@skalfa/skalfa-app 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +43 -43
- package/.github/workflows/publish.yml +39 -0
- package/CONTRIBUTING.md +45 -0
- package/LICENSE +21 -0
- package/README.md +91 -28
- package/app/auth/edit/page.tsx +65 -65
- package/app/auth/login/page.tsx +63 -63
- package/app/auth/me/page.tsx +58 -58
- package/app/auth/register/page.tsx +69 -69
- package/app/auth/verify/page.tsx +53 -53
- package/app/dashboard/user/page.tsx +76 -76
- package/app/layout.tsx +37 -37
- package/app/manifest.ts +25 -0
- package/app/page.tsx +13 -13
- package/barrels.json +5 -5
- package/blueprints/starter.blueprint.json +102 -102
- package/bun.lock +916 -0
- package/components/base.components/chip/Chip.component.tsx +39 -39
- package/components/base.components/document/DocumentViewer.component.tsx +163 -163
- package/components/base.components/document/ExportExcel.component.tsx +340 -340
- package/components/base.components/document/ImportExcel.component.tsx +315 -315
- package/components/base.components/document/PrintTable.component.tsx +204 -204
- package/components/base.components/document/RenderPDF.component.tsx +415 -415
- package/components/base.components/input/Checkbox.component.tsx +109 -109
- package/components/base.components/input/Input.component.tsx +332 -332
- package/components/base.components/input/InputCheckbox.component.tsx +174 -174
- package/components/base.components/input/InputCurrency.component.tsx +163 -163
- package/components/base.components/input/InputDate.component.tsx +352 -352
- package/components/base.components/input/InputDatetime.component.tsx +260 -260
- package/components/base.components/input/InputDocument.component.tsx +351 -351
- package/components/base.components/input/InputImage.component.tsx +533 -533
- package/components/base.components/input/InputMap.component.tsx +317 -317
- package/components/base.components/input/InputNumber.component.tsx +192 -192
- package/components/base.components/input/InputOtp.component.tsx +169 -169
- package/components/base.components/input/InputPassword.component.tsx +236 -236
- package/components/base.components/input/InputRadio.component.tsx +175 -175
- package/components/base.components/input/InputTime.component.tsx +275 -275
- package/components/base.components/input/InputValues.component.tsx +68 -68
- package/components/base.components/input/Radio.component.tsx +102 -102
- package/components/base.components/input/Select.component.tsx +541 -541
- package/components/base.components/modal/BottomSheet.component.tsx +245 -245
- package/components/base.components/supervision/FormSupervision.component.tsx +433 -433
- package/components/base.components/supervision/TableSupervision.component.tsx +697 -697
- package/components/base.components/table/ControlBar.component.tsx +497 -497
- package/components/base.components/table/FilterComponent.tsx +518 -518
- package/components/base.components/table/Table.component.tsx +469 -469
- package/components/base.components/typography/TypographyArticle.component.tsx +26 -26
- package/components/base.components/typography/TypographyColumn.component.tsx +20 -20
- package/components/base.components/typography/TypographyContent.component.tsx +20 -20
- package/components/base.components/typography/TypographyTips.component.tsx +20 -20
- package/components/base.components/wrap/Draggable.component.tsx +303 -303
- package/components/base.components/wrap/IDBProvider.tsx +12 -12
- package/components/base.components/wrap/Image.component.tsx +9 -9
- package/components/base.components/wrap/ShortcutProvider.tsx +57 -57
- package/components/base.components/wrap/Swipe.component.tsx +93 -93
- package/components/index.ts +2 -2
- package/contexts/AppProvider.tsx +11 -11
- package/contexts/Auth.context.tsx +64 -64
- package/contexts/Toggle.context.tsx +44 -44
- package/next.config.ts +15 -1
- package/package.json +14 -13
- package/public/204.svg +19 -19
- package/public/500.svg +39 -39
- package/public/icon-192.png +0 -0
- package/public/icon-512.png +0 -0
- package/public/images/logo-fill.png +0 -0
- package/public/images/logo-full-fill.png +0 -0
- package/public/images/logo-full.png +0 -0
- package/public/images/logo.png +0 -0
- package/schema/idb/app.schema.ts +8 -8
- package/src-tauri/Cargo.toml +14 -0
- package/src-tauri/build.rs +3 -0
- package/src-tauri/capabilities/default.json +11 -0
- package/src-tauri/icons/128x128.png +0 -0
- package/src-tauri/icons/128x128@2x.png +0 -0
- package/src-tauri/icons/32x32.png +0 -0
- package/src-tauri/icons/icon.icns +0 -0
- package/src-tauri/icons/icon.ico +0 -0
- package/src-tauri/src/main.rs +7 -0
- package/src-tauri/tauri.conf.json +36 -0
- package/styles/globals.css +231 -231
- package/styles/tailwind.safelist +68 -68
- package/utils/commands/barrels.ts +27 -27
- package/utils/commands/light.ts +21 -21
- package/utils/commands/logger.ts +42 -42
- package/utils/commands/stubs/table-blueprint.stub +12 -12
- package/utils/commands/use-pdf.ts +29 -29
package/app/auth/me/page.tsx
CHANGED
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
"use client"
|
|
2
|
-
|
|
3
|
-
import { useRouter } from "next/navigation";
|
|
4
|
-
import { auth } from "@utils";
|
|
5
|
-
import { useAuthContext } from "@contexts";
|
|
6
|
-
import { ButtonComponent, CardComponent, ImageComponent } from "@components";
|
|
7
|
-
|
|
8
|
-
export default function Login() {
|
|
9
|
-
const router = useRouter();
|
|
10
|
-
const {user} = useAuthContext();
|
|
11
|
-
|
|
12
|
-
return (
|
|
13
|
-
<>
|
|
14
|
-
<div className="h-screen flex flex-col justify-center items-center">
|
|
15
|
-
<h1 className="text-2xl font-extrabold italic">WELCOME TO NEXT-LIGHT v.3</h1>
|
|
16
|
-
<p className="text-sm font-semibold mt-6">Your account!</p>
|
|
17
|
-
|
|
18
|
-
<CardComponent className="mt-4 p-6 w-[400px] rounded-2xl">
|
|
19
|
-
<div className="flex gap-4">
|
|
20
|
-
{user?.image && (
|
|
21
|
-
|
|
22
|
-
<div className="bg-slate-200 aspect-[3/4] w-full rounded flex justify-center items-center">
|
|
23
|
-
<ImageComponent src={process.env.NEXT_PUBLIC_STORAGE_HOST + user?.image} width={400} height={600} alt="" />
|
|
24
|
-
</div>
|
|
25
|
-
)}
|
|
26
|
-
<div className="flex flex-col gap-4">
|
|
27
|
-
<div>
|
|
28
|
-
<p className="text-xs font-semibold text-light-foreground">
|
|
29
|
-
Name
|
|
30
|
-
</p>
|
|
31
|
-
<p>{user?.name}</p>
|
|
32
|
-
</div>
|
|
33
|
-
<div>
|
|
34
|
-
<p className="text-xs font-semibold text-light-foreground">
|
|
35
|
-
Email
|
|
36
|
-
</p>
|
|
37
|
-
<p>{user?.email}</p>
|
|
38
|
-
</div>
|
|
39
|
-
|
|
40
|
-
<ButtonComponent href="/auth/edit" label="Change" variant="light" block className="py-1.5" />
|
|
41
|
-
<ButtonComponent
|
|
42
|
-
label="Logout"
|
|
43
|
-
variant="outline"
|
|
44
|
-
paint="danger"
|
|
45
|
-
className="py-1.5"
|
|
46
|
-
block
|
|
47
|
-
onClick={() => {
|
|
48
|
-
auth.deleteAccessToken()
|
|
49
|
-
router.push("/auth/login")
|
|
50
|
-
}}
|
|
51
|
-
/>
|
|
52
|
-
</div>
|
|
53
|
-
</div>
|
|
54
|
-
</CardComponent>
|
|
55
|
-
</div>
|
|
56
|
-
</>
|
|
57
|
-
);
|
|
58
|
-
}
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import { useRouter } from "next/navigation";
|
|
4
|
+
import { auth } from "@utils";
|
|
5
|
+
import { useAuthContext } from "@contexts";
|
|
6
|
+
import { ButtonComponent, CardComponent, ImageComponent } from "@components";
|
|
7
|
+
|
|
8
|
+
export default function Login() {
|
|
9
|
+
const router = useRouter();
|
|
10
|
+
const {user} = useAuthContext();
|
|
11
|
+
|
|
12
|
+
return (
|
|
13
|
+
<>
|
|
14
|
+
<div className="h-screen flex flex-col justify-center items-center">
|
|
15
|
+
<h1 className="text-2xl font-extrabold italic">WELCOME TO NEXT-LIGHT v.3</h1>
|
|
16
|
+
<p className="text-sm font-semibold mt-6">Your account!</p>
|
|
17
|
+
|
|
18
|
+
<CardComponent className="mt-4 p-6 w-[400px] rounded-2xl">
|
|
19
|
+
<div className="flex gap-4">
|
|
20
|
+
{user?.image && (
|
|
21
|
+
|
|
22
|
+
<div className="bg-slate-200 aspect-[3/4] w-full rounded flex justify-center items-center">
|
|
23
|
+
<ImageComponent src={process.env.NEXT_PUBLIC_STORAGE_HOST + user?.image} width={400} height={600} alt="" />
|
|
24
|
+
</div>
|
|
25
|
+
)}
|
|
26
|
+
<div className="flex flex-col gap-4">
|
|
27
|
+
<div>
|
|
28
|
+
<p className="text-xs font-semibold text-light-foreground">
|
|
29
|
+
Name
|
|
30
|
+
</p>
|
|
31
|
+
<p>{user?.name}</p>
|
|
32
|
+
</div>
|
|
33
|
+
<div>
|
|
34
|
+
<p className="text-xs font-semibold text-light-foreground">
|
|
35
|
+
Email
|
|
36
|
+
</p>
|
|
37
|
+
<p>{user?.email}</p>
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
<ButtonComponent href="/auth/edit" label="Change" variant="light" block className="py-1.5" />
|
|
41
|
+
<ButtonComponent
|
|
42
|
+
label="Logout"
|
|
43
|
+
variant="outline"
|
|
44
|
+
paint="danger"
|
|
45
|
+
className="py-1.5"
|
|
46
|
+
block
|
|
47
|
+
onClick={() => {
|
|
48
|
+
auth.deleteAccessToken()
|
|
49
|
+
router.push("/auth/login")
|
|
50
|
+
}}
|
|
51
|
+
/>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
</CardComponent>
|
|
55
|
+
</div>
|
|
56
|
+
</>
|
|
57
|
+
);
|
|
58
|
+
}
|
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
"use client"
|
|
2
|
-
|
|
3
|
-
import Link from "next/link";
|
|
4
|
-
import { useRouter } from "next/navigation";
|
|
5
|
-
import { ButtonComponent, CardComponent, FormSupervisionComponent } from "@components";
|
|
6
|
-
import { useAuthContext } from "@contexts";
|
|
7
|
-
|
|
8
|
-
export default function Register() {
|
|
9
|
-
const router = useRouter();
|
|
10
|
-
const {setRegisterToken} = useAuthContext();
|
|
11
|
-
|
|
12
|
-
return (
|
|
13
|
-
<>
|
|
14
|
-
<div className="h-screen flex flex-col justify-center items-center">
|
|
15
|
-
<h1 className="text-2xl font-extrabold italic">WELCOME TO NEXT-LIGHT v.3</h1>
|
|
16
|
-
<p className="text-sm font-semibold mt-6">Create new account!</p>
|
|
17
|
-
|
|
18
|
-
<CardComponent className="mt-4 p-6 w-[400px] rounded-2xl">
|
|
19
|
-
<FormSupervisionComponent
|
|
20
|
-
fields={[
|
|
21
|
-
{
|
|
22
|
-
construction: {
|
|
23
|
-
name: "name",
|
|
24
|
-
label: "Nama",
|
|
25
|
-
placeholder: "Ex: Joko Gunawan",
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
construction: {
|
|
30
|
-
name: "email",
|
|
31
|
-
label: "E-mail",
|
|
32
|
-
placeholder: "Ex: example@mail.com",
|
|
33
|
-
}
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
type: "enter-password",
|
|
37
|
-
construction: {
|
|
38
|
-
name: "password",
|
|
39
|
-
label: "Password",
|
|
40
|
-
placeholder: "Ex: secret123",
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
]}
|
|
44
|
-
submitControl={{
|
|
45
|
-
path: "register"
|
|
46
|
-
}}
|
|
47
|
-
onSuccess={(res) => {
|
|
48
|
-
setRegisterToken(res?.data?.token)
|
|
49
|
-
router.push("/auth/verify")
|
|
50
|
-
}}
|
|
51
|
-
footerControl={({loading}) => (
|
|
52
|
-
<>
|
|
53
|
-
<ButtonComponent
|
|
54
|
-
type="submit"
|
|
55
|
-
label="Create Account"
|
|
56
|
-
block
|
|
57
|
-
className="mt-4"
|
|
58
|
-
loading={loading}
|
|
59
|
-
/>
|
|
60
|
-
|
|
61
|
-
<p className="mt-4 text-center">Already have an account? <Link href="/auth/login" className="text-primary underline">Login</Link></p>
|
|
62
|
-
</>
|
|
63
|
-
)}
|
|
64
|
-
/>
|
|
65
|
-
</CardComponent>
|
|
66
|
-
</div>
|
|
67
|
-
</>
|
|
68
|
-
);
|
|
69
|
-
}
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import Link from "next/link";
|
|
4
|
+
import { useRouter } from "next/navigation";
|
|
5
|
+
import { ButtonComponent, CardComponent, FormSupervisionComponent } from "@components";
|
|
6
|
+
import { useAuthContext } from "@contexts";
|
|
7
|
+
|
|
8
|
+
export default function Register() {
|
|
9
|
+
const router = useRouter();
|
|
10
|
+
const {setRegisterToken} = useAuthContext();
|
|
11
|
+
|
|
12
|
+
return (
|
|
13
|
+
<>
|
|
14
|
+
<div className="h-screen flex flex-col justify-center items-center">
|
|
15
|
+
<h1 className="text-2xl font-extrabold italic">WELCOME TO NEXT-LIGHT v.3</h1>
|
|
16
|
+
<p className="text-sm font-semibold mt-6">Create new account!</p>
|
|
17
|
+
|
|
18
|
+
<CardComponent className="mt-4 p-6 w-[400px] rounded-2xl">
|
|
19
|
+
<FormSupervisionComponent
|
|
20
|
+
fields={[
|
|
21
|
+
{
|
|
22
|
+
construction: {
|
|
23
|
+
name: "name",
|
|
24
|
+
label: "Nama",
|
|
25
|
+
placeholder: "Ex: Joko Gunawan",
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
construction: {
|
|
30
|
+
name: "email",
|
|
31
|
+
label: "E-mail",
|
|
32
|
+
placeholder: "Ex: example@mail.com",
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
type: "enter-password",
|
|
37
|
+
construction: {
|
|
38
|
+
name: "password",
|
|
39
|
+
label: "Password",
|
|
40
|
+
placeholder: "Ex: secret123",
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
]}
|
|
44
|
+
submitControl={{
|
|
45
|
+
path: "register"
|
|
46
|
+
}}
|
|
47
|
+
onSuccess={(res) => {
|
|
48
|
+
setRegisterToken(res?.data?.token)
|
|
49
|
+
router.push("/auth/verify")
|
|
50
|
+
}}
|
|
51
|
+
footerControl={({loading}) => (
|
|
52
|
+
<>
|
|
53
|
+
<ButtonComponent
|
|
54
|
+
type="submit"
|
|
55
|
+
label="Create Account"
|
|
56
|
+
block
|
|
57
|
+
className="mt-4"
|
|
58
|
+
loading={loading}
|
|
59
|
+
/>
|
|
60
|
+
|
|
61
|
+
<p className="mt-4 text-center">Already have an account? <Link href="/auth/login" className="text-primary underline">Login</Link></p>
|
|
62
|
+
</>
|
|
63
|
+
)}
|
|
64
|
+
/>
|
|
65
|
+
</CardComponent>
|
|
66
|
+
</div>
|
|
67
|
+
</>
|
|
68
|
+
);
|
|
69
|
+
}
|
package/app/auth/verify/page.tsx
CHANGED
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
"use client"
|
|
2
|
-
|
|
3
|
-
import Link from "next/link";
|
|
4
|
-
import { useRouter } from "next/navigation";
|
|
5
|
-
import { ButtonComponent, CardComponent, FormSupervisionComponent } from "@components";
|
|
6
|
-
import { useAuthContext } from "@contexts/.";
|
|
7
|
-
|
|
8
|
-
export default function Verify() {
|
|
9
|
-
const router = useRouter();
|
|
10
|
-
const {registerToken} = useAuthContext();
|
|
11
|
-
|
|
12
|
-
return (
|
|
13
|
-
<>
|
|
14
|
-
<div className="h-screen flex flex-col justify-center items-center">
|
|
15
|
-
<h1 className="text-2xl font-extrabold italic">WELCOME TO NEXT-LIGHT v.3</h1>
|
|
16
|
-
<p className="text-sm font-semibold mt-6">Verify your email!</p>
|
|
17
|
-
|
|
18
|
-
<CardComponent className="mt-4 p-6 w-[400px] rounded-2xl">
|
|
19
|
-
<FormSupervisionComponent
|
|
20
|
-
fields={[
|
|
21
|
-
{
|
|
22
|
-
type: "otp",
|
|
23
|
-
construction: {
|
|
24
|
-
name: "token",
|
|
25
|
-
}
|
|
26
|
-
},
|
|
27
|
-
]}
|
|
28
|
-
submitControl={{
|
|
29
|
-
path: "verify",
|
|
30
|
-
bearer: registerToken || "",
|
|
31
|
-
}}
|
|
32
|
-
onSuccess={() => {
|
|
33
|
-
router.push("/auth/login")
|
|
34
|
-
}}
|
|
35
|
-
footerControl={({loading}) => (
|
|
36
|
-
<>
|
|
37
|
-
<ButtonComponent
|
|
38
|
-
type="submit"
|
|
39
|
-
label="Submit"
|
|
40
|
-
block
|
|
41
|
-
className="mt-4"
|
|
42
|
-
loading={loading}
|
|
43
|
-
/>
|
|
44
|
-
|
|
45
|
-
<p className="mt-4 text-center">Already have an account? <Link href="/auth/login" className="text-primary underline">Login</Link></p>
|
|
46
|
-
</>
|
|
47
|
-
)}
|
|
48
|
-
/>
|
|
49
|
-
</CardComponent>
|
|
50
|
-
</div>
|
|
51
|
-
</>
|
|
52
|
-
);
|
|
53
|
-
}
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import Link from "next/link";
|
|
4
|
+
import { useRouter } from "next/navigation";
|
|
5
|
+
import { ButtonComponent, CardComponent, FormSupervisionComponent } from "@components";
|
|
6
|
+
import { useAuthContext } from "@contexts/.";
|
|
7
|
+
|
|
8
|
+
export default function Verify() {
|
|
9
|
+
const router = useRouter();
|
|
10
|
+
const {registerToken} = useAuthContext();
|
|
11
|
+
|
|
12
|
+
return (
|
|
13
|
+
<>
|
|
14
|
+
<div className="h-screen flex flex-col justify-center items-center">
|
|
15
|
+
<h1 className="text-2xl font-extrabold italic">WELCOME TO NEXT-LIGHT v.3</h1>
|
|
16
|
+
<p className="text-sm font-semibold mt-6">Verify your email!</p>
|
|
17
|
+
|
|
18
|
+
<CardComponent className="mt-4 p-6 w-[400px] rounded-2xl">
|
|
19
|
+
<FormSupervisionComponent
|
|
20
|
+
fields={[
|
|
21
|
+
{
|
|
22
|
+
type: "otp",
|
|
23
|
+
construction: {
|
|
24
|
+
name: "token",
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
]}
|
|
28
|
+
submitControl={{
|
|
29
|
+
path: "verify",
|
|
30
|
+
bearer: registerToken || "",
|
|
31
|
+
}}
|
|
32
|
+
onSuccess={() => {
|
|
33
|
+
router.push("/auth/login")
|
|
34
|
+
}}
|
|
35
|
+
footerControl={({loading}) => (
|
|
36
|
+
<>
|
|
37
|
+
<ButtonComponent
|
|
38
|
+
type="submit"
|
|
39
|
+
label="Submit"
|
|
40
|
+
block
|
|
41
|
+
className="mt-4"
|
|
42
|
+
loading={loading}
|
|
43
|
+
/>
|
|
44
|
+
|
|
45
|
+
<p className="mt-4 text-center">Already have an account? <Link href="/auth/login" className="text-primary underline">Login</Link></p>
|
|
46
|
+
</>
|
|
47
|
+
)}
|
|
48
|
+
/>
|
|
49
|
+
</CardComponent>
|
|
50
|
+
</div>
|
|
51
|
+
</>
|
|
52
|
+
);
|
|
53
|
+
}
|
|
@@ -1,77 +1,77 @@
|
|
|
1
|
-
import { TableSupervisionComponent} from "@components";
|
|
2
|
-
import { Suspense } from "react";
|
|
3
|
-
|
|
4
|
-
export default function Table() {
|
|
5
|
-
return (
|
|
6
|
-
<Suspense fallback={<div>Loading...</div>}>
|
|
7
|
-
<TableSupervisionComponent
|
|
8
|
-
title="User"
|
|
9
|
-
fetchControl={{
|
|
10
|
-
path: "users",
|
|
11
|
-
}}
|
|
12
|
-
columnControl={[
|
|
13
|
-
{
|
|
14
|
-
selector: "name",
|
|
15
|
-
label: "Nama",
|
|
16
|
-
sortable: true,
|
|
17
|
-
filterable: true,
|
|
18
|
-
width: "350px",
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
selector: "email",
|
|
22
|
-
label: "Email",
|
|
23
|
-
sortable: true,
|
|
24
|
-
width: "250px",
|
|
25
|
-
},
|
|
26
|
-
]}
|
|
27
|
-
detailControl={[
|
|
28
|
-
{
|
|
29
|
-
label: "Nama",
|
|
30
|
-
item: "name",
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
label: "Email",
|
|
34
|
-
item: "email",
|
|
35
|
-
}
|
|
36
|
-
]}
|
|
37
|
-
formControl={{
|
|
38
|
-
fields: [
|
|
39
|
-
{
|
|
40
|
-
construction: {
|
|
41
|
-
name: "email",
|
|
42
|
-
label: "E-mail",
|
|
43
|
-
placeholder: "Ex: example@mail.com",
|
|
44
|
-
validations: ["required"],
|
|
45
|
-
},
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
construction: {
|
|
49
|
-
name: "name",
|
|
50
|
-
label: "Name",
|
|
51
|
-
placeholder: "Ex: Joko Gunawan",
|
|
52
|
-
},
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
construction: {
|
|
56
|
-
name: "password",
|
|
57
|
-
label: "Password",
|
|
58
|
-
placeholder: "Ex: secret123",
|
|
59
|
-
}
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
construction: {
|
|
63
|
-
type: "file",
|
|
64
|
-
name: "image",
|
|
65
|
-
label: "Picture",
|
|
66
|
-
}
|
|
67
|
-
},
|
|
68
|
-
],
|
|
69
|
-
}}
|
|
70
|
-
controlBar={["CREATE", "FILTER", "SEARCH", "SORT", "SELECTABLE", "IMPORT", "EXPORT", "PRINT", "REFRESH"]}
|
|
71
|
-
responsiveControl={{
|
|
72
|
-
mobile: true,
|
|
73
|
-
}}
|
|
74
|
-
/>
|
|
75
|
-
</Suspense>
|
|
76
|
-
);
|
|
1
|
+
import { TableSupervisionComponent} from "@components";
|
|
2
|
+
import { Suspense } from "react";
|
|
3
|
+
|
|
4
|
+
export default function Table() {
|
|
5
|
+
return (
|
|
6
|
+
<Suspense fallback={<div>Loading...</div>}>
|
|
7
|
+
<TableSupervisionComponent
|
|
8
|
+
title="User"
|
|
9
|
+
fetchControl={{
|
|
10
|
+
path: "users",
|
|
11
|
+
}}
|
|
12
|
+
columnControl={[
|
|
13
|
+
{
|
|
14
|
+
selector: "name",
|
|
15
|
+
label: "Nama",
|
|
16
|
+
sortable: true,
|
|
17
|
+
filterable: true,
|
|
18
|
+
width: "350px",
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
selector: "email",
|
|
22
|
+
label: "Email",
|
|
23
|
+
sortable: true,
|
|
24
|
+
width: "250px",
|
|
25
|
+
},
|
|
26
|
+
]}
|
|
27
|
+
detailControl={[
|
|
28
|
+
{
|
|
29
|
+
label: "Nama",
|
|
30
|
+
item: "name",
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
label: "Email",
|
|
34
|
+
item: "email",
|
|
35
|
+
}
|
|
36
|
+
]}
|
|
37
|
+
formControl={{
|
|
38
|
+
fields: [
|
|
39
|
+
{
|
|
40
|
+
construction: {
|
|
41
|
+
name: "email",
|
|
42
|
+
label: "E-mail",
|
|
43
|
+
placeholder: "Ex: example@mail.com",
|
|
44
|
+
validations: ["required"],
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
construction: {
|
|
49
|
+
name: "name",
|
|
50
|
+
label: "Name",
|
|
51
|
+
placeholder: "Ex: Joko Gunawan",
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
construction: {
|
|
56
|
+
name: "password",
|
|
57
|
+
label: "Password",
|
|
58
|
+
placeholder: "Ex: secret123",
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
construction: {
|
|
63
|
+
type: "file",
|
|
64
|
+
name: "image",
|
|
65
|
+
label: "Picture",
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
}}
|
|
70
|
+
controlBar={["CREATE", "FILTER", "SEARCH", "SORT", "SELECTABLE", "IMPORT", "EXPORT", "PRINT", "REFRESH"]}
|
|
71
|
+
responsiveControl={{
|
|
72
|
+
mobile: true,
|
|
73
|
+
}}
|
|
74
|
+
/>
|
|
75
|
+
</Suspense>
|
|
76
|
+
);
|
|
77
77
|
}
|
package/app/layout.tsx
CHANGED
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
import { ReactNode } from "react";
|
|
2
|
-
|
|
3
|
-
import { Roboto } from "next/font/google";
|
|
4
|
-
import "@styles/globals.css";
|
|
5
|
-
|
|
6
|
-
import moment from "moment";
|
|
7
|
-
import "moment/locale/id";
|
|
8
|
-
|
|
9
|
-
import { config } from "@fortawesome/fontawesome-svg-core";
|
|
10
|
-
import "@fortawesome/fontawesome-svg-core/styles.css";
|
|
11
|
-
|
|
12
|
-
import { ContextAppProvider } from "@contexts/AppProvider";
|
|
13
|
-
import { IDBProvider, ShortcutProvider } from "@components";
|
|
14
|
-
|
|
15
|
-
moment.locale("id");
|
|
16
|
-
config.autoAddCss = false;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const font = Roboto({
|
|
20
|
-
subsets: ["latin"],
|
|
21
|
-
weight: ["100", "300", "400", "500", "700", "900"],
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
export default function AppLayout({ children }: { children: ReactNode }) {
|
|
26
|
-
return (
|
|
27
|
-
<html lang="id" className={font.className}>
|
|
28
|
-
<body className="antialiased">
|
|
29
|
-
<ContextAppProvider>
|
|
30
|
-
<ShortcutProvider />
|
|
31
|
-
<IDBProvider>
|
|
32
|
-
{children}
|
|
33
|
-
</IDBProvider>
|
|
34
|
-
</ContextAppProvider>
|
|
35
|
-
</body>
|
|
36
|
-
</html>
|
|
37
|
-
);
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
|
|
3
|
+
import { Roboto } from "next/font/google";
|
|
4
|
+
import "@styles/globals.css";
|
|
5
|
+
|
|
6
|
+
import moment from "moment";
|
|
7
|
+
import "moment/locale/id";
|
|
8
|
+
|
|
9
|
+
import { config } from "@fortawesome/fontawesome-svg-core";
|
|
10
|
+
import "@fortawesome/fontawesome-svg-core/styles.css";
|
|
11
|
+
|
|
12
|
+
import { ContextAppProvider } from "@contexts/AppProvider";
|
|
13
|
+
import { IDBProvider, ShortcutProvider } from "@components";
|
|
14
|
+
|
|
15
|
+
moment.locale("id");
|
|
16
|
+
config.autoAddCss = false;
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
const font = Roboto({
|
|
20
|
+
subsets: ["latin"],
|
|
21
|
+
weight: ["100", "300", "400", "500", "700", "900"],
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
export default function AppLayout({ children }: { children: ReactNode }) {
|
|
26
|
+
return (
|
|
27
|
+
<html lang="id" className={font.className}>
|
|
28
|
+
<body className="antialiased">
|
|
29
|
+
<ContextAppProvider>
|
|
30
|
+
<ShortcutProvider />
|
|
31
|
+
<IDBProvider>
|
|
32
|
+
{children}
|
|
33
|
+
</IDBProvider>
|
|
34
|
+
</ContextAppProvider>
|
|
35
|
+
</body>
|
|
36
|
+
</html>
|
|
37
|
+
);
|
|
38
38
|
}
|
package/app/manifest.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { MetadataRoute } from "next";
|
|
2
|
+
|
|
3
|
+
export default function manifest(): MetadataRoute.Manifest {
|
|
4
|
+
return {
|
|
5
|
+
name: "Skalfa App",
|
|
6
|
+
short_name: "Skalfa",
|
|
7
|
+
description: "A premium hybrid web, desktop, and mobile application.",
|
|
8
|
+
start_url: "/",
|
|
9
|
+
display: "standalone",
|
|
10
|
+
background_color: "#0f172a",
|
|
11
|
+
theme_color: "#3b82f6",
|
|
12
|
+
icons: [
|
|
13
|
+
{
|
|
14
|
+
src: "/icon-192.png",
|
|
15
|
+
sizes: "192x192",
|
|
16
|
+
type: "image/png",
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
src: "/icon-512.png",
|
|
20
|
+
sizes: "512x512",
|
|
21
|
+
type: "image/png",
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
};
|
|
25
|
+
}
|
package/app/page.tsx
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
export default function Home() {
|
|
2
|
-
return (
|
|
3
|
-
<>
|
|
4
|
-
<div className="h-screen flex flex-col justify-center items-center">
|
|
5
|
-
<h1 className="text-2xl font-extrabold italic">NEXT-LIGHT v.3</h1>
|
|
6
|
-
|
|
7
|
-
<p className="text-sm -mt-1 font-semibold text-light-foreground">
|
|
8
|
-
The Magic Starter Template
|
|
9
|
-
</p>
|
|
10
|
-
</div>
|
|
11
|
-
</>
|
|
12
|
-
);
|
|
13
|
-
}
|
|
1
|
+
export default function Home() {
|
|
2
|
+
return (
|
|
3
|
+
<>
|
|
4
|
+
<div className="h-screen flex flex-col justify-center items-center">
|
|
5
|
+
<h1 className="text-2xl font-extrabold italic">NEXT-LIGHT v.3</h1>
|
|
6
|
+
|
|
7
|
+
<p className="text-sm -mt-1 font-semibold text-light-foreground">
|
|
8
|
+
The Magic Starter Template
|
|
9
|
+
</p>
|
|
10
|
+
</div>
|
|
11
|
+
</>
|
|
12
|
+
);
|
|
13
|
+
}
|
package/barrels.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
{
|
|
2
|
-
"directory": ["components/base.components", "components/construct.components", "components/structure.components", "contexts", "app", "schema"],
|
|
3
|
-
"delete": true,
|
|
4
|
-
"exclude": ["index.ts"],
|
|
5
|
-
"structure": "flat"
|
|
1
|
+
{
|
|
2
|
+
"directory": ["components/base.components", "components/construct.components", "components/structure.components", "contexts", "app", "schema"],
|
|
3
|
+
"delete": true,
|
|
4
|
+
"exclude": ["index.ts"],
|
|
5
|
+
"structure": "flat"
|
|
6
6
|
}
|