From fdb31a895316813e8e1f2bd7475c5b92241ff762 Mon Sep 17 00:00:00 2001
From: Anang Yusman
Date: Tue, 23 Apr 2024 12:17:21 +0700
Subject: [PATCH] feat:add data table master-user-level
---
.../master-user-level-form.tsx | 126 ++++++++++++------
.../master-user-level-table.tsx | 120 ++++++++++-------
package-lock.json | 97 ++++++++++++++
package.json | 2 +
services/http-config/axios-base-instance.ts | 12 ++
.../http-config/axios-interceptor-instance.ts | 33 +++++
services/http-config/http-base-services.ts | 44 ++++++
.../http-config/http-disestages-2-services.ts | 70 ++++++++++
.../http-config/http-interceptor-services.ts | 75 +++++++++++
services/user-levels/user-levels-service.ts | 26 ++++
10 files changed, 519 insertions(+), 86 deletions(-)
create mode 100644 services/http-config/axios-base-instance.ts
create mode 100644 services/http-config/axios-interceptor-instance.ts
create mode 100644 services/http-config/http-base-services.ts
create mode 100644 services/http-config/http-disestages-2-services.ts
create mode 100644 services/http-config/http-interceptor-services.ts
create mode 100644 services/user-levels/user-levels-service.ts
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
+
+
+ {/*
+
+
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);
+}
+