feat: darkmode preferences screens

This commit is contained in:
Ahmed Bouhuolia
2025-11-02 16:43:47 +02:00
parent a76445a6eb
commit 77dc0778a3
12 changed files with 78 additions and 102 deletions

View File

@@ -10,8 +10,8 @@ export const InitialCurrencies = [
]; ];
export const ERRORS = { export const ERRORS = {
CURRENCY_NOT_FOUND: 'currency_not_found', CURRENCY_NOT_FOUND: 'CURRENCY_NOT_FOUND',
CURRENCY_CODE_EXISTS: 'currency_code_exists', CURRENCY_CODE_EXISTS: 'CURRENCY_CODE_EXISTS',
BASE_CURRENCY_INVALID: 'BASE_CURRENCY_INVALID', BASE_CURRENCY_INVALID: 'BASE_CURRENCY_INVALID',
CANNOT_DELETE_BASE_CURRENCY: 'CANNOT_DELETE_BASE_CURRENCY', CANNOT_DELETE_BASE_CURRENCY: 'CANNOT_DELETE_BASE_CURRENCY',
}; };

View File

@@ -26,7 +26,7 @@ export const CardFooterActions = styled.div`
--x-color-border: #e0e7ea; --x-color-border: #e0e7ea;
.bp4-dark & { .bp4-dark & {
--x-color-border: rgba(255, 255, 255, 0.25); --x-color-border: rgba(255, 255, 255, 0.15);
} }
padding-top: 16px; padding-top: 16px;
border-top: 1px solid var(--x-color-border); border-top: 1px solid var(--x-color-border);

View File

@@ -1,24 +1,24 @@
// @ts-nocheck // @ts-nocheck
import React from 'react'; import React from 'react';
import { Classes, FormGroup, InputGroup } from '@blueprintjs/core'; import { Classes } from '@blueprintjs/core';
import { FastField } from 'formik'; import { useFormikContext } from 'formik';
import { FormattedMessage as T } from '@/components'; import { FormattedMessage as T } from '@/components';
import classNames from 'classnames'; import classNames from 'classnames';
import { CLASSES } from '@/constants/classes'; import { CLASSES } from '@/constants/classes';
import { useCurrencyFormContext } from './CurrencyFormProvider'; import { useCurrencyFormContext } from './CurrencyFormProvider';
import { ErrorMessage, FieldRequiredHint, ListSelect } from '@/components'; import { FieldRequiredHint, FFormGroup, FInputGroup, FSelect } from '@/components';
import { useAutofocus } from '@/hooks'; import { useAutofocus } from '@/hooks';
import { inputIntent, currenciesOptions } from '@/utils'; import { currenciesOptions } from '@/utils';
/** /**
* Currency form fields. * Currency form fields.
*/ */
export default function CurrencyFormFields() { export default function CurrencyFormFields() {
const currencyNameFieldRef = useAutofocus(); const currencyNameFieldRef = useAutofocus();
const { isEditMode } = useCurrencyFormContext(); const { isEditMode } = useCurrencyFormContext();
const { setFieldValue } = useFormikContext();
// Filter currency code // Filter currency code
const filterCurrencyCode = (query, currency, _index, exactMatch) => { const filterCurrencyCode = (query, currency, _index, exactMatch) => {
@@ -33,22 +33,16 @@ export default function CurrencyFormFields() {
return ( return (
<div className={Classes.DIALOG_BODY}> <div className={Classes.DIALOG_BODY}>
<FastField name={'currency_code'}> <FFormGroup
{({ name={'currency_code'}
form: { setFieldValue },
field: { value },
meta: { error, touched },
}) => (
<FormGroup
label={<T id={'currency_code'} />} label={<T id={'currency_code'} />}
className={classNames(CLASSES.FILL, 'form-group--type')}
> >
<ListSelect <FSelect
name={'currency_code'}
items={currenciesOptions} items={currenciesOptions}
selectedItemProp={'currency_code'} valueAccessor={'currency_code'}
selectedItem={value} textAccessor={'formatted_name'}
textProp={'formatted_name'} placeholder={<T id={'select_currency_code'} />}
defaultText={<T id={'select_currency_code'} />}
onItemSelect={(currency) => { onItemSelect={(currency) => {
setFieldValue('currency_code', currency.currency_code); setFieldValue('currency_code', currency.currency_code);
setFieldValue('currency_name', currency.name); setFieldValue('currency_name', currency.name);
@@ -58,41 +52,28 @@ export default function CurrencyFormFields() {
disabled={isEditMode} disabled={isEditMode}
popoverProps={{ minimal: true }} popoverProps={{ minimal: true }}
/> />
</FormGroup> </FFormGroup>
)}
</FastField>
{/* ----------- Currency name ----------- */} {/* ----------- Currency name ----------- */}
<FastField name={'currency_name'}> <FFormGroup
{({ field, field: { value }, meta: { error, touched } }) => ( name={'currency_name'}
<FormGroup
label={<T id={'currency_name'} />} label={<T id={'currency_name'} />}
labelInfo={<FieldRequiredHint />} labelInfo={<FieldRequiredHint />}
className={'form-group--currency-name'}
intent={inputIntent({ error, touched })}
helperText={<ErrorMessage name="currency_name" />}
// inline={true}
> >
<InputGroup <FInputGroup
name={'currency_name'}
inputRef={(ref) => (currencyNameFieldRef.current = ref)} inputRef={(ref) => (currencyNameFieldRef.current = ref)}
{...field}
/> />
</FormGroup> </FFormGroup>
)}
</FastField>
{/* ----------- Currency Code ----------- */} {/* ----------- Currency Code ----------- */}
<FastField name={'currency_sign'}> <FFormGroup
{({ field, field: { value }, meta: { error, touched } }) => ( name={'currency_sign'}
<FormGroup
label={<T id={'currency_sign'} />} label={<T id={'currency_sign'} />}
labelInfo={<FieldRequiredHint />} labelInfo={<FieldRequiredHint />}
className={'form-group--currency-sign'}
intent={inputIntent({ error, touched })}
helperText={<ErrorMessage name="currency_sign" />}
> >
<InputGroup {...field} /> <FInputGroup name={'currency_sign'} />
</FormGroup> </FFormGroup>
)}
</FastField>
</div> </div>
); );
} }

View File

@@ -63,7 +63,7 @@ const CardFooterActions = styled.div`
--x-color-border: #e0e7ea; --x-color-border: #e0e7ea;
.bp4-dark & { .bp4-dark & {
--x-color-border: rgba(255, 255, 255, 0.25); --x-color-border: rgba(255, 255, 255, 0.15);
} }
padding-top: 16px; padding-top: 16px;
border-top: 1px solid var(--x-color-border); border-top: 1px solid var(--x-color-border);

