mirror of
https://github.com/frappe/erpnext.git
synced 2026-09-02 16:13:22 +00:00
* feat: new banking module (#54720)
* feat: initial SPA setup for banking
* wip: bring over new banking module
* feat: added Espresso design tokens
* feat: button styles
* fix: add all ink colors
* wip: espresso design system changes
* feat: button and badge espresso components
* fix: button styling for reconcile
* feat: Espresso progress bar
* feat: Espresso toggle switch
* feat: Espresso tabs design
* fix: vertical tab support
* fix: button sizing across modals
* feat: Espresso style table layout
* feat: Espresso tooltip
* feat: Espresso elevations and checkbox
* feat: Dialog with Espresso styles
* feat: Espresso textarea
* fix: input styles
* fix: colors on bank picker
* fix: breadcrumb styling
* fix: bank picker styling
* feat: create doctypes and fields for bank reconciliation
* feat: APIs for banking
* fix: use date format parser
* fix: font styling to match Espresso
* wip: settings modal
* feat: settings dialog component
* fix: icons and invalid requests
* feat: preferences tab
* fix: adjust icon stroke width to 1.5
* feat: rule configuration in settings
* fix: remove sheet component
* feat: alert and error banner component
* feat: dropdown in Espresso
* feat: popover and select in Espresso
* fix: cleanup more styles
* fix: match size of link fields
* feat: command styling
* fix: remove unused style tokens
* fix: styles for global date picker dropdown
* fix: styles for match and reconcile
* feat: table Espresso component
* feat: remove all other design tokens
* fix: remove unused tokens
* fix: form elements
* fix: remove unused styles and fix filters in bank transaction list
* feat: fetch bank rec doctypes for filtering
* fix: record payment modal
* feat: support for dark mode switching
* fix: move bank logos to public folder
* feat: add support for RTL
* feat: support for RTL
* chore: send layout direction in dev boot
* fix: make checkbox work in RTL
* feat: dark mode support
* fix: dark mode style
* feat: bank logos in dark mode
* feat: dark mode bank logos
* chore: use dark mode bank logos everywhere
* chore: move rule evaluation to controller
* chore: add tests for bank transaction rules
* fix: move deps to fix actions errors
* fix: move tw-animate-css to deps
* fix: remove shadcn
* fix: do not open modal if no transactions selected
* fix: add translation strings
* feat: add banner on existing bank reconciliation tool
* feat: bank statement import
* fix: translations and layout directions
* fix: validation for transaction matching rule
* fix: styles
* fix: show conflicting transactions in alert
* fix: show help text for new banking module forms
* feat: show total debits and credits
* fix: dark mode colors in automatic config
* feat: add keyboard shortcuts help
* feat: added keyboard shortcut for settings
* fix: decrease size of progress bar
* chore: bump packages
* feat: add tests for statement import
* fix: settings dialog
* fix: show banner on small screens
* fix: show banner when no bank account set
(cherry picked from commit 6de5367f12)
# Conflicts:
# erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py
* chore: resolve conflicts
* fix: add type hints to whitelisted methods
---------
Co-authored-by: Nikhil Kothari <nik.kothari22@live.com>
197 lines
5.4 KiB
TypeScript
197 lines
5.4 KiB
TypeScript
import * as React from "react"
|
|
import { AlertDialog as AlertDialogPrimitive } from "radix-ui"
|
|
|
|
import { cn } from "@/lib/utils"
|
|
import { Button } from "@/components/ui/button"
|
|
|
|
function AlertDialog({
|
|
...props
|
|
}: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {
|
|
return <AlertDialogPrimitive.Root data-slot="alert-dialog" {...props} />
|
|
}
|
|
|
|
function AlertDialogTrigger({
|
|
...props
|
|
}: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {
|
|
return (
|
|
<AlertDialogPrimitive.Trigger data-slot="alert-dialog-trigger" {...props} />
|
|
)
|
|
}
|
|
|
|
function AlertDialogPortal({
|
|
...props
|
|
}: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {
|
|
return (
|
|
<AlertDialogPrimitive.Portal data-slot="alert-dialog-portal" {...props} />
|
|
)
|
|
}
|
|
|
|
function AlertDialogOverlay({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {
|
|
return (
|
|
<AlertDialogPrimitive.Overlay
|
|
data-slot="alert-dialog-overlay"
|
|
className={cn(
|
|
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black-200 dark:bg-black-700",
|
|
className
|
|
)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function AlertDialogContent({
|
|
className,
|
|
size = "default",
|
|
...props
|
|
}: React.ComponentProps<typeof AlertDialogPrimitive.Content> & {
|
|
size?: "default" | "sm"
|
|
}) {
|
|
return (
|
|
<AlertDialogPortal>
|
|
<AlertDialogOverlay />
|
|
<AlertDialogPrimitive.Content
|
|
data-slot="alert-dialog-content"
|
|
data-size={size}
|
|
className={cn(
|
|
"bg-surface-modal shadow-xl rounded-xl data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 group/alert-dialog-content fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 p-6 duration-200 data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-lg",
|
|
className
|
|
)}
|
|
{...props}
|
|
/>
|
|
</AlertDialogPortal>
|
|
)
|
|
}
|
|
|
|
function AlertDialogHeader({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<"div">) {
|
|
return (
|
|
<div
|
|
data-slot="alert-dialog-header"
|
|
className={cn(
|
|
"grid grid-rows-[auto_1fr] place-items-center gap-1.5 has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-6 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-start sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]",
|
|
className
|
|
)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function AlertDialogFooter({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<"div">) {
|
|
return (
|
|
<div
|
|
data-slot="alert-dialog-footer"
|
|
className={cn(
|
|
"flex flex-col-reverse gap-2 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end",
|
|
className
|
|
)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function AlertDialogTitle({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {
|
|
return (
|
|
<AlertDialogPrimitive.Title
|
|
data-slot="alert-dialog-title"
|
|
className={cn(
|
|
"text-2xl leading-6 text-ink-gray-8 font-semibold sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2",
|
|
className
|
|
)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function AlertDialogDescription({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {
|
|
return (
|
|
<AlertDialogPrimitive.Description
|
|
data-slot="alert-dialog-description"
|
|
className={cn("text-ink-gray-7 text-p-base", className)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function AlertDialogMedia({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<"div">) {
|
|
return (
|
|
<div
|
|
data-slot="alert-dialog-media"
|
|
className={cn(
|
|
"bg-surface-gray-1 mb-2 inline-flex size-16 items-center justify-center rounded-md sm:group-data-[size=default]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-8",
|
|
className
|
|
)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function AlertDialogAction({
|
|
className,
|
|
variant = "solid",
|
|
size = "md",
|
|
theme = "red",
|
|
...props
|
|
}: React.ComponentProps<typeof AlertDialogPrimitive.Action> &
|
|
Pick<React.ComponentProps<typeof Button>, "variant" | "size" | "theme">) {
|
|
return (
|
|
<Button variant={variant} size={size} theme={theme} asChild>
|
|
<AlertDialogPrimitive.Action
|
|
data-slot="alert-dialog-action"
|
|
className={cn(className)}
|
|
{...props}
|
|
/>
|
|
</Button>
|
|
)
|
|
}
|
|
|
|
function AlertDialogCancel({
|
|
className,
|
|
variant = "outline",
|
|
size = "md",
|
|
theme = "gray",
|
|
...props
|
|
}: React.ComponentProps<typeof AlertDialogPrimitive.Cancel> &
|
|
Pick<React.ComponentProps<typeof Button>, "variant" | "size" | "theme">) {
|
|
return (
|
|
<Button variant={variant} size={size} asChild>
|
|
<AlertDialogPrimitive.Cancel
|
|
data-slot="alert-dialog-cancel"
|
|
className={cn(className)}
|
|
{...props}
|
|
/>
|
|
</Button>
|
|
)
|
|
}
|
|
|
|
export {
|
|
AlertDialog,
|
|
AlertDialogAction,
|
|
AlertDialogCancel,
|
|
AlertDialogContent,
|
|
AlertDialogDescription,
|
|
AlertDialogFooter,
|
|
AlertDialogHeader,
|
|
AlertDialogMedia,
|
|
AlertDialogOverlay,
|
|
AlertDialogPortal,
|
|
AlertDialogTitle,
|
|
AlertDialogTrigger,
|
|
}
|