diff --git a/.lighthouserc.json b/.lighthouserc.json index 2c6d8109..0e1d7f3f 100644 --- a/.lighthouserc.json +++ b/.lighthouserc.json @@ -1,14 +1,13 @@ { - "ci": { - "collect": { - "staticDistDir": "./public" - }, - "assert": { - "assertions": {} - }, - "upload": { - "target": "temporary-public-storage" - } + "ci": { + "collect": { + "staticDistDir": "./public" + }, + "assert": { + "assertions": {} + }, + "upload": { + "target": "temporary-public-storage" } + } } - \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..3d3b816c --- /dev/null +++ b/.prettierignore @@ -0,0 +1,44 @@ +# Dependencies +node_modules +.pnp +.pnp.js + +# Testing +coverage + +# Next.js +.next/ +out/ +build +dist + +# Misc +.DS_Store +*.pem + +# Debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Local env files +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# Vercel +.vercel + +# Typescript +*.tsbuildinfo +next-env.d.ts + +# PWA +**/public/sw.js +**/public/workbox-*.js +**/public/worker-*.js +**/public/sw.js.map +**/public/workbox-*.js.map +**/public/worker-*.js.map \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..93940df9 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,28 @@ +{ + "semi": true, + "singleQuote": false, + "tabWidth": 2, + "trailingComma": "es5", + "printWidth": 100, + "bracketSpacing": true, + "arrowParens": "always", + "endOfLine": "auto", + "plugins": ["prettier-plugin-tailwindcss", "@ianvs/prettier-plugin-sort-imports"], + "importOrder": [ + "^(react/(.*)$)|^(react$)", + "^(next/(.*)$)|^(next$)", + "", + "", + "^@/types/(.*)$", + "^@/config/(.*)$", + "^@/lib/(.*)$", + "^@/hooks/(.*)$", + "^@/components/ui/(.*)$", + "^@/components/(.*)$", + "^@/styles/(.*)$", + "^@/app/(.*)$", + "", + "^[./]" + ], + "importOrderParserPlugins": ["typescript", "jsx", "decorators-legacy"] +} \ No newline at end of file diff --git a/components.json b/components.json index 3a63489a..13feb79d 100644 --- a/components.json +++ b/components.json @@ -14,4 +14,4 @@ "components": "@/components", "utils": "@/lib/utils/utils" } -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index 81606c97..223d88f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -154,6 +154,7 @@ "devDependencies": { "@dnd-kit/utilities": "^3.2.2", "@faker-js/faker": "^8.4.1", + "@ianvs/prettier-plugin-sort-imports": "^4.4.1", "@next/bundle-analyzer": "^15.0.3", "@types/d3-shape": "^3.1.6", "@types/geojson": "^7946.0.15", @@ -167,6 +168,8 @@ "eslint": "^8", "eslint-config-next": "14.2.3", "postcss": "^8", + "prettier": "^3.5.3", + "prettier-plugin-tailwindcss": "^0.6.11", "tailwindcss": "^3.4.4", "typescript": "^5" } @@ -1259,6 +1262,28 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@ianvs/prettier-plugin-sort-imports": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@ianvs/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.4.1.tgz", + "integrity": "sha512-F0/Hrcfpy8WuxlQyAWJTEren/uxKhYonOGY4OyWmwRdeTvkh9mMSCxowZLjNkhwi/2ipqCgtXwwOk7tW0mWXkA==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.26.2", + "@babel/parser": "^7.26.2", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "semver": "^7.5.2" + }, + "peerDependencies": { + "@vue/compiler-sfc": "2.7.x || 3.x", + "prettier": "2 || 3" + }, + "peerDependenciesMeta": { + "@vue/compiler-sfc": { + "optional": true + } + } + }, "node_modules/@iconify/react": { "version": "5.1.0", "license": "MIT", @@ -1643,6 +1668,126 @@ "glob": "10.3.10" } }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz", + "integrity": "sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz", + "integrity": "sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz", + "integrity": "sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz", + "integrity": "sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz", + "integrity": "sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz", + "integrity": "sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz", + "integrity": "sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz", + "integrity": "sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@next/swc-win32-x64-msvc": { "version": "14.2.3", "cpu": [ @@ -13113,6 +13258,99 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.6.11", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.11.tgz", + "integrity": "sha512-YxaYSIvZPAqhrrEpRtonnrXdghZg1irNg4qrjboCXrpybLWVs55cW2N3juhspVJiO0JBvYJT8SYsJpc8OQSnsA==", + "dev": true, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "@zackad/prettier-plugin-twig": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-import-sort": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-multiline-arrays": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-style-order": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "@zackad/prettier-plugin-twig": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-import-sort": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-multiline-arrays": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-style-order": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + } + } + }, "node_modules/pretty-format": { "version": "26.6.2", "license": "MIT", @@ -18480,126 +18718,6 @@ "engines": { "node": ">=12.20" } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz", - "integrity": "sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz", - "integrity": "sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz", - "integrity": "sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz", - "integrity": "sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz", - "integrity": "sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz", - "integrity": "sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz", - "integrity": "sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz", - "integrity": "sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } } } } diff --git a/package.json b/package.json index aad5b1ed..fff7b700 100644 --- a/package.json +++ b/package.json @@ -3,10 +3,12 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev", + "dev": "next dev --turbo", "build": "next build", "start": "next start", - "lint": "next lint" + "lint": "next lint", + "format": "prettier --write \"**/*.{ts,tsx,md,js,jsx,json}\"", + "format:check": "prettier --check \"**/*.{ts,tsx,md,js,jsx,json}\"" }, "dependencies": { "@ckeditor/ckeditor5-react": "^6.2.0", @@ -155,6 +157,7 @@ "devDependencies": { "@dnd-kit/utilities": "^3.2.2", "@faker-js/faker": "^8.4.1", + "@ianvs/prettier-plugin-sort-imports": "^4.4.1", "@next/bundle-analyzer": "^15.0.3", "@types/d3-shape": "^3.1.6", "@types/geojson": "^7946.0.15", @@ -168,6 +171,8 @@ "eslint": "^8", "eslint-config-next": "14.2.3", "postcss": "^8", + "prettier": "^3.5.3", + "prettier-plugin-tailwindcss": "^0.6.11", "tailwindcss": "^3.4.4", "typescript": "^5" } diff --git a/src/README.md b/src/README.md index d9a04642..c48fcc68 100644 --- a/src/README.md +++ b/src/README.md @@ -43,30 +43,36 @@ src/ ## Directory Purposes ### app/ + - Contains Next.js App Router pages and layouts - Organized by route groups and features - Each route can have its own loading, error, and layout components ### components/ + - `ui/`: Reusable UI components that are not specific to any feature - `features/`: Components that are specific to features/domains of the application ### lib/ + - Shared utilities and core functionality - No component logic, only pure functions and utilities - Organized by domain (api, auth, etc.) ### styles/ + - Global styles and theme configuration - CSS modules and styled components - Theme variables and configurations ### config/ + - Application-wide configuration - Environment variables - Site metadata ### i18n/ + - Internationalization configuration - Translation files - Language utilities @@ -74,21 +80,25 @@ src/ ## Best Practices 1. **Component Organization** + - Keep components small and focused - Use index.ts files for clean exports - Co-locate tests with components 2. **Code Splitting** + - Use dynamic imports for large components - Lazy load routes and features - Keep bundle sizes small 3. **Type Safety** + - Use TypeScript strictly - Define types in appropriate domains - Share types across related features 4. **State Management** + - Use React Context for global state - Keep state close to where it's used - Avoid prop drilling @@ -96,4 +106,4 @@ src/ 5. **Testing** - Co-locate tests with implementation - Use meaningful test descriptions - - Test user interactions and edge cases \ No newline at end of file + - Test user interactions and edge cases diff --git a/src/action/app-actions.ts b/src/action/app-actions.ts index 0fb80fd0..6e8a7a9a 100644 --- a/src/action/app-actions.ts +++ b/src/action/app-actions.ts @@ -1,12 +1,12 @@ -'use server' -import { redirect } from "next/navigation"; +"use server"; + import { revalidatePath } from "next/cache"; +import { redirect } from "next/navigation"; + import { postMessage } from "@/app/[locale]/(protected)/app/chat/utils"; - -export const postMessageAction = async (id: string, message: string,) => { - const response = await postMessage(id, message) - revalidatePath("/"); - return response; - -} +export const postMessageAction = async (id: string, message: string) => { + const response = await postMessage(id, message); + revalidatePath("/"); + return response; +}; diff --git a/src/action/auth-action.ts b/src/action/auth-action.ts index 03c93a23..5120c807 100644 --- a/src/action/auth-action.ts +++ b/src/action/auth-action.ts @@ -1,6 +1,8 @@ -'use server' -import { redirect } from "next/navigation"; +"use server"; + import { revalidatePath } from "next/cache"; +import { redirect } from "next/navigation"; + export const loginUser = async (data: any) => { try { const response = undefined; @@ -13,4 +15,4 @@ export const loginUser = async (data: any) => { } catch (error) { throw new Error(error as string); } -}; \ No newline at end of file +}; diff --git a/src/app/[locale]/(protected)/admin/add-experts/component/column.tsx b/src/app/[locale]/(protected)/admin/add-experts/component/column.tsx index 41a1969a..89fbddfa 100644 --- a/src/app/[locale]/(protected)/admin/add-experts/component/column.tsx +++ b/src/app/[locale]/(protected)/admin/add-experts/component/column.tsx @@ -1,28 +1,19 @@ import * as React from "react"; -import { ColumnDef } from "@tanstack/react-table"; - -import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; -import { cn } from "@/lib/utils/utils" -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuTrigger, - DropdownMenuItem, -} from "@/components/ui/dropdown-menu"; -import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; -import { - formatDateToIndonesian, - getOnlyDate, - htmlToString, -} from "@/lib/utils/globals"; import { Link, useRouter } from "@/i18n/navigation"; +import { ColumnDef } from "@tanstack/react-table"; +import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; + +import { formatDateToIndonesian, getOnlyDate, htmlToString } from "@/lib/utils/globals"; +import { cn } from "@/lib/utils/utils"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Collapsible, CollapsibleContent } from "@/components/ui/collapsible"; import { Dialog, DialogContent, @@ -30,7 +21,12 @@ import { DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; -import { Collapsible, CollapsibleContent } from "@/components/ui/collapsible"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; const columns: ColumnDef[] = [ { diff --git a/src/app/[locale]/(protected)/admin/add-experts/component/table.tsx b/src/app/[locale]/(protected)/admin/add-experts/component/table.tsx index b785f6b9..a4708c35 100644 --- a/src/app/[locale]/(protected)/admin/add-experts/component/table.tsx +++ b/src/app/[locale]/(protected)/admin/add-experts/component/table.tsx @@ -1,31 +1,34 @@ "use client"; import * as React from "react"; +import { useRouter, useSearchParams } from "next/navigation"; +import { Link } from "@/i18n/navigation"; import { ColumnDef, ColumnFiltersState, - PaginationState, - SortingState, - VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, + PaginationState, + SortingState, useReactTable, + VisibilityState, } from "@tanstack/react-table"; -import { Button } from "@/components/ui/button"; - -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "@/components/ui/table"; import { UserIcon } from "lucide-react"; -import { cn } from "@/lib/utils/utils" + +import { close, loading } from "@/config/swal"; +import { getPlanningPagination } from "@/lib/services/agenda-setting/agenda-setting"; +import { paginationBlog } from "@/lib/services/blog/blog"; +import { listDataMedia } from "@/lib/services/broadcast/broadcast"; +import { listEnableCategory } from "@/lib/services/content/content"; +import { listDataExperts } from "@/lib/services/experts/experts"; +import { ticketingPagination } from "@/lib/services/ticketing/ticketing"; +import { cn } from "@/lib/utils/utils"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; import { DropdownMenu, DropdownMenuContent, @@ -36,24 +39,18 @@ import { } from "@/components/ui/dropdown-menu"; import { Input } from "@/components/ui/input"; import { InputGroup, InputGroupText } from "@/components/ui/input-group"; -import { paginationBlog } from "@/lib/services/blog/blog"; -import { ticketingPagination } from "@/lib/services/ticketing/ticketing"; -import { Badge } from "@/components/ui/badge"; -import { useRouter, useSearchParams } from "next/navigation"; -import TablePagination from "@/components/features/table/table-pagination"; -import columns from "./column"; -import { getPlanningPagination } from "@/lib/services/agenda-setting/agenda-setting"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { listDataMedia } from "@/lib/services/broadcast/broadcast"; -import { listEnableCategory } from "@/lib/services/content/content"; -import { Checkbox } from "@/components/ui/checkbox"; -import { close, loading } from "@/config/swal"; -import { Link } from "@/i18n/navigation"; -import { listDataExperts } from "@/lib/services/experts/experts"; + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import TablePagination from "@/components/features/table/table-pagination"; + +import columns from "./column"; const dummyData = [ { @@ -80,11 +77,8 @@ const AddExpertTable = () => { const [dataTable, setDataTable] = React.useState([]); const [totalData, setTotalData] = React.useState(1); const [sorting, setSorting] = React.useState([]); - const [columnFilters, setColumnFilters] = React.useState( - [] - ); - const [columnVisibility, setColumnVisibility] = - React.useState({}); + const [columnFilters, setColumnFilters] = React.useState([]); + const [columnVisibility, setColumnVisibility] = React.useState({}); const [rowSelection, setRowSelection] = React.useState({}); const [pagination, setPagination] = React.useState({ pageIndex: 0, @@ -228,22 +222,11 @@ const AddExpertTable = () => { - - - 1 - 10 Data - - - 1 - 20 Data - - - 1 - 25 Data - - - 1 - 50 Data - + + 1 - 10 Data + 1 - 20 Data + 1 - 25 Data + 1 - 50 Data @@ -257,10 +240,7 @@ const AddExpertTable = () => { {header.isPlaceholder ? null - : flexRender( - header.column.columnDef.header, - header.getContext() - )} + : flexRender(header.column.columnDef.header, header.getContext())} ))} @@ -290,11 +270,7 @@ const AddExpertTable = () => { )} - + ); }; diff --git a/src/app/[locale]/(protected)/admin/add-experts/create/page.tsx b/src/app/[locale]/(protected)/admin/add-experts/create/page.tsx index 939d6e33..1fad20cc 100644 --- a/src/app/[locale]/(protected)/admin/add-experts/create/page.tsx +++ b/src/app/[locale]/(protected)/admin/add-experts/create/page.tsx @@ -1,5 +1,22 @@ "use client"; -import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; + +import { useEffect, useState } from "react"; +import { useRouter } from "@/i18n/navigation"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { Eye, EyeOff } from "lucide-react"; +import { useForm } from "react-hook-form"; +import Swal from "sweetalert2"; +import withReactContent from "sweetalert2-react-content"; +import { z } from "zod"; + +import { loading } from "@/config/swal"; +import { + AdministrationLevelList, + getListCompetencies, + getListExperiences, + saveUserInternal, + saveUserRolePlacements, +} from "@/lib/services/management-user/management-user"; import { Button } from "@/components/ui/button"; import { Form, @@ -10,12 +27,6 @@ import { FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; -import { z } from "zod"; -import { useForm } from "react-hook-form"; -import { zodResolver } from "@hookform/resolvers/zod"; -import withReactContent from "sweetalert2-react-content"; -import Swal from "sweetalert2"; -import { useRouter } from "@/i18n/navigation"; import { Select, SelectContent, @@ -23,16 +34,7 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; -import { useEffect, useState } from "react"; -import { - AdministrationLevelList, - getListCompetencies, - getListExperiences, - saveUserInternal, - saveUserRolePlacements, -} from "@/lib/services/management-user/management-user"; -import { loading } from "@/config/swal"; -import { Eye, EyeOff } from "lucide-react"; +import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; const FormSchema = z.object({ name: z.string({ @@ -84,9 +86,7 @@ export default function AddExpertForm() { const [showPassword, setShowPassword] = useState(false); const togglePasswordType = () => { - setPasswordType((prevType) => - prevType === "password" ? "text" : "password" - ); + setPasswordType((prevType) => (prevType === "password" ? "text" : "password")); }; const roleSelection = [ @@ -209,15 +209,9 @@ export default function AddExpertForm() { }); } - const handleSelectionChange = ( - index: number, - type: "roleId" | "userLevelId", - value: string - ) => { + const handleSelectionChange = (index: number, type: "roleId" | "userLevelId", value: string) => { setPlacementRows((prevRows) => - prevRows.map((row) => - row.index === index ? { ...row, [type]: value } : row - ) + prevRows.map((row) => (row.index === index ? { ...row, [type]: value } : row)) ); }; @@ -242,10 +236,7 @@ export default function AddExpertForm() {
- +

Campaign

Posisi {placementRows?.map((row: any) => (
- handleSelectionChange(row.index, "roleId", e)}> @@ -424,11 +411,7 @@ export default function AddExpertForm() { ))} - handleSelectionChange(row.index, "userLevelId", e)}> diff --git a/src/app/[locale]/(protected)/admin/add-experts/page.tsx b/src/app/[locale]/(protected)/admin/add-experts/page.tsx index ee867ef9..36c2001b 100644 --- a/src/app/[locale]/(protected)/admin/add-experts/page.tsx +++ b/src/app/[locale]/(protected)/admin/add-experts/page.tsx @@ -1,4 +1,5 @@ import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; + import AddExpertTable from "./component/table"; export default function AddExpert() { diff --git a/src/app/[locale]/(protected)/admin/analysis/content-management/page.tsx b/src/app/[locale]/(protected)/admin/analysis/content-management/page.tsx index 12848a23..55356663 100644 --- a/src/app/[locale]/(protected)/admin/analysis/content-management/page.tsx +++ b/src/app/[locale]/(protected)/admin/analysis/content-management/page.tsx @@ -1,25 +1,23 @@ "use client"; -import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; + +import { useEffect, useState } from "react"; +import { addDays, format } from "date-fns"; +import Cookies from "js-cookie"; +import { Calendar as CalendarIcon } from "lucide-react"; +import { DateRange } from "react-day-picker"; + +import { generateTicket } from "@/lib/services/tableau/tableau-service"; +import { cn, getCookiesDecrypt } from "@/lib/utils/utils"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; -import { useEffect, useState } from "react"; -import { addDays, format } from "date-fns"; -import { Calendar as CalendarIcon } from "lucide-react"; -import { DateRange } from "react-day-picker"; -import Cookies from "js-cookie"; -import { cn, getCookiesDecrypt } from "@/lib/utils/utils"; import { Button } from "@/components/ui/button"; import { Calendar } from "@/components/ui/calendar"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { generateTicket } from "@/lib/services/tableau/tableau-service"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; const users = [ { id: 1, name: "POLRI" }, diff --git a/src/app/[locale]/(protected)/admin/analysis/emergency-issue/page.tsx b/src/app/[locale]/(protected)/admin/analysis/emergency-issue/page.tsx index f21356d5..db80a089 100644 --- a/src/app/[locale]/(protected)/admin/analysis/emergency-issue/page.tsx +++ b/src/app/[locale]/(protected)/admin/analysis/emergency-issue/page.tsx @@ -1,25 +1,23 @@ "use client"; -import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; + +import { useEffect, useState } from "react"; +import { addDays, format } from "date-fns"; +import Cookies from "js-cookie"; +import { Calendar as CalendarIcon } from "lucide-react"; +import { DateRange } from "react-day-picker"; + +import { generateTicket } from "@/lib/services/tableau/tableau-service"; +import { cn, getCookiesDecrypt } from "@/lib/utils/utils"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; -import { useEffect, useState } from "react"; -import { addDays, format } from "date-fns"; -import { Calendar as CalendarIcon } from "lucide-react"; -import { DateRange } from "react-day-picker"; -import Cookies from "js-cookie"; -import { cn, getCookiesDecrypt } from "@/lib/utils/utils"; import { Button } from "@/components/ui/button"; import { Calendar } from "@/components/ui/calendar"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { generateTicket } from "@/lib/services/tableau/tableau-service"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; const users = [ { id: 1, name: "POLRI" }, @@ -82,12 +80,7 @@ export default function EmergencyIssue() {
- + ANALISA BERKAITAN DENGAN AKUN PELAPOR{" "} diff --git a/src/app/[locale]/(protected)/admin/analysis/feedback-center/page.tsx b/src/app/[locale]/(protected)/admin/analysis/feedback-center/page.tsx index 76d690f5..651bdc35 100644 --- a/src/app/[locale]/(protected)/admin/analysis/feedback-center/page.tsx +++ b/src/app/[locale]/(protected)/admin/analysis/feedback-center/page.tsx @@ -1,25 +1,23 @@ "use client"; -import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; + +import { useEffect, useState } from "react"; +import { addDays, format } from "date-fns"; +import Cookies from "js-cookie"; +import { Calendar as CalendarIcon } from "lucide-react"; +import { DateRange } from "react-day-picker"; + +import { generateTicket } from "@/lib/services/tableau/tableau-service"; +import { cn, getCookiesDecrypt } from "@/lib/utils/utils"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; -import { useEffect, useState } from "react"; -import { addDays, format } from "date-fns"; -import { Calendar as CalendarIcon } from "lucide-react"; -import { DateRange } from "react-day-picker"; -import Cookies from "js-cookie"; -import { cn, getCookiesDecrypt } from "@/lib/utils/utils"; import { Button } from "@/components/ui/button"; import { Calendar } from "@/components/ui/calendar"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { generateTicket } from "@/lib/services/tableau/tableau-service"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; const users = [ { id: 1, name: "POLRI" }, @@ -83,16 +81,9 @@ export default function FeedbackCenter() {
- + - - TICKET PADA FEEDBACK CENTER{" "} - + TICKET PADA FEEDBACK CENTER
diff --git a/src/app/[locale]/(protected)/admin/analysis/schedule/page.tsx b/src/app/[locale]/(protected)/admin/analysis/schedule/page.tsx index 0a59f5a1..09249769 100644 --- a/src/app/[locale]/(protected)/admin/analysis/schedule/page.tsx +++ b/src/app/[locale]/(protected)/admin/analysis/schedule/page.tsx @@ -1,25 +1,23 @@ "use client"; -import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; + +import { useEffect, useState } from "react"; +import { addDays, format } from "date-fns"; +import Cookies from "js-cookie"; +import { Calendar as CalendarIcon } from "lucide-react"; +import { DateRange } from "react-day-picker"; + +import { generateTicket } from "@/lib/services/tableau/tableau-service"; +import { cn, getCookiesDecrypt } from "@/lib/utils/utils"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; -import { useEffect, useState } from "react"; -import { addDays, format } from "date-fns"; -import { Calendar as CalendarIcon } from "lucide-react"; -import { DateRange } from "react-day-picker"; -import Cookies from "js-cookie"; -import { cn, getCookiesDecrypt } from "@/lib/utils/utils"; import { Button } from "@/components/ui/button"; import { Calendar } from "@/components/ui/calendar"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { generateTicket } from "@/lib/services/tableau/tableau-service"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; export default function ContentManagement() { const [startDate, setStartDate] = useState(new Date()); @@ -108,12 +106,7 @@ export default function ContentManagement() {
- + PUBLISH JADWAL PRESS CONFERENCE TERBANYAK @@ -141,12 +134,7 @@ export default function ContentManagement() { - + JUMLAH PRODUKSI KONTEN UNTUK KATEGORI PRESS CONFERENCE @@ -174,12 +162,7 @@ export default function ContentManagement() { - + TINGKAT INTERAKSI KONTEN UNTUK KATEGORI PRESS CONFERENCE @@ -207,12 +190,7 @@ export default function ContentManagement() { - + AKTIFITAS MEDIA BERKAITAN DENGAN PERS RILIS diff --git a/src/app/[locale]/(protected)/admin/broadcast/campaign-list/account-list/component/column.tsx b/src/app/[locale]/(protected)/admin/broadcast/campaign-list/account-list/component/column.tsx index 2fd55f2b..a9ae5780 100644 --- a/src/app/[locale]/(protected)/admin/broadcast/campaign-list/account-list/component/column.tsx +++ b/src/app/[locale]/(protected)/admin/broadcast/campaign-list/account-list/component/column.tsx @@ -1,22 +1,21 @@ import * as React from "react"; +import { Link, useRouter } from "@/i18n/navigation"; import { ColumnDef } from "@tanstack/react-table"; - import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; -import { cn } from "@/lib/utils/utils" +import Swal from "sweetalert2"; +import withReactContent from "sweetalert2-react-content"; + +import { close, error, loading } from "@/config/swal"; +import { deleteMediaBlastAccount } from "@/lib/services/broadcast/broadcast"; +import { cn } from "@/lib/utils/utils"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, - DropdownMenuTrigger, DropdownMenuItem, + DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; -import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; -import Swal from "sweetalert2"; - -import { Link, useRouter } from "@/i18n/navigation"; -import withReactContent from "sweetalert2-react-content"; -import { close, error, loading } from "@/config/swal"; -import { deleteMediaBlastAccount } from "@/lib/services/broadcast/broadcast"; import { useToast } from "@/components/ui/use-toast"; const columns: ColumnDef[] = [ @@ -29,30 +28,22 @@ const columns: ColumnDef[] = [ { accessorKey: "accountName", header: "Nama", - cell: ({ row }) => ( - {row.getValue("accountName")} - ), + cell: ({ row }) => {row.getValue("accountName")}, }, { accessorKey: "accountType", header: "Tipe Akun", - cell: ({ row }) => ( - {row.getValue("accountType")} - ), + cell: ({ row }) => {row.getValue("accountType")}, }, { accessorKey: "accountCategory", header: "Kategory", - cell: ({ row }) => ( - {row.getValue("accountCategory")} - ), + cell: ({ row }) => {row.getValue("accountCategory")}, }, { accessorKey: "emailAddress", header: "Email", - cell: ({ row }) => ( - {row.getValue("emailAddress")} - ), + cell: ({ row }) => {row.getValue("emailAddress")}, }, { accessorKey: "whatsappNumber", @@ -112,9 +103,7 @@ const columns: ColumnDef[] = [ - + Edit diff --git a/src/app/[locale]/(protected)/admin/broadcast/campaign-list/account-list/component/table.tsx b/src/app/[locale]/(protected)/admin/broadcast/campaign-list/account-list/component/table.tsx index f9befda7..5d03e30a 100644 --- a/src/app/[locale]/(protected)/admin/broadcast/campaign-list/account-list/component/table.tsx +++ b/src/app/[locale]/(protected)/admin/broadcast/campaign-list/account-list/component/table.tsx @@ -1,21 +1,29 @@ "use client"; import * as React from "react"; +import { useRouter, useSearchParams } from "next/navigation"; +import { Link } from "@/i18n/navigation"; +import { Icon } from "@iconify/react/dist/iconify.js"; import { ColumnDef, ColumnFiltersState, - PaginationState, - SortingState, - VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, + PaginationState, + SortingState, useReactTable, + VisibilityState, } from "@tanstack/react-table"; -import { Button } from "@/components/ui/button"; +import { UserIcon } from "lucide-react"; +import { close, loading } from "@/config/swal"; +import { getMediaBlastAccountPage } from "@/lib/services/broadcast/broadcast"; +import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { Table, TableBody, @@ -24,21 +32,9 @@ import { TableHeader, TableRow, } from "@/components/ui/table"; -import { UserIcon } from "lucide-react"; - -import { useRouter, useSearchParams } from "next/navigation"; import TablePagination from "@/components/features/table/table-pagination"; + import columns from "./column"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { getMediaBlastAccountPage } from "@/lib/services/broadcast/broadcast"; -import { Checkbox } from "@/components/ui/checkbox"; -import { close, loading } from "@/config/swal"; -import { Link } from "@/i18n/navigation"; -import { Icon } from "@iconify/react/dist/iconify.js"; const AccountListTable = () => { const router = useRouter(); @@ -46,11 +42,8 @@ const AccountListTable = () => { const [dataTable, setDataTable] = React.useState([]); const [totalData, setTotalData] = React.useState(1); const [sorting, setSorting] = React.useState([]); - const [columnFilters, setColumnFilters] = React.useState( - [] - ); - const [columnVisibility, setColumnVisibility] = - React.useState({}); + const [columnFilters, setColumnFilters] = React.useState([]); + const [columnVisibility, setColumnVisibility] = React.useState({}); const [rowSelection, setRowSelection] = React.useState({}); const [pagination, setPagination] = React.useState({ pageIndex: 0, @@ -95,10 +88,7 @@ const AccountListTable = () => { async function fetchData() { try { loading(); - const res = await getMediaBlastAccountPage( - page - 1, - filtered ? filtered.join(",") : "" - ); + const res = await getMediaBlastAccountPage(page - 1, filtered ? filtered.join(",") : ""); const data = res?.data?.data; const contentData = data?.content; contentData.forEach((item: any, index: number) => { @@ -155,10 +145,7 @@ const AccountListTable = () => {
@@ -180,9 +167,7 @@ const AccountListTable = () => { - handleFilter("jurnalis", Boolean(e)) - } + onCheckedChange={(e) => handleFilter("jurnalis", Boolean(e))} />
); }; diff --git a/src/app/[locale]/(protected)/admin/broadcast/campaign-list/account-list/create/page.tsx b/src/app/[locale]/(protected)/admin/broadcast/campaign-list/account-list/create/page.tsx index 2dbe85ae..2f822ffd 100644 --- a/src/app/[locale]/(protected)/admin/broadcast/campaign-list/account-list/create/page.tsx +++ b/src/app/[locale]/(protected)/admin/broadcast/campaign-list/account-list/create/page.tsx @@ -1,8 +1,21 @@ "use client"; -import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; -import { z } from "zod"; -import { useForm } from "react-hook-form"; + +import { useRouter } from "@/i18n/navigation"; import { zodResolver } from "@hookform/resolvers/zod"; +import { format } from "date-fns"; +import { CalendarIcon } from "lucide-react"; +import { useForm } from "react-hook-form"; +import Swal from "sweetalert2"; +import withReactContent from "sweetalert2-react-content"; +import { z } from "zod"; + +import { error } from "@/config/swal"; +import { saveMediaBlastAccount, saveMediaBlastCampaign } from "@/lib/services/broadcast/broadcast"; +import { getOnlyDate } from "@/lib/utils/globals"; +import { cn } from "@/lib/utils/utils"; +import { Button } from "@/components/ui/button"; +import { Calendar } from "@/components/ui/calendar"; +import { Checkbox } from "@/components/ui/checkbox"; import { Form, FormControl, @@ -12,38 +25,18 @@ import { FormLabel, FormMessage, } from "@/components/ui/form"; -import withReactContent from "sweetalert2-react-content"; -import Swal from "sweetalert2"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; import { Input } from "@/components/ui/input"; -import { Button } from "@/components/ui/button"; -import { cn } from "@/lib/utils/utils" -import { format } from "date-fns"; -import { CalendarIcon } from "lucide-react"; -import { Calendar } from "@/components/ui/calendar"; -import { getOnlyDate } from "@/lib/utils/globals"; -import { - saveMediaBlastAccount, - saveMediaBlastCampaign, -} from "@/lib/services/broadcast/broadcast"; -import { error } from "@/config/swal"; -import { useRouter } from "@/i18n/navigation"; -import { Checkbox } from "@/components/ui/checkbox"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; +import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; const FormSchema = z.object({ name: z.string({ required_error: "Required", }), - accountType: z - .array(z.string()) - .refine((value) => value.some((item) => item), { - message: "Required", - }), + accountType: z.array(z.string()).refine((value) => value.some((item) => item), { + message: "Required", + }), accountCategory: z.enum(["polri", "jurnalis", "umumu", "ksp"], { required_error: "Required", }), @@ -114,10 +107,7 @@ export default function CreateAccountForBroadcast() {
- +

Account

( Nama - + @@ -159,17 +145,11 @@ export default function CreateAccountForBroadcast() { onCheckedChange={(checked) => { return checked ? field.onChange([...field.value, "wa"]) - : field.onChange( - field.value?.filter( - (value) => value !== "wa" - ) - ); + : field.onChange(field.value?.filter((value) => value !== "wa")); }} /> - - Whatsapp - + Whatsapp ); }} @@ -191,9 +171,7 @@ export default function CreateAccountForBroadcast() { return checked ? field.onChange([...field.value, "email"]) : field.onChange( - field.value?.filter( - (value) => value !== "email" - ) + field.value?.filter((value) => value !== "email") ); }} /> diff --git a/src/app/[locale]/(protected)/admin/broadcast/campaign-list/account-list/edit/[id]/page.tsx b/src/app/[locale]/(protected)/admin/broadcast/campaign-list/account-list/edit/[id]/page.tsx index 2b6b8d3b..0bb3ae67 100644 --- a/src/app/[locale]/(protected)/admin/broadcast/campaign-list/account-list/edit/[id]/page.tsx +++ b/src/app/[locale]/(protected)/admin/broadcast/campaign-list/account-list/edit/[id]/page.tsx @@ -1,8 +1,27 @@ "use client"; -import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; -import { z } from "zod"; -import { useForm } from "react-hook-form"; + +import { useEffect } from "react"; +import { useParams } from "next/navigation"; +import { useRouter } from "@/i18n/navigation"; import { zodResolver } from "@hookform/resolvers/zod"; +import { format } from "date-fns"; +import { CalendarIcon } from "lucide-react"; +import { useForm } from "react-hook-form"; +import Swal from "sweetalert2"; +import withReactContent from "sweetalert2-react-content"; +import { z } from "zod"; + +import { error } from "@/config/swal"; +import { + getMediaBlastAccount, + saveMediaBlastAccount, + saveMediaBlastCampaign, +} from "@/lib/services/broadcast/broadcast"; +import { getOnlyDate } from "@/lib/utils/globals"; +import { cn } from "@/lib/utils/utils"; +import { Button } from "@/components/ui/button"; +import { Calendar } from "@/components/ui/calendar"; +import { Checkbox } from "@/components/ui/checkbox"; import { Form, FormControl, @@ -12,41 +31,18 @@ import { FormLabel, FormMessage, } from "@/components/ui/form"; -import withReactContent from "sweetalert2-react-content"; -import Swal from "sweetalert2"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; import { Input } from "@/components/ui/input"; -import { Button } from "@/components/ui/button"; -import { cn } from "@/lib/utils/utils" -import { format } from "date-fns"; -import { CalendarIcon } from "lucide-react"; -import { Calendar } from "@/components/ui/calendar"; -import { getOnlyDate } from "@/lib/utils/globals"; -import { - getMediaBlastAccount, - saveMediaBlastAccount, - saveMediaBlastCampaign, -} from "@/lib/services/broadcast/broadcast"; -import { error } from "@/config/swal"; -import { useRouter } from "@/i18n/navigation"; -import { Checkbox } from "@/components/ui/checkbox"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; -import { useParams } from "next/navigation"; -import { useEffect } from "react"; +import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; const FormSchema = z.object({ name: z.string({ required_error: "Required", }), - accountType: z - .array(z.string()) - .refine((value) => value.some((item) => item), { - message: "Required", - }), + accountType: z.array(z.string()).refine((value) => value.some((item) => item), { + message: "Required", + }), accountCategory: z.enum(["polri", "jurnalis", "umumu", "ksp"], { required_error: "Required", }), @@ -134,10 +130,7 @@ export default function EditAccountForBroadcast() {
- +

Account

( Nama - + @@ -178,17 +167,11 @@ export default function EditAccountForBroadcast() { onCheckedChange={(checked) => { return checked ? field.onChange([...field.value, "wa"]) - : field.onChange( - field.value?.filter( - (value) => value !== "wa" - ) - ); + : field.onChange(field.value?.filter((value) => value !== "wa")); }} /> - - Whatsapp - + Whatsapp ); }} @@ -210,9 +193,7 @@ export default function EditAccountForBroadcast() { return checked ? field.onChange([...field.value, "email"]) : field.onChange( - field.value?.filter( - (value) => value !== "email" - ) + field.value?.filter((value) => value !== "email") ); }} /> diff --git a/src/app/[locale]/(protected)/admin/broadcast/campaign-list/account-list/page.tsx b/src/app/[locale]/(protected)/admin/broadcast/campaign-list/account-list/page.tsx index 1a4c0259..4213aad6 100644 --- a/src/app/[locale]/(protected)/admin/broadcast/campaign-list/account-list/page.tsx +++ b/src/app/[locale]/(protected)/admin/broadcast/campaign-list/account-list/page.tsx @@ -1,4 +1,5 @@ import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; + import AccountListTable from "./component/table"; export default function AdminCampaignList() { diff --git a/src/app/[locale]/(protected)/admin/broadcast/campaign-list/component/column.tsx b/src/app/[locale]/(protected)/admin/broadcast/campaign-list/component/column.tsx index 0cca7573..805c0ca0 100644 --- a/src/app/[locale]/(protected)/admin/broadcast/campaign-list/component/column.tsx +++ b/src/app/[locale]/(protected)/admin/broadcast/campaign-list/component/column.tsx @@ -1,18 +1,17 @@ import * as React from "react"; +import { Link, useRouter } from "@/i18n/navigation"; import { ColumnDef } from "@tanstack/react-table"; - import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; -import { cn } from "@/lib/utils/utils" + +import { cn } from "@/lib/utils/utils"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, - DropdownMenuTrigger, DropdownMenuItem, + DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; -import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; - -import { Link, useRouter } from "@/i18n/navigation"; const columns: ColumnDef[] = [ { @@ -24,9 +23,7 @@ const columns: ColumnDef[] = [ { accessorKey: "title", header: "Judul", - cell: ({ row }) => ( - {row.getValue("title")} - ), + cell: ({ row }) => {row.getValue("title")}, }, { accessorKey: "sendTime", @@ -43,15 +40,15 @@ const columns: ColumnDef[] = [ row.getValue("status") == "done" ? "bg-blue-500" : row.getValue("status") == "waiting" - ? "bg-yellow-400" - : "bg-red-600" + ? "bg-yellow-400" + : "bg-red-600" }`} > {row.getValue("status") == "done" ? "Selesai" : row.getValue("status") == "waiting" - ? "Proses" - : "Gagal"} + ? "Proses" + : "Gagal"} ), }, @@ -74,18 +71,10 @@ const columns: ColumnDef[] = [ - - Detail - + Detail - - Edit - + Edit Delete diff --git a/src/app/[locale]/(protected)/admin/broadcast/campaign-list/component/table.tsx b/src/app/[locale]/(protected)/admin/broadcast/campaign-list/component/table.tsx index 7d14a6fd..4c4bc35a 100644 --- a/src/app/[locale]/(protected)/admin/broadcast/campaign-list/component/table.tsx +++ b/src/app/[locale]/(protected)/admin/broadcast/campaign-list/component/table.tsx @@ -1,30 +1,21 @@ "use client"; import * as React from "react"; +import { useRouter, useSearchParams } from "next/navigation"; +import { Link } from "@/i18n/navigation"; import { ColumnDef, ColumnFiltersState, - PaginationState, - SortingState, - VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, + PaginationState, + SortingState, useReactTable, + VisibilityState, } from "@tanstack/react-table"; -import { Button } from "@/components/ui/button"; - -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "@/components/ui/table"; -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { ChevronLeft, ChevronRight, @@ -37,7 +28,18 @@ import { TrendingUp, UserIcon, } from "lucide-react"; -import { cn } from "@/lib/utils/utils" + +import { close, loading } from "@/config/swal"; +import { getPlanningPagination } from "@/lib/services/agenda-setting/agenda-setting"; +import { paginationBlog } from "@/lib/services/blog/blog"; +import { getMediaBlastCampaignPage, listDataMedia } from "@/lib/services/broadcast/broadcast"; +import { listEnableCategory } from "@/lib/services/content/content"; +import { ticketingPagination } from "@/lib/services/ticketing/ticketing"; +import { cn } from "@/lib/utils/utils"; +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; import { DropdownMenu, DropdownMenuContent, @@ -48,39 +50,28 @@ import { } from "@/components/ui/dropdown-menu"; import { Input } from "@/components/ui/input"; import { InputGroup, InputGroupText } from "@/components/ui/input-group"; -import { paginationBlog } from "@/lib/services/blog/blog"; -import { ticketingPagination } from "@/lib/services/ticketing/ticketing"; -import { Badge } from "@/components/ui/badge"; -import { useRouter, useSearchParams } from "next/navigation"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; import TablePagination from "@/components/features/table/table-pagination"; -import columns from "./column"; -import { getPlanningPagination } from "@/lib/services/agenda-setting/agenda-setting"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { - getMediaBlastCampaignPage, - listDataMedia, -} from "@/lib/services/broadcast/broadcast"; -import { listEnableCategory } from "@/lib/services/content/content"; -import { Checkbox } from "@/components/ui/checkbox"; -import { close, loading } from "@/config/swal"; -import { Link } from "@/i18n/navigation"; import { NewCampaignIcon } from "@/components/icon"; +import columns from "./column"; + const CampaignListTable = () => { const router = useRouter(); const searchParams = useSearchParams(); const [dataTable, setDataTable] = React.useState([]); const [totalData, setTotalData] = React.useState(1); const [sorting, setSorting] = React.useState([]); - const [columnFilters, setColumnFilters] = React.useState( - [] - ); - const [columnVisibility, setColumnVisibility] = - React.useState({}); + const [columnFilters, setColumnFilters] = React.useState([]); + const [columnVisibility, setColumnVisibility] = React.useState({}); const [rowSelection, setRowSelection] = React.useState({}); const [pagination, setPagination] = React.useState({ pageIndex: 0, @@ -170,10 +161,7 @@ const CampaignListTable = () => { {header.isPlaceholder ? null - : flexRender( - header.column.columnDef.header, - header.getContext() - )} + : flexRender(header.column.columnDef.header, header.getContext())} ))} @@ -203,11 +191,7 @@ const CampaignListTable = () => { )} - +
); }; diff --git a/src/app/[locale]/(protected)/admin/broadcast/campaign-list/create/page.tsx b/src/app/[locale]/(protected)/admin/broadcast/campaign-list/create/page.tsx index 07bb229b..39002bd9 100644 --- a/src/app/[locale]/(protected)/admin/broadcast/campaign-list/create/page.tsx +++ b/src/app/[locale]/(protected)/admin/broadcast/campaign-list/create/page.tsx @@ -1,8 +1,20 @@ "use client"; -import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; -import { z } from "zod"; -import { useForm } from "react-hook-form"; + +import { useRouter } from "@/i18n/navigation"; import { zodResolver } from "@hookform/resolvers/zod"; +import { format } from "date-fns"; +import { CalendarIcon } from "lucide-react"; +import { useForm } from "react-hook-form"; +import Swal from "sweetalert2"; +import withReactContent from "sweetalert2-react-content"; +import { z } from "zod"; + +import { error } from "@/config/swal"; +import { saveMediaBlastCampaign } from "@/lib/services/broadcast/broadcast"; +import { getOnlyDate } from "@/lib/utils/globals"; +import { cn } from "@/lib/utils/utils"; +import { Button } from "@/components/ui/button"; +import { Calendar } from "@/components/ui/calendar"; import { Form, FormControl, @@ -12,23 +24,9 @@ import { FormLabel, FormMessage, } from "@/components/ui/form"; -import withReactContent from "sweetalert2-react-content"; -import Swal from "sweetalert2"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; import { Input } from "@/components/ui/input"; -import { Button } from "@/components/ui/button"; -import { cn } from "@/lib/utils/utils" -import { format } from "date-fns"; -import { CalendarIcon } from "lucide-react"; -import { Calendar } from "@/components/ui/calendar"; -import { getOnlyDate } from "@/lib/utils/globals"; -import { saveMediaBlastCampaign } from "@/lib/services/broadcast/broadcast"; -import { error } from "@/config/swal"; -import { useRouter } from "@/i18n/navigation"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; const FormSchema = z.object({ date: z.date({ @@ -99,10 +97,7 @@ export default function CreateCampaign() {
- +

Campaign

( Judul - + diff --git a/src/app/[locale]/(protected)/admin/broadcast/campaign-list/edit/[id]/page.tsx b/src/app/[locale]/(protected)/admin/broadcast/campaign-list/edit/[id]/page.tsx index 08029170..5a7c41af 100644 --- a/src/app/[locale]/(protected)/admin/broadcast/campaign-list/edit/[id]/page.tsx +++ b/src/app/[locale]/(protected)/admin/broadcast/campaign-list/edit/[id]/page.tsx @@ -1,8 +1,25 @@ "use client"; -import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; -import { z } from "zod"; -import { useForm } from "react-hook-form"; + +import { useEffect } from "react"; +import { useParams } from "next/navigation"; +import { useRouter } from "@/i18n/navigation"; import { zodResolver } from "@hookform/resolvers/zod"; +import { format } from "date-fns"; +import { CalendarIcon } from "lucide-react"; +import { useForm } from "react-hook-form"; +import Swal from "sweetalert2"; +import withReactContent from "sweetalert2-react-content"; +import { z } from "zod"; + +import { error } from "@/config/swal"; +import { + getMediaBlastCampaignById, + saveMediaBlastCampaign, +} from "@/lib/services/broadcast/broadcast"; +import { getOnlyDate } from "@/lib/utils/globals"; +import { cn } from "@/lib/utils/utils"; +import { Button } from "@/components/ui/button"; +import { Calendar } from "@/components/ui/calendar"; import { Form, FormControl, @@ -12,28 +29,9 @@ import { FormLabel, FormMessage, } from "@/components/ui/form"; -import withReactContent from "sweetalert2-react-content"; -import Swal from "sweetalert2"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; import { Input } from "@/components/ui/input"; -import { Button } from "@/components/ui/button"; -import { cn } from "@/lib/utils/utils" -import { format } from "date-fns"; -import { CalendarIcon } from "lucide-react"; -import { Calendar } from "@/components/ui/calendar"; -import { getOnlyDate } from "@/lib/utils/globals"; -import { - getMediaBlastCampaignById, - saveMediaBlastCampaign, -} from "@/lib/services/broadcast/broadcast"; -import { error } from "@/config/swal"; -import { useRouter } from "@/i18n/navigation"; -import { useParams } from "next/navigation"; -import { useEffect } from "react"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; const FormSchema = z.object({ date: z.date({ @@ -128,10 +126,7 @@ export default function EditCampaign() {
- +

Campaign

( Judul - + diff --git a/src/app/[locale]/(protected)/admin/broadcast/campaign-list/page.tsx b/src/app/[locale]/(protected)/admin/broadcast/campaign-list/page.tsx index 165fa9b0..11d8d52e 100644 --- a/src/app/[locale]/(protected)/admin/broadcast/campaign-list/page.tsx +++ b/src/app/[locale]/(protected)/admin/broadcast/campaign-list/page.tsx @@ -1,4 +1,5 @@ import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; + import CampaignListTable from "./component/table"; export default function AdminCampaignList() { diff --git a/src/app/[locale]/(protected)/admin/broadcast/email/[id]/page.tsx b/src/app/[locale]/(protected)/admin/broadcast/email/[id]/page.tsx index 20241049..b4c778fe 100644 --- a/src/app/[locale]/(protected)/admin/broadcast/email/[id]/page.tsx +++ b/src/app/[locale]/(protected)/admin/broadcast/email/[id]/page.tsx @@ -1,5 +1,5 @@ -import ContentBlast from "@/components/features/form/broadcast/content-blast-form"; import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; +import ContentBlast from "@/components/features/form/broadcast/content-blast-form"; export default function CreateEmailBlast() { return ( diff --git a/src/app/[locale]/(protected)/admin/broadcast/email/component/column.tsx b/src/app/[locale]/(protected)/admin/broadcast/email/component/column.tsx index e4a6c95a..a4a0fccf 100644 --- a/src/app/[locale]/(protected)/admin/broadcast/email/component/column.tsx +++ b/src/app/[locale]/(protected)/admin/broadcast/email/component/column.tsx @@ -1,28 +1,19 @@ import * as React from "react"; -import { ColumnDef } from "@tanstack/react-table"; - -import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; -import { cn } from "@/lib/utils/utils" -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuTrigger, - DropdownMenuItem, -} from "@/components/ui/dropdown-menu"; -import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; -import { - formatDateToIndonesian, - getOnlyDate, - htmlToString, -} from "@/lib/utils/globals"; import { Link, useRouter } from "@/i18n/navigation"; +import { ColumnDef } from "@tanstack/react-table"; +import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; + +import { formatDateToIndonesian, getOnlyDate, htmlToString } from "@/lib/utils/globals"; +import { cn } from "@/lib/utils/utils"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Collapsible, CollapsibleContent } from "@/components/ui/collapsible"; import { Dialog, DialogContent, @@ -30,7 +21,12 @@ import { DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; -import { Collapsible, CollapsibleContent } from "@/components/ui/collapsible"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; const columns: ColumnDef[] = [ { @@ -57,9 +53,7 @@ const columns: ColumnDef[] = [ { accessorKey: "createdAt", header: "Tanggal Unggah", - cell: ({ row }) => ( - {formatDateToIndonesian(row.getValue("createdAt"))} - ), + cell: ({ row }) => {formatDateToIndonesian(row.getValue("createdAt"))}, }, { @@ -86,21 +80,13 @@ const columns: ColumnDef[] = [ - - Detail - + Detail - - Email Blast - + Email Blast - - Whatsapp Blast - + Whatsapp Blast diff --git a/src/app/[locale]/(protected)/admin/broadcast/email/component/table.tsx b/src/app/[locale]/(protected)/admin/broadcast/email/component/table.tsx index c95186c7..3eb1e3d1 100644 --- a/src/app/[locale]/(protected)/admin/broadcast/email/component/table.tsx +++ b/src/app/[locale]/(protected)/admin/broadcast/email/component/table.tsx @@ -1,30 +1,21 @@ "use client"; import * as React from "react"; +import { useRouter, useSearchParams } from "next/navigation"; +import { Link } from "@/i18n/navigation"; import { ColumnDef, ColumnFiltersState, - PaginationState, - SortingState, - VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, + PaginationState, + SortingState, useReactTable, + VisibilityState, } from "@tanstack/react-table"; -import { Button } from "@/components/ui/button"; - -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "@/components/ui/table"; -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { ChevronLeft, ChevronRight, @@ -37,7 +28,18 @@ import { TrendingUp, UserIcon, } from "lucide-react"; -import { cn } from "@/lib/utils/utils" + +import { close, loading } from "@/config/swal"; +import { getPlanningPagination } from "@/lib/services/agenda-setting/agenda-setting"; +import { paginationBlog } from "@/lib/services/blog/blog"; +import { listDataMedia, listDataMediaBroadCast } from "@/lib/services/broadcast/broadcast"; +import { listEnableCategory } from "@/lib/services/content/content"; +import { ticketingPagination } from "@/lib/services/ticketing/ticketing"; +import { cn } from "@/lib/utils/utils"; +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; import { DropdownMenu, DropdownMenuContent, @@ -48,26 +50,18 @@ import { } from "@/components/ui/dropdown-menu"; import { Input } from "@/components/ui/input"; import { InputGroup, InputGroupText } from "@/components/ui/input-group"; -import { paginationBlog } from "@/lib/services/blog/blog"; -import { ticketingPagination } from "@/lib/services/ticketing/ticketing"; -import { Badge } from "@/components/ui/badge"; -import { useRouter, useSearchParams } from "next/navigation"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; import TablePagination from "@/components/features/table/table-pagination"; + import columns from "./column"; -import { getPlanningPagination } from "@/lib/services/agenda-setting/agenda-setting"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { - listDataMedia, - listDataMediaBroadCast, -} from "@/lib/services/broadcast/broadcast"; -import { listEnableCategory } from "@/lib/services/content/content"; -import { Checkbox } from "@/components/ui/checkbox"; -import { close, loading } from "@/config/swal"; -import { Link } from "@/i18n/navigation"; const BroadcastEmailTable = () => { const router = useRouter(); @@ -78,11 +72,8 @@ const BroadcastEmailTable = () => { const [dataTable, setDataTable] = React.useState([]); const [totalData, setTotalData] = React.useState(1); const [sorting, setSorting] = React.useState([]); - const [columnFilters, setColumnFilters] = React.useState( - [] - ); - const [columnVisibility, setColumnVisibility] = - React.useState({}); + const [columnFilters, setColumnFilters] = React.useState([]); + const [columnVisibility, setColumnVisibility] = React.useState({}); const [rowSelection, setRowSelection] = React.useState({}); const [pagination, setPagination] = React.useState({ pageIndex: 0, @@ -228,22 +219,11 @@ const BroadcastEmailTable = () => { - - - 1 - 10 Data - - - 1 - 20 Data - - - 1 - 25 Data - - - 1 - 50 Data - + + 1 - 10 Data + 1 - 20 Data + 1 - 25 Data + 1 - 50 Data @@ -257,10 +237,7 @@ const BroadcastEmailTable = () => {
@@ -271,9 +248,7 @@ const BroadcastEmailTable = () => { - handleChange("category", category.id, Boolean(e)) - } + onCheckedChange={(e) => handleChange("category", category.id, Boolean(e))} />
); }; diff --git a/src/app/[locale]/(protected)/admin/broadcast/page.tsx b/src/app/[locale]/(protected)/admin/broadcast/page.tsx index c71b8293..0b21a275 100644 --- a/src/app/[locale]/(protected)/admin/broadcast/page.tsx +++ b/src/app/[locale]/(protected)/admin/broadcast/page.tsx @@ -1,13 +1,15 @@ "use client"; -import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; -import BroadcastTable from "./email/component/table"; + +import { useState } from "react"; +import { Link } from "@/i18n/navigation"; import { PlusIcon } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; + import EscalationTable from "../../shared/communication/escalation/components/escalation-table"; import InternalTable from "../../shared/communication/internal/components/internal-table"; -import { useState } from "react"; -import { Link } from "@/i18n/navigation"; -import { Button } from "@/components/ui/button"; +import BroadcastTable from "./email/component/table"; import BroadcastEmailTable from "./email/component/table"; import BroadcastWhatsAppTable from "./whatsapp/component/table"; @@ -22,11 +24,7 @@ export default function AdminBroadcast() { rounded="md" onClick={() => setTab("Email Blast")} className={` hover:text-white - ${ - tab === "Email Blast" - ? "bg-black text-white " - : "bg-white text-black " - }`} + ${tab === "Email Blast" ? "bg-black text-white " : "bg-white text-black "}`} > Email Blast @@ -34,11 +32,7 @@ export default function AdminBroadcast() { rounded="md" onClick={() => setTab("WhatsApp Blast")} className={` hover:text-white - ${ - tab === "WhatsApp Blast" - ? "bg-black text-white " - : "bg-white text-black " - }`} + ${tab === "WhatsApp Blast" ? "bg-black text-white " : "bg-white text-black "}`} > WhatsApp Blast diff --git a/src/app/[locale]/(protected)/admin/broadcast/whatsapp/[id]/page.tsx b/src/app/[locale]/(protected)/admin/broadcast/whatsapp/[id]/page.tsx index b278b0fd..55f6e463 100644 --- a/src/app/[locale]/(protected)/admin/broadcast/whatsapp/[id]/page.tsx +++ b/src/app/[locale]/(protected)/admin/broadcast/whatsapp/[id]/page.tsx @@ -1,5 +1,5 @@ -import ContentBlast from "@/components/features/form/broadcast/content-blast-form"; import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; +import ContentBlast from "@/components/features/form/broadcast/content-blast-form"; export default function CreateWABlast() { return ( diff --git a/src/app/[locale]/(protected)/admin/broadcast/whatsapp/component/column.tsx b/src/app/[locale]/(protected)/admin/broadcast/whatsapp/component/column.tsx index e93d83c6..1a593ab2 100644 --- a/src/app/[locale]/(protected)/admin/broadcast/whatsapp/component/column.tsx +++ b/src/app/[locale]/(protected)/admin/broadcast/whatsapp/component/column.tsx @@ -1,28 +1,19 @@ import * as React from "react"; -import { ColumnDef } from "@tanstack/react-table"; - -import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; -import { cn } from "@/lib/utils/utils" -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuTrigger, - DropdownMenuItem, -} from "@/components/ui/dropdown-menu"; -import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; -import { - formatDateToIndonesian, - getOnlyDate, - htmlToString, -} from "@/lib/utils/globals"; import { Link, useRouter } from "@/i18n/navigation"; +import { ColumnDef } from "@tanstack/react-table"; +import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; + +import { formatDateToIndonesian, getOnlyDate, htmlToString } from "@/lib/utils/globals"; +import { cn } from "@/lib/utils/utils"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Collapsible, CollapsibleContent } from "@/components/ui/collapsible"; import { Dialog, DialogContent, @@ -30,7 +21,12 @@ import { DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; -import { Collapsible, CollapsibleContent } from "@/components/ui/collapsible"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; const columns: ColumnDef[] = [ { @@ -52,9 +48,7 @@ const columns: ColumnDef[] = [ { accessorKey: "createdAt", header: "Tanggal Unggah", - cell: ({ row }) => ( - {formatDateToIndonesian(row.getValue("createdAt"))} - ), + cell: ({ row }) => {formatDateToIndonesian(row.getValue("createdAt"))}, }, { @@ -81,21 +75,13 @@ const columns: ColumnDef[] = [ - - Detail - + Detail - - Email Blast - + Email Blast - - Whatsapp Blast - + Whatsapp Blast diff --git a/src/app/[locale]/(protected)/admin/broadcast/whatsapp/component/table.tsx b/src/app/[locale]/(protected)/admin/broadcast/whatsapp/component/table.tsx index 01dd2c58..e6c7e469 100644 --- a/src/app/[locale]/(protected)/admin/broadcast/whatsapp/component/table.tsx +++ b/src/app/[locale]/(protected)/admin/broadcast/whatsapp/component/table.tsx @@ -1,30 +1,21 @@ "use client"; import * as React from "react"; +import { useRouter, useSearchParams } from "next/navigation"; +import { Link } from "@/i18n/navigation"; import { ColumnDef, ColumnFiltersState, - PaginationState, - SortingState, - VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, + PaginationState, + SortingState, useReactTable, + VisibilityState, } from "@tanstack/react-table"; -import { Button } from "@/components/ui/button"; - -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "@/components/ui/table"; -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { ChevronLeft, ChevronRight, @@ -37,7 +28,18 @@ import { TrendingUp, UserIcon, } from "lucide-react"; -import { cn } from "@/lib/utils/utils" + +import { close, loading } from "@/config/swal"; +import { getPlanningPagination } from "@/lib/services/agenda-setting/agenda-setting"; +import { paginationBlog } from "@/lib/services/blog/blog"; +import { listDataMedia, listDataMediaBroadCast } from "@/lib/services/broadcast/broadcast"; +import { listEnableCategory } from "@/lib/services/content/content"; +import { ticketingPagination } from "@/lib/services/ticketing/ticketing"; +import { cn } from "@/lib/utils/utils"; +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; import { DropdownMenu, DropdownMenuContent, @@ -48,26 +50,18 @@ import { } from "@/components/ui/dropdown-menu"; import { Input } from "@/components/ui/input"; import { InputGroup, InputGroupText } from "@/components/ui/input-group"; -import { paginationBlog } from "@/lib/services/blog/blog"; -import { ticketingPagination } from "@/lib/services/ticketing/ticketing"; -import { Badge } from "@/components/ui/badge"; -import { useRouter, useSearchParams } from "next/navigation"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; import TablePagination from "@/components/features/table/table-pagination"; + import columns from "./column"; -import { getPlanningPagination } from "@/lib/services/agenda-setting/agenda-setting"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { - listDataMedia, - listDataMediaBroadCast, -} from "@/lib/services/broadcast/broadcast"; -import { listEnableCategory } from "@/lib/services/content/content"; -import { Checkbox } from "@/components/ui/checkbox"; -import { close, loading } from "@/config/swal"; -import { Link } from "@/i18n/navigation"; const BroadcastWhatsAppTable = () => { const router = useRouter(); @@ -78,11 +72,8 @@ const BroadcastWhatsAppTable = () => { const [dataTable, setDataTable] = React.useState([]); const [totalData, setTotalData] = React.useState(1); const [sorting, setSorting] = React.useState([]); - const [columnFilters, setColumnFilters] = React.useState( - [] - ); - const [columnVisibility, setColumnVisibility] = - React.useState({}); + const [columnFilters, setColumnFilters] = React.useState([]); + const [columnVisibility, setColumnVisibility] = React.useState({}); const [rowSelection, setRowSelection] = React.useState({}); const [pagination, setPagination] = React.useState({ pageIndex: 0, @@ -228,22 +219,11 @@ const BroadcastWhatsAppTable = () => { - - - 1 - 10 Data - - - 1 - 20 Data - - - 1 - 25 Data - - - 1 - 50 Data - + + 1 - 10 Data + 1 - 20 Data + 1 - 25 Data + 1 - 50 Data @@ -257,10 +237,7 @@ const BroadcastWhatsAppTable = () => {
@@ -271,9 +248,7 @@ const BroadcastWhatsAppTable = () => { - handleChange("category", category.id, Boolean(e)) - } + onCheckedChange={(e) => handleChange("category", category.id, Boolean(e))} />
); }; diff --git a/src/app/[locale]/(protected)/admin/management-user/external/detail/[id]/page.tsx b/src/app/[locale]/(protected)/admin/management-user/external/detail/[id]/page.tsx index 5701f89c..eb244293 100644 --- a/src/app/[locale]/(protected)/admin/management-user/external/detail/[id]/page.tsx +++ b/src/app/[locale]/(protected)/admin/management-user/external/detail/[id]/page.tsx @@ -1,12 +1,18 @@ "use client"; -import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; +import { useEffect, useState } from "react"; +import { useParams } from "next/navigation"; +import { Link, useRouter } from "@/i18n/navigation"; +import { identity } from "@fullcalendar/core/internal"; import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; +import Swal from "sweetalert2"; +import withReactContent from "sweetalert2-react-content"; import { z } from "zod"; +import { close, error, loading } from "@/config/swal"; +import { getUserById, saveUserInternal } from "@/lib/services/management-user/management-user"; import { Button } from "@/components/ui/button"; - import { Form, FormControl, @@ -15,21 +21,9 @@ import { FormLabel, FormMessage, } from "@/components/ui/form"; - -import { - getUserById, - saveUserInternal, -} from "@/lib/services/management-user/management-user"; -import { useEffect, useState } from "react"; import { Input } from "@/components/ui/input"; +import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; import { Textarea } from "@/components/ui/textarea"; -import { Link, useRouter } from "@/i18n/navigation"; - -import Swal from "sweetalert2"; -import withReactContent from "sweetalert2-react-content"; -import { close, error, loading } from "@/config/swal"; -import { useParams } from "next/navigation"; -import { identity } from "@fullcalendar/core/internal"; const FormSchema = z.object({ fullname: z.string({ @@ -151,10 +145,7 @@ export default function EditUserForm() {
- +

Data Pengelola Media Hub

Username - + diff --git a/src/app/[locale]/(protected)/admin/management-user/external/edit/[id]/page.tsx b/src/app/[locale]/(protected)/admin/management-user/external/edit/[id]/page.tsx index 40c6a1e0..7326d324 100644 --- a/src/app/[locale]/(protected)/admin/management-user/external/edit/[id]/page.tsx +++ b/src/app/[locale]/(protected)/admin/management-user/external/edit/[id]/page.tsx @@ -1,13 +1,29 @@ "use client"; -import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; +import { useEffect, useState } from "react"; +import dynamic from "next/dynamic"; +import { useParams } from "next/navigation"; +import { Link, useRouter } from "@/i18n/navigation"; +import { identity } from "@fullcalendar/core/internal"; import { zodResolver } from "@hookform/resolvers/zod"; import { Check, ChevronsUpDown } from "lucide-react"; import { useForm } from "react-hook-form"; +import Swal from "sweetalert2"; +import withReactContent from "sweetalert2-react-content"; import { z } from "zod"; +import { close, error, loading } from "@/config/swal"; +import { + AdministrationLevelList, + getListCompetencies, + getListEducation, + getListSchools, + getUserById, + saveUserInternal, +} from "@/lib/services/management-user/management-user"; import { cn, getCookiesDecrypt } from "@/lib/utils/utils"; import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; import { Command, CommandEmpty, @@ -24,26 +40,9 @@ import { FormLabel, FormMessage, } from "@/components/ui/form"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { - AdministrationLevelList, - getListCompetencies, - getListEducation, - getListSchools, - getUserById, - saveUserInternal, -} from "@/lib/services/management-user/management-user"; -import { useEffect, useState } from "react"; import { Input } from "@/components/ui/input"; -import { Textarea } from "@/components/ui/textarea"; -import { Link, useRouter } from "@/i18n/navigation"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; -import dynamic from "next/dynamic"; -import { Checkbox } from "@/components/ui/checkbox"; import { Select, SelectContent, @@ -51,11 +50,8 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; -import Swal from "sweetalert2"; -import withReactContent from "sweetalert2-react-content"; -import { close, error, loading } from "@/config/swal"; -import { useParams } from "next/navigation"; -import { identity } from "@fullcalendar/core/internal"; +import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; +import { Textarea } from "@/components/ui/textarea"; const PasswordChecklist = dynamic(() => import("react-password-checklist"), { ssr: false, @@ -189,10 +185,7 @@ export default function EditUserForm() {
- +

Data Pengelola Media Hub

Nama Lengkap - + @@ -220,11 +209,7 @@ export default function EditUserForm() { Username - + @@ -278,12 +263,7 @@ export default function EditUserForm() { Email - + diff --git a/src/app/[locale]/(protected)/admin/management-user/internal/create/page.tsx b/src/app/[locale]/(protected)/admin/management-user/internal/create/page.tsx index 82606f40..5f51c35c 100644 --- a/src/app/[locale]/(protected)/admin/management-user/internal/create/page.tsx +++ b/src/app/[locale]/(protected)/admin/management-user/internal/create/page.tsx @@ -1,13 +1,26 @@ "use client"; -import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; +import { useEffect, useState } from "react"; +import dynamic from "next/dynamic"; +import { Link, useRouter } from "@/i18n/navigation"; import { zodResolver } from "@hookform/resolvers/zod"; import { Check, ChevronsUpDown } from "lucide-react"; import { useForm } from "react-hook-form"; +import Swal from "sweetalert2"; +import withReactContent from "sweetalert2-react-content"; import { z } from "zod"; +import { close, error, loading } from "@/config/swal"; +import { + AdministrationLevelList, + getListCompetencies, + getListEducation, + getListSchools, + saveUserInternal, +} from "@/lib/services/management-user/management-user"; import { cn, getCookiesDecrypt } from "@/lib/utils/utils"; import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; import { Command, CommandEmpty, @@ -24,25 +37,9 @@ import { FormLabel, FormMessage, } from "@/components/ui/form"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { - AdministrationLevelList, - getListCompetencies, - getListEducation, - getListSchools, - saveUserInternal, -} from "@/lib/services/management-user/management-user"; -import { useEffect, useState } from "react"; import { Input } from "@/components/ui/input"; -import { Textarea } from "@/components/ui/textarea"; -import { Link, useRouter } from "@/i18n/navigation"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; -import dynamic from "next/dynamic"; -import { Checkbox } from "@/components/ui/checkbox"; import { Select, SelectContent, @@ -50,9 +47,8 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; -import Swal from "sweetalert2"; -import withReactContent from "sweetalert2-react-content"; -import { close, error, loading } from "@/config/swal"; +import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; +import { Textarea } from "@/components/ui/textarea"; const PasswordChecklist = dynamic(() => import("react-password-checklist"), { ssr: false, @@ -339,10 +335,7 @@ export default function CreateUserForm() {
- +

Data Pengelola Media Hub

{field.value - ? roleList.find((role) => role.value === field.value) - ?.label + ? roleList.find((role) => role.value === field.value)?.label : "Pilih level"} @@ -387,9 +379,7 @@ export default function CreateUserForm() { @@ -410,11 +400,7 @@ export default function CreateUserForm() { Nama Lengkap - + @@ -428,11 +414,7 @@ export default function CreateUserForm() { Username - + @@ -453,16 +435,11 @@ export default function CreateUserForm() { className="flex flex-wrap gap-3 w-1/2" > {roles.map((role) => ( - + - - {role.name} - + {role.name} ))} @@ -494,9 +471,7 @@ export default function CreateUserForm() { > { return checked ? field.onChange([ @@ -505,16 +480,13 @@ export default function CreateUserForm() { ]) : field.onChange( (field.value || []).filter( - (value) => - value !== String(item.typeId) + (value) => value !== String(item.typeId) ) ); }} /> - - {item.name} - + {item.name} ); }} @@ -614,12 +586,7 @@ export default function CreateUserForm() { Nomor Regitrasi Polri {`(NRP)`} - + @@ -653,12 +620,7 @@ export default function CreateUserForm() { Email - + diff --git a/src/app/[locale]/(protected)/admin/management-user/internal/detail/[id]/page.tsx b/src/app/[locale]/(protected)/admin/management-user/internal/detail/[id]/page.tsx index 2f4c3b48..0ee5ce5c 100644 --- a/src/app/[locale]/(protected)/admin/management-user/internal/detail/[id]/page.tsx +++ b/src/app/[locale]/(protected)/admin/management-user/internal/detail/[id]/page.tsx @@ -1,13 +1,28 @@ "use client"; -import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; +import { useEffect, useState } from "react"; +import dynamic from "next/dynamic"; +import { useParams } from "next/navigation"; +import { Link, useRouter } from "@/i18n/navigation"; import { zodResolver } from "@hookform/resolvers/zod"; import { Check, ChevronsUpDown } from "lucide-react"; import { useForm } from "react-hook-form"; +import Swal from "sweetalert2"; +import withReactContent from "sweetalert2-react-content"; import { z } from "zod"; +import { close, error, loading } from "@/config/swal"; +import { + AdministrationLevelList, + getListCompetencies, + getListEducation, + getListSchools, + getUserById, + saveUserInternal, +} from "@/lib/services/management-user/management-user"; import { cn, getCookiesDecrypt } from "@/lib/utils/utils"; import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; import { Command, CommandEmpty, @@ -24,26 +39,9 @@ import { FormLabel, FormMessage, } from "@/components/ui/form"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { - AdministrationLevelList, - getListCompetencies, - getListEducation, - getListSchools, - getUserById, - saveUserInternal, -} from "@/lib/services/management-user/management-user"; -import { useEffect, useState } from "react"; import { Input } from "@/components/ui/input"; -import { Textarea } from "@/components/ui/textarea"; -import { Link, useRouter } from "@/i18n/navigation"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; -import dynamic from "next/dynamic"; -import { Checkbox } from "@/components/ui/checkbox"; import { Select, SelectContent, @@ -51,10 +49,8 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; -import Swal from "sweetalert2"; -import withReactContent from "sweetalert2-react-content"; -import { close, error, loading } from "@/config/swal"; -import { useParams } from "next/navigation"; +import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; +import { Textarea } from "@/components/ui/textarea"; const sns = [ { @@ -364,10 +360,7 @@ export default function DetailUserForm() {
- +

Data Pengelola Media Hub

{field.value - ? roleList.find((role) => role.value === field.value) - ?.label + ? roleList.find((role) => role.value === field.value)?.label : "Pilih level"} @@ -412,9 +404,7 @@ export default function DetailUserForm() { @@ -454,12 +444,7 @@ export default function DetailUserForm() { Username - + @@ -481,16 +466,11 @@ export default function DetailUserForm() { disabled > {roles.map((role) => ( - + - - {role.name} - + {role.name} ))} @@ -523,9 +503,7 @@ export default function DetailUserForm() { { return checked ? field.onChange([ @@ -534,16 +512,13 @@ export default function DetailUserForm() { ]) : field.onChange( (field.value || []).filter( - (value) => - value !== String(item.typeId) + (value) => value !== String(item.typeId) ) ); }} /> - - {item.name} - + {item.name} ); }} @@ -565,11 +540,7 @@ export default function DetailUserForm() { render={({ field }) => ( Pendidikan Terakhir - @@ -594,11 +565,7 @@ export default function DetailUserForm() { render={({ field }) => ( Universitas / Perguruan Tinggi - @@ -623,11 +590,7 @@ export default function DetailUserForm() { render={({ field }) => ( Kompetensi - diff --git a/src/app/[locale]/(protected)/admin/management-user/internal/edit/[id]/page.tsx b/src/app/[locale]/(protected)/admin/management-user/internal/edit/[id]/page.tsx index 433e3dd7..bab160df 100644 --- a/src/app/[locale]/(protected)/admin/management-user/internal/edit/[id]/page.tsx +++ b/src/app/[locale]/(protected)/admin/management-user/internal/edit/[id]/page.tsx @@ -1,13 +1,28 @@ "use client"; -import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; +import { useEffect, useState } from "react"; +import dynamic from "next/dynamic"; +import { useParams } from "next/navigation"; +import { Link, useRouter } from "@/i18n/navigation"; import { zodResolver } from "@hookform/resolvers/zod"; import { Check, ChevronsUpDown } from "lucide-react"; import { useForm } from "react-hook-form"; +import Swal from "sweetalert2"; +import withReactContent from "sweetalert2-react-content"; import { z } from "zod"; +import { close, error, loading } from "@/config/swal"; +import { + AdministrationLevelList, + getListCompetencies, + getListEducation, + getListSchools, + getUserById, + saveUserInternal, +} from "@/lib/services/management-user/management-user"; import { cn, getCookiesDecrypt } from "@/lib/utils/utils"; import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; import { Command, CommandEmpty, @@ -24,26 +39,9 @@ import { FormLabel, FormMessage, } from "@/components/ui/form"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { - AdministrationLevelList, - getListCompetencies, - getListEducation, - getListSchools, - getUserById, - saveUserInternal, -} from "@/lib/services/management-user/management-user"; -import { useEffect, useState } from "react"; import { Input } from "@/components/ui/input"; -import { Textarea } from "@/components/ui/textarea"; -import { Link, useRouter } from "@/i18n/navigation"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; -import dynamic from "next/dynamic"; -import { Checkbox } from "@/components/ui/checkbox"; import { Select, SelectContent, @@ -51,10 +49,8 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; -import Swal from "sweetalert2"; -import withReactContent from "sweetalert2-react-content"; -import { close, error, loading } from "@/config/swal"; -import { useParams } from "next/navigation"; +import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; +import { Textarea } from "@/components/ui/textarea"; const PasswordChecklist = dynamic(() => import("react-password-checklist"), { ssr: false, @@ -367,10 +363,7 @@ export default function EditUserForm() {
- +

Data Pengelola Media Hub

{field.value - ? roleList.find((role) => role.value === field.value) - ?.label + ? roleList.find((role) => role.value === field.value)?.label : "Pilih level"} @@ -415,9 +407,7 @@ export default function EditUserForm() { @@ -438,11 +428,7 @@ export default function EditUserForm() { Nama Lengkap - + @@ -456,11 +442,7 @@ export default function EditUserForm() { Username - + @@ -481,16 +463,11 @@ export default function EditUserForm() { className="flex flex-wrap gap-3 w-1/2" > {roles.map((role) => ( - + - - {role.name} - + {role.name} ))} @@ -522,9 +499,7 @@ export default function EditUserForm() { > { return checked ? field.onChange([ @@ -533,16 +508,13 @@ export default function EditUserForm() { ]) : field.onChange( (field.value || []).filter( - (value) => - value !== String(item.typeId) + (value) => value !== String(item.typeId) ) ); }} /> - - {item.name} - + {item.name} ); }} @@ -642,12 +614,7 @@ export default function EditUserForm() { Nomor Regitrasi Polri {`(NRP)`} - + @@ -681,12 +648,7 @@ export default function EditUserForm() { Email - + diff --git a/src/app/[locale]/(protected)/admin/management-user/page.tsx b/src/app/[locale]/(protected)/admin/management-user/page.tsx index 5720bbc4..02c5d270 100644 --- a/src/app/[locale]/(protected)/admin/management-user/page.tsx +++ b/src/app/[locale]/(protected)/admin/management-user/page.tsx @@ -1,14 +1,16 @@ "use client"; + +import { useEffect, useState } from "react"; +import { Link, useRouter } from "@/i18n/navigation"; +import Cookies from "js-cookie"; +import { PlusIcon } from "lucide-react"; + +import { getCookiesDecrypt } from "@/lib/utils/utils"; +import { Button } from "@/components/ui/button"; import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; import UserExternalTable from "@/components/features/table/management-user/management-user-external-table"; import UserInternalTable from "@/components/features/table/management-user/management-user-internal-table"; -import { Button } from "@/components/ui/button"; import ManagementUserVisualization from "@/components/features/visualization/management-user-viz"; -import { Link, useRouter } from "@/i18n/navigation"; -import { PlusIcon } from "lucide-react"; -import { useEffect, useState } from "react"; -import Cookies from "js-cookie"; -import { getCookiesDecrypt } from "@/lib/utils/utils"; export default function ManagementUser() { const [isInternal, setIsInternal] = useState(true); @@ -38,9 +40,7 @@ export default function ManagementUser() {
-

- Data User {isInternal ? "Internal" : "Eksternal"} -

+

Data User {isInternal ? "Internal" : "Eksternal"}

{isInternal && ( - - - 1 - 10 Data - - - 1 - 50 Data - - - 1 - 100 Data - - - 1 - 250 Data - + + 1 - 10 Data + 1 - 50 Data + 1 - 100 Data + 1 - 250 Data @@ -316,9 +299,7 @@ const NewsTable = () => { key={column.id} className="capitalize" checked={column.getIsVisible()} - onCheckedChange={(value) => - column.toggleVisibility(!!value) - } + onCheckedChange={(value) => column.toggleVisibility(!!value)} > {column.id} @@ -337,10 +318,7 @@ const NewsTable = () => { {header.isPlaceholder ? null - : flexRender( - header.column.columnDef.header, - header.getContext() - )} + : flexRender(header.column.columnDef.header, header.getContext())} ))} @@ -366,11 +344,7 @@ const NewsTable = () => { )} - + {/*
); }; diff --git a/src/app/[locale]/(protected)/admin/media-tracking/media-online/component/column.tsx b/src/app/[locale]/(protected)/admin/media-tracking/media-online/component/column.tsx index e0537acf..6e7c5b9b 100644 --- a/src/app/[locale]/(protected)/admin/media-tracking/media-online/component/column.tsx +++ b/src/app/[locale]/(protected)/admin/media-tracking/media-online/component/column.tsx @@ -1,28 +1,19 @@ import * as React from "react"; -import { ColumnDef } from "@tanstack/react-table"; - -import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; -import { cn } from "@/lib/utils/utils" -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuTrigger, - DropdownMenuItem, -} from "@/components/ui/dropdown-menu"; -import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; -import { - formatDateToIndonesian, - getOnlyDate, - htmlToString, -} from "@/lib/utils/globals"; import { Link, useRouter } from "@/i18n/navigation"; +import { ColumnDef } from "@tanstack/react-table"; +import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; + +import { formatDateToIndonesian, getOnlyDate, htmlToString } from "@/lib/utils/globals"; +import { cn } from "@/lib/utils/utils"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Collapsible, CollapsibleContent } from "@/components/ui/collapsible"; import { Dialog, DialogContent, @@ -30,7 +21,12 @@ import { DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; -import { Collapsible, CollapsibleContent } from "@/components/ui/collapsible"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; const columns: ColumnDef[] = [ { diff --git a/src/app/[locale]/(protected)/admin/media-tracking/media-online/component/table.tsx b/src/app/[locale]/(protected)/admin/media-tracking/media-online/component/table.tsx index d192a792..43b0ef3d 100644 --- a/src/app/[locale]/(protected)/admin/media-tracking/media-online/component/table.tsx +++ b/src/app/[locale]/(protected)/admin/media-tracking/media-online/component/table.tsx @@ -1,30 +1,21 @@ "use client"; import * as React from "react"; +import { useRouter, useSearchParams } from "next/navigation"; +import { Link } from "@/i18n/navigation"; import { ColumnDef, ColumnFiltersState, - PaginationState, - SortingState, - VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, + PaginationState, + SortingState, useReactTable, + VisibilityState, } from "@tanstack/react-table"; -import { Button } from "@/components/ui/button"; - -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "@/components/ui/table"; -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { ChevronLeft, ChevronRight, @@ -37,7 +28,18 @@ import { TrendingUp, UserIcon, } from "lucide-react"; -import { cn } from "@/lib/utils/utils" + +import { close, loading } from "@/config/swal"; +import { getPlanningPagination } from "@/lib/services/agenda-setting/agenda-setting"; +import { paginationBlog } from "@/lib/services/blog/blog"; +import { listDataMedia } from "@/lib/services/broadcast/broadcast"; +import { listEnableCategory } from "@/lib/services/content/content"; +import { ticketingPagination } from "@/lib/services/ticketing/ticketing"; +import { cn } from "@/lib/utils/utils"; +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; import { DropdownMenu, DropdownMenuContent, @@ -48,23 +50,18 @@ import { } from "@/components/ui/dropdown-menu"; import { Input } from "@/components/ui/input"; import { InputGroup, InputGroupText } from "@/components/ui/input-group"; -import { paginationBlog } from "@/lib/services/blog/blog"; -import { ticketingPagination } from "@/lib/services/ticketing/ticketing"; -import { Badge } from "@/components/ui/badge"; -import { useRouter, useSearchParams } from "next/navigation"; -import TablePagination from "@/components/features/table/table-pagination"; -import columns from "./column"; -import { getPlanningPagination } from "@/lib/services/agenda-setting/agenda-setting"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { listDataMedia } from "@/lib/services/broadcast/broadcast"; -import { listEnableCategory } from "@/lib/services/content/content"; -import { Checkbox } from "@/components/ui/checkbox"; -import { close, loading } from "@/config/swal"; -import { Link } from "@/i18n/navigation"; + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import TablePagination from "@/components/features/table/table-pagination"; + +import columns from "./column"; const MediaOnlineTable = () => { const router = useRouter(); @@ -75,11 +72,8 @@ const MediaOnlineTable = () => { const [dataTable, setDataTable] = React.useState([]); const [totalData, setTotalData] = React.useState(1); const [sorting, setSorting] = React.useState([]); - const [columnFilters, setColumnFilters] = React.useState( - [] - ); - const [columnVisibility, setColumnVisibility] = - React.useState({}); + const [columnFilters, setColumnFilters] = React.useState([]); + const [columnVisibility, setColumnVisibility] = React.useState({}); const [rowSelection, setRowSelection] = React.useState({}); const [pagination, setPagination] = React.useState({ pageIndex: 0, @@ -228,22 +222,11 @@ const MediaOnlineTable = () => { - - - 1 - 10 Data - - - 1 - 20 Data - - - 1 - 25 Data - - - 1 - 50 Data - + + 1 - 10 Data + 1 - 20 Data + 1 - 25 Data + 1 - 50 Data @@ -257,10 +240,7 @@ const MediaOnlineTable = () => { {header.isPlaceholder ? null - : flexRender( - header.column.columnDef.header, - header.getContext() - )} + : flexRender(header.column.columnDef.header, header.getContext())} ))} @@ -290,11 +270,7 @@ const MediaOnlineTable = () => { )} - +
); }; diff --git a/src/app/[locale]/(protected)/admin/media-tracking/media-online/create/page.tsx b/src/app/[locale]/(protected)/admin/media-tracking/media-online/create/page.tsx index 8ca3e88f..643ea188 100644 --- a/src/app/[locale]/(protected)/admin/media-tracking/media-online/create/page.tsx +++ b/src/app/[locale]/(protected)/admin/media-tracking/media-online/create/page.tsx @@ -1,9 +1,9 @@ import { Card, CardContent } from "@/components/ui/card"; import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; -import FormTaskTa from "@/components/features/form/task-ta/task-ta-form"; +import FormMediaOnline from "@/components/features/form/media-tracking/media-tracking-form"; import FormAskExpert from "@/components/features/form/shared/ask-expert-form"; import FormDoItYourself from "@/components/features/form/shared/do-it-yourself-form"; -import FormMediaOnline from "@/components/features/form/media-tracking/media-tracking-form"; +import FormTaskTa from "@/components/features/form/task-ta/task-ta-form"; const MediaOnlineCreatePage = () => { return ( diff --git a/src/app/[locale]/(protected)/admin/media-tracking/media-online/page.tsx b/src/app/[locale]/(protected)/admin/media-tracking/media-online/page.tsx index fda27bb6..70c361fa 100644 --- a/src/app/[locale]/(protected)/admin/media-tracking/media-online/page.tsx +++ b/src/app/[locale]/(protected)/admin/media-tracking/media-online/page.tsx @@ -1,4 +1,5 @@ import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; + import MediaOnlineTable from "./component/table"; export default function AdminMediaOnline() { diff --git a/src/app/[locale]/(protected)/admin/media-tracking/page.tsx b/src/app/[locale]/(protected)/admin/media-tracking/page.tsx index 2935d376..eb190d3f 100644 --- a/src/app/[locale]/(protected)/admin/media-tracking/page.tsx +++ b/src/app/[locale]/(protected)/admin/media-tracking/page.tsx @@ -1,4 +1,5 @@ import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; + import NewsTable from "./component/table"; export default function AdminNews() { diff --git a/src/app/[locale]/(protected)/admin/media-tracking/tb-news/component/column.tsx b/src/app/[locale]/(protected)/admin/media-tracking/tb-news/component/column.tsx index 66c4d0d7..a7a28eaf 100644 --- a/src/app/[locale]/(protected)/admin/media-tracking/tb-news/component/column.tsx +++ b/src/app/[locale]/(protected)/admin/media-tracking/tb-news/component/column.tsx @@ -1,28 +1,19 @@ import * as React from "react"; -import { ColumnDef } from "@tanstack/react-table"; - -import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; -import { cn } from "@/lib/utils/utils" -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuTrigger, - DropdownMenuItem, -} from "@/components/ui/dropdown-menu"; -import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; -import { - formatDateToIndonesian, - getOnlyDate, - htmlToString, -} from "@/lib/utils/globals"; import { Link, useRouter } from "@/i18n/navigation"; +import { ColumnDef } from "@tanstack/react-table"; +import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; + +import { formatDateToIndonesian, getOnlyDate, htmlToString } from "@/lib/utils/globals"; +import { cn } from "@/lib/utils/utils"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Collapsible, CollapsibleContent } from "@/components/ui/collapsible"; import { Dialog, DialogContent, @@ -30,7 +21,12 @@ import { DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; -import { Collapsible, CollapsibleContent } from "@/components/ui/collapsible"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; const columns: ColumnDef[] = [ { @@ -66,9 +62,7 @@ const columns: ColumnDef[] = [ - + View diff --git a/src/app/[locale]/(protected)/admin/media-tracking/tb-news/component/table.tsx b/src/app/[locale]/(protected)/admin/media-tracking/tb-news/component/table.tsx index d968d835..dea53d60 100644 --- a/src/app/[locale]/(protected)/admin/media-tracking/tb-news/component/table.tsx +++ b/src/app/[locale]/(protected)/admin/media-tracking/tb-news/component/table.tsx @@ -1,30 +1,21 @@ "use client"; +import { link } from "fs"; import * as React from "react"; +import { usePathname, useRouter, useSearchParams } from "next/navigation"; import { ColumnDef, ColumnFiltersState, - PaginationState, - SortingState, - VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, + PaginationState, + SortingState, useReactTable, + VisibilityState, } from "@tanstack/react-table"; -import { Button } from "@/components/ui/button"; - -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "@/components/ui/table"; -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { ChevronLeft, ChevronRight, @@ -37,21 +28,13 @@ import { TrendingUp, UserIcon, } from "lucide-react"; -import { cn } from "@/lib/utils/utils" -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuRadioGroup, - DropdownMenuRadioItem, - DropdownMenuTrigger, -} from "@/components/ui/dropdown-menu"; -import { usePathname, useRouter, useSearchParams } from "next/navigation"; -import TablePagination from "@/components/features/table/table-pagination"; -import columns from "./column"; -import { listEnableCategory } from "@/lib/services/content/content"; + import { close, loading } from "@/config/swal"; -import { Label } from "@/components/ui/label"; +import { listEnableCategory } from "@/lib/services/content/content"; +import { listDataAll } from "@/lib/services/landing/landing"; +import { cn } from "@/lib/utils/utils"; +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, @@ -60,12 +43,30 @@ import { DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; -import { link } from "fs"; -import { listDataAll } from "@/lib/services/landing/landing"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { Label } from "@/components/ui/label"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import SearchAudioComponent from "@/components/features/form/media-tracking/search-audio-card"; +import SearchDocumentComponent from "@/components/features/form/media-tracking/search-document-card"; import SearchImageComponent from "@/components/features/form/media-tracking/search-image-card"; import SearchVideoComponent from "@/components/features/form/media-tracking/search-video-card"; -import SearchDocumentComponent from "@/components/features/form/media-tracking/search-document-card"; -import SearchAudioComponent from "@/components/features/form/media-tracking/search-audio-card"; +import TablePagination from "@/components/features/table/table-pagination"; + +import columns from "./column"; const NewsTable = () => { const router = useRouter(); @@ -76,13 +77,10 @@ const NewsTable = () => { const [categories, setCategories] = React.useState(); const [dataTable, setDataTable] = React.useState([]); const [sorting, setSorting] = React.useState([]); - const [columnFilters, setColumnFilters] = React.useState( - [] - ); + const [columnFilters, setColumnFilters] = React.useState([]); const [showTable, setShowTable] = React.useState(false); const [onSearch, setOnSearch] = React.useState(""); - const [columnVisibility, setColumnVisibility] = - React.useState({}); + const [columnVisibility, setColumnVisibility] = React.useState({}); const [rowSelection, setRowSelection] = React.useState({}); const [pagination, setPagination] = React.useState({ pageIndex: 0, @@ -148,9 +146,7 @@ const NewsTable = () => { React.useEffect(() => { if (categorie) { - setCategoryFilter( - categorie?.split("&")?.length > 1 ? categorie?.split("&") : [categorie] - ); + setCategoryFilter(categorie?.split("&")?.length > 1 ? categorie?.split("&") : [categorie]); console.log( "Kategori", categorie, @@ -182,9 +178,7 @@ const NewsTable = () => { if (asPath?.includes("/polda/") == true) { if (asPath?.split("/")[2] !== "[polda_name]") { const filter = - categoryFilter?.length > 0 - ? categoryFilter?.sort().join(",") - : categorie || ""; + categoryFilter?.length > 0 ? categoryFilter?.sort().join(",") : categorie || ""; const name = title == undefined ? "" : title; const format = formatFilter == undefined ? "" : formatFilter?.join(","); @@ -226,9 +220,7 @@ const NewsTable = () => { return (
-

- Tracking Berita hari ini! -

+

Tracking Berita hari ini!

@@ -280,10 +272,7 @@ const NewsTable = () => { {header.isPlaceholder ? null - : flexRender( - header.column.columnDef.header, - header.getContext() - )} + : flexRender(header.column.columnDef.header, header.getContext())} ))} @@ -309,11 +298,7 @@ const NewsTable = () => { )} - +
); }; diff --git a/src/app/[locale]/(protected)/admin/media-tracking/tb-news/page.tsx b/src/app/[locale]/(protected)/admin/media-tracking/tb-news/page.tsx index 2935d376..eb190d3f 100644 --- a/src/app/[locale]/(protected)/admin/media-tracking/tb-news/page.tsx +++ b/src/app/[locale]/(protected)/admin/media-tracking/tb-news/page.tsx @@ -1,4 +1,5 @@ import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; + import NewsTable from "./component/table"; export default function AdminNews() { diff --git a/src/app/[locale]/(protected)/admin/settings/banner/component/banner-column.tsx b/src/app/[locale]/(protected)/admin/settings/banner/component/banner-column.tsx index cfb4884e..20271e62 100644 --- a/src/app/[locale]/(protected)/admin/settings/banner/component/banner-column.tsx +++ b/src/app/[locale]/(protected)/admin/settings/banner/component/banner-column.tsx @@ -1,28 +1,19 @@ import * as React from "react"; -import { ColumnDef } from "@tanstack/react-table"; - -import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; -import { cn } from "@/lib/utils/utils" -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuTrigger, - DropdownMenuItem, -} from "@/components/ui/dropdown-menu"; -import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; -import { - formatDateToIndonesian, - getOnlyDate, - htmlToString, -} from "@/lib/utils/globals"; import { Link, useRouter } from "@/i18n/navigation"; +import { ColumnDef } from "@tanstack/react-table"; +import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; + +import { formatDateToIndonesian, getOnlyDate, htmlToString } from "@/lib/utils/globals"; +import { cn } from "@/lib/utils/utils"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Collapsible, CollapsibleContent } from "@/components/ui/collapsible"; import { Dialog, DialogContent, @@ -30,9 +21,15 @@ import { DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; -import { Collapsible, CollapsibleContent } from "@/components/ui/collapsible"; -import StatusToogle from "./status-toogle"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; + import StaticToogle from "./static-toogle"; +import StatusToogle from "./status-toogle"; const columns: ColumnDef[] = [ // { @@ -54,26 +51,19 @@ const columns: ColumnDef[] = [ { accessorKey: "createdAt", header: "Tanggal Unggah", - cell: ({ row }) => ( - {formatDateToIndonesian(row.getValue("createdAt"))} - ), + cell: ({ row }) => {formatDateToIndonesian(row.getValue("createdAt"))}, }, { accessorKey: "isStaticBanner", header: "Static Banner", cell: ({ row }) => ( - + ), }, { accessorKey: "statusName", header: "Status Banner", - cell: ({ row }) => ( - - ), + cell: ({ row }) => , }, { @@ -94,11 +84,7 @@ const columns: ColumnDef[] = [ - - Detail - + Detail diff --git a/src/app/[locale]/(protected)/admin/settings/banner/component/banner-table.tsx b/src/app/[locale]/(protected)/admin/settings/banner/component/banner-table.tsx index c06e65b7..92499c45 100644 --- a/src/app/[locale]/(protected)/admin/settings/banner/component/banner-table.tsx +++ b/src/app/[locale]/(protected)/admin/settings/banner/component/banner-table.tsx @@ -1,19 +1,24 @@ "use client"; import * as React from "react"; +import { useSearchParams } from "next/navigation"; +import { Link, useRouter } from "@/i18n/navigation"; import { ColumnDef, ColumnFiltersState, - PaginationState, - SortingState, - VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, + PaginationState, + SortingState, useReactTable, + VisibilityState, } from "@tanstack/react-table"; + +import { close, loading } from "@/config/swal"; +import { listBanner, listStaticBanner } from "@/lib/services/settings/settings"; import { Table, TableBody, @@ -23,12 +28,7 @@ import { TableRow, } from "@/components/ui/table"; -import { useSearchParams } from "next/navigation"; - -import { close, loading } from "@/config/swal"; -import { Link, useRouter } from "@/i18n/navigation"; import columns from "./banner-column"; -import { listBanner, listStaticBanner } from "@/lib/services/settings/settings"; const BannerListTable = () => { const router = useRouter(); @@ -36,11 +36,8 @@ const BannerListTable = () => { const [showData, setShowData] = React.useState("10"); const [sorting, setSorting] = React.useState([]); - const [columnFilters, setColumnFilters] = React.useState( - [] - ); - const [columnVisibility, setColumnVisibility] = - React.useState({}); + const [columnFilters, setColumnFilters] = React.useState([]); + const [columnVisibility, setColumnVisibility] = React.useState({}); const [rowSelection, setRowSelection] = React.useState({}); const [pagination, setPagination] = React.useState({ pageIndex: 0, @@ -113,10 +110,7 @@ const BannerListTable = () => { {header.isPlaceholder ? null - : flexRender( - header.column.columnDef.header, - header.getContext() - )} + : flexRender(header.column.columnDef.header, header.getContext())} ))} diff --git a/src/app/[locale]/(protected)/admin/settings/banner/component/column.tsx b/src/app/[locale]/(protected)/admin/settings/banner/component/column.tsx index 3684e091..bc1f4e46 100644 --- a/src/app/[locale]/(protected)/admin/settings/banner/component/column.tsx +++ b/src/app/[locale]/(protected)/admin/settings/banner/component/column.tsx @@ -1,28 +1,21 @@ import * as React from "react"; -import { ColumnDef } from "@tanstack/react-table"; - -import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; -import { cn } from "@/lib/utils/utils" -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuTrigger, - DropdownMenuItem, -} from "@/components/ui/dropdown-menu"; -import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; -import { - formatDateToIndonesian, - getOnlyDate, - htmlToString, -} from "@/lib/utils/globals"; import { Link, useRouter } from "@/i18n/navigation"; +import { ColumnDef } from "@tanstack/react-table"; +import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; + +import { error } from "@/config/swal"; +import { setBanner } from "@/lib/services/settings/settings"; +import { formatDateToIndonesian, getOnlyDate, htmlToString } from "@/lib/utils/globals"; +import { cn } from "@/lib/utils/utils"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Collapsible, CollapsibleContent } from "@/components/ui/collapsible"; import { Dialog, DialogContent, @@ -30,9 +23,12 @@ import { DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; -import { Collapsible, CollapsibleContent } from "@/components/ui/collapsible"; -import { setBanner } from "@/lib/services/settings/settings"; -import { error } from "@/config/swal"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; import { useToast } from "@/components/ui/use-toast"; const columns: ColumnDef[] = [ @@ -55,9 +51,7 @@ const columns: ColumnDef[] = [ { accessorKey: "createdAt", header: "Tanggal Unggah", - cell: ({ row }) => ( - {formatDateToIndonesian(row.getValue("createdAt"))} - ), + cell: ({ row }) => {formatDateToIndonesian(row.getValue("createdAt"))}, }, { @@ -92,16 +86,10 @@ const columns: ColumnDef[] = [ - - Detail - + Detail - handleBanner(row.original.id)}> - Jadikan Banner - + handleBanner(row.original.id)}>Jadikan Banner diff --git a/src/app/[locale]/(protected)/admin/settings/banner/component/static-toogle.tsx b/src/app/[locale]/(protected)/admin/settings/banner/component/static-toogle.tsx index 6ba2025a..ac7dc8e3 100644 --- a/src/app/[locale]/(protected)/admin/settings/banner/component/static-toogle.tsx +++ b/src/app/[locale]/(protected)/admin/settings/banner/component/static-toogle.tsx @@ -1,12 +1,10 @@ +import { useRouter } from "@/i18n/navigation"; + +import { setStaticBanner } from "@/lib/services/settings/settings"; import { Switch } from "@/components/ui/switch"; import { useToast } from "@/components/ui/use-toast"; -import { useRouter } from "@/i18n/navigation"; -import { setStaticBanner } from "@/lib/services/settings/settings"; -export default function StaticToogle(props: { - id: number; - initChecked: boolean; -}) { +export default function StaticToogle(props: { id: number; initChecked: boolean }) { const { id, initChecked } = props; const { toast } = useToast(); const router = useRouter(); diff --git a/src/app/[locale]/(protected)/admin/settings/banner/component/status-toogle.tsx b/src/app/[locale]/(protected)/admin/settings/banner/component/status-toogle.tsx index 40378d69..c1f242d8 100644 --- a/src/app/[locale]/(protected)/admin/settings/banner/component/status-toogle.tsx +++ b/src/app/[locale]/(protected)/admin/settings/banner/component/status-toogle.tsx @@ -1,12 +1,10 @@ +import { useRouter } from "@/i18n/navigation"; + +import { setBanner } from "@/lib/services/settings/settings"; import { Switch } from "@/components/ui/switch"; import { useToast } from "@/components/ui/use-toast"; -import { useRouter } from "@/i18n/navigation"; -import { setBanner } from "@/lib/services/settings/settings"; -export default function StatusToogle(props: { - id: number; - initChecked: boolean; -}) { +export default function StatusToogle(props: { id: number; initChecked: boolean }) { const { id, initChecked } = props; const { toast } = useToast(); const router = useRouter(); @@ -28,10 +26,6 @@ export default function StatusToogle(props: { router.push("/admin/settings/banner?dataChange=true"); }; return ( - disableBanner()} - /> + disableBanner()} /> ); } diff --git a/src/app/[locale]/(protected)/admin/settings/banner/component/table.tsx b/src/app/[locale]/(protected)/admin/settings/banner/component/table.tsx index a1b5b120..5366b1cd 100644 --- a/src/app/[locale]/(protected)/admin/settings/banner/component/table.tsx +++ b/src/app/[locale]/(protected)/admin/settings/banner/component/table.tsx @@ -1,30 +1,21 @@ "use client"; import * as React from "react"; +import { useRouter, useSearchParams } from "next/navigation"; +import { Link } from "@/i18n/navigation"; import { ColumnDef, ColumnFiltersState, - PaginationState, - SortingState, - VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, + PaginationState, + SortingState, useReactTable, + VisibilityState, } from "@tanstack/react-table"; -import { Button } from "@/components/ui/button"; - -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "@/components/ui/table"; -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { ChevronLeft, ChevronRight, @@ -37,7 +28,18 @@ import { TrendingUp, UserIcon, } from "lucide-react"; -import { cn } from "@/lib/utils/utils" + +import { close, loading } from "@/config/swal"; +import { getPlanningPagination } from "@/lib/services/agenda-setting/agenda-setting"; +import { paginationBlog } from "@/lib/services/blog/blog"; +import { listDataMedia } from "@/lib/services/broadcast/broadcast"; +import { listEnableCategory } from "@/lib/services/content/content"; +import { ticketingPagination } from "@/lib/services/ticketing/ticketing"; +import { cn } from "@/lib/utils/utils"; +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; import { DropdownMenu, DropdownMenuContent, @@ -48,23 +50,18 @@ import { } from "@/components/ui/dropdown-menu"; import { Input } from "@/components/ui/input"; import { InputGroup, InputGroupText } from "@/components/ui/input-group"; -import { paginationBlog } from "@/lib/services/blog/blog"; -import { ticketingPagination } from "@/lib/services/ticketing/ticketing"; -import { Badge } from "@/components/ui/badge"; -import { useRouter, useSearchParams } from "next/navigation"; -import TablePagination from "@/components/features/table/table-pagination"; -import columns from "./column"; -import { getPlanningPagination } from "@/lib/services/agenda-setting/agenda-setting"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { listDataMedia } from "@/lib/services/broadcast/broadcast"; -import { listEnableCategory } from "@/lib/services/content/content"; -import { Checkbox } from "@/components/ui/checkbox"; -import { close, loading } from "@/config/swal"; -import { Link } from "@/i18n/navigation"; + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import TablePagination from "@/components/features/table/table-pagination"; + +import columns from "./column"; const ContentListTable = () => { const router = useRouter(); @@ -74,11 +71,8 @@ const ContentListTable = () => { const [dataTable, setDataTable] = React.useState([]); const [totalData, setTotalData] = React.useState(1); const [sorting, setSorting] = React.useState([]); - const [columnFilters, setColumnFilters] = React.useState( - [] - ); - const [columnVisibility, setColumnVisibility] = - React.useState({}); + const [columnFilters, setColumnFilters] = React.useState([]); + const [columnVisibility, setColumnVisibility] = React.useState({}); const [rowSelection, setRowSelection] = React.useState({}); const [pagination, setPagination] = React.useState({ pageIndex: 0, @@ -218,22 +212,11 @@ const ContentListTable = () => { - - - 1 - 10 Data - - - 1 - 20 Data - - - 1 - 25 Data - - - 1 - 50 Data - + + 1 - 10 Data + 1 - 20 Data + 1 - 25 Data + 1 - 50 Data @@ -247,10 +230,7 @@ const ContentListTable = () => {
@@ -261,9 +241,7 @@ const ContentListTable = () => { - handleChange("category", category.id, Boolean(e)) - } + onCheckedChange={(e) => handleChange("category", category.id, Boolean(e))} />
@@ -555,10 +508,7 @@ export default function CreateCategoryModal() { className="w-[30%]" alt="thumbnail" /> - handleRemoveFile(files[0])} - className="cursor-pointer" - > + handleRemoveFile(files[0])} className="cursor-pointer">
@@ -583,12 +533,7 @@ export default function CreateCategoryModal() { )} /> - diff --git a/src/app/[locale]/(protected)/admin/settings/category/component/edit.tsx b/src/app/[locale]/(protected)/admin/settings/category/component/edit.tsx index b6841306..6f021fbc 100644 --- a/src/app/[locale]/(protected)/admin/settings/category/component/edit.tsx +++ b/src/app/[locale]/(protected)/admin/settings/category/component/edit.tsx @@ -1,6 +1,20 @@ "use client"; +import { Fragment, useEffect, useState } from "react"; +import { useRouter } from "@/i18n/navigation"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { Icon } from "@iconify/react/dist/iconify.js"; +import Cookies from "js-cookie"; +import { CloudUpload } from "lucide-react"; +import { useDropzone } from "react-dropzone"; +import { useForm } from "react-hook-form"; +import { z } from "zod"; + +import { close, error, loading } from "@/config/swal"; +import { getCategoryDetail, getUserRoles, postCategory } from "@/lib/services/settings/settings"; +import { getCookiesDecrypt } from "@/lib/utils/utils"; import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; import { Dialog, DialogContent, @@ -9,9 +23,6 @@ import { DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; -import { z } from "zod"; -import { useForm } from "react-hook-form"; -import { zodResolver } from "@hookform/resolvers/zod"; import { Form, FormControl, @@ -21,25 +32,12 @@ import { FormLabel, FormMessage, } from "@/components/ui/form"; -import { useRouter } from "@/i18n/navigation"; import { Input } from "@/components/ui/input"; -import { Checkbox } from "@/components/ui/checkbox"; -import { - getCategoryDetail, - getUserRoles, - postCategory, -} from "@/lib/services/settings/settings"; -import { Fragment, useEffect, useState } from "react"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; -import { Icon } from "@iconify/react/dist/iconify.js"; import { Textarea } from "@/components/ui/textarea"; -import { close, error, loading } from "@/config/swal"; -import { UnitMapping } from "./unit-mapping"; -import { useDropzone } from "react-dropzone"; -import { CloudUpload } from "lucide-react"; import { useToast } from "@/components/ui/use-toast"; -import Cookies from "js-cookie"; -import { getCookiesDecrypt } from "@/lib/utils/utils"; + +import { UnitMapping } from "./unit-mapping"; const FormSchema = z.object({ title: z.string({ @@ -48,16 +46,12 @@ const FormSchema = z.object({ description: z.string({ required_error: "Required", }), - contentType: z - .array(z.string()) - .refine((value) => value.some((item) => item), { - message: "Required", - }), - selectedUser: z - .array(z.string()) - .refine((value) => value.some((item) => item), { - message: "Required", - }), + contentType: z.array(z.string()).refine((value) => value.some((item) => item), { + message: "Required", + }), + selectedUser: z.array(z.string()).refine((value) => value.some((item) => item), { + message: "Required", + }), publishTo: z.array(z.string()).refine((value) => value.some((item) => item), { message: "Required", }), @@ -122,9 +116,7 @@ export default function EditCategoryModal(props: { const router = useRouter(); const [satkerData, setSatkerData] = useState([]); const [unitData, setUnitData] = useState([]); - const [userList, setUserList] = useState< - { id: string; name: string; isInternal: boolean }[] - >([]); + const [userList, setUserList] = useState<{ id: string; name: string; isInternal: boolean }[]>([]); const form = useForm>({ resolver: zodResolver(FormSchema), @@ -147,10 +139,7 @@ export default function EditCategoryModal(props: { form.setValue("title", String(data?.name)); form.setValue("description", String(data?.description)); form.setValue("contentType", data?.mediaTypes?.split(",")); - form.setValue( - "selectedUser", - removeAndReturn(data?.publishedFor, [2, 3, 4]) - ); + form.setValue("selectedUser", removeAndReturn(data?.publishedFor, [2, 3, 4])); form.setValue("publishTo", data?.publishedLocation?.split(",")); form.setValue("file", thumbnailLink); @@ -183,17 +172,13 @@ export default function EditCategoryModal(props: { } const contentType = form.watch("contentType"); - const isAllContentChecked = listContent.every((item) => - contentType?.includes(item.id) - ); + const isAllContentChecked = listContent.every((item) => contentType?.includes(item.id)); const users = form.watch("selectedUser"); const isAllUserChecked = userList.every((item) => users?.includes(item.id)); const target = form.watch("publishTo"); - const isAllTargetChecked = publishToList.every((item) => - target?.includes(item.id) - ); + const isAllTargetChecked = publishToList.every((item) => target?.includes(item.id)); useEffect(() => { getRoles(); @@ -223,10 +208,10 @@ export default function EditCategoryModal(props: { unitData?.length > 0 && satkerData?.length > 0 ? unit + "," + satker : unitData?.length > 0 - ? unit - : satkerData?.length > 0 - ? satker - : ""; + ? unit + : satkerData?.length > 0 + ? satker + : ""; formMedia.append("id", data.id); formMedia.append("name", data.title); @@ -262,10 +247,7 @@ export default function EditCategoryModal(props: { return ( - setIsOpen(true)} - className="hover:underline cursor-pointer" - > + setIsOpen(true)} className="hover:underline cursor-pointer"> {isDetail ? "Detail" : "Edit"} @@ -274,10 +256,7 @@ export default function EditCategoryModal(props: { Edit Kategori - + { return ( - +
{ return checked - ? field.onChange([ - ...field.value, - item.id, - ]) + ? field.onChange([...field.value, item.id]) : field.onChange( - field.value?.filter( - (value) => value !== item.id - ) + field.value?.filter((value) => value !== item.id) ); }} /> - - {item.name} - + {item.name}
); @@ -385,10 +354,7 @@ export default function EditCategoryModal(props: { name="selectedUser" render={({ field }) => { return ( - +
{ return checked - ? field.onChange([ - ...field.value, - item.id, - ]) + ? field.onChange([...field.value, item.id]) : field.onChange( - field.value?.filter( - (value) => value !== item.id - ) + field.value?.filter((value) => value !== item.id) ); }} /> - - {item.name} - + {item.name}
); @@ -460,10 +419,7 @@ export default function EditCategoryModal(props: { name="publishTo" render={({ field }) => { return ( - +
{ return checked - ? field.onChange([ - ...field.value, - item.id, - ]) + ? field.onChange([...field.value, item.id]) : field.onChange( - field.value?.filter( - (value) => value !== item.id - ) + field.value?.filter((value) => value !== item.id) ); }} /> - - {item.name}{" "} - + {item.name}
); @@ -576,8 +525,8 @@ export default function EditCategoryModal(props: { Tarik file disini atau klik untuk upload.
- ( Upload file dengan format .jpg, .jpeg, atau - .png. Ukuran maksimal 100mb.) + ( Upload file dengan format .jpg, .jpeg, atau .png. Ukuran maksimal + 100mb.)
@@ -585,15 +534,8 @@ export default function EditCategoryModal(props: { )} {field.value !== "" && ( @@ -606,10 +548,7 @@ export default function EditCategoryModal(props: { className="w-[30%]" alt="thumbnail" /> - handleRemoveFile(files[0])} - className="cursor-pointer" - > + handleRemoveFile(files[0])} className="cursor-pointer">
@@ -642,12 +581,7 @@ export default function EditCategoryModal(props: { /> {!isDetail && ( - diff --git a/src/app/[locale]/(protected)/admin/settings/category/component/status.tsx b/src/app/[locale]/(protected)/admin/settings/category/component/status.tsx index 64ef54d4..a6c8d54f 100644 --- a/src/app/[locale]/(protected)/admin/settings/category/component/status.tsx +++ b/src/app/[locale]/(protected)/admin/settings/category/component/status.tsx @@ -1,13 +1,12 @@ "use client"; -import { Switch } from "@/components/ui/switch"; -import { error } from "@/config/swal"; -import { useRouter } from "@/i18n/navigation"; -import { publishUnpublishCategory } from "@/lib/services/settings/settings"; -export default function StatusToogle(props: { - id: number; - initValue: boolean; -}) { +import { useRouter } from "@/i18n/navigation"; + +import { error } from "@/config/swal"; +import { publishUnpublishCategory } from "@/lib/services/settings/settings"; +import { Switch } from "@/components/ui/switch"; + +export default function StatusToogle(props: { id: number; initValue: boolean }) { const { id, initValue } = props; const router = useRouter(); const publishCategory = async (id: number, status: string) => { diff --git a/src/app/[locale]/(protected)/admin/settings/category/component/table.tsx b/src/app/[locale]/(protected)/admin/settings/category/component/table.tsx index 3bcf5d70..827ddb7b 100644 --- a/src/app/[locale]/(protected)/admin/settings/category/component/table.tsx +++ b/src/app/[locale]/(protected)/admin/settings/category/component/table.tsx @@ -1,40 +1,28 @@ "use client"; import * as React from "react"; +import { useSearchParams } from "next/navigation"; +import { Link, useRouter } from "@/i18n/navigation"; import { ColumnDef, ColumnFiltersState, - PaginationState, - SortingState, - VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, + PaginationState, + SortingState, useReactTable, + VisibilityState, } from "@tanstack/react-table"; -import { Button } from "@/components/ui/button"; +import { useTranslations } from "next-intl"; -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "@/components/ui/table"; - -import { useSearchParams } from "next/navigation"; -import TablePagination from "@/components/features/table/table-pagination"; -import columns from "./column"; - -import { listEnableCategory } from "@/lib/services/content/content"; -import { Checkbox } from "@/components/ui/checkbox"; import { close, loading } from "@/config/swal"; -import { Link, useRouter } from "@/i18n/navigation"; -import { NewCampaignIcon } from "@/components/icon"; +import { listEnableCategory } from "@/lib/services/content/content"; import { getCategories } from "@/lib/services/settings/settings"; +import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; import { Dialog, DialogContent, @@ -43,13 +31,20 @@ import { DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; -import CreateCategoryModal from "./create"; -import { useTranslations } from "next-intl"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import TablePagination from "@/components/features/table/table-pagination"; +import { NewCampaignIcon } from "@/components/icon"; + +import columns from "./column"; +import CreateCategoryModal from "./create"; const AdminCategoryTable = () => { const router = useRouter(); @@ -63,11 +58,8 @@ const AdminCategoryTable = () => { const [region, setRegion] = React.useState(); const [regionFilter, setRegionFilter] = React.useState([]); const [statusFilter, setStatusFilter] = React.useState([]); - const [columnFilters, setColumnFilters] = React.useState( - [] - ); - const [columnVisibility, setColumnVisibility] = - React.useState({}); + const [columnFilters, setColumnFilters] = React.useState([]); + const [columnVisibility, setColumnVisibility] = React.useState({}); const [rowSelection, setRowSelection] = React.useState({}); const [pagination, setPagination] = React.useState({ pageIndex: 0, @@ -127,18 +119,11 @@ const AdminCategoryTable = () => { try { loading(); - const regionQuery = regionFilter.length - ? `&publishedLocation=${regionFilter.join(",")}` - : ""; + const regionQuery = regionFilter.length ? `&publishedLocation=${regionFilter.join(",")}` : ""; - const statusQuery = statusFilter.length - ? `&isPublish=${statusFilter.join(",")}` - : ""; + const statusQuery = statusFilter.length ? `&isPublish=${statusFilter.join(",")}` : ""; - const response = await getCategories( - page - 1, - `${regionQuery}${statusQuery}` - ); + const response = await getCategories(page - 1, `${regionQuery}${statusQuery}`); const data = response?.data?.data; const contentData = data?.content; @@ -166,9 +151,7 @@ const AdminCategoryTable = () => { setRegionFilter([]); } } else { - let updated = checked - ? [...regionFilter, id] - : regionFilter.filter((val) => val !== id); + let updated = checked ? [...regionFilter, id] : regionFilter.filter((val) => val !== id); // Jika semua sudah tercentang, maka otomatis centang "semua" const allIds = ["mabes", "polda", "satker", "internasional"]; @@ -202,10 +185,7 @@ const AdminCategoryTable = () => {
@@ -217,14 +197,12 @@ const AdminCategoryTable = () => { id={region.id} checked={ region.id === "semua" - ? ["mabes", "polda", "satker", "internasional"].every( - (val) => regionFilter.includes(val) + ? ["mabes", "polda", "satker", "internasional"].every((val) => + regionFilter.includes(val) ) : regionFilter.includes(region.id) } - onCheckedChange={(e) => - handleChange("region", region.id, Boolean(e)) - } + onCheckedChange={(e) => handleChange("region", region.id, Boolean(e))} />
@@ -254,14 +227,9 @@ const AdminCategoryTable = () => { - handleChange("status", "false", Boolean(e)) - } + onCheckedChange={(e) => handleChange("status", "false", Boolean(e))} /> -
@@ -278,10 +246,7 @@ const AdminCategoryTable = () => { {header.isPlaceholder ? null - : flexRender( - header.column.columnDef.header, - header.getContext() - )} + : flexRender(header.column.columnDef.header, header.getContext())} ))} @@ -311,11 +276,7 @@ const AdminCategoryTable = () => { )} - +
); }; diff --git a/src/app/[locale]/(protected)/admin/settings/category/component/unit-mapping.tsx b/src/app/[locale]/(protected)/admin/settings/category/component/unit-mapping.tsx index 10b1d7bb..f1a90b13 100644 --- a/src/app/[locale]/(protected)/admin/settings/category/component/unit-mapping.tsx +++ b/src/app/[locale]/(protected)/admin/settings/category/component/unit-mapping.tsx @@ -1,5 +1,21 @@ "use client"; + +import { useEffect, useState } from "react"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useForm } from "react-hook-form"; +import { z } from "zod"; + +import { getUserLevelForAssignments } from "@/lib/services/task"; import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; +import { + Dialog, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; import { Form, FormControl, @@ -9,22 +25,8 @@ import { FormLabel, FormMessage, } from "@/components/ui/form"; -import { - Dialog, - DialogContent, - DialogFooter, - DialogHeader, - DialogTitle, - DialogTrigger, -} from "@/components/ui/dialog"; -import { Checkbox } from "@/components/ui/checkbox"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; -import { zodResolver } from "@hookform/resolvers/zod"; -import { useForm } from "react-hook-form"; -import { z } from "zod"; -import { useEffect, useState } from "react"; -import { getUserLevelForAssignments } from "@/lib/services/task"; const FormSchema = z.object({ items: z.array(z.string()).refine((value) => value.some((item) => item), { @@ -46,9 +48,7 @@ export function UnitMapping(props: { }) { const { unit, sendDataToParent, isDetail } = props; const [unitList, setUnitList] = useState([]); - const [satkerList, setSatkerList] = useState<{ id: number; name: string }[]>( - [] - ); + const [satkerList, setSatkerList] = useState<{ id: number; name: string }[]>([]); const [isOpen, setIsOpen] = useState(false); const form = useForm>({ resolver: zodResolver(FormSchema), @@ -68,12 +68,8 @@ export function UnitMapping(props: { const unitType = form.watch("items"); - const isAllUnitChecked = unitList.every((item) => - unitType?.includes(String(item.id)) - ); - const isAllSatkerChecked = satkerList.every((item) => - unitType?.includes(String(item.id)) - ); + const isAllUnitChecked = unitList.every((item) => unitType?.includes(String(item.id))); + const isAllSatkerChecked = satkerList.every((item) => unitType?.includes(String(item.id))); const setupUnit = (data: UnitType[]) => { const temp = data.filter((a) => a.name.includes("POLDA")); @@ -89,10 +85,7 @@ export function UnitMapping(props: { return ( - setIsOpen(true)} - className="text-primary cursor-pointer text-xs mr-3" - > + setIsOpen(true)} className="text-primary cursor-pointer text-xs mr-3"> Pilih {unit} @@ -127,9 +120,7 @@ export function UnitMapping(props: { control={form.control} name="items" render={() => ( - + {unitList?.map((item: any) => ( { return checked - ? field.onChange([ - ...field.value, - String(item.id), - ]) + ? field.onChange([...field.value, String(item.id)]) : field.onChange( - field.value?.filter( - (value) => value !== String(item.id) - ) + field.value?.filter((value) => value !== String(item.id)) ); }} /> @@ -200,9 +184,7 @@ export function UnitMapping(props: { control={form.control} name="items" render={() => ( - + {satkerList?.map((item: any) => ( { return checked - ? field.onChange([ - ...field.value, - String(item.id), - ]) + ? field.onChange([...field.value, String(item.id)]) : field.onChange( - field.value?.filter( - (value) => value !== String(item.id) - ) + field.value?.filter((value) => value !== String(item.id)) ); }} /> diff --git a/src/app/[locale]/(protected)/admin/settings/category/page.tsx b/src/app/[locale]/(protected)/admin/settings/category/page.tsx index 9b994f7e..d4b5e044 100644 --- a/src/app/[locale]/(protected)/admin/settings/category/page.tsx +++ b/src/app/[locale]/(protected)/admin/settings/category/page.tsx @@ -1,5 +1,7 @@ "use client"; + import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; + import AdminCategoryTable from "./component/table"; export default function AdminCategory() { diff --git a/src/app/[locale]/(protected)/admin/settings/faq/component/column.tsx b/src/app/[locale]/(protected)/admin/settings/faq/component/column.tsx index 4b73769e..4440f720 100644 --- a/src/app/[locale]/(protected)/admin/settings/faq/component/column.tsx +++ b/src/app/[locale]/(protected)/admin/settings/faq/component/column.tsx @@ -1,34 +1,25 @@ import * as React from "react"; +import { Link, useRouter } from "@/i18n/navigation"; import { ColumnDef } from "@tanstack/react-table"; - import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; -import { cn } from "@/lib/utils/utils" + +import { error } from "@/config/swal"; +import { deleteCategory, deleteDataFAQ } from "@/lib/services/settings/settings"; +import { htmlToString } from "@/lib/utils/globals"; +import { cn } from "@/lib/utils/utils"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, - DropdownMenuTrigger, DropdownMenuItem, + DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; -import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; - -import { Link, useRouter } from "@/i18n/navigation"; -import { error } from "@/config/swal"; -import { deleteCategory, deleteDataFAQ } from "@/lib/services/settings/settings"; -import { useToast } from "@/components/ui/use-toast"; +import { Menubar, MenubarContent, MenubarMenu, MenubarTrigger } from "@/components/ui/menubar"; // import EditCategoryModal from "./edit"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { - Menubar, - MenubarContent, - MenubarMenu, - MenubarTrigger, -} from "@/components/ui/menubar"; -import { htmlToString } from "@/lib/utils/globals"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import { useToast } from "@/components/ui/use-toast"; + import EditFAQModal from "./edit"; const columns: ColumnDef[] = [ @@ -42,19 +33,13 @@ const columns: ColumnDef[] = [ accessorKey: "question", header: "Pertanyaan", cell: ({ row }) => ( - - {htmlToString(row.getValue("question"))} - + {htmlToString(row.getValue("question"))} ), }, { accessorKey: "answer", header: "Answer", - cell: ({ row }) => ( - - {htmlToString(row.getValue("answer"))} - - ), + cell: ({ row }) => {htmlToString(row.getValue("answer"))}, }, { diff --git a/src/app/[locale]/(protected)/admin/settings/faq/component/create.tsx b/src/app/[locale]/(protected)/admin/settings/faq/component/create.tsx index 8c7821aa..129aefb5 100644 --- a/src/app/[locale]/(protected)/admin/settings/faq/component/create.tsx +++ b/src/app/[locale]/(protected)/admin/settings/faq/component/create.tsx @@ -1,6 +1,22 @@ "use client"; +import { stringify } from "querystring"; +import { Fragment, useEffect, useState } from "react"; +import Image from "next/image"; +import { useRouter } from "@/i18n/navigation"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { Icon } from "@iconify/react/dist/iconify.js"; +import { CloudUpload } from "lucide-react"; +import { useTranslations } from "next-intl"; +import { useDropzone } from "react-dropzone"; +import { useForm } from "react-hook-form"; +import { Upload } from "tus-js-client"; +import { z } from "zod"; + +import { close, error, loading } from "@/config/swal"; +import { getUserRoles, postCategory, postDataFAQ } from "@/lib/services/settings/settings"; import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; import { Dialog, DialogContent, @@ -9,9 +25,6 @@ import { DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; -import { z } from "zod"; -import { useForm } from "react-hook-form"; -import { zodResolver } from "@hookform/resolvers/zod"; import { Form, FormControl, @@ -21,26 +34,10 @@ import { FormLabel, FormMessage, } from "@/components/ui/form"; -import { useRouter } from "@/i18n/navigation"; import { Input } from "@/components/ui/input"; -import { Checkbox } from "@/components/ui/checkbox"; -import { - getUserRoles, - postCategory, - postDataFAQ, -} from "@/lib/services/settings/settings"; -import { Fragment, useEffect, useState } from "react"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; -import { Icon } from "@iconify/react/dist/iconify.js"; import { Textarea } from "@/components/ui/textarea"; -import { close, error, loading } from "@/config/swal"; import { useToast } from "@/components/ui/use-toast"; -import { stringify } from "querystring"; -import { useDropzone } from "react-dropzone"; -import { CloudUpload } from "lucide-react"; -import Image from "next/image"; -import { Upload } from "tus-js-client"; -import { useTranslations } from "next-intl"; const FormSchema = z.object({ answer: z.string({ @@ -91,9 +88,7 @@ export default function CreateFAQModal() { }); const target = form.watch("publishTo"); - const isAllTargetChecked = publishToList.every((item) => - target?.includes(item.id) - ); + const isAllTargetChecked = publishToList.every((item) => target?.includes(item.id)); const onSubmit = async (data: z.infer) => { const request = { @@ -129,10 +124,7 @@ export default function CreateFAQModal() { {t("add")} FAQ - + - - Internasional - + Internasional @@ -283,12 +273,7 @@ export default function CreateFAQModal() { )} /> - diff --git a/src/app/[locale]/(protected)/admin/settings/faq/component/edit.tsx b/src/app/[locale]/(protected)/admin/settings/faq/component/edit.tsx index 2b252df0..26e6812e 100644 --- a/src/app/[locale]/(protected)/admin/settings/faq/component/edit.tsx +++ b/src/app/[locale]/(protected)/admin/settings/faq/component/edit.tsx @@ -1,6 +1,28 @@ "use client"; +import { stringify } from "querystring"; +import { Fragment, useEffect, useState } from "react"; +import Image from "next/image"; +import { useRouter } from "@/i18n/navigation"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { Icon } from "@iconify/react/dist/iconify.js"; +import { id } from "date-fns/locale"; +import { CloudUpload } from "lucide-react"; +import { useDropzone } from "react-dropzone"; +import { useForm } from "react-hook-form"; +import { Upload } from "tus-js-client"; +import { z } from "zod"; + +import { close, error, loading } from "@/config/swal"; +import { + detailDataFAQ, + getUserRoles, + postCategory, + postDataFAQ, +} from "@/lib/services/settings/settings"; +import { htmlToString } from "@/lib/utils/globals"; import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; import { Dialog, DialogContent, @@ -9,9 +31,6 @@ import { DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; -import { z } from "zod"; -import { useForm } from "react-hook-form"; -import { zodResolver } from "@hookform/resolvers/zod"; import { Form, FormControl, @@ -21,28 +40,10 @@ import { FormLabel, FormMessage, } from "@/components/ui/form"; -import { useRouter } from "@/i18n/navigation"; import { Input } from "@/components/ui/input"; -import { Checkbox } from "@/components/ui/checkbox"; -import { - detailDataFAQ, - getUserRoles, - postCategory, - postDataFAQ, -} from "@/lib/services/settings/settings"; -import { Fragment, useEffect, useState } from "react"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; -import { Icon } from "@iconify/react/dist/iconify.js"; import { Textarea } from "@/components/ui/textarea"; -import { close, error, loading } from "@/config/swal"; import { useToast } from "@/components/ui/use-toast"; -import { stringify } from "querystring"; -import { useDropzone } from "react-dropzone"; -import { CloudUpload } from "lucide-react"; -import Image from "next/image"; -import { Upload } from "tus-js-client"; -import { id } from "date-fns/locale"; -import { htmlToString } from "@/lib/utils/globals"; const FormSchema = z.object({ answer: z.string({ @@ -99,10 +100,7 @@ export default function EditFAQModal(props: { id: string; isDetail: boolean }) { const data = res?.data?.data; form.setValue("question", htmlToString(data.question)); form.setValue("answer", htmlToString(data.answer)); - form.setValue( - "publishTo", - data.isInternational ? "international" : "wilayah" - ); + form.setValue("publishTo", data.isInternational ? "international" : "wilayah"); }; const onSubmit = async (data: z.infer) => { @@ -131,19 +129,14 @@ export default function EditFAQModal(props: { id: string; isDetail: boolean }) { return ( - - {isDetail ? "Detail" : "Edit"} - + {isDetail ? "Detail" : "Edit"} {isDetail ? "Detail" : "Edit"} FAQ - + - - Internasional - + Internasional @@ -307,12 +298,7 @@ export default function EditFAQModal(props: { id: string; isDetail: boolean }) { /> {!isDetail && ( - diff --git a/src/app/[locale]/(protected)/admin/settings/faq/component/table.tsx b/src/app/[locale]/(protected)/admin/settings/faq/component/table.tsx index f1a04b77..f9f226ea 100644 --- a/src/app/[locale]/(protected)/admin/settings/faq/component/table.tsx +++ b/src/app/[locale]/(protected)/admin/settings/faq/component/table.tsx @@ -1,40 +1,27 @@ "use client"; import * as React from "react"; +import { useSearchParams } from "next/navigation"; +import { Link, useRouter } from "@/i18n/navigation"; import { ColumnDef, ColumnFiltersState, - PaginationState, - SortingState, - VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, + PaginationState, + SortingState, useReactTable, + VisibilityState, } from "@tanstack/react-table"; -import { Button } from "@/components/ui/button"; -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "@/components/ui/table"; - -import { useSearchParams } from "next/navigation"; -import TablePagination from "@/components/features/table/table-pagination"; -import columns from "./column"; - -import { listEnableCategory } from "@/lib/services/content/content"; -import { Checkbox } from "@/components/ui/checkbox"; import { close, loading } from "@/config/swal"; -import { Link, useRouter } from "@/i18n/navigation"; -import { NewCampaignIcon } from "@/components/icon"; +import { listEnableCategory } from "@/lib/services/content/content"; import { getCategories, getListFAQ } from "@/lib/services/settings/settings"; +import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; import { Dialog, DialogContent, @@ -43,6 +30,18 @@ import { DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import TablePagination from "@/components/features/table/table-pagination"; +import { NewCampaignIcon } from "@/components/icon"; + +import columns from "./column"; import CreateFAQModal from "./create"; const AdminFAQTable = () => { @@ -53,11 +52,8 @@ const AdminFAQTable = () => { const [dataTable, setDataTable] = React.useState([]); const [totalData, setTotalData] = React.useState(1); const [sorting, setSorting] = React.useState([]); - const [columnFilters, setColumnFilters] = React.useState( - [] - ); - const [columnVisibility, setColumnVisibility] = - React.useState({}); + const [columnFilters, setColumnFilters] = React.useState([]); + const [columnVisibility, setColumnVisibility] = React.useState({}); const [rowSelection, setRowSelection] = React.useState({}); const [pagination, setPagination] = React.useState({ pageIndex: 0, @@ -139,10 +135,7 @@ const AdminFAQTable = () => { {header.isPlaceholder ? null - : flexRender( - header.column.columnDef.header, - header.getContext() - )} + : flexRender(header.column.columnDef.header, header.getContext())} ))} diff --git a/src/app/[locale]/(protected)/admin/settings/faq/page.tsx b/src/app/[locale]/(protected)/admin/settings/faq/page.tsx index 0e01b498..d4a7d91d 100644 --- a/src/app/[locale]/(protected)/admin/settings/faq/page.tsx +++ b/src/app/[locale]/(protected)/admin/settings/faq/page.tsx @@ -1,4 +1,5 @@ import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; + import AdminFAQTable from "./component/table"; export default function FAQSetting() { diff --git a/src/app/[locale]/(protected)/admin/settings/feedback/component/column.tsx b/src/app/[locale]/(protected)/admin/settings/feedback/component/column.tsx index 2e6ad797..11fe3046 100644 --- a/src/app/[locale]/(protected)/admin/settings/feedback/component/column.tsx +++ b/src/app/[locale]/(protected)/admin/settings/feedback/component/column.tsx @@ -1,34 +1,25 @@ import * as React from "react"; +import { Link, useRouter } from "@/i18n/navigation"; import { ColumnDef } from "@tanstack/react-table"; - import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; -import { cn } from "@/lib/utils/utils" + +import { error } from "@/config/swal"; +import { deleteCategory, deleteDataFAQ } from "@/lib/services/settings/settings"; +import { htmlToString } from "@/lib/utils/globals"; +import { cn } from "@/lib/utils/utils"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, - DropdownMenuTrigger, DropdownMenuItem, + DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; -import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; - -import { Link, useRouter } from "@/i18n/navigation"; -import { error } from "@/config/swal"; -import { deleteCategory, deleteDataFAQ } from "@/lib/services/settings/settings"; -import { useToast } from "@/components/ui/use-toast"; +import { Menubar, MenubarContent, MenubarMenu, MenubarTrigger } from "@/components/ui/menubar"; // import EditCategoryModal from "./edit"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { - Menubar, - MenubarContent, - MenubarMenu, - MenubarTrigger, -} from "@/components/ui/menubar"; -import { htmlToString } from "@/lib/utils/globals"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import { useToast } from "@/components/ui/use-toast"; + import EditFAQModal from "./edit"; import EditFeedbackModal from "./edit"; @@ -43,9 +34,7 @@ const columns: ColumnDef[] = [ accessorKey: "question", header: "Poin Penilaian", cell: ({ row }) => ( - - {htmlToString(row.getValue("question"))} - + {htmlToString(row.getValue("question"))} ), }, { @@ -92,17 +81,9 @@ const columns: ColumnDef[] = [ - + - + faqDelete(row.original.id)} diff --git a/src/app/[locale]/(protected)/admin/settings/feedback/component/create.tsx b/src/app/[locale]/(protected)/admin/settings/feedback/component/create.tsx index c755f052..4d89201e 100644 --- a/src/app/[locale]/(protected)/admin/settings/feedback/component/create.tsx +++ b/src/app/[locale]/(protected)/admin/settings/feedback/component/create.tsx @@ -1,6 +1,27 @@ "use client"; +import { stringify } from "querystring"; +import { Fragment, useEffect, useState } from "react"; +import Image from "next/image"; +import { useRouter } from "@/i18n/navigation"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { Icon } from "@iconify/react/dist/iconify.js"; +import { CloudUpload } from "lucide-react"; +import { useTranslations } from "next-intl"; +import { useDropzone } from "react-dropzone"; +import { useForm } from "react-hook-form"; +import { Upload } from "tus-js-client"; +import { z } from "zod"; + +import { close, error, loading } from "@/config/swal"; +import { + getUserRoles, + postCategory, + postDataFAQ, + postDataFeedback, +} from "@/lib/services/settings/settings"; import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; import { Dialog, DialogContent, @@ -9,9 +30,6 @@ import { DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; -import { z } from "zod"; -import { useForm } from "react-hook-form"; -import { zodResolver } from "@hookform/resolvers/zod"; import { Form, FormControl, @@ -21,27 +39,10 @@ import { FormLabel, FormMessage, } from "@/components/ui/form"; -import { useRouter } from "@/i18n/navigation"; import { Input } from "@/components/ui/input"; -import { Checkbox } from "@/components/ui/checkbox"; -import { - getUserRoles, - postCategory, - postDataFAQ, - postDataFeedback, -} from "@/lib/services/settings/settings"; -import { Fragment, useEffect, useState } from "react"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; -import { Icon } from "@iconify/react/dist/iconify.js"; import { Textarea } from "@/components/ui/textarea"; -import { close, error, loading } from "@/config/swal"; import { useToast } from "@/components/ui/use-toast"; -import { stringify } from "querystring"; -import { useDropzone } from "react-dropzone"; -import { CloudUpload } from "lucide-react"; -import Image from "next/image"; -import { Upload } from "tus-js-client"; -import { useTranslations } from "next-intl"; const FormSchema = z.object({ question: z.string({ @@ -119,10 +120,7 @@ export default function CreateFAQModal() { {t("add")} Feedback - + - - Internasional - + Internasional @@ -259,12 +255,7 @@ export default function CreateFAQModal() { )} /> - diff --git a/src/app/[locale]/(protected)/admin/settings/feedback/component/edit.tsx b/src/app/[locale]/(protected)/admin/settings/feedback/component/edit.tsx index 5830f195..c7fbb9ca 100644 --- a/src/app/[locale]/(protected)/admin/settings/feedback/component/edit.tsx +++ b/src/app/[locale]/(protected)/admin/settings/feedback/component/edit.tsx @@ -1,6 +1,30 @@ "use client"; +import { stringify } from "querystring"; +import { Fragment, useEffect, useState } from "react"; +import Image from "next/image"; +import { useRouter } from "@/i18n/navigation"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { Icon } from "@iconify/react/dist/iconify.js"; +import { id } from "date-fns/locale"; +import { CloudUpload } from "lucide-react"; +import { useDropzone } from "react-dropzone"; +import { useForm } from "react-hook-form"; +import { Upload } from "tus-js-client"; +import { z } from "zod"; + +import { close, error, loading } from "@/config/swal"; +import { + detailDataFAQ, + detailDataFeedback, + getUserRoles, + postCategory, + postDataFAQ, + postDataFeedback, +} from "@/lib/services/settings/settings"; +import { htmlToString } from "@/lib/utils/globals"; import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; import { Dialog, DialogContent, @@ -9,9 +33,6 @@ import { DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; -import { z } from "zod"; -import { useForm } from "react-hook-form"; -import { zodResolver } from "@hookform/resolvers/zod"; import { Form, FormControl, @@ -21,30 +42,10 @@ import { FormLabel, FormMessage, } from "@/components/ui/form"; -import { useRouter } from "@/i18n/navigation"; import { Input } from "@/components/ui/input"; -import { Checkbox } from "@/components/ui/checkbox"; -import { - detailDataFAQ, - detailDataFeedback, - getUserRoles, - postCategory, - postDataFAQ, - postDataFeedback, -} from "@/lib/services/settings/settings"; -import { Fragment, useEffect, useState } from "react"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; -import { Icon } from "@iconify/react/dist/iconify.js"; import { Textarea } from "@/components/ui/textarea"; -import { close, error, loading } from "@/config/swal"; import { useToast } from "@/components/ui/use-toast"; -import { stringify } from "querystring"; -import { useDropzone } from "react-dropzone"; -import { CloudUpload } from "lucide-react"; -import Image from "next/image"; -import { Upload } from "tus-js-client"; -import { id } from "date-fns/locale"; -import { htmlToString } from "@/lib/utils/globals"; const FormSchema = z.object({ question: z.string({ @@ -104,10 +105,7 @@ export default function EditFeedbackModal(props: { const initState = async () => { form.setValue("question", htmlToString(data.question)); - form.setValue( - "publishTo", - data.isInternational ? "international" : "wilayah" - ); + form.setValue("publishTo", data.isInternational ? "international" : "wilayah"); }; const onSubmit = async (data: z.infer) => { @@ -135,19 +133,14 @@ export default function EditFeedbackModal(props: { return ( - - {isDetail ? "Detail" : "Edit"} - + {isDetail ? "Detail" : "Edit"} {isDetail ? "Detail" : "Edit"} Feedback - + - - Internasional - + Internasional @@ -293,12 +284,7 @@ export default function EditFeedbackModal(props: { {!isDetail && ( - diff --git a/src/app/[locale]/(protected)/admin/settings/feedback/component/table.tsx b/src/app/[locale]/(protected)/admin/settings/feedback/component/table.tsx index 040eecd7..878ab73b 100644 --- a/src/app/[locale]/(protected)/admin/settings/feedback/component/table.tsx +++ b/src/app/[locale]/(protected)/admin/settings/feedback/component/table.tsx @@ -1,21 +1,28 @@ "use client"; import * as React from "react"; +import { useSearchParams } from "next/navigation"; +import { Link, useRouter } from "@/i18n/navigation"; import { ColumnDef, ColumnFiltersState, - PaginationState, - SortingState, - VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, + PaginationState, + SortingState, useReactTable, + VisibilityState, } from "@tanstack/react-table"; -import { Button } from "@/components/ui/button"; +import { useTranslations } from "next-intl"; +import { close, loading } from "@/config/swal"; +import { listEnableCategory } from "@/lib/services/content/content"; +import { getCategories, getListFAQ, getListFeedback } from "@/lib/services/settings/settings"; +import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; import { Table, TableBody, @@ -24,24 +31,11 @@ import { TableHeader, TableRow, } from "@/components/ui/table"; - -import { useSearchParams } from "next/navigation"; import TablePagination from "@/components/features/table/table-pagination"; -import columns from "./column"; - -import { listEnableCategory } from "@/lib/services/content/content"; -import { Checkbox } from "@/components/ui/checkbox"; -import { close, loading } from "@/config/swal"; -import { Link, useRouter } from "@/i18n/navigation"; import { NewCampaignIcon } from "@/components/icon"; -import { - getCategories, - getListFAQ, - getListFeedback, -} from "@/lib/services/settings/settings"; +import columns from "./column"; import CreateFAQModal from "./create"; -import { useTranslations } from "next-intl"; const AdminFeedbackTable = () => { const router = useRouter(); @@ -52,11 +46,8 @@ const AdminFeedbackTable = () => { const [dataTable, setDataTable] = React.useState([]); const [totalData, setTotalData] = React.useState(1); const [sorting, setSorting] = React.useState([]); - const [columnFilters, setColumnFilters] = React.useState( - [] - ); - const [columnVisibility, setColumnVisibility] = - React.useState({}); + const [columnFilters, setColumnFilters] = React.useState([]); + const [columnVisibility, setColumnVisibility] = React.useState({}); const [rowSelection, setRowSelection] = React.useState({}); const [pagination, setPagination] = React.useState({ pageIndex: 0, @@ -138,10 +129,7 @@ const AdminFeedbackTable = () => { {header.isPlaceholder ? null - : flexRender( - header.column.columnDef.header, - header.getContext() - )} + : flexRender(header.column.columnDef.header, header.getContext())} ))} diff --git a/src/app/[locale]/(protected)/admin/settings/feedback/page.tsx b/src/app/[locale]/(protected)/admin/settings/feedback/page.tsx index db0325d9..923f216f 100644 --- a/src/app/[locale]/(protected)/admin/settings/feedback/page.tsx +++ b/src/app/[locale]/(protected)/admin/settings/feedback/page.tsx @@ -1,4 +1,5 @@ import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; + import AdminFeedbackTable from "./component/table"; export default function FAQSetting() { diff --git a/src/app/[locale]/(protected)/admin/settings/privacy/page.tsx b/src/app/[locale]/(protected)/admin/settings/privacy/page.tsx index 3bdbae5d..93f3e4b8 100644 --- a/src/app/[locale]/(protected)/admin/settings/privacy/page.tsx +++ b/src/app/[locale]/(protected)/admin/settings/privacy/page.tsx @@ -1,8 +1,15 @@ "use client"; -import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; -import { z } from "zod"; -import { useForm } from "react-hook-form"; + +import { useEffect, useRef } from "react"; +import dynamic from "next/dynamic"; import { zodResolver } from "@hookform/resolvers/zod"; +import JoditEditor from "jodit-react"; +import { useForm } from "react-hook-form"; +import { z } from "zod"; + +import { close, error, loading } from "@/config/swal"; +import { getPrivacy, savePrivacy } from "@/lib/services/settings/settings"; +import { Button } from "@/components/ui/button"; import { Form, FormControl, @@ -12,14 +19,9 @@ import { FormLabel, FormMessage, } from "@/components/ui/form"; -import { close, error, loading } from "@/config/swal"; import { Input } from "@/components/ui/input"; -import JoditEditor from "jodit-react"; -import { useEffect, useRef } from "react"; -import { getPrivacy, savePrivacy } from "@/lib/services/settings/settings"; +import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; import { useToast } from "@/components/ui/use-toast"; -import { Button } from "@/components/ui/button"; -import dynamic from "next/dynamic"; const CustomEditor = dynamic( () => { @@ -76,21 +78,14 @@ export default function AdminPrivacyPolicy() { <> - + ( Judul - + @@ -114,10 +109,7 @@ export default function AdminPrivacyPolicy() { onChange={field.onChange} /> */} - + diff --git a/src/app/[locale]/(protected)/admin/settings/tag/component/column.tsx b/src/app/[locale]/(protected)/admin/settings/tag/component/column.tsx index 1d85fabe..50fe5efd 100644 --- a/src/app/[locale]/(protected)/admin/settings/tag/component/column.tsx +++ b/src/app/[locale]/(protected)/admin/settings/tag/component/column.tsx @@ -1,34 +1,25 @@ import * as React from "react"; +import { Link, useRouter } from "@/i18n/navigation"; import { ColumnDef } from "@tanstack/react-table"; - import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; -import { cn } from "@/lib/utils/utils" + +import { error } from "@/config/swal"; +import { deleteCategory, deleteDataFAQ } from "@/lib/services/settings/settings"; +import { htmlToString } from "@/lib/utils/globals"; +import { cn } from "@/lib/utils/utils"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, - DropdownMenuTrigger, DropdownMenuItem, + DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; -import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; - -import { Link, useRouter } from "@/i18n/navigation"; -import { error } from "@/config/swal"; -import { deleteCategory, deleteDataFAQ } from "@/lib/services/settings/settings"; -import { useToast } from "@/components/ui/use-toast"; +import { Menubar, MenubarContent, MenubarMenu, MenubarTrigger } from "@/components/ui/menubar"; // import EditCategoryModal from "./edit"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { - Menubar, - MenubarContent, - MenubarMenu, - MenubarTrigger, -} from "@/components/ui/menubar"; -import { htmlToString } from "@/lib/utils/globals"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import { useToast } from "@/components/ui/use-toast"; + import EditFAQModal from "./edit"; import EditFeedbackModal from "./edit"; import EditTagModal from "./edit"; @@ -43,16 +34,12 @@ const columns: ColumnDef[] = [ { accessorKey: "tagName", header: "Nama Tag", - cell: ({ row }) => ( - {row.getValue("tagName")} - ), + cell: ({ row }) => {row.getValue("tagName")}, }, { accessorKey: "categoryName", header: "Kategori", - cell: ({ row }) => ( - {row.getValue("categoryName")} - ), + cell: ({ row }) => {row.getValue("categoryName")}, }, { accessorKey: "contentCount", @@ -98,17 +85,9 @@ const columns: ColumnDef[] = [ - + - + tagDelete(row.original.id)} diff --git a/src/app/[locale]/(protected)/admin/settings/tag/component/create.tsx b/src/app/[locale]/(protected)/admin/settings/tag/component/create.tsx index 159a6726..034f2d97 100644 --- a/src/app/[locale]/(protected)/admin/settings/tag/component/create.tsx +++ b/src/app/[locale]/(protected)/admin/settings/tag/component/create.tsx @@ -1,38 +1,16 @@ "use client"; -import { Button } from "@/components/ui/button"; -import { - Dialog, - DialogContent, - DialogFooter, - DialogHeader, - DialogTitle, - DialogTrigger, -} from "@/components/ui/dialog"; -import { z } from "zod"; -import { useForm } from "react-hook-form"; -import { zodResolver } from "@hookform/resolvers/zod"; -import { - Form, - FormControl, - FormField, - FormItem, - FormLabel, - FormMessage, -} from "@/components/ui/form"; -import { useRouter } from "@/i18n/navigation"; -import { Input } from "@/components/ui/input"; - import { Fragment, useEffect, useState } from "react"; - -import { useToast } from "@/components/ui/use-toast"; -import { getCategories, getCategoriesAll } from "@/lib/services/settings/settings"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; +import { useRouter } from "@/i18n/navigation"; +import { zodResolver } from "@hookform/resolvers/zod"; import { Check, ChevronsUpDown } from "lucide-react"; +import { useTranslations } from "next-intl"; +import { useForm } from "react-hook-form"; +import { z } from "zod"; + +import { getCategories, getCategoriesAll } from "@/lib/services/settings/settings"; +import { cn } from "@/lib/utils/utils"; +import { Button } from "@/components/ui/button"; import { Command, CommandEmpty, @@ -41,8 +19,25 @@ import { CommandItem, CommandList, } from "@/components/ui/command"; -import { cn } from "@/lib/utils/utils" -import { useTranslations } from "next-intl"; +import { + Dialog, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import { useToast } from "@/components/ui/use-toast"; const FormSchema = z.object({ name: z.string({ @@ -57,9 +52,9 @@ export default function CreateTagModal() { const router = useRouter(); const { toast } = useToast(); const t = useTranslations("Menu"); - const [categoryList, setCategoryList] = useState< - { id: number; label: string; value: string }[] - >([]); + const [categoryList, setCategoryList] = useState<{ id: number; label: string; value: string }[]>( + [] + ); const [isOpen, setIsOpen] = useState(false); const form = useForm>({ @@ -117,10 +112,7 @@ export default function CreateTagModal() { {t("add-tags")} - + {field.value - ? categoryList.find( - (categ) => categ.value === field.value - )?.label + ? categoryList.find((categ) => categ.value === field.value)?.label : "Pilih level"} @@ -165,9 +155,7 @@ export default function CreateTagModal() { @@ -196,12 +184,7 @@ export default function CreateTagModal() { )} /> - diff --git a/src/app/[locale]/(protected)/admin/settings/tag/component/edit.tsx b/src/app/[locale]/(protected)/admin/settings/tag/component/edit.tsx index 719247d2..c5b031ec 100644 --- a/src/app/[locale]/(protected)/admin/settings/tag/component/edit.tsx +++ b/src/app/[locale]/(protected)/admin/settings/tag/component/edit.tsx @@ -1,29 +1,14 @@ "use client"; -import { Button } from "@/components/ui/button"; -import { - Dialog, - DialogContent, - DialogFooter, - DialogHeader, - DialogTitle, - DialogTrigger, -} from "@/components/ui/dialog"; -import { z } from "zod"; -import { useForm } from "react-hook-form"; -import { zodResolver } from "@hookform/resolvers/zod"; -import { - Form, - FormControl, - FormDescription, - FormField, - FormItem, - FormLabel, - FormMessage, -} from "@/components/ui/form"; +import { stringify } from "querystring"; +import { Fragment, useEffect, useState } from "react"; import { useRouter } from "@/i18n/navigation"; -import { Input } from "@/components/ui/input"; -import { Checkbox } from "@/components/ui/checkbox"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { Check, ChevronsUpDown } from "lucide-react"; +import { useForm } from "react-hook-form"; +import { z } from "zod"; + +import { close, error, loading } from "@/config/swal"; import { detailDataFAQ, detailDataFeedback, @@ -33,17 +18,9 @@ import { postDataFAQ, postDataFeedback, } from "@/lib/services/settings/settings"; -import { Fragment, useEffect, useState } from "react"; - -import { close, error, loading } from "@/config/swal"; -import { useToast } from "@/components/ui/use-toast"; -import { stringify } from "querystring"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { Check, ChevronsUpDown } from "lucide-react"; +import { cn } from "@/lib/utils/utils"; +import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; import { Command, CommandEmpty, @@ -52,7 +29,26 @@ import { CommandItem, CommandList, } from "@/components/ui/command"; -import { cn } from "@/lib/utils/utils" +import { + Dialog, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; +import { + Form, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import { useToast } from "@/components/ui/use-toast"; const FormSchema = z.object({ name: z.string({ @@ -99,9 +95,9 @@ export default function EditTagModal(props: { const { id, isDetail, data } = props; const router = useRouter(); const { toast } = useToast(); - const [categoryList, setCategoryList] = useState< - { id: number; label: string; value: string }[] - >([]); + const [categoryList, setCategoryList] = useState<{ id: number; label: string; value: string }[]>( + [] + ); const [isOpen, setIsOpen] = useState(false); const form = useForm>({ @@ -160,19 +156,14 @@ export default function EditTagModal(props: { return ( - - {isDetail ? "Detail" : "Edit"} - + {isDetail ? "Detail" : "Edit"} {isDetail ? "Detail" : "Edit"} Tag - + {field.value - ? categoryList.find( - (categ) => categ.value === field.value - )?.label + ? categoryList.find((categ) => categ.value === field.value)?.label : "Pilih level"} @@ -217,9 +206,7 @@ export default function EditTagModal(props: { @@ -255,12 +242,7 @@ export default function EditTagModal(props: { {!isDetail && ( - diff --git a/src/app/[locale]/(protected)/admin/settings/tag/component/table.tsx b/src/app/[locale]/(protected)/admin/settings/tag/component/table.tsx index 5b64523c..b76fc67d 100644 --- a/src/app/[locale]/(protected)/admin/settings/tag/component/table.tsx +++ b/src/app/[locale]/(protected)/admin/settings/tag/component/table.tsx @@ -1,21 +1,33 @@ "use client"; import * as React from "react"; +import { useSearchParams } from "next/navigation"; +import { Link, useRouter } from "@/i18n/navigation"; import { ColumnDef, ColumnFiltersState, - PaginationState, - SortingState, - VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, + PaginationState, + SortingState, useReactTable, + VisibilityState, } from "@tanstack/react-table"; -import { Button } from "@/components/ui/button"; +import { useTranslations } from "next-intl"; +import { close, loading } from "@/config/swal"; +import { listEnableCategory } from "@/lib/services/content/content"; +import { + getCategories, + getListFAQ, + getListFeedback, + getTags, +} from "@/lib/services/settings/settings"; +import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; import { Table, TableBody, @@ -24,25 +36,11 @@ import { TableHeader, TableRow, } from "@/components/ui/table"; - -import { useSearchParams } from "next/navigation"; import TablePagination from "@/components/features/table/table-pagination"; -import columns from "./column"; - -import { listEnableCategory } from "@/lib/services/content/content"; -import { Checkbox } from "@/components/ui/checkbox"; -import { close, loading } from "@/config/swal"; -import { Link, useRouter } from "@/i18n/navigation"; import { NewCampaignIcon } from "@/components/icon"; -import { - getCategories, - getListFAQ, - getListFeedback, - getTags, -} from "@/lib/services/settings/settings"; +import columns from "./column"; import CreateFAQModal from "./create"; -import { useTranslations } from "next-intl"; const AdminTagTable = () => { const router = useRouter(); @@ -53,11 +51,8 @@ const AdminTagTable = () => { const [dataTable, setDataTable] = React.useState([]); const [totalData, setTotalData] = React.useState(1); const [sorting, setSorting] = React.useState([]); - const [columnFilters, setColumnFilters] = React.useState( - [] - ); - const [columnVisibility, setColumnVisibility] = - React.useState({}); + const [columnFilters, setColumnFilters] = React.useState([]); + const [columnVisibility, setColumnVisibility] = React.useState({}); const [rowSelection, setRowSelection] = React.useState({}); const [pagination, setPagination] = React.useState({ pageIndex: 0, @@ -138,10 +133,7 @@ const AdminTagTable = () => { {header.isPlaceholder ? null - : flexRender( - header.column.columnDef.header, - header.getContext() - )} + : flexRender(header.column.columnDef.header, header.getContext())} ))} diff --git a/src/app/[locale]/(protected)/admin/settings/tag/page.tsx b/src/app/[locale]/(protected)/admin/settings/tag/page.tsx index f0ec0aa8..dfbdb9f2 100644 --- a/src/app/[locale]/(protected)/admin/settings/tag/page.tsx +++ b/src/app/[locale]/(protected)/admin/settings/tag/page.tsx @@ -1,6 +1,7 @@ "use client"; import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; + import AdminTagTable from "./component/table"; export default function TagCategory() { diff --git a/src/app/[locale]/(protected)/admin/survey/component/column.tsx b/src/app/[locale]/(protected)/admin/survey/component/column.tsx index 21acf72b..6b2dfe39 100644 --- a/src/app/[locale]/(protected)/admin/survey/component/column.tsx +++ b/src/app/[locale]/(protected)/admin/survey/component/column.tsx @@ -1,21 +1,20 @@ import * as React from "react"; +import { Link, useRouter } from "@/i18n/navigation"; import { ColumnDef } from "@tanstack/react-table"; - +import { format } from "date-fns"; import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; -import { cn } from "@/lib/utils/utils" +import { date } from "zod"; + +import { cn } from "@/lib/utils/utils"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, - DropdownMenuTrigger, DropdownMenuItem, + DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; -import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; - -import { Link, useRouter } from "@/i18n/navigation"; -import { format } from "date-fns"; import header from "@/components/partials/header"; -import { date } from "zod"; const columns: ColumnDef[] = [ { @@ -27,10 +26,7 @@ const columns: ColumnDef[] = [ accessorKey: "createdAt", header: "Tanggal", cell: ({ row }) => { - const createdAt = row.getValue("createdAt") as - | string - | number - | undefined; + const createdAt = row.getValue("createdAt") as string | number | undefined; const formattedDate = createdAt && !isNaN(new Date(createdAt).getTime()) @@ -42,46 +38,34 @@ const columns: ColumnDef[] = [ { accessorKey: "createdByCategory", header: "Jenis Akun", - cell: ({ row }) => ( - {row.getValue("createdByCategory")} - ), + cell: ({ row }) => {row.getValue("createdByCategory")}, }, { accessorKey: "createdByUsername", header: "UserName", - cell: ({ row }) => ( - {row.getValue("createdByUsername")} - ), + cell: ({ row }) => {row.getValue("createdByUsername")}, }, { accessorKey: "accessFrequency", header: "Akses Mediahub", - cell: ({ row }) => ( - {row.getValue("accessFrequency")} - ), + cell: ({ row }) => {row.getValue("accessFrequency")}, }, { accessorKey: "uiExperienceDesign", header: "Tampilan Desain Web", - cell: ({ row }) => ( - {row.getValue("uiExperienceDesign")} - ), + cell: ({ row }) => {row.getValue("uiExperienceDesign")}, }, { accessorKey: "uiExperienceNavigation", header: "Kemudahan Navigasi", cell: ({ row }) => ( - - {row.getValue("uiExperienceNavigation")} - + {row.getValue("uiExperienceNavigation")} ), }, { accessorKey: "uiExperienceSpeed", header: "Kecepatan Akses", - cell: ({ row }) => ( - {row.getValue("uiExperienceSpeed")} - ), + cell: ({ row }) => {row.getValue("uiExperienceSpeed")}, }, { id: "actions", diff --git a/src/app/[locale]/(protected)/admin/survey/component/table.tsx b/src/app/[locale]/(protected)/admin/survey/component/table.tsx index 63149aae..412f1ac9 100644 --- a/src/app/[locale]/(protected)/admin/survey/component/table.tsx +++ b/src/app/[locale]/(protected)/admin/survey/component/table.tsx @@ -1,30 +1,21 @@ "use client"; import * as React from "react"; +import { useRouter, useSearchParams } from "next/navigation"; +import { Link } from "@/i18n/navigation"; import { ColumnDef, ColumnFiltersState, - PaginationState, - SortingState, - VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, + PaginationState, + SortingState, useReactTable, + VisibilityState, } from "@tanstack/react-table"; -import { Button } from "@/components/ui/button"; - -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "@/components/ui/table"; -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { ChevronLeft, ChevronRight, @@ -37,49 +28,6 @@ import { TrendingUp, UserIcon, } from "lucide-react"; -import { cn } from "@/lib/utils/utils" -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuRadioGroup, - DropdownMenuRadioItem, - DropdownMenuTrigger, -} from "@/components/ui/dropdown-menu"; -import { Input } from "@/components/ui/input"; -import { InputGroup, InputGroupText } from "@/components/ui/input-group"; -import { paginationBlog } from "@/lib/services/blog/blog"; -import { ticketingPagination } from "@/lib/services/ticketing/ticketing"; -import { Badge } from "@/components/ui/badge"; -import { useRouter, useSearchParams } from "next/navigation"; -import TablePagination from "@/components/features/table/table-pagination"; -import columns from "./column"; -import { getPlanningPagination } from "@/lib/services/agenda-setting/agenda-setting"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { - getMediaBlastCampaignPage, - listDataMedia, -} from "@/lib/services/broadcast/broadcast"; -import { listEnableCategory } from "@/lib/services/content/content"; -import { Checkbox } from "@/components/ui/checkbox"; -import { close, loading } from "@/config/swal"; -import { Link } from "@/i18n/navigation"; -import { NewCampaignIcon } from "@/components/icon"; -import search from "../../../app/chat/components/search"; -import { - Select, - SelectContent, - SelectGroup, - SelectItem, - SelectLabel, - SelectTrigger, - SelectValue, -} from "@/components/ui/select"; -import { Card, CardContent } from "@/components/ui/card"; import { Bar, BarChart, @@ -90,7 +38,53 @@ import { XAxis, YAxis, } from "recharts"; + +import { close, loading } from "@/config/swal"; +import { getPlanningPagination } from "@/lib/services/agenda-setting/agenda-setting"; +import { paginationBlog } from "@/lib/services/blog/blog"; +import { getMediaBlastCampaignPage, listDataMedia } from "@/lib/services/broadcast/broadcast"; +import { listEnableCategory } from "@/lib/services/content/content"; import { getSurveyData } from "@/lib/services/survey/survey"; +import { ticketingPagination } from "@/lib/services/ticketing/ticketing"; +import { cn } from "@/lib/utils/utils"; +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Card, CardContent } from "@/components/ui/card"; +import { Checkbox } from "@/components/ui/checkbox"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { Input } from "@/components/ui/input"; +import { InputGroup, InputGroupText } from "@/components/ui/input-group"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectLabel, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; +import TablePagination from "@/components/features/table/table-pagination"; +import { NewCampaignIcon } from "@/components/icon"; + +import search from "../../../app/chat/components/search"; +import columns from "./column"; const data = [ { @@ -110,13 +104,11 @@ const data = [ total: 70, }, { - question: - "Seberapa Akurat dan Terpercaya\nInformasi pada Website MediaHub Polri", + question: "Seberapa Akurat dan Terpercaya\nInformasi pada Website MediaHub Polri", total: 60, }, { - question: - "Seberapa Lengkap Informasi dan Berita\npada Website MediaHub Polri", + question: "Seberapa Lengkap Informasi dan Berita\npada Website MediaHub Polri", total: 55, }, { @@ -134,11 +126,8 @@ const SurveyListTable = () => { const [showData, setShowData] = React.useState("polri"); const [startDate, setStartDate] = React.useState(""); const [sorting, setSorting] = React.useState([]); - const [columnFilters, setColumnFilters] = React.useState( - [] - ); - const [columnVisibility, setColumnVisibility] = - React.useState({}); + const [columnFilters, setColumnFilters] = React.useState([]); + const [columnVisibility, setColumnVisibility] = React.useState({}); const [rowSelection, setRowSelection] = React.useState({}); const [pagination, setPagination] = React.useState({ pageIndex: 0, @@ -251,9 +240,7 @@ const SurveyListTable = () => {
-

- Survei Kepuasan Pengguna MediaHub Polri -

+

Survei Kepuasan Pengguna MediaHub Polri

{ {header.isPlaceholder ? null - : flexRender( - header.column.columnDef.header, - header.getContext() - )} + : flexRender(header.column.columnDef.header, header.getContext())} ))} @@ -335,11 +319,7 @@ const SurveyListTable = () => { )} - +
); }; diff --git a/src/app/[locale]/(protected)/admin/survey/detail/[id]/page.tsx b/src/app/[locale]/(protected)/admin/survey/detail/[id]/page.tsx index e6b5dad6..3d6b4084 100644 --- a/src/app/[locale]/(protected)/admin/survey/detail/[id]/page.tsx +++ b/src/app/[locale]/(protected)/admin/survey/detail/[id]/page.tsx @@ -1,7 +1,7 @@ import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; import FormBlogDetail from "@/components/features/form/blog/blog--detail-form"; -import FormSurvey from "@/components/features/landing-page/survey"; import FormSurveyDetail from "@/components/features/form/survey/survey-detail"; +import FormSurvey from "@/components/features/landing-page/survey"; const SurveyDetailPage = async () => { return ( diff --git a/src/app/[locale]/(protected)/admin/survey/page.tsx b/src/app/[locale]/(protected)/admin/survey/page.tsx index 10727f1d..3f89eb69 100644 --- a/src/app/[locale]/(protected)/admin/survey/page.tsx +++ b/src/app/[locale]/(protected)/admin/survey/page.tsx @@ -1,8 +1,11 @@ "use client"; -import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; + import { useState } from "react"; import { Link } from "@/i18n/navigation"; + import { Button } from "@/components/ui/button"; +import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; + import SurveyListTable from "./component/table"; export default function AdminSurvey() { diff --git a/src/app/[locale]/(protected)/app/calendar/calender-view.tsx b/src/app/[locale]/(protected)/app/calendar/calender-view.tsx index 2f707e0f..69220033 100644 --- a/src/app/[locale]/(protected)/app/calendar/calender-view.tsx +++ b/src/app/[locale]/(protected)/app/calendar/calender-view.tsx @@ -1,29 +1,30 @@ "use client"; -import React, { useState, useEffect } from "react"; -import FullCalendar from "@fullcalendar/react"; // must go before plugins + +import React, { useEffect, useState } from "react"; +import { EventContentArg } from "@fullcalendar/core"; import dayGridPlugin from "@fullcalendar/daygrid"; -import timeGridPlugin from "@fullcalendar/timegrid"; import interactionPlugin, { Draggable } from "@fullcalendar/interaction"; import listPlugin from "@fullcalendar/list"; +import FullCalendar from "@fullcalendar/react"; // must go before plugins + +import timeGridPlugin from "@fullcalendar/timegrid"; +import { Plus } from "lucide-react"; +import { useTranslations } from "next-intl"; + import { Button } from "@/components/ui/button"; -import { Label } from "@/components/ui/label"; -import ExternalDraggingevent from "./dragging-events"; import { Calendar } from "@/components/ui/calendar"; import { Card, CardContent, CardHeader } from "@/components/ui/card"; -import { Plus } from "lucide-react"; import { Checkbox } from "@/components/ui/checkbox"; -import { CalendarEvent, CalendarCategory } from "./data" -import { - EventContentArg, -} from '@fullcalendar/core' +import { Label } from "@/components/ui/label"; + +import { CalendarCategory, CalendarEvent } from "./data"; +import ExternalDraggingevent from "./dragging-events"; import EventModal from "./event-modal"; -import { useTranslations } from "next-intl"; + const wait = () => new Promise((resolve) => setTimeout(resolve, 1000)); interface CalendarViewProps { events: CalendarEvent[]; categories: CalendarCategory[]; - - } const CalendarView = ({ events, categories }: CalendarViewProps) => { @@ -31,7 +32,7 @@ const CalendarView = ({ events, categories }: CalendarViewProps) => { const [selectedEventDate, setSelectedEventDate] = useState(null); const [selectedEvent, setSelectedEvent] = useState(null); const [draggableInitialized, setDraggableInitialized] = useState(false); -const t = useTranslations("CalendarApp") + const t = useTranslations("CalendarApp"); // event canvas state const [sheetOpen, setSheetOpen] = useState(false); const [date, setDate] = React.useState(new Date()); @@ -103,16 +104,14 @@ const t = useTranslations("CalendarApp") if (selectedCategory && selectedCategory.includes(category)) { setSelectedCategory(selectedCategory.filter((c) => c !== category)); } else { - setSelectedCategory([...selectedCategory || [], category]); + setSelectedCategory([...(selectedCategory || []), category]); } }; const handleClassName = (arg: EventContentArg) => { - if (arg.event.extendedProps.calendar === "holiday") { return "destructive"; - } - else if (arg.event.extendedProps.calendar === "business") { + } else if (arg.event.extendedProps.calendar === "business") { return "primary"; } else if (arg.event.extendedProps.calendar === "personal") { return "success"; @@ -122,11 +121,9 @@ const t = useTranslations("CalendarApp") return "info"; } else if (arg.event.extendedProps.calendar === "meeting") { return "warning"; - } - else { + } else { return "primary"; } - }; const filteredEvents = events?.filter((event) => @@ -139,10 +136,7 @@ const t = useTranslations("CalendarApp") - @@ -159,15 +153,13 @@ const t = useTranslations("CalendarApp")
-

- {t("shortDesc")} -

+

{t("shortDesc")}

{dragEvents.map((event) => ( ))}
- {t("filter")} + {t("filter")}
  • @@ -201,12 +193,7 @@ const t = useTranslations("CalendarApp") { const { title, id, tag } = event; @@ -6,7 +7,8 @@ const ExternalDraggingevent = ({ event }: any) => {
    + className="fc-event px-4 py-1.5 bg-default-100 dark:bg-default-300 rounded text-sm flex items-center gap-2 shadow-sm cursor-move" + > (new Date()); const [endDate, setEndDate] = useState(new Date()); const [isPending, startTransition] = React.useTransition(); - const [calendarProps, setCalendarProps] = React.useState( - categories[0].value - ); + const [calendarProps, setCalendarProps] = React.useState(categories[0].value); // delete modal state const [deleteModalOpen, setDeleteModalOpen] = useState(false); const [eventIdToDelete, setEventIdToDelete] = useState(null); @@ -160,11 +152,7 @@ const EventModal = ({ !startDate && "text-muted-foreground" )} > - {startDate ? ( - format(startDate, "PP") - ) : ( - Pick a date - )} + {startDate ? format(startDate, "PP") : Pick a date} @@ -196,11 +184,7 @@ const EventModal = ({ !endDate && "text-muted-foreground" )} > - {endDate ? ( - format(endDate, "PP") - ) : ( - Pick a date - )} + {endDate ? format(endDate, "PP") : Pick a date} @@ -236,10 +220,7 @@ const EventModal = ({ {categories.map((category: CalendarCategory) => ( - + {category.label} ))} diff --git a/src/app/[locale]/(protected)/app/calendar/page.tsx b/src/app/[locale]/(protected)/app/calendar/page.tsx index 266a6f7b..43b82284 100644 --- a/src/app/[locale]/(protected)/app/calendar/page.tsx +++ b/src/app/[locale]/(protected)/app/calendar/page.tsx @@ -1,8 +1,6 @@ -import { getEvents, getCategories } from "./utils"; -import { Category } from "./data" import CalendarView from "./calender-view"; - - +import { Category } from "./data"; +import { getCategories, getEvents } from "./utils"; const CalenderPage = async () => { const events = await getEvents(); diff --git a/src/app/[locale]/(protected)/app/calendar/utils.ts b/src/app/[locale]/(protected)/app/calendar/utils.ts index e4862dd2..427a2fd9 100644 --- a/src/app/[locale]/(protected)/app/calendar/utils.ts +++ b/src/app/[locale]/(protected)/app/calendar/utils.ts @@ -2,10 +2,10 @@ import { calendarEvents, categories } from "./data"; // get events export const getEvents = async () => { - return calendarEvents; + return calendarEvents; }; // get categories export const getCategories = async () => { - return categories; -} \ No newline at end of file + return categories; +}; diff --git a/src/app/[locale]/(protected)/app/chat/[id]/components/chat-header.tsx b/src/app/[locale]/(protected)/app/chat/[id]/components/chat-header.tsx index 55b7bb02..71069179 100644 --- a/src/app/[locale]/(protected)/app/chat/[id]/components/chat-header.tsx +++ b/src/app/[locale]/(protected)/app/chat/[id]/components/chat-header.tsx @@ -1,123 +1,124 @@ "use client"; + +import { useChatConfig } from "@/lib/hooks/use-chat"; +import { useMediaQuery } from "@/lib/hooks/use-media-query"; +import { cn } from "@/lib/utils/utils"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; -import { cn } from "@/lib/utils/utils" import { Icon } from "@/components/ui/icon"; -import { - Tooltip, - TooltipContent, - TooltipProvider, - TooltipTrigger, -} from "@/components/ui/tooltip"; -import { useMediaQuery } from "@/lib/hooks/use-media-query"; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; import { Contact, ProfileUser } from "@/app/api/chat/data"; -import { useChatConfig } from "@/lib/hooks/use-chat"; const ChatHeader = ({ contact }: { contact: any }) => { - let active = true; - const isLg = useMediaQuery("(max-width: 1024px)"); + let active = true; + const isLg = useMediaQuery("(max-width: 1024px)"); - const [chatConfig, setChatConfig] = useChatConfig() + const [chatConfig, setChatConfig] = useChatConfig(); - return ( -
    -
    - {isLg && ( - - )} -
    - - - {contact?.fullName?.slice(0, 2)} - - -
    -
    -
    - {contact?.fullName} -
    -
    - {active ? "Active Now" : "Offline"} -
    -
    -
    -
    - - - - - - -

    Start a voice call

    -
    -
    -
    - - - - - - -

    Start a video call

    -
    -
    -
    - {!isLg && ( - - - - - - -

    Conversation information

    -
    -
    -
    - )} -
    + return ( +
    +
    + {isLg && ( + + )} +
    + + + {contact?.fullName?.slice(0, 2)} + +
    - ); +
    +
    + {contact?.fullName} +
    +
    + {active ? "Active Now" : "Offline"} +
    +
    +
    +
    + + + + + + +

    Start a voice call

    +
    +
    +
    + + + + + + +

    Start a video call

    +
    +
    +
    + {!isLg && ( + + + + + + +

    Conversation information

    +
    +
    +
    + )} +
    +
    + ); }; export default ChatHeader; diff --git a/src/app/[locale]/(protected)/app/chat/[id]/components/info-wrapper.tsx b/src/app/[locale]/(protected)/app/chat/[id]/components/info-wrapper.tsx index 2925c2e4..59bdf169 100644 --- a/src/app/[locale]/(protected)/app/chat/[id]/components/info-wrapper.tsx +++ b/src/app/[locale]/(protected)/app/chat/[id]/components/info-wrapper.tsx @@ -1,20 +1,21 @@ -'use client' +"use client"; -import React from 'react' +import React from "react"; + +import { useChatConfig } from "@/lib/hooks/use-chat"; import { Card, CardContent } from "@/components/ui/card"; -import { useChatConfig } from '@/lib/hooks/use-chat'; -import { ScrollArea } from '@/components/ui/scroll-area'; +import { ScrollArea } from "@/components/ui/scroll-area"; const InfoWrapper = ({ children }: { children: React.ReactNode }) => { - const [chatConfig] = useChatConfig(); - if (!chatConfig.showInfo) return null - return ( - - - {children} - - - ) -} + const [chatConfig] = useChatConfig(); + if (!chatConfig.showInfo) return null; + return ( + + + {children} + + + ); +}; -export default InfoWrapper \ No newline at end of file +export default InfoWrapper; diff --git a/src/app/[locale]/(protected)/app/chat/[id]/components/message-footer.tsx b/src/app/[locale]/(protected)/app/chat/[id]/components/message-footer.tsx index b506f0e3..1a08cb99 100644 --- a/src/app/[locale]/(protected)/app/chat/[id]/components/message-footer.tsx +++ b/src/app/[locale]/(protected)/app/chat/[id]/components/message-footer.tsx @@ -1,143 +1,138 @@ "use client"; -import React, { useState } from "react"; -import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; -import { Icon } from "@/components/ui/icon"; -import { Annoyed, SendHorizontal } from "lucide-react"; +import React, { useState } from "react"; import data from "@emoji-mart/data"; import Picker from "@emoji-mart/react"; -import { - Tooltip, - TooltipArrow, - TooltipContent, - TooltipProvider, - TooltipTrigger, -} from "@/components/ui/tooltip"; -import { Label } from "@/components/ui/label"; - -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "@/components/ui/popover"; -import { postMessageAction } from "/action/app-actions"; +import { Annoyed, SendHorizontal } from "lucide-react"; import { useTheme } from "next-themes"; +import { Button } from "@/components/ui/button"; +import { Icon } from "@/components/ui/icon"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import { + Tooltip, + TooltipArrow, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; + +import { postMessageAction } from "/action/app-actions"; + const MessageFooter = () => { - const { theme: mode } = useTheme(); - const [message, setMessage] = useState(""); - const handleChange = (e: React.ChangeEvent) => { - setMessage(e.target.value); - e.target.style.height = "auto"; // Reset the height to auto to adjust - e.target.style.height = `${e.target.scrollHeight - 15}px`; + const { theme: mode } = useTheme(); + const [message, setMessage] = useState(""); + const handleChange = (e: React.ChangeEvent) => { + setMessage(e.target.value); + e.target.style.height = "auto"; // Reset the height to auto to adjust + e.target.style.height = `${e.target.scrollHeight - 15}px`; + }; + + const handleSelectEmoji = (emoji: any) => { + setMessage(message + emoji.native); + }; + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + if (!message) return; + const data: any = { + message, }; - const handleSelectEmoji = (emoji: any) => { - setMessage(message + emoji.native); - }; + await postMessageAction("55fe838e-9a09-4caf-a591-559803309ef1", "sfsfsf"); + setMessage(""); + }; + return ( + <> +
    +
    + + + + + + +

    Add link

    +
    +
    +
    - const handleSubmit = async (e: React.FormEvent) => { - e.preventDefault(); - if (!message) return; - const data: any = { - message, - }; - - await postMessageAction("55fe838e-9a09-4caf-a591-559803309ef1", "sfsfsf"); - setMessage(""); - - - }; - return ( - <> - - -
    + + + + -
    - - - - - - -

    Add link

    -
    -
    -
    + + + +
    +
    + +
    + + defaultValue={"Lorem ipsum dolor, sit amet consectetur adipisicing elit. Rerum, commodi!"} + readOnly={true} + >
    ); }; -export default BasicTextarea; \ No newline at end of file +export default BasicTextarea; diff --git a/src/app/[locale]/(protected)/forms/textarea/colors-textarea.tsx b/src/app/[locale]/(protected)/forms/textarea/colors-textarea.tsx index c40e18ee..49a7ead7 100644 --- a/src/app/[locale]/(protected)/forms/textarea/colors-textarea.tsx +++ b/src/app/[locale]/(protected)/forms/textarea/colors-textarea.tsx @@ -1,4 +1,3 @@ - import { Textarea } from "@/components/ui/textarea"; const ColorsTextarea = () => { @@ -15,4 +14,4 @@ const ColorsTextarea = () => { ); }; -export default ColorsTextarea; \ No newline at end of file +export default ColorsTextarea; diff --git a/src/app/[locale]/(protected)/forms/textarea/displayed-rows.tsx b/src/app/[locale]/(protected)/forms/textarea/displayed-rows.tsx index 3213908d..505132b3 100644 --- a/src/app/[locale]/(protected)/forms/textarea/displayed-rows.tsx +++ b/src/app/[locale]/(protected)/forms/textarea/displayed-rows.tsx @@ -1,5 +1,6 @@ import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; + const DisplayedRows = () => { return (
    @@ -15,4 +16,4 @@ const DisplayedRows = () => { ); }; -export default DisplayedRows; \ No newline at end of file +export default DisplayedRows; diff --git a/src/app/[locale]/(protected)/forms/textarea/horizontal-label.tsx b/src/app/[locale]/(protected)/forms/textarea/horizontal-label.tsx index 17634ee2..08a693ab 100644 --- a/src/app/[locale]/(protected)/forms/textarea/horizontal-label.tsx +++ b/src/app/[locale]/(protected)/forms/textarea/horizontal-label.tsx @@ -10,4 +10,4 @@ const HorizontalLabel = () => { ); }; -export default HorizontalLabel; \ No newline at end of file +export default HorizontalLabel; diff --git a/src/app/[locale]/(protected)/forms/textarea/layout.tsx b/src/app/[locale]/(protected)/forms/textarea/layout.tsx index 6e956709..398682f9 100644 --- a/src/app/[locale]/(protected)/forms/textarea/layout.tsx +++ b/src/app/[locale]/(protected)/forms/textarea/layout.tsx @@ -2,7 +2,8 @@ import { Metadata } from "next"; export const metadata: Metadata = { title: "Media Hub | POLRI", - description: "Media Hub merupakan situs resmi milik Divisi Humas Polri di mana di dalamnya berisi konten-konten yang dapat diakses secara gratis oleh Internal Polri, Jurnalis, Masyarakat Umum, dan KSP.", + description: + "Media Hub merupakan situs resmi milik Divisi Humas Polri di mana di dalamnya berisi konten-konten yang dapat diakses secara gratis oleh Internal Polri, Jurnalis, Masyarakat Umum, dan KSP.", }; const Layout = ({ children }: { children: React.ReactNode }) => { return <>{children}; diff --git a/src/app/[locale]/(protected)/forms/textarea/page.tsx b/src/app/[locale]/(protected)/forms/textarea/page.tsx index 504b71c9..6b8d18a1 100644 --- a/src/app/[locale]/(protected)/forms/textarea/page.tsx +++ b/src/app/[locale]/(protected)/forms/textarea/page.tsx @@ -1,14 +1,16 @@ import Card from "@/components/ui/structures/code-snippet"; +import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; + import BasicTextarea from "./basic-textarea"; -import DisplayedRows from "./displayed-rows"; import ColorsTextarea from "./colors-textarea"; +import DisplayedRows from "./displayed-rows"; import HorizontalLabel from "./horizontal-label"; import { basicTextarea, colorsTextarea, displayedRows, horizontalLabel } from "./source-code"; -import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; + const TextareaPage = () => { return (
    - +
    @@ -27,4 +29,4 @@ const TextareaPage = () => { ); }; -export default TextareaPage; \ No newline at end of file +export default TextareaPage; diff --git a/src/app/[locale]/(protected)/forms/textarea/source-code.ts b/src/app/[locale]/(protected)/forms/textarea/source-code.ts index 52ee1f89..6e8b57c4 100644 --- a/src/app/[locale]/(protected)/forms/textarea/source-code.ts +++ b/src/app/[locale]/(protected)/forms/textarea/source-code.ts @@ -1,4 +1,4 @@ -export const basicTextarea=`import { Label } from "@/components/ui/label"; +export const basicTextarea = `import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; const BasicTextarea = () => { @@ -22,9 +22,9 @@ const BasicTextarea = () => { ); }; -export default BasicTextarea;` +export default BasicTextarea;`; -export const colorsTextarea=` +export const colorsTextarea = ` import { Textarea } from "@/components/ui/textarea"; const ColorsTextarea = () => { @@ -41,9 +41,9 @@ const ColorsTextarea = () => { ); }; -export default ColorsTextarea;` +export default ColorsTextarea;`; -export const displayedRows=`import { Label } from "@/components/ui/label"; +export const displayedRows = `import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; const DisplayedRows = () => { return ( @@ -60,9 +60,9 @@ const DisplayedRows = () => { ); }; -export default DisplayedRows;` +export default DisplayedRows;`; -export const horizontalLabel=`import { Label } from "@/components/ui/label"; +export const horizontalLabel = `import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; const HorizontalLabel = () => { @@ -74,4 +74,4 @@ const HorizontalLabel = () => { ); }; -export default HorizontalLabel;` \ No newline at end of file +export default HorizontalLabel;`; diff --git a/src/app/[locale]/(protected)/icons/layout.tsx b/src/app/[locale]/(protected)/icons/layout.tsx index 6e956709..398682f9 100644 --- a/src/app/[locale]/(protected)/icons/layout.tsx +++ b/src/app/[locale]/(protected)/icons/layout.tsx @@ -2,7 +2,8 @@ import { Metadata } from "next"; export const metadata: Metadata = { title: "Media Hub | POLRI", - description: "Media Hub merupakan situs resmi milik Divisi Humas Polri di mana di dalamnya berisi konten-konten yang dapat diakses secara gratis oleh Internal Polri, Jurnalis, Masyarakat Umum, dan KSP.", + description: + "Media Hub merupakan situs resmi milik Divisi Humas Polri di mana di dalamnya berisi konten-konten yang dapat diakses secara gratis oleh Internal Polri, Jurnalis, Masyarakat Umum, dan KSP.", }; const Layout = ({ children }: { children: React.ReactNode }) => { return <>{children}; diff --git a/src/app/[locale]/(protected)/icons/page.tsx b/src/app/[locale]/(protected)/icons/page.tsx index 5d1be296..dafc9988 100644 --- a/src/app/[locale]/(protected)/icons/page.tsx +++ b/src/app/[locale]/(protected)/icons/page.tsx @@ -1,13 +1,10 @@ -import { Link } from '@/i18n/navigation'; -import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; +import { Link } from "@/i18n/navigation"; + import { Button } from "@/components/ui/button"; import { Icon } from "@/components/ui/icon"; -import { - Tooltip, - TooltipContent, - TooltipProvider, - TooltipTrigger, -} from "@/components/ui/tooltip" +import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; + const IconPage = () => { const icons = [ { name: "heroicons:academic-cap" }, @@ -66,37 +63,29 @@ const IconPage = () => {
    - { - icons.map((icon, index) => ( - - - - - - - -

    {icon.name}

    -
    -
    -
    - )) - } + {icons.map((icon, index) => ( + + + + + + +

    {icon.name}

    +
    +
    +
    + ))}
    @@ -105,4 +94,4 @@ const IconPage = () => { ); }; -export default IconPage; \ No newline at end of file +export default IconPage; diff --git a/src/app/[locale]/(protected)/layout.tsx b/src/app/[locale]/(protected)/layout.tsx index b77e4a10..a60e29d4 100644 --- a/src/app/[locale]/(protected)/layout.tsx +++ b/src/app/[locale]/(protected)/layout.tsx @@ -1,10 +1,11 @@ -import LayoutProvider from "/providers/layout.provider"; -import LayoutContentProvider from "/providers/content.provider"; -import DashCodeSidebar from "@/components/partials/sidebar"; -import DashCodeFooter from "@/components/partials/footer"; import ThemeCustomize from "@/components/partials/customizer"; +import DashCodeFooter from "@/components/partials/footer"; import DashCodeHeader from "@/components/partials/header"; -import MountedProvider from "/providers/mounted.provider"; +import DashCodeSidebar from "@/components/partials/sidebar"; + +import LayoutContentProvider from "@/providers/content.provider"; +import LayoutProvider from "@/providers/layout.provider"; +import MountedProvider from "@/providers/mounted.provider"; const layout = async ({ children }: { children: React.ReactNode }) => { return ( diff --git a/src/app/[locale]/(protected)/maps/constant.ts b/src/app/[locale]/(protected)/maps/constant.ts index 738bf4ac..e40fa139 100644 --- a/src/app/[locale]/(protected)/maps/constant.ts +++ b/src/app/[locale]/(protected)/maps/constant.ts @@ -1 +1 @@ -export const MAP_KEY = "7ZOaHj6xeWeeUNIdCjfC"; \ No newline at end of file +export const MAP_KEY = "7ZOaHj6xeWeeUNIdCjfC"; diff --git a/src/app/[locale]/(protected)/maps/layout.tsx b/src/app/[locale]/(protected)/maps/layout.tsx index 6e956709..398682f9 100644 --- a/src/app/[locale]/(protected)/maps/layout.tsx +++ b/src/app/[locale]/(protected)/maps/layout.tsx @@ -2,7 +2,8 @@ import { Metadata } from "next"; export const metadata: Metadata = { title: "Media Hub | POLRI", - description: "Media Hub merupakan situs resmi milik Divisi Humas Polri di mana di dalamnya berisi konten-konten yang dapat diakses secara gratis oleh Internal Polri, Jurnalis, Masyarakat Umum, dan KSP.", + description: + "Media Hub merupakan situs resmi milik Divisi Humas Polri di mana di dalamnya berisi konten-konten yang dapat diakses secara gratis oleh Internal Polri, Jurnalis, Masyarakat Umum, dan KSP.", }; const Layout = ({ children }: { children: React.ReactNode }) => { return <>{children}; diff --git a/src/app/[locale]/(protected)/maps/maps-leaflet/basic-map.tsx b/src/app/[locale]/(protected)/maps/maps-leaflet/basic-map.tsx index bbcfe9c0..9fbad960 100644 --- a/src/app/[locale]/(protected)/maps/maps-leaflet/basic-map.tsx +++ b/src/app/[locale]/(protected)/maps/maps-leaflet/basic-map.tsx @@ -2,7 +2,7 @@ import { useState } from "react"; import Leaflet from "leaflet"; -import { MapContainer, TileLayer, Marker } from "react-leaflet"; +import { MapContainer, Marker, TileLayer } from "react-leaflet"; // Set default icon paths Leaflet.Icon.Default.imagePath = "../node_modules/leaflet"; @@ -24,11 +24,7 @@ const BasicMap = ({ height = 350 }: { height?: number }) => { }); const position: [number, number] = [state.lat, state.lng]; return ( - + { const position: [number, number] = [37.5004851, -96.2261503]; const setColor = () => { @@ -33,14 +36,8 @@ const GeoJSONMap = ({ height = 350 }: { height?: number }) => { attribution='© OpenStreetMap contributors' url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" /> - } - style={setColor} - /> - } - pointToLayer={setIcon} - /> + } style={setColor} /> + } pointToLayer={setIcon} /> ); }; diff --git a/src/app/[locale]/(protected)/maps/maps-leaflet/layer-groups.tsx b/src/app/[locale]/(protected)/maps/maps-leaflet/layer-groups.tsx index cc48cc80..0a7315cf 100644 --- a/src/app/[locale]/(protected)/maps/maps-leaflet/layer-groups.tsx +++ b/src/app/[locale]/(protected)/maps/maps-leaflet/layer-groups.tsx @@ -1,6 +1,7 @@ "use client"; import { useState } from "react"; +import { useTheme } from "next-themes"; import { Circle, FeatureGroup, @@ -11,7 +12,8 @@ import { TileLayer, } from "react-leaflet"; -import { useTheme } from "next-themes"; +import { colors } from "@/lib/colors"; + const rectangle: [number, number][] = [ [51.49, -0.08], [51.5, -0.06], @@ -22,7 +24,7 @@ interface MapState { lng: number; zoom: number; } -import { colors } from "@/lib/colors"; + const LayerGroupMap = ({ height = 350 }: { height?: number }) => { const { theme: mode } = useTheme(); @@ -34,18 +36,15 @@ const LayerGroupMap = ({ height = 350 }: { height?: number }) => { const position: [number, number] = [state.lat, state.lng]; return ( - + - { const position: [number, number] = [state.lat, state.lng]; return ( - + { return (
    diff --git a/src/app/[locale]/(protected)/maps/maps-leaflet/popup-marker-map.tsx b/src/app/[locale]/(protected)/maps/maps-leaflet/popup-marker-map.tsx index 00cde315..389a6247 100644 --- a/src/app/[locale]/(protected)/maps/maps-leaflet/popup-marker-map.tsx +++ b/src/app/[locale]/(protected)/maps/maps-leaflet/popup-marker-map.tsx @@ -1,46 +1,42 @@ -"use client" -import { useState } from "react" -import Leaflet from "leaflet" -import { MapContainer, TileLayer, Marker, Popup } from "react-leaflet" +"use client"; -Leaflet.Icon.Default.imagePath = "../node_modules/leaflet" +import { useState } from "react"; +import Leaflet from "leaflet"; +import { MapContainer, Marker, Popup, TileLayer } from "react-leaflet"; + +Leaflet.Icon.Default.imagePath = "../node_modules/leaflet"; Leaflet.Icon.Default.mergeOptions({ - iconUrl: 'https://unpkg.com/leaflet@1.7.1/dist/images/marker-icon.png', - shadowUrl: 'https://unpkg.com/leaflet@1.7.1/dist/images/marker-shadow.png' -}) + iconUrl: "https://unpkg.com/leaflet@1.7.1/dist/images/marker-icon.png", + shadowUrl: "https://unpkg.com/leaflet@1.7.1/dist/images/marker-shadow.png", +}); interface MapState { - lat: number; - lng: number; - zoom: number; + lat: number; + lng: number; + zoom: number; } const PopupMarkerMap = ({ height = 350 }) => { - const [state, setState] = useState({ - lat: 51.505, - lng: -0.09, - zoom: 13, - }) - const position: [number, number] = [state.lat, state.lng] + const [state, setState] = useState({ + lat: 51.505, + lng: -0.09, + zoom: 13, + }); + const position: [number, number] = [state.lat, state.lng]; - return ( - - - - - Hello Dashcode! - - - - ) + return ( + + + + + Hello Dashcode! + + + + ); +}; -} - -export default PopupMarkerMap; \ No newline at end of file +export default PopupMarkerMap; diff --git a/src/app/[locale]/(protected)/maps/maps-leaflet/svg-map.tsx b/src/app/[locale]/(protected)/maps/maps-leaflet/svg-map.tsx index 8f53743f..66f62c80 100644 --- a/src/app/[locale]/(protected)/maps/maps-leaflet/svg-map.tsx +++ b/src/app/[locale]/(protected)/maps/maps-leaflet/svg-map.tsx @@ -1,33 +1,28 @@ -"use client" +"use client"; -import { MapContainer, TileLayer, SVGOverlay } from "react-leaflet" +import { MapContainer, SVGOverlay, TileLayer } from "react-leaflet"; const SVGMap = ({ height = 350 }: { height?: number }) => { - const position: [number, number] = [51.505, -0.09] - const bounds: [[number, number], [number, number]] = [ - [51.49, -0.08], - [51.5, -0.06], - ] + const position: [number, number] = [51.505, -0.09]; + const bounds: [[number, number], [number, number]] = [ + [51.49, -0.08], + [51.5, -0.06], + ]; - return ( - - - - - - - Hi - - - - ) -} + return ( + + + + + + + Hi + + + + ); +}; export default SVGMap; diff --git a/src/app/[locale]/(protected)/maps/maps-leaflet/vector-layers.tsx b/src/app/[locale]/(protected)/maps/maps-leaflet/vector-layers.tsx index a3963a10..9c2886a9 100644 --- a/src/app/[locale]/(protected)/maps/maps-leaflet/vector-layers.tsx +++ b/src/app/[locale]/(protected)/maps/maps-leaflet/vector-layers.tsx @@ -2,18 +2,19 @@ import { useState } from "react"; import { useTheme } from "next-themes"; - import { - MapContainer, - TileLayer, - Popup, Circle, CircleMarker, + MapContainer, Polygon, Polyline, + Popup, Rectangle, + TileLayer, } from "react-leaflet"; +import { colors } from "@/lib/colors"; + const polyline: [number, number][] = [ [51.505, -0.09], [51.51, -0.1], @@ -56,7 +57,6 @@ const rectangle: [number, number][] = [ [51.49, -0.08], [51.5, -0.06], ]; -import { colors } from "@/lib/colors"; const VectorLayersMap = ({ height = 350 }) => { const { theme: mode } = useTheme(); @@ -69,20 +69,12 @@ const VectorLayersMap = ({ height = 350 }) => { const position: [number, number] = [state.lat, state.lng]; return ( - + - + { > Popup in CircleMarker - + - + - + ); }; diff --git a/src/app/[locale]/(protected)/maps/maps-vector/events-map.tsx b/src/app/[locale]/(protected)/maps/maps-vector/events-map.tsx index b40b83c8..d5dfa014 100644 --- a/src/app/[locale]/(protected)/maps/maps-vector/events-map.tsx +++ b/src/app/[locale]/(protected)/maps/maps-vector/events-map.tsx @@ -1,9 +1,10 @@ "use client"; import React, { useState } from "react"; -import world from "./worldmap.json"; import { VectorMap } from "@south-paw/react-vector-maps"; +import world from "./worldmap.json"; + const EventVMap = ({ height = 350 }: { height?: number }) => { const [hovered, setHovered] = useState("None"); const [focused, setFocused] = useState("None"); @@ -47,16 +48,13 @@ const EventVMap = ({ height = 350 }: { height?: number }) => {

    - Hovered:{" "} - {hovered && {hovered}} + Hovered: {hovered && {hovered}}

    - Focused:{" "} - {focused && {focused}} + Focused: {focused && {focused}}

    - Clicked:{" "} - {clicked && {clicked}} + Clicked: {clicked && {clicked}}

    diff --git a/src/app/[locale]/(protected)/maps/maps-vector/layer-links.tsx b/src/app/[locale]/(protected)/maps/maps-vector/layer-links.tsx index f722b278..a6189898 100644 --- a/src/app/[locale]/(protected)/maps/maps-vector/layer-links.tsx +++ b/src/app/[locale]/(protected)/maps/maps-vector/layer-links.tsx @@ -1,14 +1,15 @@ "use client"; import React from "react"; -import world from "./worldmap.json"; import { VectorMap } from "@south-paw/react-vector-maps"; +import world from "./worldmap.json"; + const LayerLinks = ({ height = 350 }: { height?: number }) => { const onClick = (event: React.MouseEvent) => { const name = event.currentTarget.getAttribute("name"); if (name) { - // window.open(`https://www.google.com/search?q=${name}%20nz`); + // window.open(`https://www.google.com/search?q=${name}%20nz`); } }; diff --git a/src/app/[locale]/(protected)/maps/maps-vector/page.tsx b/src/app/[locale]/(protected)/maps/maps-vector/page.tsx index 17ffe5ed..fd3429ae 100644 --- a/src/app/[locale]/(protected)/maps/maps-vector/page.tsx +++ b/src/app/[locale]/(protected)/maps/maps-vector/page.tsx @@ -1,9 +1,10 @@ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import VMap from "./vectore-map"; + import EventVMap from "./events-map"; -import SelectingLayers from "./selecting-layers"; import LayerLinks from "./layer-links"; +import SelectingLayers from "./selecting-layers"; import StyledVMap from "./styled-map"; +import VMap from "./vectore-map"; const MapsVectorPage = () => { return ( diff --git a/src/app/[locale]/(protected)/maps/maps-vector/selecting-layers.tsx b/src/app/[locale]/(protected)/maps/maps-vector/selecting-layers.tsx index 7b8593d6..d70f7389 100644 --- a/src/app/[locale]/(protected)/maps/maps-vector/selecting-layers.tsx +++ b/src/app/[locale]/(protected)/maps/maps-vector/selecting-layers.tsx @@ -1,9 +1,10 @@ "use client"; import { useState } from "react"; -import world from "./worldmap.json"; import { VectorMap } from "@south-paw/react-vector-maps"; +import world from "./worldmap.json"; + const SelectingLayers = ({ height = 250 }: { height?: number }) => { const [selected, setSelected] = useState([]); diff --git a/src/app/[locale]/(protected)/maps/maps-vector/styled-map.tsx b/src/app/[locale]/(protected)/maps/maps-vector/styled-map.tsx index d0731410..9ba9b666 100644 --- a/src/app/[locale]/(protected)/maps/maps-vector/styled-map.tsx +++ b/src/app/[locale]/(protected)/maps/maps-vector/styled-map.tsx @@ -1,15 +1,13 @@ "use client"; -import world from "./worldmap.json"; import { VectorMap } from "@south-paw/react-vector-maps"; +import world from "./worldmap.json"; + const StyledVMap = ({ height = 350 }: { height?: number }) => { return (
    - +
    ); }; diff --git a/src/app/[locale]/(protected)/maps/maps-vector/vectore-map.tsx b/src/app/[locale]/(protected)/maps/maps-vector/vectore-map.tsx index d40787d9..bea32735 100644 --- a/src/app/[locale]/(protected)/maps/maps-vector/vectore-map.tsx +++ b/src/app/[locale]/(protected)/maps/maps-vector/vectore-map.tsx @@ -1,15 +1,13 @@ "use client"; -import world from "./worldmap.json"; import { VectorMap } from "@south-paw/react-vector-maps"; +import world from "./worldmap.json"; + const VMap = ({ height = 350 }: { height?: number }) => { return (
    - +
    ); }; diff --git a/src/app/[locale]/(protected)/notifications/components/columns.tsx b/src/app/[locale]/(protected)/notifications/components/columns.tsx index 78fc6518..1f898df2 100644 --- a/src/app/[locale]/(protected)/notifications/components/columns.tsx +++ b/src/app/[locale]/(protected)/notifications/components/columns.tsx @@ -1,18 +1,18 @@ import * as React from "react"; +import { Link } from "@/i18n/navigation"; import { ColumnDef } from "@tanstack/react-table"; - +import { format } from "date-fns"; import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; -import { cn } from "@/lib/utils/utils" + +import { cn } from "@/lib/utils/utils"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, - DropdownMenuTrigger, DropdownMenuItem, + DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; -import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; -import { format } from "date-fns"; -import { Link } from "@/i18n/navigation"; const columns: ColumnDef[] = [ { @@ -23,9 +23,7 @@ const columns: ColumnDef[] = [ { accessorKey: "title", header: "Title", - cell: ({ row }) => ( - {row.getValue("title")} - ), + cell: ({ row }) => {row.getValue("title")}, }, { accessorKey: "categoryName", @@ -36,10 +34,7 @@ const columns: ColumnDef[] = [ accessorKey: "createdAt", header: "Upload Date", cell: ({ row }) => { - const createdAt = row.getValue("createdAt") as - | string - | number - | undefined; + const createdAt = row.getValue("createdAt") as string | number | undefined; const formattedDate = createdAt && !isNaN(new Date(createdAt).getTime()) @@ -67,8 +62,7 @@ const columns: ColumnDef[] = [ const statusName = status?.toLocaleLowerCase(); // Ubah ke huruf kecil // Gunakan `statusName` untuk pencocokan - const statusStyles = - statusColors[statusName] || "bg-gray-100 text-gray-600"; + const statusStyles = statusColors[statusName] || "bg-gray-100 text-gray-600"; return ( diff --git a/src/app/[locale]/(protected)/notifications/components/notifications-table.tsx b/src/app/[locale]/(protected)/notifications/components/notifications-table.tsx index 2ede0de7..cf70fdc9 100644 --- a/src/app/[locale]/(protected)/notifications/components/notifications-table.tsx +++ b/src/app/[locale]/(protected)/notifications/components/notifications-table.tsx @@ -1,8 +1,7 @@ "use client"; -import React, { useState, useEffect } from "react"; -import { Button } from "@/components/ui/button"; -import { getNotifications } from "@/lib/services/notifications/notifications"; +import React, { useEffect, useState } from "react"; +import { useRouter } from "next/navigation"; import { CalendarCheck, CheckCheck, @@ -14,7 +13,9 @@ import { SquareCheck, UploadIcon, } from "lucide-react"; -import { useRouter } from "next/navigation"; + +import { getNotifications } from "@/lib/services/notifications/notifications"; +import { Button } from "@/components/ui/button"; export type Notification = { id: number; diff --git a/src/app/[locale]/(protected)/notifications/page.tsx b/src/app/[locale]/(protected)/notifications/page.tsx index 72ce971f..46c266a8 100644 --- a/src/app/[locale]/(protected)/notifications/page.tsx +++ b/src/app/[locale]/(protected)/notifications/page.tsx @@ -1,8 +1,10 @@ -import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; -import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; -import { Plus } from "lucide-react"; -import { Button } from "@/components/ui/button"; import { Link } from "@/i18n/navigation"; +import { Plus } from "lucide-react"; + +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; + import BlogTable from "../contributor/blog/components/blog-table"; import NotificationsTable from "./components/notifications-table"; diff --git a/src/app/[locale]/(protected)/shared/communication/collaboration/components/collabroation-table.tsx b/src/app/[locale]/(protected)/shared/communication/collaboration/components/collabroation-table.tsx index 74dfe406..6dbbdd9a 100644 --- a/src/app/[locale]/(protected)/shared/communication/collaboration/components/collabroation-table.tsx +++ b/src/app/[locale]/(protected)/shared/communication/collaboration/components/collabroation-table.tsx @@ -1,30 +1,20 @@ "use client"; import * as React from "react"; +import { useRouter, useSearchParams } from "next/navigation"; import { ColumnDef, ColumnFiltersState, - PaginationState, - SortingState, - VisibilityState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, + PaginationState, + SortingState, useReactTable, + VisibilityState, } from "@tanstack/react-table"; -import { Button } from "@/components/ui/button"; - -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "@/components/ui/table"; -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { ChevronDown, ChevronLeft, @@ -37,7 +27,19 @@ import { TrendingDown, TrendingUp, } from "lucide-react"; + +import { paginationBlog } from "@/lib/services/blog/blog"; +import { + getTicketingCollaborationPagination, + getTicketingEscalationPagination, + listTicketingInternal, +} from "@/lib/services/communication/communication"; +import { listDataAudio, listDataImage, listDataVideo } from "@/lib/services/content/content"; +import { ticketingPagination } from "@/lib/services/ticketing/ticketing"; import { cn, getCookiesDecrypt } from "@/lib/utils/utils"; +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuCheckboxItem, @@ -49,22 +51,17 @@ import { } from "@/components/ui/dropdown-menu"; import { Input } from "@/components/ui/input"; import { InputGroup, InputGroupText } from "@/components/ui/input-group"; -import { paginationBlog } from "@/lib/services/blog/blog"; -import { ticketingPagination } from "@/lib/services/ticketing/ticketing"; -import { Badge } from "@/components/ui/badge"; -import { useRouter, useSearchParams } from "next/navigation"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; import TablePagination from "@/components/features/table/table-pagination"; + import columns from "./columns"; -import { - listDataAudio, - listDataImage, - listDataVideo, -} from "@/lib/services/content/content"; -import { - getTicketingCollaborationPagination, - getTicketingEscalationPagination, - listTicketingInternal, -} from "@/lib/services/communication/communication"; import useTableColumns from "./columns"; const CollaborationTable = () => { @@ -74,11 +71,8 @@ const CollaborationTable = () => { const [dataTable, setDataTable] = React.useState([]); const [totalData, setTotalData] = React.useState(1); const [sorting, setSorting] = React.useState([]); - const [columnFilters, setColumnFilters] = React.useState( - [] - ); - const [columnVisibility, setColumnVisibility] = - React.useState({}); + const [columnFilters, setColumnFilters] = React.useState([]); + const [columnVisibility, setColumnVisibility] = React.useState({}); const [rowSelection, setRowSelection] = React.useState({}); const [showData, setShowData] = React.useState("10"); @@ -142,11 +136,7 @@ const CollaborationTable = () => { async function fetchData() { try { - const res = await getTicketingCollaborationPagination( - page - 1, - showData, - search - ); + const res = await getTicketingCollaborationPagination(page - 1, showData, search); const data = res?.data?.data; const contentData = data?.content; contentData.forEach((item: any, index: number) => { @@ -187,22 +177,11 @@ const CollaborationTable = () => { - - - 1 - 10 Data - - - 1 - 20 Data - - - 1 - 25 Data - - - 1 - 50 Data - + + 1 - 10 Data + 1 - 20 Data + 1 - 25 Data + 1 - 50 Data @@ -223,9 +202,7 @@ const CollaborationTable = () => { key={column.id} className="capitalize" checked={column.getIsVisible()} - onCheckedChange={(value) => - column.toggleVisibility(!!value) - } + onCheckedChange={(value) => column.toggleVisibility(!!value)} > {column.id} @@ -245,10 +222,7 @@ const CollaborationTable = () => { {header.isPlaceholder ? null - : flexRender( - header.column.columnDef.header, - header.getContext() - )} + : flexRender(header.column.columnDef.header, header.getContext())} ))} @@ -278,11 +252,7 @@ const CollaborationTable = () => { )} - +
    ); }; diff --git a/src/app/[locale]/(protected)/shared/communication/collaboration/components/columns.tsx b/src/app/[locale]/(protected)/shared/communication/collaboration/components/columns.tsx index 7c0ae3df..a662bc2b 100644 --- a/src/app/[locale]/(protected)/shared/communication/collaboration/components/columns.tsx +++ b/src/app/[locale]/(protected)/shared/communication/collaboration/components/columns.tsx @@ -1,19 +1,19 @@ import * as React from "react"; +import { Link, useRouter } from "@/i18n/navigation"; import { ColumnDef } from "@tanstack/react-table"; - +import { format } from "date-fns"; import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react"; -import { cn } from "@/lib/utils/utils" +import { useTranslations } from "next-intl"; + +import { cn } from "@/lib/utils/utils"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, - DropdownMenuTrigger, DropdownMenuItem, + DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; -import { Button } from "@/components/ui/button"; -import { Badge } from "@/components/ui/badge"; -import { format } from "date-fns"; -import { Link, useRouter } from "@/i18n/navigation"; -import { useTranslations } from "next-intl"; const useTableColumns = () => { const t = useTranslations("Table"); // Panggil di dalam hook @@ -27,18 +27,12 @@ const useTableColumns = () => { { accessorKey: "title", header: t("question"), - cell: ({ row }) => ( - {row.getValue("title")} - ), + cell: ({ row }) => {row.getValue("title")}, }, { accessorKey: "commentFromUserName", header: t("sender"), - cell: ({ row }) => ( - - {row.getValue("commentFromUserName")} - - ), + cell: ({ row }) => {row.getValue("commentFromUserName")}, }, { accessorKey: "Type", @@ -52,10 +46,7 @@ const useTableColumns = () => { accessorKey: "createdAt", header: t("time"), cell: ({ row }) => { - const createdAt = row.getValue("createdAt") as - | string - | number - | undefined; + const createdAt = row.getValue("createdAt") as string | number | undefined; const formattedDate = createdAt && !isNaN(new Date(createdAt).getTime()) @@ -74,11 +65,7 @@ const useTableColumns = () => { ? "bg-green-100 text-green-600" // Gaya untuk "Open" : "bg-red-100 text-red-600"; // Gaya untuk "Closed" - return ( - - {status} - - ); + return {status}; }, }, @@ -103,9 +90,7 @@ const useTableColumns = () => { - router.push( - `/shared/communication/collaboration/detail/${row.original.id}` - ) + router.push(`/shared/communication/collaboration/detail/${row.original.id}`) } className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none items-center" > diff --git a/src/app/[locale]/(protected)/shared/communication/collaboration/detail/[id]/component/users-card.tsx b/src/app/[locale]/(protected)/shared/communication/collaboration/detail/[id]/component/users-card.tsx index beef6fdc..03bdb24a 100644 --- a/src/app/[locale]/(protected)/shared/communication/collaboration/detail/[id]/component/users-card.tsx +++ b/src/app/[locale]/(protected)/shared/communication/collaboration/detail/[id]/component/users-card.tsx @@ -1,20 +1,18 @@ "use client"; -import { Button } from "@/components/ui/button"; -import Select, { MultiValue } from "react-select"; -import { Icon } from "@iconify/react/dist/iconify.js"; +import { stringify } from "querystring"; import { useEffect, useState } from "react"; -import { Separator } from "@/components/ui/separator"; -import { - getCuratorUser, - saveCollaborationTeams, -} from "@/lib/services/communication/communication"; +import { useParams } from "next/navigation"; +import { Icon } from "@iconify/react/dist/iconify.js"; +import Select, { MultiValue } from "react-select"; import Swal from "sweetalert2"; import withReactContent from "sweetalert2-react-content"; + import { close, loading } from "@/config/swal"; -import { useParams } from "next/navigation"; +import { getCuratorUser, saveCollaborationTeams } from "@/lib/services/communication/communication"; +import { Button } from "@/components/ui/button"; +import { Separator } from "@/components/ui/separator"; import { useToast } from "@/components/ui/use-toast"; -import { stringify } from "querystring"; const assigneeOptions = [ { value: "mahedi", label: "Mahedi Amin", image: "/images/avatar/av-1.svg" }, diff --git a/src/app/[locale]/(protected)/shared/communication/collaboration/detail/[id]/page.tsx b/src/app/[locale]/(protected)/shared/communication/collaboration/detail/[id]/page.tsx index 51e6eb99..a15c879d 100644 --- a/src/app/[locale]/(protected)/shared/communication/collaboration/detail/[id]/page.tsx +++ b/src/app/[locale]/(protected)/shared/communication/collaboration/detail/[id]/page.tsx @@ -1,8 +1,12 @@ "use client"; -import { Button } from "@/components/ui/button"; -import { Separator } from "@/components/ui/separator"; -import { Textarea } from "@/components/ui/textarea"; -import { useToast } from "@/components/ui/use-toast"; + +import { stringify } from "querystring"; +import { useEffect, useState } from "react"; +import { useParams } from "next/navigation"; +import { Icon } from "@iconify/react/dist/iconify.js"; +import Swal from "sweetalert2"; +import withReactContent from "sweetalert2-react-content"; + import { close, loading } from "@/config/swal"; import { deleteCollabDiscussion, @@ -11,18 +15,13 @@ import { getTicketCollaborationTeams, saveCollabDiscussion, } from "@/lib/services/communication/communication"; -import { - getLocaleTimestamp, - htmlToString, - textEllipsis, -} from "@/lib/utils/globals"; -import { Icon } from "@iconify/react/dist/iconify.js"; -import { useParams } from "next/navigation"; -import { stringify } from "querystring"; -import { useEffect, useState } from "react"; -import Swal from "sweetalert2"; -import withReactContent from "sweetalert2-react-content"; +import { getLocaleTimestamp, htmlToString, textEllipsis } from "@/lib/utils/globals"; +import { Button } from "@/components/ui/button"; +import { Separator } from "@/components/ui/separator"; import SiteBreadcrumb from "@/components/ui/structures/site-breadcrumb"; +import { Textarea } from "@/components/ui/textarea"; +import { useToast } from "@/components/ui/use-toast"; + import UsersCard from "./component/users-card"; export default function CollaborationPage() { @@ -113,15 +112,10 @@ export default function CollaborationPage() {

    - - {detailTickets?.commentFromUserName} - {" "} + {detailTickets?.commentFromUserName}{" "} mengirimkan komentar untuk

    - + {textEllipsis(detailTickets?.feed?.message, 25)}
    @@ -129,13 +123,9 @@ export default function CollaborationPage() { {" "} {`${new Date(detailTickets?.createdAt).getDate()}-${ new Date(detailTickets?.createdAt).getMonth() + 1 - }-${new Date( + }-${new Date(detailTickets?.createdAt).getFullYear()} ${new Date( detailTickets?.createdAt - ).getFullYear()} ${new Date( - detailTickets?.createdAt - ).getHours()}:${new Date( - detailTickets?.createdAt - ).getMinutes()}`} + ).getHours()}:${new Date(detailTickets?.createdAt).getMinutes()}`}

    @@ -153,12 +143,8 @@ export default function CollaborationPage() {
    -

    - {data?.messageFrom?.fullname} -

    -

    - {getLocaleTimestamp(new Date(data?.createdAt))} -

    +

    {data?.messageFrom?.fullname}

    +

    {getLocaleTimestamp(new Date(data?.createdAt))}

    {data?.message}

    @@ -178,10 +164,7 @@ export default function CollaborationPage() {

    Belum Ada Tanggapan

    )}
    - + +
    - diff --git a/src/app/[locale]/(public)/content-management/download/page.tsx b/src/app/[locale]/(public)/content-management/download/page.tsx index 7d7cb6f9..790402c5 100644 --- a/src/app/[locale]/(public)/content-management/download/page.tsx +++ b/src/app/[locale]/(public)/content-management/download/page.tsx @@ -1,25 +1,32 @@ "use client"; -import { close, error, loading, successCallback } from "@/config/swal"; -import { checkWishlistStatus, deleteWishlist, getInfoProfile, mediaWishlist, saveWishlist } from "@/lib/services/landing/landing"; import React, { useEffect, useState } from "react"; -import { Link, useRouter } from "@/i18n/navigation"; -import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import Image from "next/image"; import { usePathname, useSearchParams } from "next/navigation"; +import { Link, useRouter } from "@/i18n/navigation"; +import { Icon } from "@iconify/react/dist/iconify.js"; +import { useTranslations } from "next-intl"; +import Swal from "sweetalert2"; +import withReactContent from "sweetalert2-react-content"; + +import { close, error, loading, successCallback } from "@/config/swal"; +import { + checkWishlistStatus, + deleteWishlist, + getInfoProfile, + mediaWishlist, + saveWishlist, +} from "@/lib/services/landing/landing"; +import { sendMediaUploadToEmail } from "@/lib/services/media-tracking/media-tracking"; +import { getCookiesDecrypt } from "@/lib/utils/utils"; +import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; +import ImageBlurry from "@/components/ui/image-blurry"; +import { Input } from "@/components/ui/input"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; import HeaderManagement from "@/components/features/landing-page/header-management"; import SidebarManagement from "@/components/features/landing-page/sidebar-management"; -import withReactContent from "sweetalert2-react-content"; -import { getCookiesDecrypt } from "@/lib/utils/utils"; -import Swal from "sweetalert2"; -import { Icon } from "@iconify/react/dist/iconify.js"; -import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; -import { Input } from "@/components/ui/input"; -import { Button } from "@/components/ui/button"; -import { sendMediaUploadToEmail } from "@/lib/services/media-tracking/media-tracking"; -import ImageBlurry from "@/components/ui/image-blurry"; -import Image from "next/image"; -import { useTranslations } from "next-intl"; const Galery = (props: any) => { const [profile, setProfile] = useState(); @@ -63,7 +70,16 @@ const Galery = (props: any) => { const name = title == undefined ? "" : title; const format = formatFilter == undefined ? "" : formatFilter?.join(","); - const response = await mediaWishlist("2", isInstitute ? instituteId : "", name, filter, "9", pages, sortBy, format); + const response = await mediaWishlist( + "2", + isInstitute ? instituteId : "", + name, + filter, + "9", + pages, + sortBy, + format + ); setGetTotalPage(response?.data?.data?.totalPages); setContentVideo(response?.data?.data?.content); @@ -97,7 +113,16 @@ const Galery = (props: any) => { const name = title == undefined ? "" : title; const format = formatFilter == undefined ? "" : formatFilter?.join(","); - const response = await mediaWishlist("3", isInstitute ? instituteId : "", name, filter, "12", pages, sortBy, format); + const response = await mediaWishlist( + "3", + isInstitute ? instituteId : "", + name, + filter, + "12", + pages, + sortBy, + format + ); setGetTotalPage(response?.data?.data?.totalPages); setContentDocument(response?.data?.data?.content); @@ -122,7 +147,16 @@ const Galery = (props: any) => { const name = title == undefined ? "" : title; const format = formatFilter == undefined ? "" : formatFilter?.join(","); - const response = await mediaWishlist("4", isInstitute ? instituteId : "", name, filter, "6", pages, sortBy, format); + const response = await mediaWishlist( + "4", + isInstitute ? instituteId : "", + name, + filter, + "6", + pages, + sortBy, + format + ); setGetTotalPage(response?.data?.data?.totalPages); setContentAudio(response?.data?.data?.content); @@ -143,7 +177,16 @@ const Galery = (props: any) => { const name = title == undefined ? "" : title; const format = formatFilter == undefined ? "" : formatFilter?.join(","); - const response = await mediaWishlist("1", isInstitute ? instituteId : "", name, filter, "12", pages, sortBy, format); + const response = await mediaWishlist( + "1", + isInstitute ? instituteId : "", + name, + filter, + "12", + pages, + sortBy, + format + ); setGetTotalPage(response?.data?.data?.totalPages); setContentImage(response?.data?.data?.content); @@ -338,48 +381,89 @@ const Galery = (props: any) => { contentVideo?.length > 0 ? (
    {contentVideo?.map((video: any) => ( - +
    - +
    -

    {video?.mediaUpload?.title}

    +

    + {video?.mediaUpload?.title} +

    - + -

    handleSaveWishlist(video?.mediaUpload?.id)} className="cursor-pointer flex flex-row gap-2 hover:text-red-800"> - -

    {t("save")}

    +
    handleSaveWishlist(video?.mediaUpload?.id)} + className="cursor-pointer flex flex-row gap-2 hover:text-red-800" + > + +

    + {t("save")} +

    - + -

    Content Rewrite

    +

    + Content Rewrite +

    {t("shareTo")}

    -

    {t("destinationEmail")}

    - setEmailShareInput(event.target.value)} onKeyPress={handleEmailList} type="email" placeholder={t("pressEnter")} /> +

    + {t("destinationEmail")} +

    + + setEmailShareInput(event.target.value) + } + onKeyPress={handleEmailList} + type="email" + placeholder={t("pressEnter")} + />
    -
    @@ -399,16 +483,31 @@ const Galery = (props: any) => {
    ) : (

    - empty + empty

    ) ) : selectedTab == "audio" ? ( contentAudio?.length > 0 ? (
    {contentAudio?.map((audio: any) => ( -
    +
    - + {
    -
    {audio?.mediaUpload?.title}
    +
    + {audio?.mediaUpload?.title} +
    @@ -425,9 +526,20 @@ const Galery = (props: any) => {
    - # -
    {audio?.mediaUpload?.duration}
    - + # +
    + {audio?.mediaUpload?.duration} +
    + { -
    handleSaveWishlist(audio?.mediaUpload?.id)} className="cursor-pointer flex flex-row gap-2 hover:text-red-800"> +
    handleSaveWishlist(audio?.mediaUpload?.id)} + className="cursor-pointer flex flex-row gap-2 hover:text-red-800" + >

    {t("save")}

    - +

    Content Rewrite

    @@ -462,10 +580,21 @@ const Galery = (props: any) => {

    {t("shareTo")}

    -

    {t("destinationEmail")}

    - setEmailShareInput(event.target.value)} onKeyPress={handleEmailList} type="email" placeholder={t("pressEnter")} /> +

    + {t("destinationEmail")} +

    + setEmailShareInput(event.target.value)} + onKeyPress={handleEmailList} + type="email" + placeholder={t("pressEnter")} + />
    -
    @@ -479,55 +608,103 @@ const Galery = (props: any) => {
    ) : (

    - empty + empty

    ) ) : selectedTab == "image" ? ( contentImage?.length > 0 ? (
    {contentImage?.map((image: any) => ( - +
    - +
    -

    {image?.mediaUpload?.title}

    +

    + {image?.mediaUpload?.title} +

    - + -

    handleSaveWishlist(image?.mediaUpload?.id)} className="cursor-pointer flex flex-row gap-2 hover:text-red-800"> - -

    {t("save")}

    +
    handleSaveWishlist(image?.mediaUpload?.id)} + className="cursor-pointer flex flex-row gap-2 hover:text-red-800" + > + +

    + {t("save")} +

    - + -

    Content Rewrite

    +

    + Content Rewrite +

    {t("shareTo")}

    -

    {t("destinationEmail")}

    - setEmailShareInput(event.target.value)} onKeyPress={handleEmailList} type="email" placeholder={t("pressEnter")} /> +

    + {t("destinationEmail")} +

    + + setEmailShareInput(event.target.value) + } + onKeyPress={handleEmailList} + type="email" + placeholder={t("pressEnter")} + />
    -
    @@ -547,15 +724,30 @@ const Galery = (props: any) => {
    ) : (

    - empty + empty

    ) ) : contentDocument.length > 0 ? (
    {contentDocument?.map((document: any) => ( -
    +
    - + {
    - + {document?.mediaUpload?.title}
    - - + + Download {t("document")}
    @@ -581,11 +784,17 @@ const Galery = (props: any) => { -
    handleSaveWishlist(document?.mediaUpload?.id)} className="cursor-pointer flex flex-row gap-2 hover:text-red-800"> +
    handleSaveWishlist(document?.mediaUpload?.id)} + className="cursor-pointer flex flex-row gap-2 hover:text-red-800" + >

    {t("save")}

    - +

    Content Rewrite

    @@ -601,10 +810,21 @@ const Galery = (props: any) => {

    {t("shareTo")}

    -

    {t("destinationEmail")}

    - setEmailShareInput(event.target.value)} onKeyPress={handleEmailList} type="email" placeholder={t("pressEnter")} /> +

    + {t("destinationEmail")} +

    + setEmailShareInput(event.target.value)} + onKeyPress={handleEmailList} + type="email" + placeholder={t("pressEnter")} + />
    -
    @@ -618,7 +838,13 @@ const Galery = (props: any) => {
    ) : (

    - empty + empty

    )}
    diff --git a/src/app/[locale]/(public)/content-management/galery/page.tsx b/src/app/[locale]/(public)/content-management/galery/page.tsx index ea754adc..3e0ada66 100644 --- a/src/app/[locale]/(public)/content-management/galery/page.tsx +++ b/src/app/[locale]/(public)/content-management/galery/page.tsx @@ -1,27 +1,39 @@ "use client"; -import { close, error, loading, successCallback } from "@/config/swal"; -import { checkWishlistStatus, deleteWishlist, getInfoProfile, mediaWishlist, saveWishlist } from "@/lib/services/landing/landing"; import React, { useEffect, useState } from "react"; -import { Link, useRouter } from "@/i18n/navigation"; -import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import Image from "next/image"; import { useSearchParams } from "next/navigation"; +import { Link, useRouter } from "@/i18n/navigation"; +import { Icon } from "@iconify/react/dist/iconify.js"; +import { useTranslations } from "next-intl"; +import Swal from "sweetalert2"; +import withReactContent from "sweetalert2-react-content"; + +import { close, error, loading, successCallback } from "@/config/swal"; +import { + checkWishlistStatus, + deleteWishlist, + getInfoProfile, + mediaWishlist, + saveWishlist, +} from "@/lib/services/landing/landing"; +import { sendMediaUploadToEmail } from "@/lib/services/media-tracking/media-tracking"; +import { getCookiesDecrypt } from "@/lib/utils/utils"; +import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import ImageBlurry from "@/components/ui/image-blurry"; +import { Input } from "@/components/ui/input"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { useToast } from "@/components/ui/use-toast"; import HeaderManagement from "@/components/features/landing-page/header-management"; import SidebarManagement from "@/components/features/landing-page/sidebar-management"; -import withReactContent from "sweetalert2-react-content"; -import { getCookiesDecrypt } from "@/lib/utils/utils"; -import Swal from "sweetalert2"; -import { useToast } from "@/components/ui/use-toast"; -import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"; -import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; -import { Icon } from "@iconify/react/dist/iconify.js"; -import { Input } from "@/components/ui/input"; -import { Button } from "@/components/ui/button"; -import { sendMediaUploadToEmail } from "@/lib/services/media-tracking/media-tracking"; -import ImageBlurry from "@/components/ui/image-blurry"; -import Image from "next/image"; -import { useTranslations } from "next-intl"; const Galery = (props: any) => { const [profile, setProfile] = useState(); @@ -65,7 +77,16 @@ const Galery = (props: any) => { const name = title == undefined ? "" : title; const format = formatFilter == undefined ? "" : formatFilter?.join(","); - const response = await mediaWishlist("2", isInstitute ? instituteId : "", name, filter, "9", pages, sortBy, format); + const response = await mediaWishlist( + "2", + isInstitute ? instituteId : "", + name, + filter, + "9", + pages, + sortBy, + format + ); setGetTotalPage(response?.data?.data?.totalPages); setContentVideo(response?.data?.data?.content); @@ -99,7 +120,16 @@ const Galery = (props: any) => { const name = title == undefined ? "" : title; const format = formatFilter == undefined ? "" : formatFilter?.join(","); - const response = await mediaWishlist("3", isInstitute ? instituteId : "", name, filter, "12", pages, sortBy, format); + const response = await mediaWishlist( + "3", + isInstitute ? instituteId : "", + name, + filter, + "12", + pages, + sortBy, + format + ); setGetTotalPage(response?.data?.data?.totalPages); setContentDocument(response?.data?.data?.content); @@ -124,7 +154,16 @@ const Galery = (props: any) => { const name = title == undefined ? "" : title; const format = formatFilter == undefined ? "" : formatFilter?.join(","); - const response = await mediaWishlist("4", isInstitute ? instituteId : "", name, filter, "6", pages, sortBy, format); + const response = await mediaWishlist( + "4", + isInstitute ? instituteId : "", + name, + filter, + "6", + pages, + sortBy, + format + ); setGetTotalPage(response?.data?.data?.totalPages); setContentAudio(response?.data?.data?.content); @@ -145,7 +184,16 @@ const Galery = (props: any) => { const name = title == undefined ? "" : title; const format = formatFilter == undefined ? "" : formatFilter?.join(","); - const response = await mediaWishlist("1", isInstitute ? instituteId : "", name, filter, "12", pages, sortBy, format); + const response = await mediaWishlist( + "1", + isInstitute ? instituteId : "", + name, + filter, + "12", + pages, + sortBy, + format + ); setGetTotalPage(response?.data?.data?.totalPages); setContentImage(response?.data?.data?.content); @@ -331,48 +379,89 @@ const Galery = (props: any) => { contentVideo?.length > 0 ? (
    {contentVideo?.map((video: any) => ( - +
    - +
    -

    {video?.mediaUpload?.title}

    +

    + {video?.mediaUpload?.title} +

    - + -

    handleSaveWishlist(video?.mediaUpload?.id)} className="cursor-pointer flex flex-row gap-2 hover:text-red-800"> - -

    {t("save")}

    +
    handleSaveWishlist(video?.mediaUpload?.id)} + className="cursor-pointer flex flex-row gap-2 hover:text-red-800" + > + +

    + {t("save")}{" "} +

    - + -

    Content Rewrite

    +

    + Content Rewrite +

    {t("shareTo")}

    -

    {t("destinationEmail")}

    - setEmailShareInput(event.target.value)} onKeyPress={handleEmailList} type="email" placeholder={t("shareTo")} /> +

    + {t("destinationEmail")} +

    + + setEmailShareInput(event.target.value) + } + onKeyPress={handleEmailList} + type="email" + placeholder={t("shareTo")} + />
    -
    @@ -392,33 +481,64 @@ const Galery = (props: any) => {
    ) : (

    - empty + empty

    ) ) : selectedTab == "audio" ? ( contentAudio?.length > 0 ? (
    {contentAudio?.map((audio: any) => ( -
    +
    - +
    - -
    {audio?.mediaUpload?.title}
    + +
    + {audio?.mediaUpload?.title} +
    - # -
    {audio?.mediaUpload?.duration}
    - + # +
    + {audio?.mediaUpload?.duration} +
    + { -
    handleSaveWishlist(audio?.mediaUpload?.id)} className="cursor-pointer flex flex-row gap-2 hover:text-red-800"> +
    handleSaveWishlist(audio?.mediaUpload?.id)} + className="cursor-pointer flex flex-row gap-2 hover:text-red-800" + >

    {t("save")}

    - +

    Content Rewrite

    @@ -453,10 +579,21 @@ const Galery = (props: any) => {

    {t("shareTo")}

    -

    {t("destinationEmail")}

    - setEmailShareInput(event.target.value)} onKeyPress={handleEmailList} type="email" placeholder={t("pressEnter")} /> +

    + {t("destinationEmail")} +

    + setEmailShareInput(event.target.value)} + onKeyPress={handleEmailList} + type="email" + placeholder={t("pressEnter")} + />
    -
    @@ -470,55 +607,103 @@ const Galery = (props: any) => {
    ) : (

    - empty + empty

    ) ) : selectedTab == "image" ? ( contentImage?.length > 0 ? (
    {contentImage?.map((image: any) => ( - +
    - +
    -

    {image?.mediaUpload?.title}

    +

    + {image?.mediaUpload?.title} +

    - + -

    handleSaveWishlist(image?.mediaUpload?.id)} className="cursor-pointer flex flex-row gap-2 hover:text-red-800"> - -

    {t("save")}

    +
    handleSaveWishlist(image?.mediaUpload?.id)} + className="cursor-pointer flex flex-row gap-2 hover:text-red-800" + > + +

    + {t("save")} +

    - + -

    Content Rewrite

    +

    + Content Rewrite +

    {t("shareTo")}

    -

    {t("destinationEmail")}

    - setEmailShareInput(event.target.value)} onKeyPress={handleEmailList} type="email" placeholder={t("pressEnter")} /> +

    + {t("destinationEmail")} +

    + + setEmailShareInput(event.target.value) + } + onKeyPress={handleEmailList} + type="email" + placeholder={t("pressEnter")} + />
    -
    @@ -538,15 +723,30 @@ const Galery = (props: any) => {
    ) : (

    - empty + empty

    ) ) : contentDocument.length > 0 ? (
    {contentDocument?.map((document: any) => ( -
    +
    - + {
    - + {document?.mediaUpload?.title}
    - - + + Download {t("document")}
    @@ -572,11 +783,17 @@ const Galery = (props: any) => { -
    handleSaveWishlist(document?.mediaUpload?.id)} className="cursor-pointer flex flex-row gap-2 hover:text-red-800"> +
    handleSaveWishlist(document?.mediaUpload?.id)} + className="cursor-pointer flex flex-row gap-2 hover:text-red-800" + >

    {t("save")}

    - +

    Content Rewrite

    @@ -592,10 +809,21 @@ const Galery = (props: any) => {

    {t("shareTo")}

    -

    {t("destinationEmail")}

    - setEmailShareInput(event.target.value)} onKeyPress={handleEmailList} type="email" placeholder={t("pressEnter")} /> +

    + {t("destinationEmail")} +

    + setEmailShareInput(event.target.value)} + onKeyPress={handleEmailList} + type="email" + placeholder={t("pressEnter")} + />
    -
    @@ -609,7 +837,13 @@ const Galery = (props: any) => {
    ) : (

    - empty + empty

    )}
    diff --git a/src/app/[locale]/(public)/content-management/layout.tsx b/src/app/[locale]/(public)/content-management/layout.tsx index 5d424bab..9a401f16 100644 --- a/src/app/[locale]/(public)/content-management/layout.tsx +++ b/src/app/[locale]/(public)/content-management/layout.tsx @@ -1,19 +1,20 @@ -import LayoutProvider from "/providers/layout.provider"; -import LayoutContentProvider from "/providers/content.provider"; -import DashCodeSidebar from "@/components/partials/sidebar"; -import DashCodeFooter from "@/components/partials/footer"; -import ThemeCustomize from "@/components/partials/customizer"; -import DashCodeHeader from "@/components/partials/header"; - import { redirect } from "@/i18n/navigation"; + import Footer from "@/components/features/landing-page/footer"; import Navbar from "@/components/features/landing-page/navbar"; +import ThemeCustomize from "@/components/partials/customizer"; +import DashCodeFooter from "@/components/partials/footer"; +import DashCodeHeader from "@/components/partials/header"; +import DashCodeSidebar from "@/components/partials/sidebar"; + +import LayoutContentProvider from "@/providers/content.provider"; +import LayoutProvider from "@/providers/layout.provider"; const layout = async ({ children }: { children: React.ReactNode }) => { return ( <> - + {children}
    diff --git a/src/app/[locale]/(public)/content-management/rewrite/create/[id]/page.tsx b/src/app/[locale]/(public)/content-management/rewrite/create/[id]/page.tsx index b8e40600..10130f13 100644 --- a/src/app/[locale]/(public)/content-management/rewrite/create/[id]/page.tsx +++ b/src/app/[locale]/(public)/content-management/rewrite/create/[id]/page.tsx @@ -1,35 +1,48 @@ "use client"; -import HeaderManagement from "@/components/features/landing-page/header-management"; -import SidebarManagement from "@/components/features/landing-page/sidebar-management"; -import { useRouter } from "@/i18n/navigation"; -import { getCookiesDecrypt, setCookiesEncrypt } from "@/lib/utils/utils"; -import { useParams, useSearchParams } from "next/navigation"; import React, { useEffect, useState } from "react"; +import { useParams, useSearchParams } from "next/navigation"; +import { useRouter } from "@/i18n/navigation"; +import { yupResolver } from "@hookform/resolvers/yup"; +import { zodResolver } from "@hookform/resolvers/zod"; +import Cookies from "js-cookie"; +import { useTranslations } from "next-intl"; +import { Controller, useForm } from "react-hook-form"; import Swal from "sweetalert2"; import withReactContent from "sweetalert2-react-content"; -import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue } from "@/components/ui/select"; -import { Controller, useForm } from "react-hook-form"; -import * as z from "zod"; -import { zodResolver } from "@hookform/resolvers/zod"; -import CustomEditor from "@/components/editor/custom-editor"; -import { generateDataArticle, getDetailArticle } from "@/lib/services/content/ai"; -import { Button } from "@/components/ui/button"; -import { close, error, loading } from "@/config/swal"; -import { saveContentRewrite } from "@/lib/services/content/content"; -import { getPublicSuggestionList } from "@/lib/services/landing/landing"; -import { getDetail } from "@/lib/services/detail/detail"; -import { yupResolver } from "@hookform/resolvers/yup"; import * as Yup from "yup"; -import Cookies from "js-cookie"; +import * as z from "zod"; + +import { close, error, loading } from "@/config/swal"; +import { generateDataArticle, getDetailArticle } from "@/lib/services/content/ai"; +import { saveContentRewrite } from "@/lib/services/content/content"; +import { getDetail } from "@/lib/services/detail/detail"; +import { getPublicSuggestionList } from "@/lib/services/landing/landing"; +import { getCookiesDecrypt, setCookiesEncrypt } from "@/lib/utils/utils"; +import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; +import { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectLabel, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; import { Textarea } from "@/components/ui/textarea"; -import { useTranslations } from "next-intl"; +import CustomEditor from "@/components/editor/custom-editor"; +import HeaderManagement from "@/components/features/landing-page/header-management"; +import SidebarManagement from "@/components/features/landing-page/sidebar-management"; const imageSchema = z.object({ title: z.string().min(1, { message: "Judul diperlukan" }), mainKeyword: z.string().min(1, { message: "Keyword diperlukan" }), - seo: z.string().min(1, { message: "Tuliskan kata kunci atau frasa yang relevan dengan blog Anda, lalu tekan enter" }), + seo: z + .string() + .min(1, { + message: "Tuliskan kata kunci atau frasa yang relevan dengan blog Anda, lalu tekan enter", + }), description: z.string().min(2, { message: "Narasi Penugasan harus lebih dari 2 karakter." }), creatorName: z.string().min(1, { message: "Creator diperlukan" }), // tags: z.string().min(1, { message: "Judul diperlukan" }), @@ -73,7 +86,9 @@ const page = (props: any) => { const validationSchema = Yup.object().shape({ title: Yup.string().required("Judul tidak boleh kosong"), mainKeyword: Yup.string().required("Keyword tidak boleh kosong"), - seo: Yup.string().required("Tuliskan kata kunci atau frasa yang relevan dengan blog Anda, lalu tekan enter"), + seo: Yup.string().required( + "Tuliskan kata kunci atau frasa yang relevan dengan blog Anda, lalu tekan enter" + ), description: Yup.string().required("Narasi Penugasan harus lebih dari 2 karakter."), }); @@ -174,7 +189,10 @@ const page = (props: any) => { setMain({ id: response?.data?.data?.files[0]?.id, type: response?.data?.data?.fileType.name, - url: Number(response?.data?.data?.fileType?.id) == 4 ? response?.data?.data?.files[0]?.secondaryUrl : response?.data?.data?.files[0]?.url, + url: + Number(response?.data?.data?.fileType?.id) == 4 + ? response?.data?.data?.files[0]?.secondaryUrl + : response?.data?.data?.files[0]?.url, thumbnailFileUrl: response?.data?.data?.files[0]?.thumbnailFileUrl, names: response?.data?.data?.files[0]?.fileName, format: response?.data?.data?.files[0]?.format, @@ -334,7 +352,10 @@ const page = (props: any) => {

    {t("writingStyle")}

    - @@ -372,7 +393,16 @@ const page = (props: any) => { } + render={({ field: { onChange, value } }) => ( + + )} />
    @@ -381,7 +411,14 @@ const page = (props: any) => { control={control} name="mainKeyword" render={({ field: { onChange, value } }) => ( - + )} />
    @@ -391,12 +428,22 @@ const page = (props: any) => { control={control} name="seo" render={({ field: { onChange, value } }) => ( -
    @@ -60,4 +51,3 @@ const Textarea = React.forwardRef( Textarea.displayName = "Textarea"; export { Textarea }; - diff --git a/src/components/ui/toast.tsx b/src/components/ui/toast.tsx index 99146f70..7fdb54f7 100644 --- a/src/components/ui/toast.tsx +++ b/src/components/ui/toast.tsx @@ -1,13 +1,13 @@ -"use client" +"use client"; -import * as React from "react" -import * as ToastPrimitives from "@radix-ui/react-toast" -import { cva, type VariantProps } from "class-variance-authority" -import { X } from "lucide-react" +import * as React from "react"; +import * as ToastPrimitives from "@radix-ui/react-toast"; +import { cva, type VariantProps } from "class-variance-authority"; +import { X } from "lucide-react"; -import { cn } from "@/lib/utils/utils" +import { cn } from "@/lib/utils/utils"; -const ToastProvider = ToastPrimitives.Provider +const ToastProvider = ToastPrimitives.Provider; const ToastViewport = React.forwardRef< React.ElementRef, @@ -21,8 +21,8 @@ const ToastViewport = React.forwardRef< )} {...props} /> -)) -ToastViewport.displayName = ToastPrimitives.Viewport.displayName +)); +ToastViewport.displayName = ToastPrimitives.Viewport.displayName; const toastVariants = cva( "group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full", @@ -38,12 +38,11 @@ const toastVariants = cva( variant: "default", }, } -) +); const Toast = React.forwardRef< React.ElementRef, - React.ComponentPropsWithoutRef & - VariantProps + React.ComponentPropsWithoutRef & VariantProps >(({ className, variant, ...props }, ref) => { return ( - ) -}) -Toast.displayName = ToastPrimitives.Root.displayName + ); +}); +Toast.displayName = ToastPrimitives.Root.displayName; const ToastAction = React.forwardRef< React.ElementRef, @@ -67,8 +66,8 @@ const ToastAction = React.forwardRef< )} {...props} /> -)) -ToastAction.displayName = ToastPrimitives.Action.displayName +)); +ToastAction.displayName = ToastPrimitives.Action.displayName; const ToastClose = React.forwardRef< React.ElementRef, @@ -85,20 +84,16 @@ const ToastClose = React.forwardRef< > -)) -ToastClose.displayName = ToastPrimitives.Close.displayName +)); +ToastClose.displayName = ToastPrimitives.Close.displayName; const ToastTitle = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( - -)) -ToastTitle.displayName = ToastPrimitives.Title.displayName + +)); +ToastTitle.displayName = ToastPrimitives.Title.displayName; const ToastDescription = React.forwardRef< React.ElementRef, @@ -109,12 +104,12 @@ const ToastDescription = React.forwardRef< className={cn("text-sm opacity-90", className)} {...props} /> -)) -ToastDescription.displayName = ToastPrimitives.Description.displayName +)); +ToastDescription.displayName = ToastPrimitives.Description.displayName; -type ToastProps = React.ComponentPropsWithoutRef +type ToastProps = React.ComponentPropsWithoutRef; -type ToastActionElement = React.ReactElement +type ToastActionElement = React.ReactElement; export { type ToastProps, @@ -126,4 +121,4 @@ export { ToastDescription, ToastClose, ToastAction, -} +}; diff --git a/src/components/ui/toaster.tsx b/src/components/ui/toaster.tsx index e2233852..3aa665d1 100644 --- a/src/components/ui/toaster.tsx +++ b/src/components/ui/toaster.tsx @@ -1,4 +1,4 @@ -"use client" +"use client"; import { Toast, @@ -7,11 +7,11 @@ import { ToastProvider, ToastTitle, ToastViewport, -} from "@/components/ui/toast" -import { useToast } from "@/components/ui/use-toast" +} from "@/components/ui/toast"; +import { useToast } from "@/components/ui/use-toast"; export function Toaster() { - const { toasts } = useToast() + const { toasts } = useToast(); return ( @@ -20,16 +20,14 @@ export function Toaster() {
    {title && {title}} - {description && ( - {description} - )} + {description && {description}}
    {action}
    - ) + ); })}
    - ) + ); } diff --git a/src/components/ui/toggle-group.tsx b/src/components/ui/toggle-group.tsx index 3a933122..5eba1716 100644 --- a/src/components/ui/toggle-group.tsx +++ b/src/components/ui/toggle-group.tsx @@ -1,18 +1,16 @@ -"use client" +"use client"; -import * as React from "react" -import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group" -import { VariantProps } from "class-variance-authority" +import * as React from "react"; +import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group"; +import { VariantProps } from "class-variance-authority"; -import { cn } from "@/lib/utils/utils" -import { toggleVariants } from "@/components/ui/toggle" +import { cn } from "@/lib/utils/utils"; +import { toggleVariants } from "@/components/ui/toggle"; -const ToggleGroupContext = React.createContext< - VariantProps ->({ +const ToggleGroupContext = React.createContext>({ size: "default", variant: "default", -}) +}); const ToggleGroup = React.forwardRef< React.ElementRef, @@ -24,20 +22,18 @@ const ToggleGroup = React.forwardRef< className={cn("flex items-center justify-center gap-1", className)} {...props} > - - {children} - + {children} -)) +)); -ToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName +ToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName; const ToggleGroupItem = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & VariantProps >(({ className, children, variant, size, ...props }, ref) => { - const context = React.useContext(ToggleGroupContext) + const context = React.useContext(ToggleGroupContext); return ( {children} - ) -}) + ); +}); -ToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName +ToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName; -export { ToggleGroup, ToggleGroupItem } +export { ToggleGroup, ToggleGroupItem }; diff --git a/src/components/ui/toggle.tsx b/src/components/ui/toggle.tsx index 53c83eaf..c8393cce 100644 --- a/src/components/ui/toggle.tsx +++ b/src/components/ui/toggle.tsx @@ -1,10 +1,10 @@ -"use client" +"use client"; -import * as React from "react" -import * as TogglePrimitive from "@radix-ui/react-toggle" -import { cva, type VariantProps } from "class-variance-authority" +import * as React from "react"; +import * as TogglePrimitive from "@radix-ui/react-toggle"; +import { cva, type VariantProps } from "class-variance-authority"; -import { cn } from "@/lib/utils/utils" +import { cn } from "@/lib/utils/utils"; const toggleVariants = cva( "inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-secondary data-[state=on]:text-accent-foreground", @@ -12,7 +12,8 @@ const toggleVariants = cva( variants: { variant: { default: "bg-transparent", - outline: "border border-input dark:border-default-300 bg-transparent hover:bg-accent hover:text-accent-foreground", + outline: + "border border-input dark:border-default-300 bg-transparent hover:bg-accent hover:text-accent-foreground", }, size: { default: "h-10 px-3", @@ -25,20 +26,19 @@ const toggleVariants = cva( size: "default", }, } -) +); const Toggle = React.forwardRef< React.ElementRef, - React.ComponentPropsWithoutRef & - VariantProps + React.ComponentPropsWithoutRef & VariantProps >(({ className, variant, size, ...props }, ref) => ( -)) +)); -Toggle.displayName = TogglePrimitive.Root.displayName +Toggle.displayName = TogglePrimitive.Root.displayName; -export { Toggle, toggleVariants } +export { Toggle, toggleVariants }; diff --git a/src/components/ui/tooltip.tsx b/src/components/ui/tooltip.tsx index c98f9831..3186df1f 100644 --- a/src/components/ui/tooltip.tsx +++ b/src/components/ui/tooltip.tsx @@ -1,11 +1,11 @@ -"use client" +"use client"; -import * as React from "react" -import * as TooltipPrimitive from "@radix-ui/react-tooltip" - -import { cn } from "@/lib/utils/utils" +import * as React from "react"; +import * as TooltipPrimitive from "@radix-ui/react-tooltip"; import { cva, type VariantProps } from "class-variance-authority"; + import { color } from "@/lib/type"; +import { cn } from "@/lib/utils/utils"; const tooltipVariants = cva( "z-50 overflow-hidden rounded-md px-3 py-1.5 text-sm shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ", @@ -27,46 +27,36 @@ const tooltipVariants = cva( } ); -interface ToolTipProps extends React.ComponentPropsWithoutRef, VariantProps { - color?: color +interface ToolTipProps + extends React.ComponentPropsWithoutRef, + VariantProps { + color?: color; } -const Tooltip = TooltipPrimitive.Root -const TooltipTrigger = TooltipPrimitive.Trigger +const Tooltip = TooltipPrimitive.Root; +const TooltipTrigger = TooltipPrimitive.Trigger; const TooltipArrow = TooltipPrimitive.Arrow; const TooltipProvider = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef ->( - ({ delayDuration = 0, ...props }, ref) => ( - - ) -); +>(({ delayDuration = 0, ...props }, ref) => ( + +)); TooltipProvider.displayName = TooltipPrimitive.Provider.displayName; const TooltipContent = React.forwardRef< React.ElementRef, ToolTipProps ->( - ({ className, sideOffset = 4, color, children, ...props }, ref) => ( - - {children} - - ) -); +>(({ className, sideOffset = 4, color, children, ...props }, ref) => ( + + {children} + +)); TooltipContent.displayName = TooltipPrimitive.Content.displayName; -export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider, TooltipArrow } - - - - +export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider, TooltipArrow }; diff --git a/src/components/ui/use-toast.ts b/src/components/ui/use-toast.ts index 02e111d8..f6de74b7 100644 --- a/src/components/ui/use-toast.ts +++ b/src/components/ui/use-toast.ts @@ -1,78 +1,75 @@ -"use client" +"use client"; // Inspired by react-hot-toast library -import * as React from "react" +import * as React from "react"; -import type { - ToastActionElement, - ToastProps, -} from "@/components/ui/toast" +import type { ToastActionElement, ToastProps } from "@/components/ui/toast"; -const TOAST_LIMIT = 1 -const TOAST_REMOVE_DELAY = 1000000 +const TOAST_LIMIT = 1; +const TOAST_REMOVE_DELAY = 1000000; type ToasterToast = ToastProps & { - id: string - title?: React.ReactNode - description?: React.ReactNode - action?: ToastActionElement -} + id: string; + title?: React.ReactNode; + description?: React.ReactNode; + action?: ToastActionElement; +}; const actionTypes = { ADD_TOAST: "ADD_TOAST", UPDATE_TOAST: "UPDATE_TOAST", DISMISS_TOAST: "DISMISS_TOAST", REMOVE_TOAST: "REMOVE_TOAST", -} as const +} as const; -let count = 0 +let count = 0; function genId() { - count = (count + 1) % Number.MAX_SAFE_INTEGER - return count.toString() + count = (count + 1) % Number.MAX_SAFE_INTEGER; + return count.toString(); } -type ActionType = typeof actionTypes +type ActionType = typeof actionTypes; type Action = | { - type: ActionType["ADD_TOAST"] - toast: ToasterToast + type: ActionType["ADD_TOAST"]; + toast: ToasterToast; } | { - type: ActionType["UPDATE_TOAST"] - toast: Partial + type: ActionType["UPDATE_TOAST"]; + toast: Partial; } | { - type: ActionType["DISMISS_TOAST"] - toastId?: ToasterToast["id"] + type: ActionType["DISMISS_TOAST"]; + toastId?: ToasterToast["id"]; } | { - type: ActionType["REMOVE_TOAST"] - toastId?: ToasterToast["id"] - } + type: ActionType["REMOVE_TOAST"]; + toastId?: ToasterToast["id"]; + }; interface State { - toasts: ToasterToast[] + toasts: ToasterToast[]; } -const toastTimeouts = new Map>() +const toastTimeouts = new Map>(); const addToRemoveQueue = (toastId: string) => { if (toastTimeouts.has(toastId)) { - return + return; } const timeout = setTimeout(() => { - toastTimeouts.delete(toastId) + toastTimeouts.delete(toastId); dispatch({ type: "REMOVE_TOAST", toastId: toastId, - }) - }, TOAST_REMOVE_DELAY) + }); + }, TOAST_REMOVE_DELAY); - toastTimeouts.set(toastId, timeout) -} + toastTimeouts.set(toastId, timeout); +}; export const reducer = (state: State, action: Action): State => { switch (action.type) { @@ -80,27 +77,25 @@ export const reducer = (state: State, action: Action): State => { return { ...state, toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT), - } + }; case "UPDATE_TOAST": return { ...state, - toasts: state.toasts.map((t) => - t.id === action.toast.id ? { ...t, ...action.toast } : t - ), - } + toasts: state.toasts.map((t) => (t.id === action.toast.id ? { ...t, ...action.toast } : t)), + }; case "DISMISS_TOAST": { - const { toastId } = action + const { toastId } = action; // ! Side effects ! - This could be extracted into a dismissToast() action, // but I'll keep it here for simplicity if (toastId) { - addToRemoveQueue(toastId) + addToRemoveQueue(toastId); } else { state.toasts.forEach((toast) => { - addToRemoveQueue(toast.id) - }) + addToRemoveQueue(toast.id); + }); } return { @@ -113,44 +108,44 @@ export const reducer = (state: State, action: Action): State => { } : t ), - } + }; } case "REMOVE_TOAST": if (action.toastId === undefined) { return { ...state, toasts: [], - } + }; } return { ...state, toasts: state.toasts.filter((t) => t.id !== action.toastId), - } + }; } -} +}; -const listeners: Array<(state: State) => void> = [] +const listeners: Array<(state: State) => void> = []; -let memoryState: State = { toasts: [] } +let memoryState: State = { toasts: [] }; function dispatch(action: Action) { - memoryState = reducer(memoryState, action) + memoryState = reducer(memoryState, action); listeners.forEach((listener) => { - listener(memoryState) - }) + listener(memoryState); + }); } -type Toast = Omit +type Toast = Omit; function toast({ ...props }: Toast) { - const id = genId() + const id = genId(); const update = (props: ToasterToast) => dispatch({ type: "UPDATE_TOAST", toast: { ...props, id }, - }) - const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id }) + }); + const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id }); dispatch({ type: "ADD_TOAST", @@ -159,36 +154,36 @@ function toast({ ...props }: Toast) { id, open: true, onOpenChange: (open) => { - if (!open) dismiss() + if (!open) dismiss(); }, }, - }) + }); return { id: id, dismiss, update, - } + }; } function useToast() { - const [state, setState] = React.useState(memoryState) + const [state, setState] = React.useState(memoryState); React.useEffect(() => { - listeners.push(setState) + listeners.push(setState); return () => { - const index = listeners.indexOf(setState) + const index = listeners.indexOf(setState); if (index > -1) { - listeners.splice(index, 1) + listeners.splice(index, 1); } - } - }, [state]) + }; + }, [state]); return { ...state, toast, dismiss: (toastId?: string) => dispatch({ type: "DISMISS_TOAST", toastId }), - } + }; } -export { useToast, toast } +export { useToast, toast }; diff --git a/src/components/ui/view-source/view-source.tsx b/src/components/ui/view-source/view-source.tsx index 14838de1..126821b7 100644 --- a/src/components/ui/view-source/view-source.tsx +++ b/src/components/ui/view-source/view-source.tsx @@ -5,10 +5,23 @@ type ViewSourceProps = { }; const ViewSource = ({ pathname }: ViewSourceProps) => ( - - + + - + diff --git a/src/config/fonts.ts b/src/config/fonts.ts new file mode 100644 index 00000000..1d968d7c --- /dev/null +++ b/src/config/fonts.ts @@ -0,0 +1,8 @@ +import { DM_Sans } from "next/font/google"; + +export const dmSans = DM_Sans({ + subsets: ["latin"], + variable: "--font-dm-sans", + display: "swap", + adjustFontFallback: false, +}); \ No newline at end of file diff --git a/src/config/locales.ts b/src/config/locales.ts index 989f2d56..fcd03890 100644 --- a/src/config/locales.ts +++ b/src/config/locales.ts @@ -1,4 +1,4 @@ -export const locales = ['in', 'en'] as const; +export const locales = ["in", "en"] as const; export type Locale = (typeof locales)[number]; -export const defaultLocale = 'in' as const; \ No newline at end of file +export const defaultLocale = "in" as const; diff --git a/src/config/site.ts b/src/config/site.ts index 93a5840d..7cd75e0d 100644 --- a/src/config/site.ts +++ b/src/config/site.ts @@ -1,13 +1,14 @@ export const siteConfig = { name: "DashCode", url: "https://themeforest.net/item/dashcode-admin-dashboard-template/42600453", - ogImage: "https://themeforest.img.customer.envatousercontent.com/files/489597052/01_Preview%20Image.__large_preview.png?auto=compress%2Cformat&q=80&fit=crop&crop=top&max-h=8000&max-w=590&s=cb5220f47f686ada2ec8a93545fb62c1", + ogImage: + "https://themeforest.img.customer.envatousercontent.com/files/489597052/01_Preview%20Image.__large_preview.png?auto=compress%2Cformat&q=80&fit=crop&crop=top&max-h=8000&max-w=590&s=cb5220f47f686ada2ec8a93545fb62c1", description: "DashCode presents you with the most powerful, simplest, and fastest developer-friendly and highly customizable React, Vue 3, and Tailwind templates to build web UI for your app.", links: { twitter: "#", github: "#", }, -} +}; -export type SiteConfig = typeof siteConfig \ No newline at end of file +export type SiteConfig = typeof siteConfig; diff --git a/src/i18n/navigation.ts b/src/i18n/navigation.ts index 9d67c950..24221c6d 100644 --- a/src/i18n/navigation.ts +++ b/src/i18n/navigation.ts @@ -1,5 +1,5 @@ -import {createNavigation} from 'next-intl/navigation'; -import {routing} from './routing'; +import { createNavigation } from "next-intl/navigation"; -export const {Link, getPathname, redirect, usePathname, useRouter} = - createNavigation(routing); +import { routing } from "./routing"; + +export const { Link, getPathname, redirect, usePathname, useRouter } = createNavigation(routing); diff --git a/src/i18n/request.ts b/src/i18n/request.ts index eb44324b..1a9231c3 100644 --- a/src/i18n/request.ts +++ b/src/i18n/request.ts @@ -1,16 +1,15 @@ -import { hasLocale } from 'next-intl'; -import { getRequestConfig } from 'next-intl/server'; -import { routing } from './routing'; +import { hasLocale } from "next-intl"; +import { getRequestConfig } from "next-intl/server"; -export default getRequestConfig(async ({requestLocale}) => { +import { routing } from "./routing"; + +export default getRequestConfig(async ({ requestLocale }) => { // Typically corresponds to the `[locale]` segment const requested = await requestLocale; - const locale = hasLocale(routing.locales, requested) - ? requested - : routing.defaultLocale; + const locale = hasLocale(routing.locales, requested) ? requested : routing.defaultLocale; return { locale, - messages: (await import(`./messages/${locale}.json`)).default + messages: (await import(`./messages/${locale}.json`)).default, }; }); diff --git a/src/i18n/routing.ts b/src/i18n/routing.ts index 4d5a9214..07b4ac5c 100644 --- a/src/i18n/routing.ts +++ b/src/i18n/routing.ts @@ -1,9 +1,9 @@ -import {defineRouting} from 'next-intl/routing'; +import { defineRouting } from "next-intl/routing"; export const routing = defineRouting({ - locales: ['in', 'en'], - defaultLocale: 'in', + locales: ["in", "en"], + defaultLocale: "in", pathnames: { - '/': '/', - } + "/": "/", + }, }); diff --git a/src/lib/hooks/use-chat.ts b/src/lib/hooks/use-chat.ts index 0c4ae30b..a26f57bf 100644 --- a/src/lib/hooks/use-chat.ts +++ b/src/lib/hooks/use-chat.ts @@ -1,4 +1,3 @@ - import { atom, useAtom } from "jotai"; export type ChatConfig = { diff --git a/src/lib/hooks/use-config.ts b/src/lib/hooks/use-config.ts index 9eeb3754..56370d55 100644 --- a/src/lib/hooks/use-config.ts +++ b/src/lib/hooks/use-config.ts @@ -1,57 +1,53 @@ -import { useAtom } from "jotai" -import { atomWithStorage } from "jotai/utils" -import { layoutType, sidebarType, navBarType} from "@/lib/type" - +import { useAtom } from "jotai"; +import { atomWithStorage } from "jotai/utils"; +import { layoutType, navBarType, sidebarType } from "@/lib/type"; export type Config = { - collapsed: boolean - theme: string - skin: 'default' | 'bordered' - layout: layoutType - sidebar: sidebarType - menuHidden: boolean, - showSearchBar: boolean, - showSwitcher: boolean - topHeader: 'default' | 'links' - contentWidth: 'wide' | 'boxed' - navbar: navBarType - footer: 'sticky' | 'default' | 'hidden' - isRtl: boolean - subMenu: boolean - hasSubMenu: boolean - sidebarTheme: string, - headerTheme: string, - sidebarBgImage?: string - radius: number - -} + collapsed: boolean; + theme: string; + skin: "default" | "bordered"; + layout: layoutType; + sidebar: sidebarType; + menuHidden: boolean; + showSearchBar: boolean; + showSwitcher: boolean; + topHeader: "default" | "links"; + contentWidth: "wide" | "boxed"; + navbar: navBarType; + footer: "sticky" | "default" | "hidden"; + isRtl: boolean; + subMenu: boolean; + hasSubMenu: boolean; + sidebarTheme: string; + headerTheme: string; + sidebarBgImage?: string; + radius: number; +}; export const defaultConfig: Config = { collapsed: false, theme: "zinc", - skin: 'default', + skin: "default", layout: "vertical", - sidebar: 'classic', + sidebar: "classic", menuHidden: false, showSearchBar: true, - topHeader: 'default', - contentWidth: 'wide', - navbar: 'sticky', - footer: 'default', + topHeader: "default", + contentWidth: "wide", + navbar: "sticky", + footer: "default", isRtl: false, showSwitcher: true, subMenu: false, hasSubMenu: false, - sidebarTheme: 'dark', - headerTheme: 'light', + sidebarTheme: "dark", + headerTheme: "light", sidebarBgImage: undefined, radius: 0.5, -} +}; - -const configAtom = atomWithStorage("config", defaultConfig) +const configAtom = atomWithStorage("config", defaultConfig); export function useConfig() { - - return useAtom(configAtom) + return useAtom(configAtom); } diff --git a/src/lib/hooks/use-media-query.ts b/src/lib/hooks/use-media-query.ts index 95e552cd..7ac3915a 100644 --- a/src/lib/hooks/use-media-query.ts +++ b/src/lib/hooks/use-media-query.ts @@ -1,19 +1,19 @@ -import * as React from "react" +import * as React from "react"; export function useMediaQuery(query: string) { - const [value, setValue] = React.useState(false) + const [value, setValue] = React.useState(false); React.useEffect(() => { function onChange(event: MediaQueryListEvent) { - setValue(event.matches) + setValue(event.matches); } - const result = matchMedia(query) - result.addEventListener("change", onChange) - setValue(result.matches) + const result = matchMedia(query); + result.addEventListener("change", onChange); + setValue(result.matches); - return () => result.removeEventListener("change", onChange) - }, [query]) + return () => result.removeEventListener("change", onChange); + }, [query]); - return value + return value; } diff --git a/src/lib/hooks/use-menu-hover.ts b/src/lib/hooks/use-menu-hover.ts index 9d971fa9..095c3afd 100644 --- a/src/lib/hooks/use-menu-hover.ts +++ b/src/lib/hooks/use-menu-hover.ts @@ -1,14 +1,11 @@ - import { atom, useAtom } from "jotai"; export type hoverConfig = { hovered: boolean; - }; const menuHoverConfigAtom = atom({ hovered: false, - }); export function useMenuHoverConfig() { diff --git a/src/lib/hooks/use-mobile-menu.ts b/src/lib/hooks/use-mobile-menu.ts index 2162a3a2..dcd02cd7 100644 --- a/src/lib/hooks/use-mobile-menu.ts +++ b/src/lib/hooks/use-mobile-menu.ts @@ -1,4 +1,3 @@ - import { atom, useAtom } from "jotai"; export type MobileMenuConfig = { @@ -11,4 +10,4 @@ const mobileMenuConfig = atom({ export function useMobileMenuConfig() { return useAtom(mobileMenuConfig); -} \ No newline at end of file +} diff --git a/src/lib/hooks/use-mounted.ts b/src/lib/hooks/use-mounted.ts index 3a20c62a..57bb851e 100644 --- a/src/lib/hooks/use-mounted.ts +++ b/src/lib/hooks/use-mounted.ts @@ -1,11 +1,11 @@ -import * as React from "react" +import * as React from "react"; export function useMounted() { - const [mounted, setMounted] = React.useState(false) + const [mounted, setMounted] = React.useState(false); React.useEffect(() => { - setMounted(true) - }, []) + setMounted(true); + }, []); - return mounted + return mounted; } diff --git a/src/lib/hooks/use-mutation-observer.ts b/src/lib/hooks/use-mutation-observer.ts index ad9b7ec7..757e6620 100644 --- a/src/lib/hooks/use-mutation-observer.ts +++ b/src/lib/hooks/use-mutation-observer.ts @@ -1,4 +1,4 @@ -import * as React from "react" +import * as React from "react"; export const useMutationObserver = ( ref: React.MutableRefObject, @@ -12,9 +12,9 @@ export const useMutationObserver = ( ) => { React.useEffect(() => { if (ref.current) { - const observer = new MutationObserver(callback) - observer.observe(ref.current, options) - return () => observer.disconnect() + const observer = new MutationObserver(callback); + observer.observe(ref.current, options); + return () => observer.disconnect(); } - }, [ref, callback, options]) -} + }, [ref, callback, options]); +}; diff --git a/src/lib/hooks/use-todo.ts b/src/lib/hooks/use-todo.ts index 4d831430..8dfc87f4 100644 --- a/src/lib/hooks/use-todo.ts +++ b/src/lib/hooks/use-todo.ts @@ -1,16 +1,14 @@ -import { useAtom } from "jotai" -import { atomWithStorage } from "jotai/utils" +import { useAtom } from "jotai"; +import { atomWithStorage } from "jotai/utils"; export type TodoConfig = { - isOpen: boolean -} + isOpen: boolean; +}; const todoConfigAtom = atomWithStorage("todoConfig", { isOpen: false, - -}) +}); export function useTodoConfig() { - - return useAtom(todoConfigAtom) + return useAtom(todoConfigAtom); } diff --git a/src/lib/services/auth.ts b/src/lib/services/auth.ts index ac094adb..ba7c0b1b 100644 --- a/src/lib/services/auth.ts +++ b/src/lib/services/auth.ts @@ -1,4 +1,5 @@ import qs from "qs"; + import { getAPIDummy } from "./http-config/axiosCustom"; import { httpGet, httpPost } from "./http-config/http-base-service"; import { diff --git a/src/lib/services/communication/communication.ts b/src/lib/services/communication/communication.ts index 7ecfd5cb..4526cf84 100644 --- a/src/lib/services/communication/communication.ts +++ b/src/lib/services/communication/communication.ts @@ -1,9 +1,10 @@ +import { title } from "process"; + import { httpDeleteInterceptor, httpGetInterceptor, httpPostInterceptor, } from "../http-config/http-interceptor-service"; -import { title } from "process"; export async function listTicketingInternal( page: number, @@ -99,10 +100,7 @@ export async function getTicketCollaborationTeams(id: string | number) { return httpGetInterceptor(url); } -export async function saveCollaborationTeams( - id: string | number, - userId: string | number -) { +export async function saveCollaborationTeams(id: string | number, userId: string | number) { const url = `ticketing/collaboration/teams?ticketId=${id}&userId=${userId}`; return httpPostInterceptor(url); } diff --git a/src/lib/services/communication/report-account.ts b/src/lib/services/communication/report-account.ts index 134cbd55..23c162a1 100644 --- a/src/lib/services/communication/report-account.ts +++ b/src/lib/services/communication/report-account.ts @@ -1,10 +1,6 @@ import { httpGetInterceptor } from "../http-config/http-interceptor-service"; -export async function getUserReportsPagination( - page: any, - size: any, - title: string = "" -) { +export async function getUserReportsPagination(page: any, size: any, title: string = "") { return await httpGetInterceptor( `users/reports/pagination?enablePage=1&size=${size}&page=${page}&title=${title}&sortBy=createdAt&sort=desc` ); diff --git a/src/lib/services/content/ai.ts b/src/lib/services/content/ai.ts index 28a4f055..757efdc5 100644 --- a/src/lib/services/content/ai.ts +++ b/src/lib/services/content/ai.ts @@ -4,8 +4,7 @@ import { httpGet, httpPost } from "../http-config/nulisAIApi"; export async function generateDataArticle(data: any) { const headers = { "content-type": "application/json", - Authorization: - "Basic bmdETFBQaW9ycGx6bncyalRxVmUzWUZDejV4cUtmVUo6UHJEaERXUmNvdkJSNlc1Sg==", + Authorization: "Basic bmdETFBQaW9ycGx6bncyalRxVmUzWUZDejV4cUtmVUo6UHJEaERXUmNvdkJSNlc1Sg==", }; return await httpPost("ai-writer/save-article", headers, data); } @@ -13,8 +12,7 @@ export async function generateDataArticle(data: any) { export async function getGenerateTitle(data: any) { const headers = { "content-type": "application/json", - Authorization: - "Basic bmdETFBQaW9ycGx6bncyalRxVmUzWUZDejV4cUtmVUo6UHJEaERXUmNvdkJSNlc1Sg==", + Authorization: "Basic bmdETFBQaW9ycGx6bncyalRxVmUzWUZDejV4cUtmVUo6UHJEaERXUmNvdkJSNlc1Sg==", }; return await httpPost("ai-writer/generate-title", headers, data); } @@ -22,8 +20,7 @@ export async function getGenerateTitle(data: any) { export async function getGenerateKeywords(data: any) { const headers = { "content-type": "application/json", - Authorization: - "Basic bmdETFBQaW9ycGx6bncyalRxVmUzWUZDejV4cUtmVUo6UHJEaERXUmNvdkJSNlc1Sg==", + Authorization: "Basic bmdETFBQaW9ycGx6bncyalRxVmUzWUZDejV4cUtmVUo6UHJEaERXUmNvdkJSNlc1Sg==", }; return await httpPost("ai-writer/generate-keywords", headers, data); } @@ -31,8 +28,7 @@ export async function getGenerateKeywords(data: any) { export async function getDetailArticle(id: any) { const headers = { "content-type": "application/json", - Authorization: - "Basic bmdETFBQaW9ycGx6bncyalRxVmUzWUZDejV4cUtmVUo6UHJEaERXUmNvdkJSNlc1Sg==", + Authorization: "Basic bmdETFBQaW9ycGx6bncyalRxVmUzWUZDejV4cUtmVUo6UHJEaERXUmNvdkJSNlc1Sg==", }; return await httpGet(`ai-writer/article/findArticleById/${id}`, headers); } @@ -40,8 +36,7 @@ export async function getDetailArticle(id: any) { export async function getSeoScore(id: any) { const headers = { "content-type": "application/json", - Authorization: - "Basic bmdETFBQaW9ycGx6bncyalRxVmUzWUZDejV4cUtmVUo6UHJEaERXUmNvdkJSNlc1Sg==", + Authorization: "Basic bmdETFBQaW9ycGx6bncyalRxVmUzWUZDejV4cUtmVUo6UHJEaERXUmNvdkJSNlc1Sg==", }; return await httpGet(`ai-writer/article/checkSEOScore/${id}`, headers); } @@ -49,8 +44,7 @@ export async function getSeoScore(id: any) { export async function updateManualArticle(data: any) { const headers = { "content-type": "application/json", - Authorization: - "Basic bmdETFBQaW9ycGx6bncyalRxVmUzWUZDejV4cUtmVUo6UHJEaERXUmNvdkJSNlc1Sg==", + Authorization: "Basic bmdETFBQaW9ycGx6bncyalRxVmUzWUZDejV4cUtmVUo6UHJEaERXUmNvdkJSNlc1Sg==", }; return await httpPost("ai-writer/update-article", headers, data); } @@ -58,8 +52,7 @@ export async function updateManualArticle(data: any) { export async function getGenerateTopicKeywords(data: any) { const headers = { "content-type": "application/json", - Authorization: - "Basic bmdETFBQaW9ycGx6bncyalRxVmUzWUZDejV4cUtmVUo6UHJEaERXUmNvdkJSNlc1Sg==", + Authorization: "Basic bmdETFBQaW9ycGx6bncyalRxVmUzWUZDejV4cUtmVUo6UHJEaERXUmNvdkJSNlc1Sg==", }; return await httpPost("ai-writer/generate-topic-keywords", headers, data); } @@ -67,8 +60,7 @@ export async function getGenerateTopicKeywords(data: any) { export async function saveBulkArticle(data: any) { const headers = { "content-type": "application/json", - Authorization: - "Basic bmdETFBQaW9ycGx6bncyalRxVmUzWUZDejV4cUtmVUo6UHJEaERXUmNvdkJSNlc1Sg==", + Authorization: "Basic bmdETFBQaW9ycGx6bncyalRxVmUzWUZDejV4cUtmVUo6UHJEaERXUmNvdkJSNlc1Sg==", }; return await httpPost("ai-writer/save-bulk-article", headers, data); } @@ -76,8 +68,7 @@ export async function saveBulkArticle(data: any) { export async function getGenerateRewriter(data: any) { const headers = { "content-type": "application/json", - Authorization: - "Basic bmdETFBQaW9ycGx6bncyalRxVmUzWUZDejV4cUtmVUo6UHJEaERXUmNvdkJSNlc1Sg==", + Authorization: "Basic bmdETFBQaW9ycGx6bncyalRxVmUzWUZDejV4cUtmVUo6UHJEaERXUmNvdkJSNlc1Sg==", }; return await httpPost("ai-writer/create-rewriter", headers, data); } @@ -85,8 +76,7 @@ export async function getGenerateRewriter(data: any) { export async function generateSpeechToText(data: any) { const headers = { "content-type": "multipart/form-data", - Authorization: - "Basic bmdETFBQaW9ycGx6bncyalRxVmUzWUZDejV4cUtmVUo6UHJEaERXUmNvdkJSNlc1Sg==", + Authorization: "Basic bmdETFBQaW9ycGx6bncyalRxVmUzWUZDejV4cUtmVUo6UHJEaERXUmNvdkJSNlc1Sg==", }; return await httpPost("ai-writer/speech-to-text", headers, data); } @@ -94,8 +84,7 @@ export async function generateSpeechToText(data: any) { export async function generateDataBulkArticle(data: any) { const headers = { "content-type": "application/json", - Authorization: - "Basic bmdETFBQaW9ycGx6bncyalRxVmUzWUZDejV4cUtmVUo6UHJEaERXUmNvdkJSNlc1Sg==", + Authorization: "Basic bmdETFBQaW9ycGx6bncyalRxVmUzWUZDejV4cUtmVUo6UHJEaERXUmNvdkJSNlc1Sg==", }; return await httpPost("ai-writer/save-bulk-article", headers, data); } @@ -109,5 +98,3 @@ export async function detailMediaNulis(id: any) { const url = `media/nulis-ai?id=${id}`; return httpGetInterceptor({ url }); } - - diff --git a/src/lib/services/content/content.ts b/src/lib/services/content/content.ts index 257c24f1..23a9562d 100644 --- a/src/lib/services/content/content.ts +++ b/src/lib/services/content/content.ts @@ -145,9 +145,7 @@ export async function listNulisAI(limit: any, page: any, title: string = "") { } export async function getTagsBySubCategoryId(subCategory: any) { - return await httpGetInterceptor( - `media/tags/list?subCategoryId=${subCategory}` - ); + return await httpGetInterceptor(`media/tags/list?subCategoryId=${subCategory}`); } export async function listEnableCategory(type: any) { @@ -233,4 +231,4 @@ export async function postActivityLog(data: any) { "content-type": "application/json", }; return httpPost(url, headers, data); -} \ No newline at end of file +} diff --git a/src/lib/services/contest/contest.ts b/src/lib/services/contest/contest.ts index 9c9c2aeb..9790fea3 100644 --- a/src/lib/services/contest/contest.ts +++ b/src/lib/services/contest/contest.ts @@ -1,7 +1,4 @@ -import { - httpGetInterceptor, - httpPostInterceptor, -} from "../http-config/http-interceptor-service"; +import { httpGetInterceptor, httpPostInterceptor } from "../http-config/http-interceptor-service"; export async function listContest(title: string = "", size: any, page: number) { return await httpGetInterceptor( diff --git a/src/lib/services/detail/detail.ts b/src/lib/services/detail/detail.ts index 7d3db8e3..438f350e 100644 --- a/src/lib/services/detail/detail.ts +++ b/src/lib/services/detail/detail.ts @@ -1,4 +1,8 @@ -import { httpDeleteInterceptor, httpGetInterceptor, httpPostInterceptor } from "../http-config/http-interceptor-service"; +import { + httpDeleteInterceptor, + httpGetInterceptor, + httpPostInterceptor, +} from "../http-config/http-interceptor-service"; export async function getDetail(id: any, state: any) { const url = `media/public?slug=${id}&state=${state}`; diff --git a/src/lib/services/http-config/axios-interceptor-instance.ts b/src/lib/services/http-config/axios-interceptor-instance.ts index a3522e81..61875b9c 100644 --- a/src/lib/services/http-config/axios-interceptor-instance.ts +++ b/src/lib/services/http-config/axios-interceptor-instance.ts @@ -1,5 +1,6 @@ import axios from "axios"; import Cookies from "js-cookie"; + import { getCsrfToken, login } from "../auth"; const baseURL = "https://netidhub.com/api/"; @@ -19,8 +20,7 @@ axiosInterceptorInstance.interceptors.request.use( (config) => { const accessToken = Cookies.get("access_token"); if (accessToken) { - if (config.headers) - config.headers.Authorization = "Bearer " + accessToken; + if (config.headers) config.headers.Authorization = "Bearer " + accessToken; } return config; }, diff --git a/src/lib/services/http-config/http-base-service.ts b/src/lib/services/http-config/http-base-service.ts index 3290e120..d151867f 100644 --- a/src/lib/services/http-config/http-base-service.ts +++ b/src/lib/services/http-config/http-base-service.ts @@ -1,8 +1,9 @@ -import axiosBaseInstance from "./axios-base-instance"; import axios from "axios"; import Cookies from "js-cookie"; import qs from "qs"; + import { getCsrfToken } from "../auth"; +import axiosBaseInstance from "./axios-base-instance"; export async function httpPost(pathUrl: any, headers: any, data?: any) { const resCsrf = await getCsrfToken(); @@ -17,34 +18,11 @@ export async function httpPost(pathUrl: any, headers: any, data?: any) { ...defaultHeaders, ...headers, ...(csrfToken ? { "X-XSRF-TOKEN": csrfToken } : {}), - ...(authToken ? { "Authorization" : `Bearer ${authToken}`} : {}), + ...(authToken ? { Authorization: `Bearer ${authToken}` } : {}), }; - - const response = await axiosBaseInstance - .post(pathUrl, data, { headers: mergedHeaders }) - .catch(function (error: any) { - console.log(error); - return error.response; - }); - console.log("Response base svc : ", response); - if (response?.status == 200 || response?.status == 201) { - return { - error: false, - message: "success", - data: response?.data, - }; - } else { - return { - error: true, - message: response?.data?.message || response?.data || null, - data: null, - }; - } -} -export async function httpGet(pathUrl: any, headers: any) { const response = await axiosBaseInstance - .get(pathUrl, { headers }) + .post(pathUrl, data, { headers: mergedHeaders }) .catch(function (error: any) { console.log(error); return error.response; @@ -65,6 +43,27 @@ export async function httpGet(pathUrl: any, headers: any) { } } +export async function httpGet(pathUrl: any, headers: any) { + const response = await axiosBaseInstance.get(pathUrl, { headers }).catch(function (error: any) { + console.log(error); + return error.response; + }); + console.log("Response base svc : ", response); + if (response?.status == 200 || response?.status == 201) { + return { + error: false, + message: "success", + data: response?.data, + }; + } else { + return { + error: true, + message: response?.data?.message || response?.data || null, + data: null, + }; + } +} + export async function httpPut(pathUrl: any, headers: any, data?: any) { const resCsrf = await getCsrfToken(); const csrfToken = resCsrf?.data?.token; @@ -72,7 +71,7 @@ export async function httpPut(pathUrl: any, headers: any, data?: any) { const defaultHeaders = { "Content-Type": "application/json", }; - + const mergedHeaders = { ...defaultHeaders, ...headers, diff --git a/src/lib/services/http-config/http-interceptor-prod-service.ts b/src/lib/services/http-config/http-interceptor-prod-service.ts index 68b09b47..9f01fe0d 100644 --- a/src/lib/services/http-config/http-interceptor-prod-service.ts +++ b/src/lib/services/http-config/http-interceptor-prod-service.ts @@ -1,13 +1,12 @@ import { useRouter } from "next/navigation"; import Cookies from "js-cookie"; + import { getCsrfToken } from "../auth"; import axiosBaseProdInstance from "./axios-base-prod-instance"; export async function httpGetInterceptor(pathUrl: any) { const pathname = window.location.pathname; - const response = await axiosBaseProdInstance - .get(pathUrl) - .catch((error) => error.response); + const response = await axiosBaseProdInstance.get(pathUrl).catch((error) => error.response); console.log("Response interceptor : ", response); if (response?.status == 200 || response?.status == 201) { return { @@ -35,11 +34,7 @@ export async function httpGetInterceptor(pathUrl: any) { } } -export async function httpPostInterceptor( - pathUrl: any, - data?: any, - headers?: any -) { +export async function httpPostInterceptor(pathUrl: any, data?: any, headers?: any) { const resCsrf = await getCsrfToken(); const defaultHeaders = { @@ -74,11 +69,7 @@ export async function httpPostInterceptor( } } -export async function httpPutInterceptor( - pathUrl: any, - data: any, - headers?: any -) { +export async function httpPutInterceptor(pathUrl: any, data: any, headers?: any) { const resCsrf = await getCsrfToken(); const csrfToken = resCsrf?.data?.token; diff --git a/src/lib/services/http-config/http-interceptor-service.ts b/src/lib/services/http-config/http-interceptor-service.ts index 1df7c16d..91e9b849 100644 --- a/src/lib/services/http-config/http-interceptor-service.ts +++ b/src/lib/services/http-config/http-interceptor-service.ts @@ -1,14 +1,13 @@ import { useRouter } from "next/navigation"; -import axiosInterceptorInstance from "./axios-interceptor-instance"; import Cookies from "js-cookie"; + import { getCsrfToken } from "../auth"; import axiosBaseInstance from "./axios-base-instance"; +import axiosInterceptorInstance from "./axios-interceptor-instance"; import axiosInstanceJson from "./axiosInstanceJson"; export async function httpGetInterceptorForMetadata(pathUrl: any) { - const response = await axiosInterceptorInstance - .get(pathUrl) - .catch((error) => error.response); + const response = await axiosInterceptorInstance.get(pathUrl).catch((error) => error.response); console.log("Response interceptor : ", response); if (response?.status == 200 || response?.status == 201) { return { @@ -31,9 +30,7 @@ export async function httpGetInterceptorForMetadata(pathUrl: any) { export async function httpGetInterceptor(pathUrl: any) { const pathname = window?.location.pathname; - const response = await axiosInterceptorInstance - .get(pathUrl) - .catch((error) => error.response); + const response = await axiosInterceptorInstance.get(pathUrl).catch((error) => error.response); console.log("Response interceptor : ", response); if (response?.status == 200 || response?.status == 201) { return { @@ -61,11 +58,7 @@ export async function httpGetInterceptor(pathUrl: any) { } } -export async function httpPostInterceptor( - pathUrl: any, - data?: any, - headers?: any -) { +export async function httpPostInterceptor(pathUrl: any, data?: any, headers?: any) { const resCsrf = await getCsrfToken(); const csrfToken = resCsrf?.data?.token; @@ -102,11 +95,7 @@ export async function httpPostInterceptor( } } -export async function httpPutInterceptor( - pathUrl: any, - data: any, - headers?: any -) { +export async function httpPutInterceptor(pathUrl: any, data: any, headers?: any) { const resCsrf = await getCsrfToken(); const csrfToken = resCsrf?.data?.token; diff --git a/src/lib/services/http-config/nulisAIApi.ts b/src/lib/services/http-config/nulisAIApi.ts index 7963ed61..6c17edb7 100644 --- a/src/lib/services/http-config/nulisAIApi.ts +++ b/src/lib/services/http-config/nulisAIApi.ts @@ -1,12 +1,12 @@ import axiosNulisAIInstance from "./axiosNulisAIInstance"; export async function httpPost(pathUrl: any, headers: any, data: any) { - const response = await axiosNulisAIInstance - .post(pathUrl, data, { headers }) - .catch(function (error: any) { - console.log(error); - return error.response; - }); + const response = await axiosNulisAIInstance.post(pathUrl, data, { headers }).catch(function ( + error: any + ) { + console.log(error); + return error.response; + }); console.log("Response base svc : ", response); if (response?.status == 200 || response?.status == 201) { return { @@ -24,12 +24,12 @@ export async function httpPost(pathUrl: any, headers: any, data: any) { } export async function httpGet(pathUrl: any, headers: any) { - const response = await axiosNulisAIInstance - .get(pathUrl, { headers }) - .catch(function (error: any) { - console.log(error); - return error.response; - }); + const response = await axiosNulisAIInstance.get(pathUrl, { headers }).catch(function ( + error: any + ) { + console.log(error); + return error.response; + }); console.log("Response base svc : ", response); if (response?.status == 200 || response?.status == 201) { return { diff --git a/src/lib/services/landing/landing.ts b/src/lib/services/landing/landing.ts index ffdcc2d4..9583e1bd 100644 --- a/src/lib/services/landing/landing.ts +++ b/src/lib/services/landing/landing.ts @@ -37,10 +37,7 @@ export async function getHeroData() { ); } -export async function listStaticBanner( - group: any = "", - isInt: Boolean = false -) { +export async function listStaticBanner(group: any = "", isInt: Boolean = false) { const url = `media/static-banner?group=${group}&isInt=${isInt}`; return httpGetInterceptor(url); } @@ -72,9 +69,7 @@ export async function getPrivacy() { } export async function getIndeksData() { - return await httpGetInterceptor( - `blog/public/pagination?enablePage=1&page=0&size=20` - ); + return await httpGetInterceptor(`blog/public/pagination?enablePage=1&page=0&size=20`); } export async function getDetail(slug: string) { @@ -82,15 +77,11 @@ export async function getDetail(slug: string) { } export async function getDetailMetaData(slug: string) { - return await httpGetInterceptorForMetadata( - `media/public?slug=${slug}&state=mabes` - ); + return await httpGetInterceptorForMetadata(`media/public?slug=${slug}&state=mabes`); } export async function getDetailIndeks() { - return await httpGetInterceptor( - `blog/public/pagination?enablePage=1&page=0&size=6` - ); + return await httpGetInterceptor(`blog/public/pagination?enablePage=1&page=0&size=6`); } export async function getFeedback() { @@ -195,9 +186,7 @@ export async function deleteWishlist(id: any) { } export async function getContentRewritePagination(page = 0, size = 10) { - return await httpGetInterceptor( - `media/rewrite/pagination?size=${size}&page=${page}` - ); + return await httpGetInterceptor(`media/rewrite/pagination?size=${size}&page=${page}`); } export async function getContentRewrite(id: any) { diff --git a/src/lib/services/login-services.ts b/src/lib/services/login-services.ts index fa4a5281..b7ee9dad 100644 --- a/src/lib/services/login-services.ts +++ b/src/lib/services/login-services.ts @@ -1,7 +1,5 @@ import { httpGet, httpPost } from "./http-config/http-base-service"; -import { - httpGetInterceptorWithToken, -} from "./http-config/http-interceptor-service"; +import { httpGetInterceptorWithToken } from "./http-config/http-interceptor-service"; export async function login(data: any) { const pathUrl = `signin`; diff --git a/src/lib/services/media-tracking/media-tracking.ts b/src/lib/services/media-tracking/media-tracking.ts index 402f7e05..57767bfe 100644 --- a/src/lib/services/media-tracking/media-tracking.ts +++ b/src/lib/services/media-tracking/media-tracking.ts @@ -1,7 +1,4 @@ -import { - httpGetInterceptor, - httpPostInterceptor, -} from "../http-config/http-interceptor-service"; +import { httpGetInterceptor, httpPostInterceptor } from "../http-config/http-interceptor-service"; export async function getMediaTrackingMonitoring(page: number, size: number) { const url = `cekmedsos/monitoring/pagination?page=${page}&size=${size}`; @@ -18,11 +15,7 @@ export async function mediaTrackingSave(data: any) { return httpPostInterceptor(url, data); } -export async function getMediaTracking( - page: any, - title: string = "", - size: any -) { +export async function getMediaTracking(page: any, title: string = "", size: any) { return httpGetInterceptor( `/media/tracking/monitoring/pagination?enablePagination=1&size=${size}&page=${page}&title=${title}` ); @@ -38,20 +31,14 @@ export async function getMediaTracking( export async function getMediaTrackingResult(data: any) { // const url = `/media/tracking/monitoring/pagination`; - const url = `/media/tracking/monitoring/results/pagination?trackingId=${ - data.id || "" - }`; + const url = `/media/tracking/monitoring/results/pagination?trackingId=${data.id || ""}`; return httpGetInterceptor(url); } export async function listData5Data() { - return await httpGetInterceptor( - `media/public/list?enablePage=1&sort=desc&size=5` - ); + return await httpGetInterceptor(`media/public/list?enablePage=1&sort=desc&size=5`); } export async function listDataAllNonPagination(search: string) { - return await httpGetInterceptor( - `media/public/list?enablePage=0&sort=desc&title=${search || ""}` - ); + return await httpGetInterceptor(`media/public/list?enablePage=0&sort=desc&title=${search || ""}`); } diff --git a/src/lib/services/report/report.ts b/src/lib/services/report/report.ts index f469359e..2aef29a4 100644 --- a/src/lib/services/report/report.ts +++ b/src/lib/services/report/report.ts @@ -1,7 +1,4 @@ -import { - httpGetInterceptor, - httpPostInterceptor, -} from "../http-config/http-interceptor-service"; +import { httpGetInterceptor, httpPostInterceptor } from "../http-config/http-interceptor-service"; export async function paginationReport( size: any, diff --git a/src/lib/services/schedule/schedule.ts b/src/lib/services/schedule/schedule.ts index ffac5040..2597798f 100644 --- a/src/lib/services/schedule/schedule.ts +++ b/src/lib/services/schedule/schedule.ts @@ -1,10 +1,8 @@ -import { - httpGetInterceptor, - httpPostInterceptor, -} from "../http-config/http-interceptor-service"; -import { httpGet } from "../http-config/http-base-service"; import { any } from "zod"; +import { httpGet } from "../http-config/http-base-service"; +import { httpGetInterceptor, httpPostInterceptor } from "../http-config/http-interceptor-service"; + export async function paginationSchedule( size: any, page: number, @@ -12,8 +10,7 @@ export async function paginationSchedule( title: string = "", statusFilter: number[] = [] ) { - const statusQuery = - statusFilter.length > 0 ? `&statusId=${statusFilter.join(",")}` : ""; + const statusQuery = statusFilter.length > 0 ? `&statusId=${statusFilter.join(",")}` : ""; return await httpGetInterceptor( `schedule/pagination?enablePage=1&scheduleTypeId=${type}&page=${page}&size=${size}&title=${title}${statusQuery}` ); diff --git a/src/lib/services/survey/survey.ts b/src/lib/services/survey/survey.ts index 940b967f..0d16d3a6 100644 --- a/src/lib/services/survey/survey.ts +++ b/src/lib/services/survey/survey.ts @@ -1,7 +1,4 @@ -import { - httpGetInterceptor, - httpPostInterceptor, -} from "../http-config/http-interceptor-service"; +import { httpGetInterceptor, httpPostInterceptor } from "../http-config/http-interceptor-service"; export async function createSurveyData(data: any) { const pathUrl = "users/satisfaction-survey"; diff --git a/src/lib/services/tableau/tableau-service.ts b/src/lib/services/tableau/tableau-service.ts index bc7bb8f6..17c7ea8d 100644 --- a/src/lib/services/tableau/tableau-service.ts +++ b/src/lib/services/tableau/tableau-service.ts @@ -12,7 +12,10 @@ export async function tableauSignin() { export async function tableauViewImage(token: string, viewId: string, date?: string) { const headers = { - "x-token": token - } - return await httpGetArrayBuffer(`/admin/tableau-view-image?viewId=${viewId}&date=${date}`, headers); -} \ No newline at end of file + "x-token": token, + }; + return await httpGetArrayBuffer( + `/admin/tableau-view-image?viewId=${viewId}&date=${date}`, + headers + ); +} diff --git a/src/lib/services/task.ts b/src/lib/services/task.ts index a103a2e3..d3654a18 100644 --- a/src/lib/services/task.ts +++ b/src/lib/services/task.ts @@ -1,4 +1,5 @@ import { title } from "process"; + import { httpDeleteInterceptor, httpGetInterceptor, diff --git a/src/lib/services/ticketing/ticketing.ts b/src/lib/services/ticketing/ticketing.ts index cf19148f..2ab4b688 100644 --- a/src/lib/services/ticketing/ticketing.ts +++ b/src/lib/services/ticketing/ticketing.ts @@ -1,7 +1,8 @@ import { title } from "process"; + import { httpGetInterceptor } from "../http-config/http-interceptor-service"; -export async function ticketingPagination(title: string = '', size: number, page: number) { +export async function ticketingPagination(title: string = "", size: number, page: number) { return await httpGetInterceptor( `/ticketing/pagination?enablePage=1&page=${page}&size=${size}&title=${title}` ); diff --git a/src/lib/utils/appex-chart-options.ts b/src/lib/utils/appex-chart-options.ts index e7fd6ce8..b78a2dff 100644 --- a/src/lib/utils/appex-chart-options.ts +++ b/src/lib/utils/appex-chart-options.ts @@ -2,23 +2,8 @@ export const getYAxisConfig = (colors: any) => ({ labels: getLabel(colors), }); - - -export const getXAxisConfig = (colors: string): { } => ({ - categories: [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", - ], +export const getXAxisConfig = (colors: string): {} => ({ + categories: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], labels: getLabel(colors), axisBorder: { show: false, @@ -28,17 +13,21 @@ export const getXAxisConfig = (colors: string): { } => ({ }, }); -export const getLabel = (colors:any): { } => ({ +export const getLabel = (colors: any): {} => ({ style: { colors: colors, fontFamily: "Inter", }, }); - -export const getGridConfig = (): { show: boolean; borderColor: string; strokeDashArray: number; position: string; } => ({ +export const getGridConfig = (): { + show: boolean; + borderColor: string; + strokeDashArray: number; + position: string; +} => ({ show: false, - borderColor: 'transparent', + borderColor: "transparent", strokeDashArray: 10, position: "back", -}); \ No newline at end of file +}); diff --git a/src/lib/utils/auth.ts b/src/lib/utils/auth.ts index e144cdb9..7b780939 100644 --- a/src/lib/utils/auth.ts +++ b/src/lib/utils/auth.ts @@ -5,8 +5,6 @@ // import CredentialsProvider from "next-auth/providers/credentials"; // import { getUserByEmail, type User } from "./data"; - - // export const { auth, handlers, signIn, signOut } = NextAuth({ // session: { @@ -17,13 +15,13 @@ // GitHub, // CredentialsProvider({ // credentials: { - + // email: {}, // password: {}, // }, // async authorize(credentials) { // if (credentials === null) return null; - + // try { // const user = getUserByEmail(credentials?.email as string); // if (user) { @@ -42,7 +40,6 @@ // } // }, // }), - + // ], // }); - diff --git a/src/lib/utils/colors.ts b/src/lib/utils/colors.ts index d72370e3..e8c1d7c2 100644 --- a/src/lib/utils/colors.ts +++ b/src/lib/utils/colors.ts @@ -7,8 +7,7 @@ export const colors = { light: "#425466", success: "#50C793", default: "#0f172a", - 'default-800': "#1e293b", - 'default-600': "#475569", - 'default-300': "#cbd5e1" - -}; \ No newline at end of file + "default-800": "#1e293b", + "default-600": "#475569", + "default-300": "#cbd5e1", +}; diff --git a/src/lib/utils/data.ts b/src/lib/utils/data.ts index e4ece201..dd2292d2 100644 --- a/src/lib/utils/data.ts +++ b/src/lib/utils/data.ts @@ -1,16 +1,15 @@ -// user data +// user data const users = [ { name: "dashcode", email: "dashcode@codeshaper.net", password: "password", - image: '/images/users/user-1.jpg', + image: "/images/users/user-1.jpg", }, - -] +]; -export type User = (typeof users)[number] +export type User = (typeof users)[number]; export const getUserByEmail = (email: string) => { - return users.find((user) => user.email === email) -} \ No newline at end of file + return users.find((user) => user.email === email); +}; diff --git a/src/lib/utils/events.ts b/src/lib/utils/events.ts index e82162b8..17e43198 100644 --- a/src/lib/utils/events.ts +++ b/src/lib/utils/events.ts @@ -1,5 +1,5 @@ -import va from "@vercel/analytics" -import { z } from "zod" +import va from "@vercel/analytics"; +import { z } from "zod"; const eventSchema = z.object({ name: z.enum([ @@ -16,16 +16,14 @@ const eventSchema = z.object({ "copy_chart_data", "copy_color", ]), - properties: z - .record(z.union([z.string(), z.number(), z.boolean(), z.null()])) - .optional(), -}) + properties: z.record(z.union([z.string(), z.number(), z.boolean(), z.null()])).optional(), +}); -export type Event = z.infer +export type Event = z.infer; export function trackEvent(input: Event): void { - const event = eventSchema.parse(input) + const event = eventSchema.parse(input); if (event) { - va.track(event.name, event.properties) + va.track(event.name, event.properties); } } diff --git a/src/lib/utils/globals.tsx b/src/lib/utils/globals.tsx index 81def301..bddcc4b1 100644 --- a/src/lib/utils/globals.tsx +++ b/src/lib/utils/globals.tsx @@ -1,8 +1,8 @@ "use client"; +import { useEffect } from "react"; import { format } from "date-fns"; import { id, tr } from "date-fns/locale"; -import { useEffect } from "react"; export const generateLocalizedPath = (href: string, locale: string): string => { if (href.startsWith(`/${locale}`)) { @@ -11,7 +11,11 @@ export const generateLocalizedPath = (href: string, locale: string): string => { return `/${locale}${href}`; }; -export function textEllipsis(str: string, maxLength: number, { side = "end", ellipsis = "..." } = {}) { +export function textEllipsis( + str: string, + maxLength: number, + { side = "end", ellipsis = "..." } = {} +) { if (str !== undefined && str?.length > maxLength) { switch (side) { case "start": @@ -116,7 +120,10 @@ export function secondToTimes(sec: number) { export function checkMaliciousText(str: any) { try { - const urlPattern = new RegExp("(https?:\\/\\/(?:www\\.|(?!www))[^\\s\\.]+\\.[^\\s]{2,}|www\\.[^\\s]+\\.[^\\s]{2,}|https?:\\/\\/[^\\s]+|\\b(?:https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*)", "gi"); + const urlPattern = new RegExp( + "(https?:\\/\\/(?:www\\.|(?!www))[^\\s\\.]+\\.[^\\s]{2,}|www\\.[^\\s]+\\.[^\\s]{2,}|https?:\\/\\/[^\\s]+|\\b(?:https?|ftp):\\/\\/[^\\s/$.?#].[^\\s]*)", + "gi" + ); const isContainUrl = urlPattern.test(str); if (isContainUrl) { return "Message mengandung URL yang tidak diizinkan"; @@ -155,7 +162,8 @@ export const shimmer = (w: number, h: number) => ` `; -export const toBase64 = (str: string) => (typeof window === "undefined" ? Buffer.from(str).toString("base64") : window.btoa(str)); +export const toBase64 = (str: string) => + typeof window === "undefined" ? Buffer.from(str).toString("base64") : window.btoa(str); const LoadScript = () => { useEffect(() => { diff --git a/src/lib/utils/menus.ts b/src/lib/utils/menus.ts index e9e18288..847b523d 100644 --- a/src/lib/utils/menus.ts +++ b/src/lib/utils/menus.ts @@ -1671,10 +1671,7 @@ export function getMenuList(pathname: string, t: any): Group[] { ], }, ]; - } else if ( - (Number(roleId) == 3 || Number(roleId) == 4) && - Number(levelNumber) == 2 - ) { + } else if ((Number(roleId) == 3 || Number(roleId) == 4) && Number(levelNumber) == 2) { if (Number(userLevelId) != 761) { menusSelected = [ { @@ -2086,10 +2083,7 @@ export function getMenuList(pathname: string, t: any): Group[] { }, ]; } - } else if ( - (Number(roleId) == 3 || Number(roleId) == 4) && - Number(levelNumber) == 3 - ) { + } else if ((Number(roleId) == 3 || Number(roleId) == 4) && Number(levelNumber) == 3) { if (Number(userParentLevelId) != 761) { menusSelected = [ { @@ -2811,11 +2805,7 @@ export function getMenuList(pathname: string, t: any): Group[] { ], }, ]; - } else if ( - Number(roleId) == 11 || - Number(roleId) == 19 || - Number(roleId) == 12 - ) { + } else if (Number(roleId) == 11 || Number(roleId) == 19 || Number(roleId) == 12) { menusSelected = [ { groupLabel: t("apps"), @@ -3909,9 +3899,7 @@ export function getHorizontalMenuList(pathname: string, t: any): Group[] { { href: "/ecommerce/frontend/c06d48bf-7f35-4789-b71e-d80fee5b430t", label: t("productDetails"), - active: - pathname === - "/ecommerce/frontend/c06d48bf-7f35-4789-b71e-d80fee5b430t", + active: pathname === "/ecommerce/frontend/c06d48bf-7f35-4789-b71e-d80fee5b430t", }, { href: "/ecommerce/frontend/checkout/cart", @@ -4584,146 +4572,110 @@ export function getHorizontalMenuList(pathname: string, t: any): Group[] { { href: "/charts/appex-charts/charts-appex-area", label: t("areaCharts"), - active: pathname.includes( - "/charts/appex-charts/charts-appex-area" - ), + active: pathname.includes("/charts/appex-charts/charts-appex-area"), children: [], }, { href: "/charts/appex-charts/charts-appex-bar", label: t("barCharts"), - active: pathname.includes( - "/charts/appex-charts/charts-appex-bar" - ), + active: pathname.includes("/charts/appex-charts/charts-appex-bar"), children: [], }, { href: "/charts/appex-charts/charts-appex-boxplot", label: t("boxplotCharts"), - active: pathname.includes( - "/charts/appex-charts/charts-appex-boxplot" - ), + active: pathname.includes("/charts/appex-charts/charts-appex-boxplot"), children: [], }, { href: "/charts/appex-charts/charts-appex-bubble", label: t("bubbleCharts"), - active: pathname.includes( - "/charts/appex-charts/charts-appex-bubble" - ), + active: pathname.includes("/charts/appex-charts/charts-appex-bubble"), children: [], }, { href: "/charts/appex-charts/charts-appex-candlestick", label: t("candlestickCharts"), - active: pathname.includes( - "/charts/appex-charts/charts-appex-candlestick" - ), + active: pathname.includes("/charts/appex-charts/charts-appex-candlestick"), children: [], }, { href: "/charts/appex-charts/charts-appex-column", label: t("columnCharts"), - active: pathname.includes( - "/charts/appex-charts/charts-appex-column" - ), + active: pathname.includes("/charts/appex-charts/charts-appex-column"), children: [], }, { href: "/charts/appex-charts/charts-appex-combo", label: t("comboCharts"), - active: pathname.includes( - "/charts/appex-charts/charts-appex-combo" - ), + active: pathname.includes("/charts/appex-charts/charts-appex-combo"), children: [], }, { href: "/charts/appex-charts/charts-appex-funnel", label: t("funnelCharts"), - active: pathname.includes( - "/charts/appex-charts/charts-appex-funnel" - ), + active: pathname.includes("/charts/appex-charts/charts-appex-funnel"), children: [], }, { href: "/charts/appex-charts/charts-appex-heatmap", label: t("heatmapCharts"), - active: pathname.includes( - "/charts/appex-charts/charts-appex-heatmap" - ), + active: pathname.includes("/charts/appex-charts/charts-appex-heatmap"), children: [], }, { href: "/charts/appex-charts/charts-appex-line", label: t("lineCharts"), - active: pathname.includes( - "/charts/appex-charts/charts-appex-line" - ), + active: pathname.includes("/charts/appex-charts/charts-appex-line"), children: [], }, { href: "/charts/appex-charts/charts-appex-pie", label: t("pieCharts"), - active: pathname.includes( - "/charts/appex-charts/charts-appex-pie" - ), + active: pathname.includes("/charts/appex-charts/charts-appex-pie"), children: [], }, { href: "/charts/appex-charts/charts-appex-polararea", label: t("ploarareaCharts"), - active: pathname.includes( - "/charts/appex-charts/charts-appex-polararea" - ), + active: pathname.includes("/charts/appex-charts/charts-appex-polararea"), children: [], }, { href: "/charts/appex-charts/charts-appex-radar", label: t("radarCharts"), - active: pathname.includes( - "/charts/appex-charts/charts-appex-radar" - ), + active: pathname.includes("/charts/appex-charts/charts-appex-radar"), children: [], }, { href: "/charts/appex-charts/charts-appex-radialbars", label: t("radialbarCharts"), - active: pathname.includes( - "/charts/appex-charts/charts-appex-radialbars" - ), + active: pathname.includes("/charts/appex-charts/charts-appex-radialbars"), children: [], }, { href: "/charts/appex-charts/charts-appex-range", label: t("rangeCharts"), - active: pathname.includes( - "/charts/appex-charts/charts-appex-range" - ), + active: pathname.includes("/charts/appex-charts/charts-appex-range"), children: [], }, { href: "/charts/appex-charts/charts-appex-scatter", label: t("scatterCharts"), - active: pathname.includes( - "/charts/appex-charts/charts-appex-scatter" - ), + active: pathname.includes("/charts/appex-charts/charts-appex-scatter"), children: [], }, { href: "/charts/appex-charts/charts-appex-timeline", label: t("timelineCharts"), - active: pathname.includes( - "/charts/appex-charts/charts-appex-timeline" - ), + active: pathname.includes("/charts/appex-charts/charts-appex-timeline"), children: [], }, { href: "/charts/appex-charts/charts-appex-treemap", label: t("treemapCharts"), - active: pathname.includes( - "/charts/appex-charts/charts-appex-treemap" - ), + active: pathname.includes("/charts/appex-charts/charts-appex-treemap"), children: [], }, ], @@ -4737,73 +4689,55 @@ export function getHorizontalMenuList(pathname: string, t: any): Group[] { { href: "/charts/rechart/charts-rechart-area", label: t("areaCharts"), - active: pathname.includes( - "/charts/rechart/charts-rechart-area" - ), + active: pathname.includes("/charts/rechart/charts-rechart-area"), children: [], }, { href: "/charts/rechart/charts-rechart-bar", label: t("barCharts"), - active: pathname.includes( - "/charts/rechart/charts-rechart-bar" - ), + active: pathname.includes("/charts/rechart/charts-rechart-bar"), children: [], }, { href: "/charts/rechart/charts-rechart-composed", label: t("composedCharts"), - active: pathname.includes( - "/charts/rechart/charts-rechart-composed" - ), + active: pathname.includes("/charts/rechart/charts-rechart-composed"), children: [], }, { href: "/charts/rechart/charts-rechart-line", label: t("lineCharts"), - active: pathname.includes( - "/charts/rechart/charts-rechart-line" - ), + active: pathname.includes("/charts/rechart/charts-rechart-line"), children: [], }, { href: "/charts/rechart/charts-rechart-pie", label: t("pieCharts"), - active: pathname.includes( - "/charts/rechart/charts-rechart-pie" - ), + active: pathname.includes("/charts/rechart/charts-rechart-pie"), children: [], }, { href: "/charts/rechart/charts-rechart-radar", label: t("radarCharts"), - active: pathname.includes( - "/charts/rechart/charts-rechart-radar" - ), + active: pathname.includes("/charts/rechart/charts-rechart-radar"), children: [], }, { href: "/charts/rechart/charts-rechart-radialbar", label: t("radialbarCharts"), - active: pathname.includes( - "/charts/rechart/charts-rechart-radialbar" - ), + active: pathname.includes("/charts/rechart/charts-rechart-radialbar"), children: [], }, { href: "/charts/rechart/charts-rechart-scatter", label: t("scatterCharts"), - active: pathname.includes( - "/charts/rechart/charts-rechart-scatter" - ), + active: pathname.includes("/charts/rechart/charts-rechart-scatter"), children: [], }, { href: "/charts/rechart/charts-rechart-treemap", label: t("treemapCharts"), - active: pathname.includes( - "/charts/rechart/charts-rechart-treemap" - ), + active: pathname.includes("/charts/rechart/charts-rechart-treemap"), children: [], }, ], @@ -4817,89 +4751,67 @@ export function getHorizontalMenuList(pathname: string, t: any): Group[] { { href: "/charts/chart-js/charts-chartjs-area", label: t("areaCharts"), - active: pathname.includes( - "/charts/chart-js/charts-chartjs-area" - ), + active: pathname.includes("/charts/chart-js/charts-chartjs-area"), children: [], }, { href: "/charts/chart-js/charts-chartjs-bar", label: t("barCharts"), - active: pathname.includes( - "/charts/chart-js/charts-chartjs-bar" - ), + active: pathname.includes("/charts/chart-js/charts-chartjs-bar"), children: [], }, { href: "/charts/chart-js/charts-chartjs-line", label: t("lineCharts"), - active: pathname.includes( - "/charts/chart-js/charts-chartjs-line" - ), + active: pathname.includes("/charts/chart-js/charts-chartjs-line"), children: [], }, { href: "/charts/chart-js/charts-chartjs-animations", label: t("animationCharts"), - active: pathname.includes( - "/charts/chart-js/charts-chartjs-animations" - ), + active: pathname.includes("/charts/chart-js/charts-chartjs-animations"), children: [], }, { href: "/charts/chart-js/charts-chartjs-legend", label: t("legendCharts"), - active: pathname.includes( - "/charts/chart-js/charts-chartjs-legend" - ), + active: pathname.includes("/charts/chart-js/charts-chartjs-legend"), children: [], }, { href: "/charts/chart-js/charts-chartjs-scaleoptions", label: t("scaleOptionCharts"), - active: pathname.includes( - "/charts/chart-js/charts-chartjs-scaleoptions" - ), + active: pathname.includes("/charts/chart-js/charts-chartjs-scaleoptions"), children: [], }, { href: "/charts/chart-js/charts-chartjs-scales", label: t("scaleCharts"), - active: pathname.includes( - "/charts/chart-js/charts-chartjs-scales" - ), + active: pathname.includes("/charts/chart-js/charts-chartjs-scales"), children: [], }, { href: "/charts/chart-js/charts-chartjs-scriptable", label: t("scriptableCharts"), - active: pathname.includes( - "/charts/chart-js/charts-chartjs-scriptable" - ), + active: pathname.includes("/charts/chart-js/charts-chartjs-scriptable"), children: [], }, { href: "/charts/chart-js/charts-chartjs-title", label: t("titleCharts"), - active: pathname.includes( - "/charts/chart-js/charts-chartjs-title" - ), + active: pathname.includes("/charts/chart-js/charts-chartjs-title"), children: [], }, { href: "/charts/chart-js/charts-chartjs-tooltip", label: t("tooltipChart"), - active: pathname.includes( - "/charts/chart-js/charts-chartjs-tooltip" - ), + active: pathname.includes("/charts/chart-js/charts-chartjs-tooltip"), children: [], }, { href: "/charts/chart-js/charts-chartjs-other", label: t("otherCharts"), - active: pathname.includes( - "/charts/chart-js/charts-chartjs-other" - ), + active: pathname.includes("/charts/chart-js/charts-chartjs-other"), children: [], }, ], diff --git a/src/lib/utils/pdf-generator.tsx b/src/lib/utils/pdf-generator.tsx index 4bdea08d..de64db60 100644 --- a/src/lib/utils/pdf-generator.tsx +++ b/src/lib/utils/pdf-generator.tsx @@ -1,8 +1,8 @@ -import { jsPDF } from 'jspdf'; +import { jsPDF } from "jspdf"; export default async function pdfGenerator(blobs: Blob[]) { const pdf = new jsPDF({ - unit: 'px', + unit: "px", compress: true, }); @@ -18,7 +18,7 @@ export default async function pdfGenerator(blobs: Blob[]) { const imgWidth = img.width; const imgHeight = img.height; - const orientation = imgWidth > imgHeight ? 'landscape' : 'portrait'; + const orientation = imgWidth > imgHeight ? "landscape" : "portrait"; if (i === 0) { // Set ukuran dan orientasi halaman pertama @@ -31,13 +31,13 @@ export default async function pdfGenerator(blobs: Blob[]) { pdf.setPage(pdf.getNumberOfPages()); } - pdf.addImage(img, 'PNG', 0, 0, imgWidth, imgHeight); - resolve(''); + pdf.addImage(img, "PNG", 0, 0, imgWidth, imgHeight); + resolve(""); }; }); URL.revokeObjectURL(imageUrl); } - pdf.save('downloaded-images.pdf'); + pdf.save("downloaded-images.pdf"); } diff --git a/src/lib/utils/type.ts b/src/lib/utils/type.ts index 18af5e35..a501a435 100644 --- a/src/lib/utils/type.ts +++ b/src/lib/utils/type.ts @@ -1,15 +1,28 @@ -export type color = "default" | "primary" | "secondary" | "success" | "info" | "warning" | "destructive" -export type InputColor = "default" | "primary" | "secondary" | "success" | "info" | "warning" | "destructive" -export type shadow = "sm" | "md" | "lg" | "xl" -export type size = "default" | "sm" | "md" | "lg" -export type rounded = "sm" | "md" | "lg" | "full" -export type radius = "sm" | "md" | "lg" | "xl" | "none" +export type color = + | "default" + | "primary" + | "secondary" + | "success" + | "info" + | "warning" + | "destructive"; +export type InputColor = + | "default" + | "primary" + | "secondary" + | "success" + | "info" + | "warning" + | "destructive"; +export type shadow = "sm" | "md" | "lg" | "xl"; +export type size = "default" | "sm" | "md" | "lg"; +export type rounded = "sm" | "md" | "lg" | "full"; +export type radius = "sm" | "md" | "lg" | "xl" | "none"; - -// config +// config export type layoutType = "vertical" | "horizontal" | "semi-box" | "compact"; export type contentType = "wide" | "boxed"; export type skinType = "default" | "bordered"; -export type sidebarType = 'classic' | 'draggable' | 'two-column' | 'compact' -export type navBarType = 'floating' | 'sticky' | 'hidden' | 'default' -export type headerColorType = 'default' | 'coloured' | 'transparent' +export type sidebarType = "classic" | "draggable" | "two-column" | "compact"; +export type navBarType = "floating" | "sticky" | "hidden" | "default"; +export type headerColorType = "default" | "coloured" | "transparent"; diff --git a/src/lib/utils/utils.ts b/src/lib/utils/utils.ts index 2ed06ee6..8ac6188c 100644 --- a/src/lib/utils/utils.ts +++ b/src/lib/utils/utils.ts @@ -1,9 +1,10 @@ -import { type ClassValue, clsx } from "clsx"; -import { twMerge } from "tailwind-merge"; -import Cookies from "js-cookie"; +import { clsx, type ClassValue } from "clsx"; import CryptoJS from "crypto-js"; +import Cookies from "js-cookie"; import Swal from "sweetalert2"; import withReactContent from "sweetalert2-react-content"; +import { twMerge } from "tailwind-merge"; + import Loading from "@/app/[locale]/(protected)/app/projects/loading"; export function cn(...inputs: ClassValue[]) { @@ -62,11 +63,7 @@ export function successToast(title: string, text: string) { }); } -export function setCookiesEncrypt( - param: string, - data: any, - options?: Cookies.CookieAttributes -) { +export function setCookiesEncrypt(param: string, data: any, options?: Cookies.CookieAttributes) { // Enkripsi data const cookiesEncrypt = CryptoJS.AES.encrypt( JSON.stringify(data), diff --git a/src/lib/utils/video-player.tsx b/src/lib/utils/video-player.tsx index 1275fd25..04f629b2 100644 --- a/src/lib/utils/video-player.tsx +++ b/src/lib/utils/video-player.tsx @@ -26,4 +26,4 @@ const VideoPlayer: React.FC = ({ url }) => { ); }; -export default VideoPlayer; \ No newline at end of file +export default VideoPlayer; diff --git a/src/messages/en.json b/src/messages/en.json index f80a85d8..80dba199 100644 --- a/src/messages/en.json +++ b/src/messages/en.json @@ -7,4 +7,4 @@ "search": "Search", "menu": "Menu" } -} \ No newline at end of file +} diff --git a/src/messages/in.json b/src/messages/in.json index 8f17152f..eff55b37 100644 --- a/src/messages/in.json +++ b/src/messages/in.json @@ -7,4 +7,4 @@ "search": "Cari", "menu": "Menu" } -} \ No newline at end of file +} diff --git a/src/middleware.ts b/src/middleware.ts index f2f99614..620ecf7f 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -1,5 +1,5 @@ -import createMiddleware from 'next-intl/middleware'; -import {routing} from '@/i18n/routing'; +import { routing } from "@/i18n/routing"; +import createMiddleware from "next-intl/middleware"; export default createMiddleware(routing); @@ -7,5 +7,5 @@ export const config = { // Match all pathnames except for // - … if they start with `/api`, `/trpc`, `/_next` or `/_vercel` // - … the ones containing a dot (e.g. `favicon.ico`) - matcher: '/((?!api|trpc|_next|_vercel|.*\\..*).*)' + matcher: "/((?!api|trpc|_next|_vercel|.*\\..*).*)", }; diff --git a/src/providers/auth.provider.tsx b/src/providers/auth.provider.tsx index 691083a5..28f98744 100644 --- a/src/providers/auth.provider.tsx +++ b/src/providers/auth.provider.tsx @@ -1,13 +1,10 @@ -'use client' +"use client"; + // import { SessionProvider } from "next-auth/react" -import React from 'react' +import React from "react"; const AuthProvider = ({ children }: { children: React.ReactNode }) => { - return ( -
    - {children} -
    - ) -} + return
    {children}
    ; +}; -export default AuthProvider \ No newline at end of file +export default AuthProvider; diff --git a/src/providers/content.provider.tsx b/src/providers/content.provider.tsx index 26fed2c6..855c0fcc 100644 --- a/src/providers/content.provider.tsx +++ b/src/providers/content.provider.tsx @@ -1,54 +1,59 @@ -'use client' -import { useConfig } from '@/lib/hooks/use-config' -import React from 'react' -import { cn } from "@/lib/utils/utils" +"use client"; + +import React from "react"; + +import { useConfig } from "@/lib/hooks/use-config"; +import { cn } from "@/lib/utils/utils"; const LayoutContentProvider = ({ children }: { children: React.ReactNode }) => { - const [config, setConfig] = useConfig(); - - if (config.sidebar === 'two-column') { - return ( -
    -
    - {children} -
    -
    - ) - } + const [config, setConfig] = useConfig(); + if (config.sidebar === "two-column") { return ( - <> +
    +
    + {children} +
    +
    + ); + } -
    -
    +
    +
    + {children} +
    +
    + + ); +}; - })}> - {children} -
    -
    - - ) -} - -export default LayoutContentProvider \ No newline at end of file +export default LayoutContentProvider; diff --git a/src/providers/direction-provider.tsx b/src/providers/direction-provider.tsx index b9a701b3..e0715d7b 100644 --- a/src/providers/direction-provider.tsx +++ b/src/providers/direction-provider.tsx @@ -1,23 +1,27 @@ -'use client' -import React from 'react' -import { DirectionProvider as RadixDirProvider } from '@radix-ui/react-direction'; -import { useConfig } from '@/lib/hooks/use-config'; +"use client"; -const DirectionProvider = ({ direction, children }: { direction: any, children: React.ReactNode }) => { - const [, setConfig] = useConfig(); +import React from "react"; +import { DirectionProvider as RadixDirProvider } from "@radix-ui/react-direction"; - React.useEffect(() => { - setConfig((prevConfig) => ({ - ...prevConfig, - isRtl: direction === 'rtl', - })); +import { useConfig } from "@/lib/hooks/use-config"; - }, [direction, setConfig]); +const DirectionProvider = ({ + direction, + children, +}: { + direction: any; + children: React.ReactNode; +}) => { + const [, setConfig] = useConfig(); - return ( - - {children} - ) -} + React.useEffect(() => { + setConfig((prevConfig) => ({ + ...prevConfig, + isRtl: direction === "rtl", + })); + }, [direction, setConfig]); -export default DirectionProvider + return {children}; +}; + +export default DirectionProvider; diff --git a/src/providers/layout.provider.tsx b/src/providers/layout.provider.tsx index d7bb96a8..fa2f9209 100644 --- a/src/providers/layout.provider.tsx +++ b/src/providers/layout.provider.tsx @@ -1,24 +1,24 @@ -'use client' -import { useConfig } from '@/lib/hooks/use-config' -import React from 'react' -import { cn } from "@/lib/utils/utils" +"use client"; + +import React from "react"; + +import { useConfig } from "@/lib/hooks/use-config"; +import { cn } from "@/lib/utils/utils"; const LayoutProvider = ({ children }: { children: React.ReactNode }) => { - const [config, setConfig] = useConfig(); + const [config, setConfig] = useConfig(); - return ( + return ( +
    + {children} +
    + ); +}; - -
    - {children} -
    - - ) -} - -export default LayoutProvider \ No newline at end of file +export default LayoutProvider; diff --git a/src/providers/mounted.provider.tsx b/src/providers/mounted.provider.tsx index cb08c1f0..721e9ace 100644 --- a/src/providers/mounted.provider.tsx +++ b/src/providers/mounted.provider.tsx @@ -1,10 +1,17 @@ "use client"; -import Loader from "@/components/ui/structures/loader"; -import { useMounted } from "@/lib/hooks/use-mounted"; import React from "react"; -const MountedProvider = ({ children, isProtected }: { children: React.ReactNode, isProtected: Boolean }) => { +import { useMounted } from "@/lib/hooks/use-mounted"; +import Loader from "@/components/ui/structures/loader"; + +const MountedProvider = ({ + children, + isProtected, +}: { + children: React.ReactNode; + isProtected: Boolean; +}) => { const mounted = useMounted(); if (!mounted) return isProtected ? : null; return children; diff --git a/src/providers/theme-provider.tsx b/src/providers/theme-provider.tsx index e90aa8c9..b0ff2660 100644 --- a/src/providers/theme-provider.tsx +++ b/src/providers/theme-provider.tsx @@ -1,9 +1,9 @@ -"use client" +"use client"; -import * as React from "react" -import { ThemeProvider as NextThemesProvider } from "next-themes" -import { type ThemeProviderProps } from "next-themes/dist/types" +import * as React from "react"; +import { ThemeProvider as NextThemesProvider } from "next-themes"; +import { type ThemeProviderProps } from "next-themes/dist/types"; export function ThemeProvider({ children, ...props }: ThemeProviderProps) { - return {children} + return {children}; } diff --git a/src/styles/globals.css b/src/styles/globals.css index fe0e9d4a..cac94f99 100644 --- a/src/styles/globals.css +++ b/src/styles/globals.css @@ -2,8 +2,6 @@ @tailwind components; @tailwind utilities; -@import url("https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,100..1000;1,9..40,100..1000&display=swap"); - @layer base { :root { --background: 0 0% 100%; @@ -75,6 +73,6 @@ @apply border-border; } body { - @apply bg-background text-foreground; + @apply bg-background text-foreground font-sans; } } diff --git a/src/vendor/ckeditor5/LICENSE.md b/src/vendor/ckeditor5/LICENSE.md index ff911156..d84ccad1 100644 --- a/src/vendor/ckeditor5/LICENSE.md +++ b/src/vendor/ckeditor5/LICENSE.md @@ -1,21 +1,20 @@ -Software License Agreement -========================== +# Software License Agreement Copyright (c) 2014-2024, CKSource Holding sp. z o.o. All rights reserved. Online builder code samples are licensed under the terms of the MIT License (see Appendix A): - http://en.wikipedia.org/wiki/MIT_License + http://en.wikipedia.org/wiki/MIT_License CKEditor 5 collaboration features are only available under a commercial license. [Contact us](https://ckeditor.com/contact/) for more details. Free 30-days trials of CKEditor 5 collaboration features are available: - * https://ckeditor.com/collaboration/ - Real-time collaboration (with all features). - * https://ckeditor.com/collaboration/comments/ - Inline comments feature (without real-time collaborative editing). - * https://ckeditor.com/collaboration/track-changes/ - Track changes feature (without real-time collaborative editing). -Trademarks ----------- +- https://ckeditor.com/collaboration/ - Real-time collaboration (with all features). +- https://ckeditor.com/collaboration/comments/ - Inline comments feature (without real-time collaborative editing). +- https://ckeditor.com/collaboration/track-changes/ - Track changes feature (without real-time collaborative editing). + +## Trademarks CKEditor is a trademark of CKSource Holding sp. z o.o. All other brand and product names are trademarks, registered trademarks or service @@ -23,8 +22,7 @@ marks of their respective holders. --- -Appendix A: The MIT License ---------------------------- +## Appendix A: The MIT License The MIT License (MIT) diff --git a/src/vendor/ckeditor5/README.md b/src/vendor/ckeditor5/README.md index d1faad48..7927d36f 100644 --- a/src/vendor/ckeditor5/README.md +++ b/src/vendor/ckeditor5/README.md @@ -12,7 +12,7 @@ This repository presents a CKEditor 5 editor build generated by the [Online buil Changes like changing toolbar items, changing order of icons or customizing plugin configurations should be relatively easy to make. Open the `sample/index.html` file and edit the script that initialized the CKEditor 5. Save the file and refresh the browser. That's all. -*Note:* If you have any problems with browser caching use the `Ctrl + R` or `Cmd + R` shortcut depending on your system. +_Note:_ If you have any problems with browser caching use the `Ctrl + R` or `Cmd + R` shortcut depending on your system. However if you want to remove or add a plugin to the build you need to follow the next step of this guide. @@ -47,6 +47,7 @@ This will build the CKEditor 5 to the `build` directory. You can open your brows Follow the guides available on https://ckeditor.com/docs/ckeditor5/latest/framework/index.html and enjoy the document editing. ## FAQ + | Where is the place to report bugs and feature requests? You can create an issue on https://github.com/ckeditor/ckeditor5/issues including the build id - `yt1k3s5kie6c-kuy63vghjub2`. Make sure that the question / problem is unique, please look for a possibly asked questions in the search box. Duplicates will be closed. diff --git a/src/vendor/ckeditor5/sample/script.js b/src/vendor/ckeditor5/sample/script.js index 8dd73b61..e6317254 100644 --- a/src/vendor/ckeditor5/sample/script.js +++ b/src/vendor/ckeditor5/sample/script.js @@ -1,20 +1,19 @@ -ClassicEditor - .create( document.querySelector( '.editor' ), { - // Editor configuration. - } ) - .then( editor => { - window.editor = editor; - } ) - .catch( handleSampleError ); +ClassicEditor.create(document.querySelector(".editor"), { + // Editor configuration. +}) + .then((editor) => { + window.editor = editor; + }) + .catch(handleSampleError); -function handleSampleError( error ) { - const issueUrl = 'https://github.com/ckeditor/ckeditor5/issues'; +function handleSampleError(error) { + const issueUrl = "https://github.com/ckeditor/ckeditor5/issues"; - const message = [ - 'Oops, something went wrong!', - `Please, report the following error on ${ issueUrl } with the build id "yt1k3s5kie6c-kuy63vghjub2" and the error stack trace:` - ].join( '\n' ); + const message = [ + "Oops, something went wrong!", + `Please, report the following error on ${issueUrl} with the build id "yt1k3s5kie6c-kuy63vghjub2" and the error stack trace:`, + ].join("\n"); - console.error( message ); - console.error( error ); + console.error(message); + console.error(error); } diff --git a/src/vendor/ckeditor5/src/ckeditor.ts b/src/vendor/ckeditor5/src/ckeditor.ts index 36578d86..0ca1d7f0 100644 --- a/src/vendor/ckeditor5/src/ckeditor.ts +++ b/src/vendor/ckeditor5/src/ckeditor.ts @@ -3,118 +3,113 @@ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ -import { ClassicEditor } from '@ckeditor/ckeditor5-editor-classic'; - -import { Alignment } from '@ckeditor/ckeditor5-alignment'; -import { Autoformat } from '@ckeditor/ckeditor5-autoformat'; -import { Bold, Italic } from '@ckeditor/ckeditor5-basic-styles'; -import { BlockQuote } from '@ckeditor/ckeditor5-block-quote'; -import { CloudServices } from '@ckeditor/ckeditor5-cloud-services'; -import { CodeBlock } from '@ckeditor/ckeditor5-code-block'; -import type { EditorConfig } from '@ckeditor/ckeditor5-core'; -import { Essentials } from '@ckeditor/ckeditor5-essentials'; -import { FontSize } from '@ckeditor/ckeditor5-font'; -import { Heading } from '@ckeditor/ckeditor5-heading'; +import { Alignment } from "@ckeditor/ckeditor5-alignment"; +import { Autoformat } from "@ckeditor/ckeditor5-autoformat"; +import { Bold, Italic } from "@ckeditor/ckeditor5-basic-styles"; +import { BlockQuote } from "@ckeditor/ckeditor5-block-quote"; +import { CloudServices } from "@ckeditor/ckeditor5-cloud-services"; +import { CodeBlock } from "@ckeditor/ckeditor5-code-block"; +import type { EditorConfig } from "@ckeditor/ckeditor5-core"; +import { ClassicEditor } from "@ckeditor/ckeditor5-editor-classic"; +import { Essentials } from "@ckeditor/ckeditor5-essentials"; +import { FontSize } from "@ckeditor/ckeditor5-font"; +import { Heading } from "@ckeditor/ckeditor5-heading"; import { - Image, - ImageCaption, - ImageInsert, - ImageStyle, - ImageToolbar, - ImageUpload -} from '@ckeditor/ckeditor5-image'; -import { Indent } from '@ckeditor/ckeditor5-indent'; -import { Link } from '@ckeditor/ckeditor5-link'; -import { List } from '@ckeditor/ckeditor5-list'; -import { MediaEmbed } from '@ckeditor/ckeditor5-media-embed'; -import { Paragraph } from '@ckeditor/ckeditor5-paragraph'; -import { PasteFromOffice } from '@ckeditor/ckeditor5-paste-from-office'; -import { SourceEditing } from '@ckeditor/ckeditor5-source-editing'; -import { Table, TableToolbar } from '@ckeditor/ckeditor5-table'; -import { TextTransformation } from '@ckeditor/ckeditor5-typing'; -import { Undo } from '@ckeditor/ckeditor5-undo'; -import { SimpleUploadAdapter } from '@ckeditor/ckeditor5-upload'; + Image, + ImageCaption, + ImageInsert, + ImageStyle, + ImageToolbar, + ImageUpload, +} from "@ckeditor/ckeditor5-image"; +import { Indent } from "@ckeditor/ckeditor5-indent"; +import { Link } from "@ckeditor/ckeditor5-link"; +import { List } from "@ckeditor/ckeditor5-list"; +import { MediaEmbed } from "@ckeditor/ckeditor5-media-embed"; +import { Paragraph } from "@ckeditor/ckeditor5-paragraph"; +import { PasteFromOffice } from "@ckeditor/ckeditor5-paste-from-office"; +import { SourceEditing } from "@ckeditor/ckeditor5-source-editing"; +import { Table, TableToolbar } from "@ckeditor/ckeditor5-table"; +import { TextTransformation } from "@ckeditor/ckeditor5-typing"; +import { Undo } from "@ckeditor/ckeditor5-undo"; +import { SimpleUploadAdapter } from "@ckeditor/ckeditor5-upload"; // You can read more about extending the build with additional plugins in the "Installing plugins" guide. // See https://ckeditor.com/docs/ckeditor5/latest/installation/plugins/installing-plugins.html for details. class Editor extends ClassicEditor { - public static override builtinPlugins = [ - Alignment, - Autoformat, - BlockQuote, - Bold, - CloudServices, - CodeBlock, - Essentials, - FontSize, - Heading, - Image, - ImageCaption, - ImageInsert, - ImageStyle, - ImageToolbar, - ImageUpload, - Indent, - Italic, - Link, - List, - MediaEmbed, - Paragraph, - PasteFromOffice, - SimpleUploadAdapter, - SourceEditing, - Table, - TableToolbar, - TextTransformation, - Undo - ]; + public static override builtinPlugins = [ + Alignment, + Autoformat, + BlockQuote, + Bold, + CloudServices, + CodeBlock, + Essentials, + FontSize, + Heading, + Image, + ImageCaption, + ImageInsert, + ImageStyle, + ImageToolbar, + ImageUpload, + Indent, + Italic, + Link, + List, + MediaEmbed, + Paragraph, + PasteFromOffice, + SimpleUploadAdapter, + SourceEditing, + Table, + TableToolbar, + TextTransformation, + Undo, + ]; - public static override defaultConfig: EditorConfig = { - toolbar: { - items: [ - 'heading', - 'fontSize', - '|', - 'bold', - 'italic', - 'link', - 'bulletedList', - 'numberedList', - '|', - 'alignment', - 'outdent', - 'indent', - '|', - 'imageUpload', - 'blockQuote', - 'insertTable', - 'mediaEmbed', - 'undo', - 'redo', - 'codeBlock', - 'sourceEditing', - 'imageInsert' - ] - }, - language: 'en', - image: { - toolbar: [ - 'imageTextAlternative', - 'toggleImageCaption', - 'imageStyle:inline', - 'imageStyle:block', - 'imageStyle:side' - ] - }, - table: { - contentToolbar: [ - 'tableColumn', - 'tableRow', - 'mergeTableCells' - ] - } - }; + public static override defaultConfig: EditorConfig = { + toolbar: { + items: [ + "heading", + "fontSize", + "|", + "bold", + "italic", + "link", + "bulletedList", + "numberedList", + "|", + "alignment", + "outdent", + "indent", + "|", + "imageUpload", + "blockQuote", + "insertTable", + "mediaEmbed", + "undo", + "redo", + "codeBlock", + "sourceEditing", + "imageInsert", + ], + }, + language: "en", + image: { + toolbar: [ + "imageTextAlternative", + "toggleImageCaption", + "imageStyle:inline", + "imageStyle:block", + "imageStyle:side", + ], + }, + table: { + contentToolbar: ["tableColumn", "tableRow", "mergeTableCells"], + }, + }; } export default Editor; diff --git a/src/vendor/ckeditor5/tsconfig.json b/src/vendor/ckeditor5/tsconfig.json index 4cbebfd2..db5a5754 100644 --- a/src/vendor/ckeditor5/tsconfig.json +++ b/src/vendor/ckeditor5/tsconfig.json @@ -1,12 +1,7 @@ { "compilerOptions": { "types": [], - "lib": [ - "ES2019", - "ES2020.String", - "DOM", - "DOM.Iterable" - ], + "lib": ["ES2019", "ES2020.String", "DOM", "DOM.Iterable"], "noImplicitAny": true, "noImplicitOverride": true, "strict": true, @@ -17,7 +12,5 @@ "moduleResolution": "node", "skipLibCheck": true }, - "include": [ - "./src" - ] + "include": ["./src"] } diff --git a/src/vendor/ckeditor5/webpack.config.js b/src/vendor/ckeditor5/webpack.config.js index ecc8abf6..b9e132c4 100644 --- a/src/vendor/ckeditor5/webpack.config.js +++ b/src/vendor/ckeditor5/webpack.config.js @@ -3,94 +3,102 @@ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license */ -'use strict'; +"use strict"; /* eslint-env node */ -const path = require( 'path' ); -const webpack = require( 'webpack' ); -const { bundler, styles } = require( '@ckeditor/ckeditor5-dev-utils' ); -const { CKEditorTranslationsPlugin } = require( '@ckeditor/ckeditor5-dev-translations' ); -const TerserWebpackPlugin = require( 'terser-webpack-plugin' ); +const path = require("path"); +const webpack = require("webpack"); +const { bundler, styles } = require("@ckeditor/ckeditor5-dev-utils"); +const { CKEditorTranslationsPlugin } = require("@ckeditor/ckeditor5-dev-translations"); +const TerserWebpackPlugin = require("terser-webpack-plugin"); module.exports = { - devtool: 'source-map', - performance: { hints: false }, + devtool: "source-map", + performance: { hints: false }, - entry: path.resolve( __dirname, 'src', 'ckeditor.ts' ), + entry: path.resolve(__dirname, "src", "ckeditor.ts"), - output: { - // The name under which the editor will be exported. - library: 'ClassicEditor', + output: { + // The name under which the editor will be exported. + library: "ClassicEditor", - path: path.resolve( __dirname, 'build' ), - filename: 'ckeditor.js', - libraryTarget: 'umd', - libraryExport: 'default' - }, + path: path.resolve(__dirname, "build"), + filename: "ckeditor.js", + libraryTarget: "umd", + libraryExport: "default", + }, - optimization: { - minimizer: [ - new TerserWebpackPlugin( { - sourceMap: true, - terserOptions: { - output: { - // Preserve CKEditor 5 license comments. - comments: /^!/ - } - }, - extractComments: false - } ) - ] - }, + optimization: { + minimizer: [ + new TerserWebpackPlugin({ + sourceMap: true, + terserOptions: { + output: { + // Preserve CKEditor 5 license comments. + comments: /^!/, + }, + }, + extractComments: false, + }), + ], + }, - plugins: [ - new CKEditorTranslationsPlugin( { - // UI language. Language codes follow the https://en.wikipedia.org/wiki/ISO_639-1 format. - // When changing the built-in language, remember to also change it in the editor's configuration (src/ckeditor.ts). - language: 'en', - additionalLanguages: 'all' - } ), - new webpack.BannerPlugin( { - banner: bundler.getLicenseBanner(), - raw: true - } ) - ], + plugins: [ + new CKEditorTranslationsPlugin({ + // UI language. Language codes follow the https://en.wikipedia.org/wiki/ISO_639-1 format. + // When changing the built-in language, remember to also change it in the editor's configuration (src/ckeditor.ts). + language: "en", + additionalLanguages: "all", + }), + new webpack.BannerPlugin({ + banner: bundler.getLicenseBanner(), + raw: true, + }), + ], - resolve: { - extensions: [ '.ts', '.js', '.json' ] - }, + resolve: { + extensions: [".ts", ".js", ".json"], + }, - module: { - rules: [ { - test: /\.svg$/, - use: [ 'raw-loader' ] - }, { - test: /\.ts$/, - use: 'ts-loader' - }, { - test: /\.css$/, - use: [ { - loader: 'style-loader', - options: { - injectType: 'singletonStyleTag', - attributes: { - 'data-cke': true - } - } - }, { - loader: 'css-loader' - }, { - loader: 'postcss-loader', - options: { - postcssOptions: styles.getPostCssConfig( { - themeImporter: { - themePath: require.resolve( '@ckeditor/ckeditor5-theme-lark' ) - }, - minify: true - } ) - } - } ] - } ] - } + module: { + rules: [ + { + test: /\.svg$/, + use: ["raw-loader"], + }, + { + test: /\.ts$/, + use: "ts-loader", + }, + { + test: /\.css$/, + use: [ + { + loader: "style-loader", + options: { + injectType: "singletonStyleTag", + attributes: { + "data-cke": true, + }, + }, + }, + { + loader: "css-loader", + }, + { + loader: "postcss-loader", + options: { + postcssOptions: styles.getPostCssConfig({ + themeImporter: { + themePath: require.resolve("@ckeditor/ckeditor5-theme-lark"), + }, + minify: true, + }), + }, + }, + ], + }, + ], + }, }; diff --git a/tailwind.config.ts b/tailwind.config.ts index 3f468487..1a879c76 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -3,7 +3,7 @@ import type { Config } from "tailwindcss"; const config = { darkMode: ["class"], content: [ - "./src/**/*.{js,ts,jsx,tsx,mdx}", + "./src/**/*.{js,jsx,ts,tsx}", ], prefix: "", theme: { @@ -20,7 +20,7 @@ const config = { "custom-lg-button": "1030px", }, fontFamily: { - sans: ["DM Sans", "sans-serif"], + sans: ["var(--font-dm-sans)"], }, colors: { border: "hsl(var(--border))", diff --git a/theme.config.tsx b/theme.config.tsx index 61ffdcc7..743491c8 100644 --- a/theme.config.tsx +++ b/theme.config.tsx @@ -1,6 +1,8 @@ import React from "react"; import { DocsThemeConfig } from "nextra-theme-docs"; + import DashCodeLogo from "@/components/ui/structures/dascode-logo"; + const config: DocsThemeConfig = { logo: ( diff --git a/tsconfig.json b/tsconfig.json index 11025abd..ac25e8ea 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -22,6 +22,13 @@ }, "baseUrl": "." }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "src/components/features/landing-page/NewsBottom.tsx", "src/components/features/landing-page/NavBottom.js"], + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + "src/components/features/landing-page/NewsBottom.tsx", + "src/components/features/landing-page/NavBottom.js" + ], "exclude": ["node_modules"] }