diff --git a/components/form/master/master-user-level/master-user-level-form.tsx b/components/form/master/master-user-level/master-user-level-form.tsx index a26443b..bafa6e4 100644 --- a/components/form/master/master-user-level/master-user-level-form.tsx +++ b/components/form/master/master-user-level/master-user-level-form.tsx @@ -12,6 +12,14 @@ import dynamic from 'next/dynamic'; import { useForm } from "react-hook-form"; import * as z from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; +import { createUserLevels } from "@/services/user-levels/user-levels-service"; + +const LevelList = [ + { label: "Admin", value: "admin", id: 1 }, + { label: "Super-Admin", value: "super-admin", id: 2 }, + { label: "Kurator", value: "kurator", id: 3 }, + { label: "Supervisor", value: "supervisor", id: 4 }, +]; const moduleList = [ { label: "Article", value: "article", id: 1 }, @@ -38,13 +46,14 @@ export default function CreateMasterUserLevelForm() { const editor = useRef(null); const [content, setContent] = useState(''); const [haveChildren, setHaveChildren] = useState("no"); - const [active, setActive] = useState("1"); + const [active, setTrue] = useState("true"); + const [levelValue, setLevelValue] = useState(""); const handleTab = (tab: any) => { setTabs(tab); }; const handleActive = (e: React.ChangeEvent) => { - setActive(e.target.value); + setTrue(e.target.value); }; const handleHaveChildren = (e: React.ChangeEvent) => { @@ -86,7 +95,7 @@ export default function CreateMasterUserLevelForm() { const validationSchema = z.object({ name: z.string().min(1, { message: "Required" }), aliasName: z.string().min(1, { message: "Required" }), - levelNumber: z.string().min(1, { message: "Required" }), + // levelNumber: z.string().min(1, { message: "Required" }), }); const formOptions = { resolver: zodResolver(validationSchema) }; @@ -95,21 +104,21 @@ export default function CreateMasterUserLevelForm() { const { register, handleSubmit, formState: { errors }, formState, setValue } = useForm(formOptions); const save = async (data: any) => { - + const selectedLevel = Number(Array.from(levelValue).pop()); const request = { name: data.name, aliasName: data.aliasName, - levelNumber: data.levelNumber, - status: 1, + levelNumber: selectedLevel, + isActive: active, }; console.log(request); - // loading(); - // // const res = await saveManualContext(request); - // if (res.error) { - // error(res.message); - // return false; - // } + loading(); + const res = await createUserLevels(request); + if (res.error) { + error(res.message); + return false; + } close(); successSubmit("/admin/master/master-user-level") } @@ -204,33 +213,47 @@ export default function CreateMasterUserLevelForm() {

)} -
- - -
- } - /> - {errors.levelNumber?.message && ( -

- {errors.levelNumber?.message} -

- )} -
+

Level Number

+ +
+ {/*

Parent LevelId

+
+

Status

+ + + Active + + + Inactive + + +
*/}
diff --git a/package-lock.json b/package-lock.json index fdd840a..6bf829c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,11 +23,13 @@ "@nextui-org/theme": "2.1.17", "@react-aria/ssr": "^3.8.0", "@react-aria/visually-hidden": "^3.8.6", + "@types/js-cookie": "^3.0.6", "@types/node": "20.5.7", "@types/react": "18.2.21", "@types/react-datepicker": "^6.0.1", "@types/react-dom": "18.2.7", "autoprefixer": "10.4.16", + "axios": "^1.6.8", "clsx": "^2.0.0", "eslint": "8.48.0", "eslint-config-next": "14.0.2", @@ -2632,6 +2634,11 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/js-cookie": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.6.tgz", + "integrity": "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==" + }, "node_modules/@types/json5": { "version": "0.0.29", "license": "MIT" @@ -2972,6 +2979,11 @@ "has-symbols": "^1.0.3" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "node_modules/autobind-decorator": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/autobind-decorator/-/autobind-decorator-2.4.0.tgz", @@ -3033,6 +3045,16 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/axobject-query": { "version": "3.2.1", "license": "Apache-2.0", @@ -3250,6 +3272,17 @@ "version": "2.0.2", "license": "MIT" }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "4.1.1", "license": "MIT", @@ -3363,6 +3396,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/dequal": { "version": "2.0.3", "license": "MIT", @@ -4066,6 +4107,25 @@ "version": "3.2.9", "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.3", "license": "MIT", @@ -4073,6 +4133,19 @@ "is-callable": "^1.1.3" } }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fraction.js": { "version": "4.3.7", "license": "MIT", @@ -4966,6 +5039,25 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "license": "ISC", @@ -5452,6 +5544,11 @@ "react-is": "^16.13.1" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/punycode": { "version": "2.3.1", "license": "MIT", diff --git a/package.json b/package.json index e160325..5e8e08f 100644 --- a/package.json +++ b/package.json @@ -24,11 +24,13 @@ "@nextui-org/theme": "2.1.17", "@react-aria/ssr": "^3.8.0", "@react-aria/visually-hidden": "^3.8.6", + "@types/js-cookie": "^3.0.6", "@types/node": "20.5.7", "@types/react": "18.2.21", "@types/react-datepicker": "^6.0.1", "@types/react-dom": "18.2.7", "autoprefixer": "10.4.16", + "axios": "^1.6.8", "clsx": "^2.0.0", "eslint": "8.48.0", "eslint-config-next": "14.0.2", diff --git a/services/http-config/axios-base-instance.ts b/services/http-config/axios-base-instance.ts new file mode 100644 index 0000000..aa6679f --- /dev/null +++ b/services/http-config/axios-base-instance.ts @@ -0,0 +1,12 @@ +import axios from "axios"; + +const baseURL = "http://103.82.242.92:8888"; + +const axiosBaseInstance = axios.create({ + baseURL, + headers: { + "content-type": "application/json", + }, +}); + +export default axiosBaseInstance; diff --git a/services/http-config/axios-interceptor-instance.ts b/services/http-config/axios-interceptor-instance.ts new file mode 100644 index 0000000..9bef1d9 --- /dev/null +++ b/services/http-config/axios-interceptor-instance.ts @@ -0,0 +1,33 @@ +import axios from "axios"; +import Cookies from "js-cookie"; + +const baseURL = "http://103.82.242.92:8800"; + +const refreshToken = Cookies.get("refresh_token"); + +const axiosInterceptorInstance = axios.create({ + baseURL, + headers: { + "content-type": "application/json", + }, +}); + +// Request interceptor +axiosInterceptorInstance.interceptors.request.use( + (config) => { + const accessToken = Cookies.get("access_token"); + if (accessToken) { + if (config.headers) + config.headers.Authorization = "Bearer " + accessToken; + } + return config; + }, + (error) => { + return Promise.reject(error); + }, +); + +// Response interceptor + + +export default axiosInterceptorInstance; diff --git a/services/http-config/http-base-services.ts b/services/http-config/http-base-services.ts new file mode 100644 index 0000000..b6fc06f --- /dev/null +++ b/services/http-config/http-base-services.ts @@ -0,0 +1,44 @@ +import axiosBaseInstance from "./axios-base-instance"; + +export async function httpGet(pathUrl: any, headers: any) { + const response = await axiosBaseInstance + .get(pathUrl, { headers }) + .catch((error) => error.response); + console.log("Response base svc : ", response); + if (response?.data.success) { + return { + error: false, + message: "success", + data: response?.data, + }; + } else { + return { + error: true, + message: response?.data?.message || null, + data: null, + }; + } +} + +export async function httpPost(pathUrl: any, headers: any, data: any) { + const response = await axiosBaseInstance + .post(pathUrl, data, { headers }) + .catch(function (error) { + 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, + }; + } +} diff --git a/services/http-config/http-disestages-2-services.ts b/services/http-config/http-disestages-2-services.ts new file mode 100644 index 0000000..f348b39 --- /dev/null +++ b/services/http-config/http-disestages-2-services.ts @@ -0,0 +1,70 @@ +import axiosDisestagesInstance2 from "./axios-disestages-instance-2"; + +export async function httpPostDisestages(pathUrl: any, headers: any, data?: any) { + const response = await axiosDisestagesInstance2 + .post(pathUrl, data, { headers }) + .catch(function (error) { + 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 httpGetDisestages(pathUrl: any, headers: any) { + const response = await axiosDisestagesInstance2 + .get(pathUrl, { headers }) + .catch(function (error) { + 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 httpDelete(pathUrl: any) { +// const response = await axiosDisestagesInstance +// .delete(pathUrl, data, { headers }) +// .catch(function (error) { +// 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, +// }; +// } +// } diff --git a/services/http-config/http-interceptor-services.ts b/services/http-config/http-interceptor-services.ts new file mode 100644 index 0000000..ff772b2 --- /dev/null +++ b/services/http-config/http-interceptor-services.ts @@ -0,0 +1,75 @@ +import { useRouter } from "next/navigation"; +import axiosInterceptorInstance from "./axios-interceptor-instance"; +import Cookies from "js-cookie"; + +export async function httpGetInterceptor(pathUrl: any) { + const response = await axiosInterceptorInstance + .get(pathUrl) + .catch((error) => error.response); + console.log("Response interceptor : ", response); + if (response?.status == 200 || response?.status == 201) { + return { + error: false, + message: "success", + data: response?.data, + }; + } else if (response?.status == 401) { + Cookies.set("is_logout", "true"); + window.location.href = "/"; + return { + error: true, + }; + } else { + return { + error: true, + message: response?.data?.message || response?.data || null, + data: null, + }; + } +} + +export async function httpPostInterceptor(pathUrl: any, data: any, headers?: any) { + const response = await axiosInterceptorInstance + .post(pathUrl, data, { headers }) + .catch((error) => error.response); + console.log("Response interceptor : ", response); + if (response?.status == 200 || response?.status == 201) { + return { + error: false, + message: "success", + data: response?.data, + }; + } else if (response?.status == 401) { + Cookies.set("is_logout", "true"); + window.location.href = "/"; + } else { + return { + error: true, + message: response?.data?.message || response?.data || null, + data: null, + }; + } +} + +export async function httpDeleteInterceptor(pathUrl: any) { + const response = await axiosInterceptorInstance + .delete(pathUrl) + .catch((error) => error.response); + console.log("Response interceptor : ", response); + if (response?.status == 200 || response?.status == 201) { + return { + error: false, + message: "success", + data: response?.data, + }; + } else if (response?.status == 401) { + Cookies.set("is_logout", "true"); + window.location.href = "/"; + } else { + return { + error: true, + message: response?.data?.message || response?.data || null, + data: null, + }; + } +} diff --git a/services/user-levels/user-levels-service.ts b/services/user-levels/user-levels-service.ts new file mode 100644 index 0000000..999bf4b --- /dev/null +++ b/services/user-levels/user-levels-service.ts @@ -0,0 +1,26 @@ +import { httpGet, httpPost } from "../http-config/http-base-services"; + + + +export async function getAllUserLevels(data: any) { + const headers = { + "content-type": "application/json", + }; + return await httpGet(`user-levels`, headers,); +} + +export async function getAccountById(id: string) { + const headers = { + "content-type": "application/json", + }; + return await httpGet(`user-account/findById/${id}`, headers); + +} + +export async function createUserLevels(request: any) { + const headers = { + "content-type": "application/json", + }; + return await httpPost(`user-levels`, headers, request); +} +