diff --git a/packages/webapp/src/components/AppShell/AppShell.module.scss b/packages/webapp/src/components/AppShell/AppShell.module.scss
new file mode 100644
index 000000000..51f813bcf
--- /dev/null
+++ b/packages/webapp/src/components/AppShell/AppShell.module.scss
@@ -0,0 +1,14 @@
+
+.main{
+ flex: 1 0;
+}
+
+.aside{
+ width: 500px;
+ height: 100dvh;
+ border-left: 1px solid rgba(17, 20, 24, 0.15);
+}
+
+.root {
+ display: flex;
+}
\ No newline at end of file
diff --git a/packages/webapp/src/components/AppShell/AppShell.tsx b/packages/webapp/src/components/AppShell/AppShell.tsx
new file mode 100644
index 000000000..8539117c2
--- /dev/null
+++ b/packages/webapp/src/components/AppShell/AppShell.tsx
@@ -0,0 +1,39 @@
+import React from 'react';
+import { AppShellProvider } from './AppShellProvider';
+import { Box } from '../Layout';
+import styles from './AppShell.module.scss';
+
+interface AppShellProps {
+ topbarOffset?: number;
+ mainProps: any;
+ asideProps: any;
+ children: React.ReactNode;
+}
+
+export function AppShell({
+ asideProps,
+ mainProps,
+ topbarOffset = 0,
+ ...restProps
+}: AppShellProps) {
+ return (
+
+
+
+ );
+}
+
+AppShell.Main = AppShellMain;
+AppShell.Aside = AppShellAside;
+
+function AppShellMain({ ...props }) {
+ return ;
+}
+
+interface AppShellAsideProps {
+ children: React.ReactNode;
+}
+
+function AppShellAside({ ...props }: AppShellAsideProps) {
+ return ;
+}
diff --git a/packages/webapp/src/components/AppShell/AppShellProvider.tsx b/packages/webapp/src/components/AppShell/AppShellProvider.tsx
new file mode 100644
index 000000000..299f015f4
--- /dev/null
+++ b/packages/webapp/src/components/AppShell/AppShellProvider.tsx
@@ -0,0 +1,25 @@
+import React, { createContext } from 'react';
+
+interface AppShellContextValue {
+ topbarOffset: number
+}
+
+const AppShellContext = createContext(
+ {} as AppShellContextValue,
+);
+
+interface AppShellProviderProps {
+ children: React.ReactNode;
+ mainProps: any;
+ asideProps: any;
+ topbarOffset: number;
+}
+
+export function AppShellProvider({ topbarOffset, ...props }: AppShellProviderProps) {
+ const provider = { topbarOffset } as AppShellContextValue;
+
+ return ;
+}
+
+export const useAppShellContext = () =>
+ React.useContext(AppShellContext);
diff --git a/packages/webapp/src/containers/Banking/Rules/RuleFormDialog/RuleFormContent.tsx b/packages/webapp/src/containers/Banking/Rules/RuleFormDialog/RuleFormContent.tsx
index ff0893a1e..fe7a8d216 100644
--- a/packages/webapp/src/containers/Banking/Rules/RuleFormDialog/RuleFormContent.tsx
+++ b/packages/webapp/src/containers/Banking/Rules/RuleFormDialog/RuleFormContent.tsx
@@ -1,3 +1,4 @@
+import { Classes } from '@blueprintjs/core';
import { RuleFormBoot } from './RuleFormBoot';
import { RuleFormContentForm } from './RuleFormContentForm';
@@ -12,7 +13,9 @@ export default function RuleFormContent({
}: RuleFormContentProps) {
return (
-
+
+
+
);
}
diff --git a/packages/webapp/src/containers/Banking/Rules/RuleFormDialog/RuleFormContentForm.schema.ts b/packages/webapp/src/containers/Banking/Rules/RuleFormDialog/RuleFormContentForm.schema.ts
index 3cde8f265..8247098df 100644
--- a/packages/webapp/src/containers/Banking/Rules/RuleFormDialog/RuleFormContentForm.schema.ts
+++ b/packages/webapp/src/containers/Banking/Rules/RuleFormDialog/RuleFormContentForm.schema.ts
@@ -3,11 +3,20 @@ import * as Yup from 'yup';
const Schema = Yup.object().shape({
name: Yup.string().required().label('Rule name'),
- applyIfAccountId: Yup.number().required().label(''),
- applyIfTransactionType: Yup.string().required().label(''),
- conditionsType: Yup.string().required(),
- assignCategory: Yup.string().required(),
- assignAccountId: Yup.string().required(),
+ applyIfAccountId: Yup.number().required().label('Apply to account'),
+ applyIfTransactionType: Yup.string()
+ .required()
+ .label('Apply to transaction type'),
+ conditionsType: Yup.string().required().label('Condition type'),
+ assignCategory: Yup.string().required().label('Assign to category'),
+ assignAccountId: Yup.string().required().label('Assign to account'),
+ conditions: Yup.array().of(
+ Yup.object().shape({
+ value: Yup.string().required().label('Value'),
+ comparator: Yup.string().required().label('Comparator'),
+ field: Yup.string().required().label('Field'),
+ }),
+ ),
});
export const CreateRuleFormSchema = Schema;
diff --git a/packages/webapp/src/containers/Banking/Rules/RuleFormDialog/RuleFormContentForm.tsx b/packages/webapp/src/containers/Banking/Rules/RuleFormDialog/RuleFormContentForm.tsx
index b371e2a32..a97ce4c19 100644
--- a/packages/webapp/src/containers/Banking/Rules/RuleFormDialog/RuleFormContentForm.tsx
+++ b/packages/webapp/src/containers/Banking/Rules/RuleFormDialog/RuleFormContentForm.tsx
@@ -12,6 +12,7 @@ import {
FRadioGroup,
FSelect,
Group,
+ Stack,
} from '@/components';
import { useCreateBankRule } from '@/hooks/query/bank-rules';
import {
@@ -72,13 +73,14 @@ function RuleFormContentFormRoot({
onSubmit={handleSubmit}
>