diff --git a/api/src/main.rs b/api/src/main.rs
index e2f46aa..7266f24 100644
--- a/api/src/main.rs
+++ b/api/src/main.rs
@@ -3,7 +3,10 @@ use std::{env, net::SocketAddr, sync::Arc};
use axum::{
error_handling::HandleErrorLayer,
extract,
- http::{HeaderValue, Method},
+ http::{
+ header::{ACCEPT, AUTHORIZATION, CONTENT_TYPE},
+ HeaderValue, Method,
+ },
routing::{get, patch, post},
BoxError, Router, Server,
};
@@ -44,6 +47,8 @@ async fn main() {
// CORS configuration
let cors = CorsLayer::new()
+ .allow_credentials(true)
+ .allow_headers([AUTHORIZATION, ACCEPT, CONTENT_TYPE])
.allow_methods([Method::GET, Method::POST, Method::PATCH])
.allow_origin(
if cfg!(debug_assertions) {
diff --git a/frontend/src/components/CreateForm/CreateForm.tsx b/frontend/src/components/CreateForm/CreateForm.tsx
index 4f82af4..d4764cd 100644
--- a/frontend/src/components/CreateForm/CreateForm.tsx
+++ b/frontend/src/components/CreateForm/CreateForm.tsx
@@ -7,6 +7,7 @@ import { useRouter } from 'next/navigation'
import Button from '/src/components/Button/Button'
import CalendarField from '/src/components/CalendarField/CalendarField'
import { default as ErrorAlert } from '/src/components/Error/Error'
+import SelectField from '/src/components/SelectField/SelectField'
import TextField from '/src/components/TextField/TextField'
import TimeRangeField from '/src/components/TimeRangeField/TimeRangeField'
import { API_BASE } from '/src/config/api'
@@ -148,13 +149,13 @@ const CreateForm = () => {
name="time"
/>
- {/* */}
+ />
setError(undefined)}>{error}
diff --git a/frontend/src/components/SelectField/SelectField.jsx b/frontend/src/components/SelectField/SelectField.jsx
deleted file mode 100644
index d07c4a0..0000000
--- a/frontend/src/components/SelectField/SelectField.jsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import { forwardRef } from 'react'
-
-import {
- Wrapper,
- StyledLabel,
- StyledSubLabel,
- StyledSelect,
-} from './SelectField.styles'
-
-const SelectField = forwardRef(({
- label,
- subLabel,
- id,
- options = [],
- inline = false,
- small = false,
- defaultOption,
- ...props
-}, ref) => (
-
- {label && {label}}
- {subLabel && {subLabel}}
-
-
- {defaultOption && }
- {Array.isArray(options) ? (
- options.map(value =>
-
- )
- ) : (
- Object.entries(options).map(([key, value]) =>
-
- )
- )}
-
-
-))
-
-export default SelectField
diff --git a/frontend/src/components/SelectField/SelectField.module.scss b/frontend/src/components/SelectField/SelectField.module.scss
new file mode 100644
index 0000000..996c05b
--- /dev/null
+++ b/frontend/src/components/SelectField/SelectField.module.scss
@@ -0,0 +1,23 @@
+.select {
+ width: 100%;
+ box-sizing: border-box;
+ font: inherit;
+ background: var(--surface);
+ color: inherit;
+ padding: 10px 14px;
+ border: 1px solid var(--primary);
+ box-shadow: inset 0 0 0 0 var(--primary);
+ border-radius: 3px;
+ outline: none;
+ transition: border-color .15s, box-shadow .15s;
+ appearance: none;
+ background-image: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20100%20100%22%3E%3CforeignObject%20width%3D%22100px%22%20height%3D%22100px%22%3E%3Cdiv%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%20style%3D%22color%3A%23F79E00%3Bfont-size%3A60px%3Bdisplay%3Aflex%3Balign-items%3Acenter%3Bjustify-content%3Acenter%3Bheight%3A100%25%3Bwidth%3A100%25%3B%22%3E%E2%96%BC%3C%2Fdiv%3E%3C%2FforeignObject%3E%3C%2Fsvg%3E');
+ background-repeat: no-repeat;
+ background-position: right 10px center;
+ background-size: 1em;
+
+ &:focus {
+ border: 1px solid var(--secondary);
+ box-shadow: inset 0 -3px 0 0 var(--secondary);
+ }
+}
diff --git a/frontend/src/components/SelectField/SelectField.styles.js b/frontend/src/components/SelectField/SelectField.styles.js
deleted file mode 100644
index f9f1731..0000000
--- a/frontend/src/components/SelectField/SelectField.styles.js
+++ /dev/null
@@ -1,61 +0,0 @@
-import { styled } from 'goober'
-import { forwardRef } from 'react'
-
-export const Wrapper = styled('div')`
- margin: 30px 0;
-
- ${props => props.$inline && `
- margin: 0;
- `}
- ${props => props.$small && `
- margin: 10px 0;
- `}
-`
-
-export const StyledLabel = styled('label')`
- display: block;
- padding-bottom: 4px;
- font-size: 18px;
-
- ${props => props.$inline && `
- font-size: 16px;
- `}
- ${props => props.$small && `
- font-size: .9rem;
- `}
-`
-
-export const StyledSubLabel = styled('label')`
- display: block;
- padding-bottom: 6px;
- font-size: 13px;
- opacity: .6;
-`
-
-export const StyledSelect = styled('select', forwardRef)`
- width: 100%;
- box-sizing: border-box;
- font: inherit;
- background: var(--surface);
- color: inherit;
- padding: 10px 14px;
- border: 1px solid var(--primary);
- box-shadow: inset 0 0 0 0 var(--primary);
- border-radius: 3px;
- outline: none;
- transition: border-color .15s, box-shadow .15s;
- appearance: none;
- background-image: url('data:image/svg+xml,${encodeURIComponent('')}');
- background-repeat: no-repeat;
- background-position: right 10px center;
- background-size: 1em;
-
- &:focus {
- border: 1px solid var(--secondary);
- box-shadow: inset 0 -3px 0 0 var(--secondary);
- }
-
- ${props => props.$small && `
- padding: 6px 8px;
- `}
-`
diff --git a/frontend/src/components/SelectField/SelectField.tsx b/frontend/src/components/SelectField/SelectField.tsx
new file mode 100644
index 0000000..2569879
--- /dev/null
+++ b/frontend/src/components/SelectField/SelectField.tsx
@@ -0,0 +1,52 @@
+import { forwardRef } from 'react'
+
+import { Description, Label, Wrapper } from '/src/components/Field/Field'
+
+import styles from './SelectField.module.scss'
+
+interface SelectFieldProps extends React.ComponentProps<'select'> {
+ label?: React.ReactNode
+ description?: React.ReactNode
+ options: Record | string[]
+ isInline?: boolean
+ isSmall?: boolean
+ defaultOption?: React.ReactNode
+}
+
+const SelectField = forwardRef(({
+ label,
+ description,
+ options = [],
+ isInline = false,
+ isSmall = false,
+ defaultOption,
+ ...props
+}, ref) =>
+ {label && }
+
+ {description && {description}}
+
+
+)
+
+export default SelectField