10 Commits

Author SHA1 Message Date
c782f956e0 chore: bump version to 0.1.12 2026-05-20 14:08:35 +08:00
515ee01d53 chore: bump version to 0.1.11 2026-05-20 13:57:48 +08:00
058dd95b4f refactor: rename and reorder dev panel tabs for clarity
- Rename "API Keys" → "Desa Mandiri Keys" (tab + panel title + description)
- Rename "Settings" → "App Config" (tab + panel title)
- Move "Desa Mandiri Keys" to last position with a divider separator
- Import Divider from @mantine/core
2026-05-20 12:32:06 +08:00
ef2183ffb7 chore: bump version to 0.1.10 2026-05-19 15:40:05 +08:00
9afe9297e0 Merge pull request 'amalia/18-mei-26' (#23) from amalia/18-mei-26 into main
Reviewed-on: #23
2026-05-18 17:26:01 +08:00
f98fb51cfd feat: tambah field isApprover pada edit user modal 2026-05-18 16:42:32 +08:00
3b8eabc111 fix: gender select value M/F instead of Male/Female 2026-05-18 16:31:43 +08:00
88ddb7527e Merge pull request 'chore: bump version to 0.1.9' (#22) from amalia/15-mei-26 into main
Reviewed-on: #22
2026-05-15 14:22:43 +08:00
abca720f89 chore: bump version to 0.1.9 2026-05-15 11:51:57 +08:00
a69b0aad48 Merge pull request 'upd: setting api key sistem desa mandiri' (#21) from amalia/13-mei-26 into main
Reviewed-on: #21
2026-05-13 17:24:37 +08:00
4 changed files with 23 additions and 11 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "bun-react-template",
"version": "0.1.8",
"version": "0.1.12",
"private": true,
"type": "module",
"scripts": {

View File

@@ -57,6 +57,7 @@ interface APIUser {
gender: string
isWithoutOTP: boolean
isActive: boolean
isApprover: boolean
role: string
village: string
group: string
@@ -118,7 +119,8 @@ function UsersIndexPage() {
idGroup: '',
idPosition: '',
isActive: true,
isWithoutOTP: false
isWithoutOTP: false,
isApprover: false
})
// Options Data (Shared for both Add and Edit modals)
@@ -212,7 +214,8 @@ function UsersIndexPage() {
idGroup: user.idGroup,
idPosition: user.idPosition,
isActive: user.isActive,
isWithoutOTP: user.isWithoutOTP
isWithoutOTP: user.isWithoutOTP,
isApprover: user.isApprover
})
setVillageSearch(user.village)
openEdit()
@@ -544,6 +547,12 @@ function UsersIndexPage() {
checked={editForm.isWithoutOTP}
onChange={(event) => setEditForm(f => ({ ...f, isWithoutOTP: event.currentTarget.checked }))}
/>
<Switch
label="Approver"
description="Grant approver privileges to this user"
checked={editForm.isApprover}
onChange={(event) => setEditForm(f => ({ ...f, isApprover: event.currentTarget.checked }))}
/>
</SimpleGrid>
<Button

View File

@@ -422,7 +422,7 @@ function AppVillagesIndexPage() {
<Select
label="Gender"
placeholder="Select gender"
data={['Male', 'Female']}
data={[{ label: 'Male', value: 'M' }, { label: 'Female', value: 'F' }]}
mt="sm"
required
value={form.gender}

View File

@@ -9,6 +9,7 @@ import {
Card,
Center,
Container,
Divider,
Group,
Loader,
Menu,
@@ -77,7 +78,7 @@ import { notifications } from '@mantine/notifications'
import { type Role, useLogout, useSession } from '@/frontend/hooks/useAuth'
import { usePresence } from '@/frontend/hooks/usePresence'
const validTabs = ['overview', 'operators', 'bugs', 'app-logs', 'activity-logs', 'database', 'project', 'api-keys', 'settings'] as const
const validTabs = ['overview', 'operators', 'bugs', 'app-logs', 'activity-logs', 'database', 'project', 'settings', 'api-keys'] as const
export const Route = createFileRoute('/dev')({
validateSearch: (search: Record<string, unknown>) => ({
@@ -117,8 +118,9 @@ const navItems = [
// { label: 'Activity Logs', icon: TbActivity, key: 'activity-logs' },
{ label: 'Database', icon: TbDatabase, key: 'database' },
{ label: 'Project', icon: TbSitemap, key: 'project' },
{ label: 'API Keys', icon: TbKey, key: 'api-keys' },
{ label: 'Settings', icon: TbSettings, key: 'settings' },
{ label: 'App Config', icon: TbSettings, key: 'settings' },
{ divider: true, key: '__divider-external__' },
{ label: 'Desa Mandiri Keys', icon: TbKey, key: 'api-keys' },
]
function DevPage() {
@@ -201,7 +203,8 @@ function DevPage() {
<AppShell.Section grow>
<Stack gap={4}>
{navItems.map((item) => {
const Icon = item.icon
if (item.divider) return <Divider key={item.key} my={4} />
const Icon = item.icon!
if (collapsed) {
return (
<Tooltip key={item.key} label={item.label} position="right">
@@ -1590,7 +1593,7 @@ function SettingsPanel() {
<Stack>
<Group justify="space-between">
<div>
<Title order={3}>Application Settings</Title>
<Title order={3}>App Config</Title>
<Text size="sm" c="dimmed">Manage the URL API and API Key for each application.</Text>
</div>
<Button leftSection={<TbApps size={16} />} onClick={openAdd}>Add App</Button>
@@ -1798,8 +1801,8 @@ function ApiKeysPanel() {
<Stack>
<Group justify="space-between">
<div>
<Title order={3}>API Keys</Title>
<Text size="sm" c="dimmed">Kelola API key untuk akses endpoint /api/ai/*</Text>
<Title order={3}>Desa Mandiri Keys</Title>
<Text size="sm" c="dimmed">Manage access tokens for the Desa Mandiri system</Text>
</div>
<Button leftSection={<TbKey size={14} />} onClick={openCreate}>
Buat Key Baru