View File

@@ -61,8 +61,10 @@ export function PreferencesEstimatesForm({ isSubmitting }) {
const CardFooterActions = styled.div` const CardFooterActions = styled.div`
--x-color-border: #e0e7ea; --x-color-border: #e0e7ea;
--x-color-border: rgba(255, 255, 255, 0.25);
.bp4-dark & {
--x-color-border: rgba(255, 255, 255, 0.15);
}
padding-top: 16px; padding-top: 16px;
border-top: 1px solid var(--x-color-border); border-top: 1px solid var(--x-color-border);
margin-top: 30px; margin-top: 30px;

View File

@@ -61,8 +61,10 @@ export function PreferencesInvoicesForm({ isSubmitting }) {
const CardFooterActions = styled.div` const CardFooterActions = styled.div`
--x-color-border: #e0e7ea; --x-color-border: #e0e7ea;
--x-color-border: rgba(255, 255, 255, 0.25);
.bp4-dark & {
--x-color-border: rgba(255, 255, 255, 0.15);
}
padding-top: 16px; padding-top: 16px;
border-top: 1px solid var(--x-color-border); border-top: 1px solid var(--x-color-border);
margin-top: 30px; margin-top: 30px;

View File

@@ -61,8 +61,10 @@ export function PreferencesReceiptsForm({ isSubmitting }) {
const CardFooterActions = styled.div` const CardFooterActions = styled.div`
--x-color-border: #e0e7ea; --x-color-border: #e0e7ea;
--x-color-border: rgba(255, 255, 255, 0.25);
.bp4-dark & {
--x-color-border: rgba(255, 255, 255, 0.15);
}
padding-top: 16px; padding-top: 16px;
border-top: 1px solid var(--x-color-border); border-top: 1px solid var(--x-color-border);
margin-top: 30px; margin-top: 30px;

View File

@@ -455,9 +455,9 @@ body.bp4-dark {
--color-datatable-constrant-head-border: var(--color-dark-gray5); --color-datatable-constrant-head-border: var(--color-dark-gray5);
// Card // Card
--color-card-background: var(--color-dark-gray4); --color-card-background: var(--color-dark-gray2);
--color-card-border: #d2dce2; --color-card-border: #d2dce2;
--color-card-border: rgba(255, 255, 255, 0.2); --color-card-border: rgba(255, 255, 255, 0.1);
// Bank accounts. // Bank accounts.
--color-bank-account-card-background: var(--color-card-background); --color-bank-account-card-background: var(--color-card-background);
@@ -492,8 +492,7 @@ body.bp4-dark {
--color-bank-transaction-matching-aside-footer: var(--color-dark-gray1); --color-bank-transaction-matching-aside-footer: var(--color-dark-gray1);
--color-sidebar-preferences-background: var(--color-dark-gray1); --color-sidebar-preferences-background: var(--color-dark-gray1);
--color-sidebar-preferences-border: #c6d0d9; --color-sidebar-preferences-border: rgba(255, 255, 255, 0.15);
--color-sidebar-preferences-border: rgba(255, 255, 255, 0.25);
// Preferences - Sidebar. // Preferences - Sidebar.
--color-sidebar-preferences-item-background: transparent; --color-sidebar-preferences-item-background: transparent;
@@ -502,10 +501,7 @@ body.bp4-dark {
--color-sidebar-preferences-item-hover-background: var(--color-dark-gray4); --color-sidebar-preferences-item-hover-background: var(--color-dark-gray4);
--color-sidebar-preferences-item-hover-text: #fff; --color-sidebar-preferences-item-hover-text: #fff;
--color-preferences-sidebar-head-border: #bbcbd0; --color-preferences-sidebar-head-border: rgba(255, 255, 255, 0.1);
--color-preferences-sidebar-head-text: #3b3b4c;
--color-preferences-sidebar-head-border: rgba(255, 255, 255, 0.25);
--color-preferences-sidebar-head-text: rgba(255, 255, 255, 0.85); --color-preferences-sidebar-head-text: rgba(255, 255, 255, 0.85);
// Preferences - Topbar. // Preferences - Topbar.

View File

@@ -216,28 +216,6 @@
.tr.is-context-menu-active .td { .tr.is-context-menu-active .td {
background: #f3fafc; background: #f3fafc;
} }
.td.actions .#{$ns}-button {
background: #e6effb;
border: 0;
box-shadow: none;
padding: 5px 15px;
border-radius: 8px;
&:hover,
&:focus {
background-color: #cfdcee;
}
svg {
color: #425361;
}
.bp4-icon-more-h-16 {
margin-top: 2px;
}
}
.tr.no-results { .tr.no-results {
.td { .td {
flex-direction: column; flex-direction: column;

View File

@@ -14,6 +14,11 @@
} }
} }
.preferences-page { .preferences-page {
--x-color-tab-list-border: #e5e5e5;
.bp4-dark & {
--x-color-tab-list-border: rgba(255, 255, 255, 0.1);
}
&__inside-content { &__inside-content {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@@ -36,7 +41,7 @@
overflow: auto; overflow: auto;
.#{$ns}-tab-list { .#{$ns}-tab-list {
border-bottom: 1px solid #e5e5e5; border-bottom: 1px solid var(--x-color-tab-list-border);
padding-left: 15px; padding-left: 15px;
padding-right: 15px; padding-right: 15px;
align-items: baseline; align-items: baseline;

View File

@@ -55,6 +55,9 @@
margin-right: 15px; margin-right: 15px;
border-right: 1px solid #e5e5e5; border-right: 1px solid #e5e5e5;
.bp4-dark &{
border-right-color: rgba(255, 255, 255, 0.2);
}
.bp4-button + .bp4-button { .bp4-button + .bp4-button {
margin-left: 10px; margin-left: 10px;
} }

View File

@@ -1,6 +1,13 @@
// Users/Roles List. // Users/Roles List.
// --------------------------------- // ---------------------------------
.preferences-page__inside-content--users { .preferences-page__inside-content--users {
--color-avatar-background: #b7bfc6;
--color-avatar-text: #fff;
.bp4-dark & {
--color-avatar-background: rgba(255, 255, 255, 0.2);
--color-avatar-text: #fff;
}
.bigcapital-datatable { .bigcapital-datatable {
.td { .td {
.avatar { .avatar {
@@ -8,7 +15,7 @@
height: 28px; height: 28px;
width: 28px; width: 28px;
text-align: center; text-align: center;
background: #b7bfc6; background: var(--color-avatar-background);
border-radius: 50%; border-radius: 50%;
line-height: 28px; line-height: 28px;
color: #fff; color: #fff;