This commit is contained in:
jjbrunton committed 2025-12-29 23:10:12 +00:00
1 parent 358c2be0ee
commit b10eae1bf3
26 files changed
+2509 -53

No files matched your search

+64
View File
@@ -0,0 +1,64 @@
import {
List,
Datagrid,
TextField,
DateField,
FunctionField,
SelectInput,
TextInput,
DateInput,
} from 'react-admin';
const auditLogFilters = [
<TextInput key="table" label="Table" source="table_name" alwaysOn />,
<SelectInput
key="action"
source="action"
choices={[
{ id: 'INSERT', name: 'Create' },
{ id: 'UPDATE', name: 'Update' },
{ id: 'DELETE', name: 'Delete' },
]}
/>,
<DateInput key="from" source="created_at@gte" label="From Date" />,
<DateInput key="to" source="created_at@lte" label="To Date" />,
];
export const AuditLogList = () => (
<List
filters={auditLogFilters}
sort={{ field: 'created_at', order: 'DESC' }}
>
<Datagrid bulkActionButtons={false}>
<DateField source="created_at" showTime label="Timestamp" />
<TextField source="table_name" label="Table" />
<FunctionField
label="Action"
render={(record: { action: string }) => {
const actionMap: Record<string, string> = {
INSERT: 'Create',
UPDATE: 'Update',
DELETE: 'Delete',
};
return actionMap[record.action] || record.action;
}}
/>
<TextField source="record_id" label="Record ID" />
<TextField source="admin_role" label="Role" />
<FunctionField
label="Changed Fields"
render={(record: { changed_fields?: string[] }) =>
record.changed_fields?.join(', ') || '-'
}
/>
<FunctionField
label="Summary"
render={(record: { action: string; changed_fields?: string[] }) => {
if (record.action === 'INSERT') return 'New record created';
if (record.action === 'DELETE') return 'Record deleted';
return `${record.changed_fields?.length || 0} fields changed`;
}}
/>
</Datagrid>
</List>
);
+21
View File
@@ -0,0 +1,21 @@
import {
List,
Datagrid,
TextField,
DateField,
TextInput,
} from 'react-admin';
const coupleFilters = [
<TextInput key="invite" label="Invite Code" source="invite_code" alwaysOn />,
];
export const CoupleList = () => (
<List filters={coupleFilters}>
<Datagrid bulkActionButtons={false}>
<TextField source="id" label="Couple ID" />
<TextField source="invite_code" label="Invite Code" />
<DateField source="created_at" label="Created" />
</Datagrid>
</List>
);
+59
View File
@@ -0,0 +1,59 @@
import {
Show,
SimpleShowLayout,
TextField,
DateField,
ReferenceField,
ReferenceManyField,
List,
Datagrid,
BooleanField,
Labeled,
} from 'react-admin';
export const MatchShow = () => (
<Show>
<SimpleShowLayout>
<TextField source="id" label="Match ID" />
<ReferenceField source="question_id" reference="questions" label="Question">
<TextField source="text" />
</ReferenceField>
<TextField source="match_type" />
<BooleanField source="is_new" label="Unread" />
<DateField source="created_at" />
<Labeled label="Chat Messages" fullWidth>
<ReferenceManyField
reference="messages"
target="match_id"
sort={{ field: 'created_at', order: 'ASC' }}
>
<Datagrid bulkActionButtons={false}>
<ReferenceField source="user_id" reference="profiles" link={false}>
<TextField source="name" />
</ReferenceField>
<TextField source="content" label="Message" />
<DateField source="created_at" showTime label="Sent" />
<DateField source="read_at" showTime label="Read" emptyText="-" />
</Datagrid>
</ReferenceManyField>
</Labeled>
</SimpleShowLayout>
</Show>
);
export const MatchList = () => (
<List>
<Datagrid rowClick="show" bulkActionButtons={false}>
<ReferenceField source="couple_id" reference="couples" link={false}>
<TextField source="id" />
</ReferenceField>
<ReferenceField source="question_id" reference="questions">
<TextField source="text" />
</ReferenceField>
<TextField source="match_type" />
<BooleanField source="is_new" label="Unread" />
<DateField source="created_at" />
</Datagrid>
</List>
);
+25
View File
@@ -0,0 +1,25 @@
import {
List,
Datagrid,
TextField,
DateField,
ReferenceField,
TextInput,
} from 'react-admin';
const messageFilters = [
<TextInput key="content" label="Search content" source="content@ilike" alwaysOn />,
];
export const MessageList = () => (
<List filters={messageFilters} sort={{ field: 'created_at', order: 'DESC' }}>
<Datagrid bulkActionButtons={false}>
<ReferenceField source="user_id" reference="profiles" label="Sender">
<TextField source="name" />
</ReferenceField>
<TextField source="content" />
<DateField source="created_at" showTime label="Sent At" />
<DateField source="read_at" showTime label="Read At" />
</Datagrid>
</List>
);
+84 -5
View File
@@ -1,12 +1,29 @@
import { List, Datagrid, TextField, BooleanField, DateField, ReferenceField } from 'react-admin';
import {
List,
Datagrid,
TextField,
BooleanField,
DateField,
ReferenceField,
Edit,
SimpleForm,
TextInput,
BooleanInput,
ReferenceInput,
SelectInput,
Show,
SimpleShowLayout,
ReferenceManyField,
useRecordContext,
TabbedShowLayout,
} from 'react-admin';
export const ProfileList = () => (
<List>
<Datagrid>
<Datagrid rowClick="show">
<TextField source="name" />
<TextField source="email" />
<BooleanField source="is_premium" />
<ReferenceField source="couple_id" reference="couples">
<ReferenceField source="couple_id" reference="couples" link={false}>
<TextField source="id" />
</ReferenceField>
<DateField source="created_at" />
@@ -14,9 +31,71 @@ export const ProfileList = () => (
</List>
);
export const ProfileShow = () => (
<Show>
<TabbedShowLayout>
<TabbedShowLayout.Tab label="Profile">
<TextField source="id" />
<TextField source="name" />
<BooleanField source="is_premium" />
<ReferenceField source="couple_id" reference="couples">
<TextField source="invite_code" />
</ReferenceField>
<DateField source="created_at" />
</TabbedShowLayout.Tab>
<TabbedShowLayout.Tab label="Matches & Chats">
<ReferenceManyField
label="Matches"
reference="matches"
target="couple_id"
source="couple_id"
>
<Datagrid rowClick="show" bulkActionButtons={false}>
<ReferenceField source="question_id" reference="questions">
<TextField source="text" />
</ReferenceField>
<TextField source="match_type" />
<BooleanField source="is_new" label="Unread" />
<DateField source="created_at" />
</Datagrid>
</ReferenceManyField>
</TabbedShowLayout.Tab>
<TabbedShowLayout.Tab label="Responses">
<ReferenceManyField
label="Responses"
reference="responses"
target="user_id"
>
<Datagrid bulkActionButtons={false}>
<ReferenceField source="question_id" reference="questions">
<TextField source="text" />
</ReferenceField>
<TextField source="answer" />
<DateField source="created_at" />
</Datagrid>
</ReferenceManyField>
</TabbedShowLayout.Tab>
</TabbedShowLayout>
</Show>
);
export const ProfileEdit = () => (
<Edit>
<SimpleForm>
<TextInput source="name" />
<BooleanInput source="is_premium" label="Premium Status" />
<ReferenceInput source="couple_id" reference="couples">
<SelectInput optionText="id" />
</ReferenceInput>
</SimpleForm>
</Edit>
);
export const ResponseList = () => (
<List>
<Datagrid>
<Datagrid bulkActionButtons={false}>
<ReferenceField source="user_id" reference="profiles">
<TextField source="name" />
</ReferenceField>