1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2025-02-20 14:54:15 +01:00

linted all code expected profile-custom-fields/* and proof-of-identity/*

This commit is contained in:
Sylvain 2022-06-21 12:09:56 +02:00
parent 4a8d8796a3
commit c0d5da55ce
35 changed files with 181 additions and 161 deletions

View File

@ -57,7 +57,7 @@
"fabmanager/component-methods-documentation": "error",
"fabmanager/no-bootstrap": "error",
"fabmanager/no-utilities": "error",
"fabmanager/scoped-translation": ["error", { "ignoreAbstractKeyword": true }]
"fabmanager/scoped-translation": ["error", { "ignoreAbstractKeyword": false }]
}
},
{

View File

@ -45,7 +45,7 @@ export const FabModal: React.FC<FabModalProps> = ({ title, isOpen, toggleModal,
className={`fab-modal fab-modal-${width} ${className}`}
overlayClassName="fab-modal-overlay"
onRequestClose={toggleModal}>
{closeButton && <FabButton className="modal-btn--close" onClick={toggleModal}>{t('app.shared.buttons.close')}</FabButton>}
{closeButton && <FabButton className="modal-btn--close" onClick={toggleModal}>{t('app.shared.fab_modal.close')}</FabButton>}
<div className="fab-modal-header">
{!customHeader && <h1>{ title }</h1>}
{customHeader && customHeader}

View File

@ -16,8 +16,8 @@ interface LabelledInputProps {
export const LabelledInput: React.FC<LabelledInputProps> = ({ id, type, label, value, onChange }) => {
return (
<div className="labelled-input">
<label className="label" htmlFor={id}>{label}</label>
<input className="input" id={id} type={type} value={value} onChange={onChange} />
<label htmlFor={id}>{label}</label>
<input id={id} type={type} value={value} onChange={onChange} />
</div>
);
};

View File

@ -32,7 +32,7 @@ export interface FabTextEditorRef {
*/
export const FabTextEditor: React.ForwardRefRenderFunction<FabTextEditorRef, FabTextEditorProps> = ({ paragraphTools, content, limit = 400, video, image, onChange, placeholder, error, disabled = false }, ref: RefObject<FabTextEditorRef>) => {
const { t } = useTranslation('shared');
const placeholderText = placeholder || t('app.shared.text_editor.text_placeholder');
const placeholderText = placeholder || t('app.shared.text_editor.fab_text_editor.text_placeholder');
// TODO: Add ctrl+click on link to visit
const editorRef: React.MutableRefObject<Editor | null> = useRef(null);

View File

@ -18,6 +18,7 @@ declare module '@tiptap/core' {
}
}
// eslint-disable-next-line import/no-default-export
export default Node.create<IframeOptions>({
name: 'iframe',

View File

@ -231,16 +231,16 @@ export const MenuBar: React.FC<MenuBarProps> = ({ editor, paragraphTools, video,
<div ref={ref} className={`fab-text-editor-subMenu ${submenu ? 'is-active' : ''}`}>
{ submenu === 'link' &&
(<>
<h6>{t('app.shared.text_editor.add_link')}</h6>
<h6>{t('app.shared.text_editor.menu_bar.add_link')}</h6>
<div>
<input value={url.href} onChange={linkUrlChange} onKeyDown={handleEnter} type="text" placeholder={t('app.shared.text_editor.link_placeholder')} />
<input value={url.href} onChange={linkUrlChange} onKeyDown={handleEnter} type="text" placeholder={t('app.shared.text_editor.menu_bar.link_placeholder')} />
<button type='button' onClick={unsetLink}>
<Trash size={24} />
</button>
</div>
<div>
<label className='tab'>
<p>{t('app.shared.text_editor.new_tab')}</p>
<p>{t('app.shared.text_editor.menu_bar.new_tab')}</p>
<input type="checkbox" onChange={toggleTarget} checked={url.target === '_blank'} />
<span className='switch'></span>
</label>
@ -252,14 +252,14 @@ export const MenuBar: React.FC<MenuBarProps> = ({ editor, paragraphTools, video,
}
{ submenu === 'video' &&
(<>
<h6>{t('app.shared.text_editor.add_video')}</h6>
<h6>{t('app.shared.text_editor.menu_bar.add_video')}</h6>
<select name="provider" onChange={handleSelect}>
<option value="youtube">YouTube</option>
<option value="vimeo">Vimeo</option>
<option value="dailymotion">Dailymotion</option>
</select>
<div>
<input type="text" onChange={videoUrlChange} placeholder={t('app.shared.text_editor.url_placeholder')} />
<input type="text" onChange={videoUrlChange} placeholder={t('app.shared.text_editor.menu_bar.url_placeholder')} />
<button type='button' onClick={() => addIframe()}>
<CheckCircle size={24} />
</button>
@ -268,9 +268,9 @@ export const MenuBar: React.FC<MenuBarProps> = ({ editor, paragraphTools, video,
}
{ submenu === 'image' &&
(<>
<h6>{t('app.shared.text_editor.add_image')}</h6>
<h6>{t('app.shared.text_editor.menu_bar.add_image')}</h6>
<div>
<input type="text" onChange={imageUrlChange} placeholder={t('app.shared.text_editor.url_placeholder')} />
<input type="text" onChange={imageUrlChange} placeholder={t('app.shared.text_editor.menu_bar.url_placeholder')} />
<button type='button' onClick={() => addImage()}>
<CheckCircle size={24} />
</button>

View File

@ -43,8 +43,8 @@ export const EventCard: React.FC<EventCardProps> = ({ event, cardType }) => {
startDate.getMonth() === endDate.getMonth() &&
startDate.getDate() === endDate.getDate();
return singleDayEvent
? t('app.public.home.on_the_date', { DATE: FormatLib.date(event.start_date) })
: t('app.public.home.from_date_to_date', { START: FormatLib.date(event.start_date), END: FormatLib.date(event.end_date) });
? t('app.public.event_card.on_the_date', { DATE: FormatLib.date(event.start_date) })
: t('app.public.event_card.from_date_to_date', { START: FormatLib.date(event.start_date), END: FormatLib.date(event.end_date) });
};
/**
@ -52,8 +52,8 @@ export const EventCard: React.FC<EventCardProps> = ({ event, cardType }) => {
*/
const formatTime = (): string => {
return event.all_day
? t('app.public.home.all_day')
: t('app.public.home.from_time_to_time', { START: FormatLib.time(event.start_date), END: FormatLib.time(event.end_date) });
? t('app.public.event_card.all_day')
: t('app.public.event_card.from_time_to_time', { START: FormatLib.time(event.start_date), END: FormatLib.time(event.end_date) });
};
return (
@ -112,14 +112,14 @@ export const EventCard: React.FC<EventCardProps> = ({ event, cardType }) => {
}
<div className="grid-item">
<i className="fa fa-user"></i>
{event.nb_free_places > 0 && <h6>{t('app.public.home.still_available') + event.nb_free_places}</h6>}
{event.nb_total_places > 0 && event.nb_free_places <= 0 && <h6>{t('app.public.home.event_full')}</h6>}
{!event.nb_total_places && <h6>{t('app.public.home.without_reservation')}</h6>}
{event.nb_free_places > 0 && <h6>{t('app.public.event_card.still_available') + event.nb_free_places}</h6>}
{event.nb_total_places > 0 && event.nb_free_places <= 0 && <h6>{t('app.public.event_card.event_full')}</h6>}
{!event.nb_total_places && <h6>{t('app.public.event_card.without_reservation')}</h6>}
</div>
<div className="grid-item">
<i className="fa fa-bookmark"></i>
{event.amount === 0 && <h6>{t('app.public.home.free_admission')}</h6>}
{event.amount > 0 && <h6>{t('app.public.home.full_price') + FormatLib.price(event.amount)}</h6>}
{event.amount === 0 && <h6>{t('app.public.event_card.free_admission')}</h6>}
{event.amount > 0 && <h6>{t('app.public.event_card.full_price') + FormatLib.price(event.amount)}</h6>}
</div>
</div>
</div>

View File

@ -2,7 +2,7 @@
This directory is holding the inputs components for usage within forms controlled by [React-hook-form](https://react-hook-form.com/).
All these components must have [props](https://reactjs.org/docs/components-and-props.html) that inherits from [FormComponent](../models/form-component.ts)
All these components must have [props](https://reactjs.org/docs/components-and-props.html) that inherit from [FormComponent](../models/form-component.ts)
or from [FormControlledComponent](../models/form-component.ts).
Please look at the existing components for examples.

View File

@ -40,29 +40,29 @@ export const PaymentScheduleSummary: React.FC<PaymentScheduleSummaryProps> = ({
return (
<div className="payment-schedule-summary">
<div>
<h4>{ t('app.shared.cart.your_payment_schedule') }</h4>
<h4>{ t('app.shared.payment_schedule_summary.your_payment_schedule') }</h4>
{hasEqualDeadlines() && <ul>
<li>
<span className="schedule-item-info">
{t('app.shared.cart.NUMBER_monthly_payment_of_AMOUNT', { NUMBER: schedule.items.length, AMOUNT: FormatLib.price(schedule.items[0].amount) })}
{t('app.shared.payment_schedule_summary.NUMBER_monthly_payment_of_AMOUNT', { NUMBER: schedule.items.length, AMOUNT: FormatLib.price(schedule.items[0].amount) })}
</span>
<span className="schedule-item-date">{t('app.shared.cart.first_debit')}</span>
<span className="schedule-item-date">{t('app.shared.payment_schedule_summary.first_debit')}</span>
</li>
</ul>}
{!hasEqualDeadlines() && <ul>
<li>
<span className="schedule-item-info">{t('app.shared.cart.monthly_payment_NUMBER', { NUMBER: 1 })}</span>
<span className="schedule-item-info">{t('app.shared.payment_schedule_summary.monthly_payment_NUMBER', { NUMBER: 1 })}</span>
<span className="schedule-item-price">{FormatLib.price(schedule.items[0].amount)}</span>
<span className="schedule-item-date">{t('app.shared.cart.debit')}</span>
<span className="schedule-item-date">{t('app.shared.payment_schedule_summary.debit')}</span>
</li>
<li>
<span className="schedule-item-info">
{t('app.shared.cart.NUMBER_monthly_payment_of_AMOUNT', { NUMBER: schedule.items.length - 1, AMOUNT: FormatLib.price(schedule.items[1].amount) })}
{t('app.shared.payment_schedule_summary.NUMBER_monthly_payment_of_AMOUNT', { NUMBER: schedule.items.length - 1, AMOUNT: FormatLib.price(schedule.items[1].amount) })}
</span>
</li>
</ul>}
<button className="view-full-schedule" onClick={toggleFullScheduleModal}>{t('app.shared.cart.view_full_schedule')}</button>
<FabModal title={t('app.shared.cart.your_payment_schedule')} isOpen={modal} toggleModal={toggleFullScheduleModal}>
<button className="view-full-schedule" onClick={toggleFullScheduleModal}>{t('app.shared.payment_schedule_summary.view_full_schedule')}</button>
<FabModal title={t('app.shared.payment_schedule_summary.your_payment_schedule')} isOpen={modal} toggleModal={toggleFullScheduleModal}>
<ul className="full-schedule">
{schedule.items.map(item => (
<li key={String(item.due_date)}>

View File

@ -66,7 +66,7 @@ export const PaymentSchedulesDashboard: React.FC<PaymentSchedulesDashboardProps>
* after a successful card update, provide a success message to the end-user
*/
const handleCardUpdateSuccess = (): void => {
onCardUpdateSuccess(t('app.logged.dashboard.payment_schedules.card_updated_success'));
onCardUpdateSuccess(t('app.logged.dashboard.payment_schedules_dashboard.card_updated_success'));
};
/**
@ -85,7 +85,7 @@ export const PaymentSchedulesDashboard: React.FC<PaymentSchedulesDashboardProps>
return (
<div className="payment-schedules-dashboard">
{!hasSchedules() && <div>{t('app.logged.dashboard.payment_schedules.no_payment_schedules')}</div>}
{!hasSchedules() && <div>{t('app.logged.dashboard.payment_schedules_dashboard.no_payment_schedules')}</div>}
{hasSchedules() && <div className="schedules-list">
<PaymentSchedulesTable paymentSchedules={paymentSchedules}
showCustomer={false}
@ -93,7 +93,7 @@ export const PaymentSchedulesDashboard: React.FC<PaymentSchedulesDashboardProps>
operator={currentUser}
onError={onError}
onCardUpdateSuccess={handleCardUpdateSuccess} />
{hasMoreSchedules() && <FabButton className="load-more" onClick={handleLoadMore}>{t('app.logged.dashboard.payment_schedules.load_more')}</FabButton>}
{hasMoreSchedules() && <FabButton className="load-more" onClick={handleLoadMore}>{t('app.logged.dashboard.payment_schedules_dashboard.load_more')}</FabButton>}
</div>}
</div>
);

View File

@ -93,19 +93,19 @@ export const PaymentSchedulesList: React.FC<PaymentSchedulesListProps> = ({ curr
* after a successful card update, provide a success message to the operator
*/
const handleCardUpdateSuccess = (): void => {
onCardUpdateSuccess(t('app.admin.invoices.payment_schedules.card_updated_success'));
onCardUpdateSuccess(t('app.admin.invoices.payment_schedules_list.card_updated_success'));
};
return (
<div className="payment-schedules-list">
<h3>
<i className="fas fa-filter" />
{t('app.admin.invoices.payment_schedules.filter_schedules')}
{t('app.admin.invoices.payment_schedules_list.filter_schedules')}
</h3>
<div className="schedules-filters">
<DocumentFilters onFilterChange={handleFiltersChange} />
</div>
{!hasSchedules() && <div>{t('app.admin.invoices.payment_schedules.no_payment_schedules')}</div>}
{!hasSchedules() && <div>{t('app.admin.invoices.payment_schedules_list.no_payment_schedules')}</div>}
{hasSchedules() && <div className="schedules-list">
<PaymentSchedulesTable paymentSchedules={paymentSchedules}
showCustomer={true}
@ -113,7 +113,7 @@ export const PaymentSchedulesList: React.FC<PaymentSchedulesListProps> = ({ curr
operator={currentUser}
onError={onError}
onCardUpdateSuccess={handleCardUpdateSuccess} />
{hasMoreSchedules() && <FabButton className="load-more" onClick={handleLoadMore}>{t('app.admin.invoices.payment_schedules.load_more')}</FabButton>}
{hasMoreSchedules() && <FabButton className="load-more" onClick={handleLoadMore}>{t('app.admin.invoices.payment_schedules_list.load_more')}</FabButton>}
</div>}
</div>
);

View File

@ -98,7 +98,7 @@ const PaymentSchedulesTable: React.FC<PaymentSchedulesTableProps> = ({ paymentSc
// eslint-disable-next-line fabmanager/component-class-named-as-component
<a href={link} target="_blank" className="download-button" rel="noreferrer">
<i className="fas fa-download" />
{t('app.shared.schedules_table.download')}
{t('app.shared.payment_schedules_table.download')}
</a>
);
};
@ -107,7 +107,7 @@ const PaymentSchedulesTable: React.FC<PaymentSchedulesTableProps> = ({ paymentSc
* Return the human-readable string for the status of the provided deadline.
*/
const formatState = (item: PaymentScheduleItem, schedule: PaymentSchedule): JSX.Element => {
let res = t(`app.shared.schedules_table.state_${item.state}${item.state === 'pending' ? '_' + schedule.payment_method : ''}`);
let res = t(`app.shared.payment_schedules_table.state_${item.state}${item.state === 'pending' ? '_' + schedule.payment_method : ''}`);
if (item.state === PaymentScheduleItemState.Paid) {
const key = `app.shared.schedules_table.method_${item.payment_method}`;
res += ` (${t(key)})`;
@ -132,10 +132,10 @@ const PaymentSchedulesTable: React.FC<PaymentSchedulesTableProps> = ({ paymentSc
<thead>
<tr>
<th className="w-35" />
<th className="w-200">{t('app.shared.schedules_table.schedule_num')}</th>
<th className="w-200">{t('app.shared.schedules_table.date')}</th>
<th className="w-120">{t('app.shared.schedules_table.price')}</th>
{showCustomer && <th className="w-200">{t('app.shared.schedules_table.customer')}</th>}
<th className="w-200">{t('app.shared.payment_schedules_table.schedule_num')}</th>
<th className="w-200">{t('app.shared.payment_schedules_table.date')}</th>
<th className="w-120">{t('app.shared.payment_schedules_table.price')}</th>
{showCustomer && <th className="w-200">{t('app.shared.payment_schedules_table.customer')}</th>}
<th className="w-200"/>
</tr>
</thead>
@ -159,9 +159,9 @@ const PaymentSchedulesTable: React.FC<PaymentSchedulesTableProps> = ({ paymentSc
<table className="schedule-items-table">
<thead>
<tr>
<th className="w-120">{t('app.shared.schedules_table.deadline')}</th>
<th className="w-120">{t('app.shared.schedules_table.amount')}</th>
<th className="w-200">{t('app.shared.schedules_table.state')}</th>
<th className="w-120">{t('app.shared.payment_schedules_table.deadline')}</th>
<th className="w-120">{t('app.shared.payment_schedules_table.amount')}</th>
<th className="w-200">{t('app.shared.payment_schedules_table.state')}</th>
<th className="w-200" />
</tr>
</thead>

View File

@ -25,7 +25,7 @@ export const SelectSchedule: React.FC<SelectScheduleProps> = ({ show, selected,
return (
<div className="select-schedule">
{show && <div className={className || ''}>
<label htmlFor="payment_schedule">{ t('app.shared.cart.monthly_payment') }</label>
<label htmlFor="payment_schedule">{ t('app.shared.select_schedule.monthly_payment') }</label>
<Switch checked={selected} id="payment_schedule" onChange={onChange} className="schedule-switch" />
</div>}
</div>

View File

@ -220,13 +220,13 @@ export const AbstractPaymentModal: React.FC<AbstractPaymentModalProps> = ({ isOp
{errors}
</div>}
{hasPaymentScheduleInfo() && <div className="payment-schedule-info">
<HtmlTranslate trKey="app.shared.payment.payment_schedule_html" options={{ DEADLINES: `${schedule.items.length}`, GATEWAY: gateway }} />
<HtmlTranslate trKey="app.shared.abstract_payment_modal.payment_schedule_html" options={{ DEADLINES: `${schedule.items.length}`, GATEWAY: gateway }} />
</div>}
{hasCgv() && <div className="terms-of-sales">
<input type="checkbox" id="acceptToS" name="acceptCondition" checked={tos} onChange={toggleTos} required />
<label htmlFor="acceptToS">{ t('app.shared.payment.i_have_read_and_accept_') }
<label htmlFor="acceptToS">{ t('app.shared.abstract_payment_modal.i_have_read_and_accept_') }
<a href={cgv.custom_asset_file_attributes.attachment_url} target="_blank" rel="noreferrer">
{ t('app.shared.payment._the_general_terms_and_conditions') }
{ t('app.shared.abstract_payment_modal._the_general_terms_and_conditions') }
</a>
</label>
</div>}
@ -235,8 +235,8 @@ export const AbstractPaymentModal: React.FC<AbstractPaymentModalProps> = ({ isOp
disabled={!canSubmit()}
form={formId}
className="validate-btn">
{remainingPrice > 0 && t('app.shared.payment.confirm_payment_of_', { AMOUNT: FormatLib.price(remainingPrice) })}
{remainingPrice === 0 && t('app.shared.payment.validate')}
{remainingPrice > 0 && t('app.shared.abstract_payment_modal.confirm_payment_of_', { AMOUNT: FormatLib.price(remainingPrice) })}
{remainingPrice === 0 && t('app.shared.abstract_payment_modal.validate')}
</button>}
{submitState && <div className="payment-pending">
<div className="fa-2x">

View File

@ -80,10 +80,10 @@ const CardPaymentModal: React.FC<CardPaymentModalProps> = ({ isOpen, toggleModal
return renderPayZenModal();
case null:
case undefined:
onError(t('app.shared.payment_modal.online_payment_disabled'));
onError(t('app.shared.card_payment_modal.online_payment_disabled'));
return <div />;
default:
onError(t('app.shared.payment_modal.unexpected_error'));
onError(t('app.shared.card_payment_modal.unexpected_error'));
console.error(`[PaymentModal] Unimplemented gateway: ${gateway.value}`);
return <div />;
}

View File

@ -54,7 +54,7 @@ export const LocalPaymentForm: React.FC<GatewayFormProps> = ({ onSubmit, onSucce
const methodToOption = (value: scheduleMethod): selectOption => {
if (!value) return { value, label: '' };
return { value, label: t(`app.admin.local_payment.method_${value}`) };
return { value, label: t(`app.admin.local_payment_form.method_${value}`) };
};
/**
@ -77,7 +77,7 @@ export const LocalPaymentForm: React.FC<GatewayFormProps> = ({ onSubmit, onSucce
try {
const online = await SettingAPI.get(SettingName.OnlinePaymentModule);
if (online.value !== 'true') {
return onError(t('app.admin.local_payment.online_payment_disabled'));
return onError(t('app.admin.local_payment_form.online_payment_disabled'));
}
return toggleOnlinePaymentModal();
} catch (e) {
@ -119,19 +119,19 @@ export const LocalPaymentForm: React.FC<GatewayFormProps> = ({ onSubmit, onSucce
return (
<form onSubmit={handleSubmit} id={formId} className={`local-payment-form ${className || ''}`}>
{!paymentSchedule && !isFreeOfCharge() && <p className="payment">{t('app.admin.local_payment.about_to_cash')}</p>}
{!paymentSchedule && isFreeOfCharge() && <p className="payment">{t('app.admin.local_payment.about_to_confirm', { ITEM: mainItemType() })}</p>}
{!paymentSchedule && !isFreeOfCharge() && <p className="payment">{t('app.admin.local_payment_form.about_to_cash')}</p>}
{!paymentSchedule && isFreeOfCharge() && <p className="payment">{t('app.admin.local_payment_form.about_to_confirm', { ITEM: mainItemType() })}</p>}
{paymentSchedule && <div className="payment-schedule">
<div className="schedule-method">
<label htmlFor="payment-method">{t('app.admin.local_payment.payment_method')}</label>
<Select placeholder={ t('app.admin.local_payment.payment_method') }
<label htmlFor="payment-method">{t('app.admin.local_payment_form.payment_method')}</label>
<Select placeholder={ t('app.admin.local_payment_form.payment_method') }
id="payment-method"
className="method-select"
onChange={handleUpdateMethod}
options={buildMethodOptions()}
value={methodToOption(method)} />
{method === 'card' && <p>{t('app.admin.local_payment.card_collection_info')}</p>}
{method === 'check' && <p>{t('app.admin.local_payment.check_collection_info', { DEADLINES: paymentSchedule.items.length })}</p>}
{method === 'card' && <p>{t('app.admin.local_payment_form.card_collection_info')}</p>}
{method === 'check' && <p>{t('app.admin.local_payment_form.check_collection_info', { DEADLINES: paymentSchedule.items.length })}</p>}
{method === 'transfer' && <HtmlTranslate trKey="app.admin.local_payment.transfer_collection_info" options={{ DEADLINES: paymentSchedule.items.length }} />}
</div>
<div className="full-schedule">

View File

@ -76,7 +76,7 @@ const LocalPaymentModal: React.FC<LocalPaymentModalProps> = ({ isOpen, toggleMod
isOpen={isOpen}
toggleModal={toggleModal}
logoFooter={logoFooter()}
title={isFreeOfCharge() ? t('app.admin.local_payment.validate_cart') : t('app.admin.local_payment.offline_payment')}
title={isFreeOfCharge() ? t('app.admin.local_payment_modal.validate_cart') : t('app.admin.local_payment_modal.offline_payment')}
formId="local-payment-form"
formClassName="local-payment-form"
currentUser={currentUser}

View File

@ -139,13 +139,13 @@ const PayzenKeysForm: React.FC<PayzenKeysFormProps> = ({ onValidKeys, onInvalidK
return (
<div className="payzen-keys-form">
<div className="payzen-keys-info">
<HtmlTranslate trKey="app.admin.invoices.payment.payzen_keys_info_html" />
<HtmlTranslate trKey="app.admin.invoices.payzen_keys_form.payzen_keys_info_html" />
</div>
<form name="payzenKeysForm">
<fieldset>
<legend>{t('app.admin.invoices.payment.client_keys')}</legend>
<legend>{t('app.admin.invoices.payzen_keys_form.client_keys')}</legend>
<div className="payzen-public-input">
<label htmlFor="payzen_public_key">{ t('app.admin.invoices.payment.payzen.payzen_public_key') } *</label>
<label htmlFor="payzen_public_key">{ t('app.admin.invoices.payzen_keys_form.payzen_public_key') } *</label>
<FabInput id="payzen_public_key"
icon={<i className="fas fa-info" />}
defaultValue={settings.get(SettingName.PayZenPublicKey)}
@ -158,11 +158,11 @@ const PayzenKeysForm: React.FC<PayzenKeysFormProps> = ({ onValidKeys, onInvalidK
</fieldset>
<fieldset>
<legend className={hasApiAddOn() ? 'with-addon' : ''}>
<span>{t('app.admin.invoices.payment.api_keys')}</span>
<span>{t('app.admin.invoices.payzen_keys_form.api_keys')}</span>
{hasApiAddOn() && <span className={`fieldset-legend--addon ${restApiAddOnClassName || ''}`}>{restApiAddOn}</span>}
</legend>
<div className="payzen-api-user-input">
<label htmlFor="payzen_username">{ t('app.admin.invoices.payment.payzen.payzen_username') } *</label>
<label htmlFor="payzen_username">{ t('app.admin.invoices.payzen_keys_form.payzen_username') } *</label>
<FabInput id="payzen_username"
type="number"
icon={<i className="fas fa-user-alt" />}
@ -172,7 +172,7 @@ const PayzenKeysForm: React.FC<PayzenKeysFormProps> = ({ onValidKeys, onInvalidK
required />
</div>
<div className="payzen-api-password-input">
<label htmlFor="payzen_password">{ t('app.admin.invoices.payment.payzen.payzen_password') } *</label>
<label htmlFor="payzen_password">{ t('app.admin.invoices.payzen_keys_form.payzen_password') } *</label>
<FabInput id="payzen_password"
icon={<i className="fas fa-key" />}
defaultValue={settings.get(SettingName.PayZenPassword)}
@ -181,7 +181,7 @@ const PayzenKeysForm: React.FC<PayzenKeysFormProps> = ({ onValidKeys, onInvalidK
required />
</div>
<div className="payzen-api-endpoint-input">
<label htmlFor="payzen_endpoint">{ t('app.admin.invoices.payment.payzen.payzen_endpoint') } *</label>
<label htmlFor="payzen_endpoint">{ t('app.admin.invoices.payzen_keys_form.payzen_endpoint') } *</label>
<FabInput id="payzen_endpoint"
type="url"
icon={<i className="fas fa-link" />}
@ -191,7 +191,7 @@ const PayzenKeysForm: React.FC<PayzenKeysFormProps> = ({ onValidKeys, onInvalidK
required />
</div>
<div className="payzen-api-hmac-input">
<label htmlFor="payzen_hmac">{ t('app.admin.invoices.payment.payzen.payzen_hmac') } *</label>
<label htmlFor="payzen_hmac">{ t('app.admin.invoices.payzen_keys_form.payzen_hmac') } *</label>
<FabInput id="payzen_hmac"
icon={<i className="fas fa-subscript" />}
defaultValue={settings.get(SettingName.PayZenHmacKey)}

View File

@ -43,11 +43,11 @@ export const StripeConfirmModal: React.FC<StripeConfirmModalProps> = ({ isOpen,
};
return (
<FabModal title={t('app.shared.schedules_table.resolve_action')}
<FabModal title={t('app.shared.stripe_confirm_modal.resolve_action')}
isOpen={isOpen}
toggleModal={toggleModal}
onConfirm={onConfirmed}
confirmButton={t('app.shared.schedules_table.ok_button')}
confirmButton={t('app.shared.stripe_confirm_modal.ok_button')}
preventConfirm={isPending}>
{item && <StripeConfirm clientSecret={item.client_secret} onResponse={togglePending} />}
</FabModal>

View File

@ -66,7 +66,7 @@ export const StripeForm: React.FC<GatewayFormProps> = ({ onSubmit, onSuccess, on
if (response.error.statusText) {
onError(response.error.statusText);
} else {
onError(`${t('app.shared.messages.payment_card_error')} ${response.error}`);
onError(`${t('app.shared.stripe_form.payment_card_error')} ${response.error}`);
}
} else if ('requires_action' in response) {
if (response.type === 'payment') {

View File

@ -123,11 +123,11 @@ const StripeKeysForm: React.FC<StripeKeysFormProps> = ({ onValidKeys, onInvalidK
return (
<div className="stripe-keys-form">
<div className="stripe-keys-info">
<HtmlTranslate trKey="app.admin.invoices.payment.stripe_keys_info_html" />
<HtmlTranslate trKey="app.admin.invoices.stripe_keys_form.stripe_keys_info_html" />
</div>
<form name="stripeKeysForm">
<div className="stripe-public-input">
<label htmlFor="stripe_public_key">{ t('app.admin.invoices.payment.public_key') } *</label>
<label htmlFor="stripe_public_key">{ t('app.admin.invoices.stripe_keys_form.public_key') } *</label>
<FabInput id="stripe_public_key"
icon={<i className="fa fa-info" />}
defaultValue={publicKey}
@ -138,7 +138,7 @@ const StripeKeysForm: React.FC<StripeKeysFormProps> = ({ onValidKeys, onInvalidK
required />
</div>
<div className="stripe-secret-input">
<label htmlFor="stripe_secret_key">{ t('app.admin.invoices.payment.secret_key') } *</label>
<label htmlFor="stripe_secret_key">{ t('app.admin.invoices.stripe_keys_form.secret_key') } *</label>
<FabInput id="stripe_secret_key"
icon={<i className="fa fa-key" />}
defaultValue={secretKey}

View File

@ -34,9 +34,9 @@ const DeletePlanCategory: React.FC<DeletePlanCategoryProps> = ({ onSuccess, onEr
*/
const onDeleteConfirmed = (): void => {
PlanCategoryAPI.destroy(category.id).then(() => {
onSuccess(t('app.admin.manage_plan_category.delete_category.success'));
onSuccess(t('app.admin.delete_plan_category.success'));
}).catch((error) => {
onError(t('app.admin.manage_plan_category.delete_category.error') + error);
onError(t('app.admin.delete_plan_category.error') + error);
});
toggleDeletionModal();
};
@ -44,13 +44,13 @@ const DeletePlanCategory: React.FC<DeletePlanCategoryProps> = ({ onSuccess, onEr
return (
<div className="delete-plan-category">
<FabButton type='button' className="delete-button" icon={<i className="fa fa-trash" />} onClick={toggleDeletionModal} />
<FabModal title={t('app.admin.manage_plan_category.delete_category.title')}
<FabModal title={t('app.admin.delete_plan_category.title')}
isOpen={deletionModal}
toggleModal={toggleDeletionModal}
closeButton={true}
confirmButton={t('app.admin.manage_plan_category.delete_category.cta')}
confirmButton={t('app.admin.delete_plan_category.cta')}
onConfirm={onDeleteConfirmed}>
<span>{t('app.admin.manage_plan_category.delete_category.confirm')}</span>
<span>{t('app.admin.delete_plan_category.confirm')}</span>
</FabModal>
</div>
);

View File

@ -63,7 +63,7 @@ const ManagePlanCategory: React.FC<ManagePlanCategoryProps> = ({ category, actio
icon={<i className='fa fa-plus' />}
className="create-button"
onClick={toggleModal}>
{t('app.admin.manage_plan_category.create_category.title')}
{t('app.admin.manage_plan_category.create')}
</FabButton>
);
case 'update':
@ -77,7 +77,7 @@ const ManagePlanCategory: React.FC<ManagePlanCategoryProps> = ({ category, actio
return (
<div className='manage-plan-category'>
{ toggleBtn() }
<FabModal title={t(`app.admin.manage_plan_category.${action}_category.title`)}
<FabModal title={t(`app.admin.manage_plan_category.${action}`)}
isOpen={isOpen}
toggleModal={toggleModal}
onCreation={initCategoryCreation}

View File

@ -31,16 +31,16 @@ const PlanCategoryForm: React.FC<PlanCategoryFormProps> = ({ action, category, o
switch (action) {
case 'create':
PlanCategoryAPI.create(data).then(() => {
onSuccess(t('app.admin.manage_plan_category.create_category.success'));
onSuccess(t('app.admin.plan_category_form.create.success'));
}).catch((error) => {
onError(t('app.admin.manage_plan_category.create_category.error') + error);
onError(t('app.admin.plan_category_form.create.error') + error);
});
break;
case 'update':
PlanCategoryAPI.update(data).then(() => {
onSuccess(t('app.admin.manage_plan_category.update_category.success'));
onSuccess(t('app.admin.plan_category_form.update.success'));
}).catch((error) => {
onError(t('app.admin.manage_plan_category.update_category.error') + error);
onError(t('app.admin.plan_category_form.update.error') + error);
});
break;
}
@ -48,15 +48,15 @@ const PlanCategoryForm: React.FC<PlanCategoryFormProps> = ({ action, category, o
return (
<form onSubmit={handleSubmit(onSubmit)}>
<FormInput id='name' register={register} rules={{ required: 'true' }} label={t('app.admin.manage_plan_category.name')} />
<FormInput id='name' register={register} rules={{ required: 'true' }} label={t('app.admin.plan_category_form.name')} />
<FormRichText control={control} id="description" label={t('app.admin.manage_plan_category.description')} limit={100} />
<FormRichText control={control} id="description" label={t('app.admin.plan_category_form.description')} limit={100} />
<FormInput id='weight' register={register} type='number' label={t('app.admin.manage_plan_category.significance')} />
<FormInput id='weight' register={register} type='number' label={t('app.admin.plan_category_form.significance')} />
<FabAlert level="info" className="significance-info">
{t('app.admin.manage_plan_category.info')}
{t('app.admin.plan_category_form.info')}
</FabAlert>
<FabButton type='submit'>{t(`app.admin.manage_plan_category.${action}_category.cta`)}</FabButton>
<FabButton type='submit'>{t(`app.admin.plan_category_form.${action}.cta`)}</FabButton>
</form>
);
};

View File

@ -105,7 +105,7 @@ const PlanCard: React.FC<PlanCardProps> = ({ plan, userId, subscribedPlanId, ope
<div className="content">
{canBeScheduled() && <div className="wrap-monthly">
<div className="price">
<div className="amount">{t('app.public.plans.AMOUNT_per_month', { AMOUNT: monthlyAmount() })}</div>
<div className="amount">{t('app.public.plan_card.AMOUNT_per_month', { AMOUNT: monthlyAmount() })}</div>
<span className="period">{duration()}</span>
</div>
</div>}
@ -118,25 +118,25 @@ const PlanCard: React.FC<PlanCardProps> = ({ plan, userId, subscribedPlanId, ope
</div>
<div className="card-footer">
{hasDescription() && <div className="plan-description" dangerouslySetInnerHTML={{ __html: plan.description }}/>}
{hasAttachment() && <a className="info-link" href={ plan.plan_file_url } target="_blank" rel="noreferrer">{ t('app.public.plans.more_information') }</a>}
{hasAttachment() && <a className="info-link" href={ plan.plan_file_url } target="_blank" rel="noreferrer">{ t('app.public.plan_card.more_information') }</a>}
{mustLogin() && <div className="cta-button">
<button className="subscribe-button" onClick={handleLoginRequest}>{t('app.public.plans.i_subscribe_online')}</button>
<button className="subscribe-button" onClick={handleLoginRequest}>{t('app.public.plan_card.i_subscribe_online')}</button>
</div>}
{canSubscribeForMe() && <div className="cta-button">
{!hasSubscribedToThisPlan() && <button className={`subscribe-button ${isSelected ? 'selected-card' : ''}`}
onClick={handleSelectPlan}
disabled={!_.isNil(subscribedPlanId)}>
{t('app.public.plans.i_choose_that_plan')}
{t('app.public.plan_card.i_choose_that_plan')}
</button>}
{hasSubscribedToThisPlan() && <button className="subscribe-button selected-card" disabled>
{ t('app.public.plans.i_already_subscribed') }
{ t('app.public.plan_card.i_already_subscribed') }
</button>}
</div>}
{canSubscribeForOther() && <div className="cta-button">
<button className={`subscribe-button ${isSelected ? 'selected-card' : ''}`}
onClick={handleSelectPlan}
disabled={_.isNil(userId)}>
<span>{ t('app.public.plans.i_choose_that_plan') }</span>
<span>{ t('app.public.plan_card.i_choose_that_plan') }</span>
</button>
</div>}
</div>

View File

@ -14,7 +14,7 @@ interface ExtendedPriceFormProps {
}
/**
* A form component to create/edit a extended price.
* A form component to create/edit an extended price.
* The form validation must be created elsewhere, using the attribute form={formId}.
*/
export const ExtendedPriceForm: React.FC<ExtendedPriceFormProps> = ({ formId, onSubmit, price }) => {

View File

@ -21,7 +21,7 @@ interface ProfileFormOptionProps {
}
/**
* After first logged-in from a SSO, the user has two options:
* After first logged-in from an SSO, the user has two options:
* - complete his profile (*) ;
* - bind his profile to his existing account ;
* (*) This component handle the first case.

View File

@ -4,7 +4,7 @@
border-collapse: separate;
box-sizing: border-box;
label.label {
label {
padding: 6px 12px;
font-size: 16px;
font-weight: 400;
@ -22,7 +22,7 @@
border-right: 0;
}
input.input {
input {
padding: 6px 12px;
height: 38px;
font-size: 16px;

View File

@ -34,7 +34,7 @@
<ng-include src="'/admin/invoices/list.html'"></ng-include>
</uib-tab>
<uib-tab heading="{{ 'app.admin.invoices.payment_schedules_list' | translate }}" ng-show="$root.modules.invoicing" index="4" class="payment-schedules-list">
<uib-tab heading="{{ 'app.admin.invoices.payment_schedules' | translate }}" ng-show="$root.modules.invoicing" index="4" class="payment-schedules-list">
<payment-schedules-list current-user="currentUser" on-error="onError" on-card-update-success="onCardUpdateSuccess" />
</uib-tab>
@ -58,7 +58,7 @@
<ng-include src="'/admin/invoices/list.html'"></ng-include>
</uib-tab>
<uib-tab heading="{{ 'app.admin.invoices.payment_schedules_list' | translate }}" index="4" class="payment-schedules-list">
<uib-tab heading="{{ 'app.admin.invoices.payment_schedules' | translate }}" index="4" class="payment-schedules-list">
<payment-schedules-list current-user="currentUser" on-error="onError" on-card-update-success="onCardUpdateSuccess" />
</uib-tab>
</uib-tabset>

View File

@ -447,26 +447,29 @@ en:
description: "Description"
significance: "Significance"
manage_plan_category:
create: "New category"
update: "Edit the category"
plan_category_form:
name: "Name"
description: "Description"
significance: "Significance"
info: "Categories will be shown ordered by signifiance. The higher you set the significance, the first the category will be shown."
create_category:
create:
title: "New category"
cta: "Create the category"
success: "The new category was successfully created"
error: "Unable to create the category: "
update_category:
update:
title: "Edit the category"
cta: "Validate"
success: "The category was successfully updated"
error: "Unable to update the category: "
delete_category:
title: "Delete a category"
confirm: "Are you sure you want to delete this category? If you do, the plans associated with this category won't be sorted anymore."
cta: "Delete"
success: "The category was successfully deleted"
error: "Unable to delete the category: "
delete_plan_category:
title: "Delete a category"
confirm: "Are you sure you want to delete this category? If you do, the plans associated with this category won't be sorted anymore."
cta: "Delete"
success: "The category was successfully deleted"
error: "Unable to delete the category: "
#ajouter un code promotionnel
coupons_new:
add_a_coupon: "Add a coupon"
@ -513,7 +516,7 @@ en:
credit_note: "Credit note"
display_more_invoices: "Display more invoices..."
no_invoices_for_now: "No invoices for now."
payment_schedules_list: "Payment schedules"
payment_schedules: "Payment schedules"
invoicing_settings: "Invoicing settings"
warning_invoices_disabled: "Warning: invoices are not enabled. No invoices will be generated by Fab-manager. Nevertheless, you must correctly fill the information below, especially VAT."
change_logo: "Change logo"
@ -748,20 +751,27 @@ en:
end_date: "End date"
vat_rate: "VAT rate"
amount: "Total amount"
payzen_keys_form:
payzen_keys_info_html: "<p>To be able to collect online payments, you must configure the <a href='https://payzen.eu' target='_blank'>PayZen</a> identifiers and keys.</p><p>Retrieve them from <a href='https://secure.payzen.eu/vads-merchant/' target='_blank'>your merchant back office</a>.</p>"
client_keys: "Client key"
payzen_keys: "PayZen keys"
payzen_username: "Username"
payzen_password: "Password"
payzen_endpoint: "REST API server name"
payzen_hmac: "HMAC-SHA-256 key"
stripe_keys_form:
stripe_keys_info_html: "<p>To be able to collect online payments, you must configure the <a href='https://stripe.com' target='_blank'>Stripe</a> API keys.</p><p>Retrieve them from <a href='https://dashboard.stripe.com/account/apikeys' target='_blank'>your dashboard</a>.</p><p>Updating these keys will trigger a synchronization of all users on Stripe, this may take some time. You'll receive a notification when it's done.</p>"
public_key: "Public key"
secret_key: "Secret key"
payment:
payment_settings: "Payment settings"
online_payment: "Online payment"
online_payment_info_html: "You can enable your members to book directly online, paying by card. Alternatively, you can restrict the booking and payment processes for administrators and managers."
enable_online_payment: "Enable online payment"
stripe_keys: "Stripe keys"
stripe_keys_info_html: "<p>To be able to collect online payments, you must configure the <a href='https://stripe.com' target='_blank'>Stripe</a> API keys.</p><p>Retrieve them from <a href='https://dashboard.stripe.com/account/apikeys' target='_blank'>your dashboard</a>.</p><p>Updating these keys will trigger a synchronization of all users on Stripe, this may take some time. You'll receive a notification when it's done.</p>"
public_key: "Public key"
secret_key: "Secret key"
error_check_keys: "Error: please check your Stripe keys."
stripe_keys_saved: "Stripe keys successfully saved."
error_saving_stripe_keys: "Unable to save the Stripe keys. Please try again later."
payzen_keys_info_html: "<p>To be able to collect online payments, you must configure the <a href='https://payzen.eu' target='_blank'>PayZen</a> identifiers and keys.</p><p>Retrieve them from <a href='https://secure.payzen.eu/vads-merchant/' target='_blank'>your merchant back office</a>.</p>"
client_keys: "Client key"
api_keys: "API keys"
edit_keys: "Edit keys"
currency: "Currency"
@ -770,11 +780,6 @@ en:
stripe_currency: "Stripe currency"
gateway_configuration_error: "An error occurred while configuring the payment gateway: "
payzen:
payzen_keys: "PayZen keys"
payzen_username: "Username"
payzen_password: "Password"
payzen_endpoint: "REST API server name"
payzen_hmac: "HMAC-SHA-256 key"
payzen_public_key: "Client public key"
currency: "Currency"
payzen_currency: "PayZen currency"
@ -791,7 +796,7 @@ en:
stripe: "Stripe"
payzen: "PayZen"
confirm_button: "Validate the gateway"
payment_schedules:
payment_schedules_list:
filter_schedules: "Filter schedules"
no_payment_schedules: "No payment schedules to display"
load_more: "Load more"
@ -1646,9 +1651,7 @@ en:
report_will_be_destroyed: "Once the report has been processed, it will be deleted. This can't be undone, continue?"
report_removed: "The report has been deleted"
failed_to_remove: "An error occurred, unable to delete the report"
local_payment:
validate_cart: "Validate my cart"
offline_payment: "Payment on site"
local_payment_form:
about_to_cash: "You're about to confirm the cashing by an external payment mean. Please do not click on the button below until you have fully cashed the requested payment."
about_to_confirm: "You're about to confirm your {ITEM, select, subscription{subscription} other{reservation}}."
payment_method: "Payment method"
@ -1659,6 +1662,9 @@ en:
check_collection_info: "By validating, you confirm that you have {DEADLINES} checks, allowing you to collect all the monthly payments."
transfer_collection_info: "<p>By validating, you confirm that you set up {DEADLINES} bank direct debits, allowing you to collect all the monthly payments.</p><p><strong>Please note:</strong> the bank transfers are not automatically handled by Fab-manager.</p>"
online_payment_disabled: "Online payment is not available. You cannot collect this payment schedule by online card."
local_payment_modal:
validate_cart: "Validate my cart"
offline_payment: "Payment on site"
check_list_setting:
save: 'Save'
customization_of_SETTING_successfully_saved: "Customization of the {SETTING} successfully saved."

View File

@ -128,7 +128,7 @@ en:
download_the_invoice: "Download the invoice"
download_the_credit_note: "Download the refund invoice"
no_invoices_for_now: "No invoices for now."
payment_schedules:
payment_schedules_dashboard:
no_payment_schedules: "No payment schedules to display"
load_more: "Load more"
card_updated_success: "Your card was successfully updated"

View File

@ -150,15 +150,16 @@ en:
#next events summary on the home page
fablab_s_next_events: "Fablab's next events"
every_events: "Every events"
from_date_to_date: "From {START} to {END}"
event_card:
on_the_date: "On the {DATE}"
from_date_to_date: "From {START} to {END}"
from_time_to_time: "From {START} to {END}"
all_day: "All day"
still_available: "Available place(s): "
event_full: "Event full"
without_reservation: "Without reservation"
free_admission: "Free admission"
full_price: "Full price: "
event_full: "Event full"
still_available: "Available place(s): "
all_day: "All day"
#projects gallery
projects_list:
the_fablab_projects: "The Fab Lab projects"
@ -244,16 +245,17 @@ en:
unauthorized_operation: "Unauthorized operation"
confirmation_required: "Confirmation required"
the_training_cant_be_deleted_because_it_is_already_reserved_by_some_users: "The training can't be deleted because it's already reserved by some users."
plan_card:
AMOUNT_per_month: "{AMOUNT} / month"
i_subscribe_online: "I subscribe online"
more_information: "More information"
i_choose_that_plan: "I choose that plan"
i_already_subscribed: "I already subscribed"
#summary of the subscriptions
plans:
subscriptions: "Subscriptions"
i_choose_that_plan: "I choose that plan"
i_subscribe_online: "I subscribe online"
i_already_subscribed: "I already subscribed"
more_information: "More information"
your_subscription_expires_on_the_DATE: "Your subscription expires on the {DATE}"
no_plans: "No plans are available for your group"
AMOUNT_per_month: "{AMOUNT} / month"
my_group: "My group"
his_group: "User's group"
he_wants_to_change_group: "Change group"

View File

@ -21,7 +21,6 @@ en:
messages:
you_will_lose_any_unsaved_modification_if_you_quit_this_page: "You will lose any unsaved modification if you quit this page"
you_will_lose_any_unsaved_modification_if_you_reload_this_page: "You will lose any unsaved modification if you reload this page"
payment_card_error: "A problem has occurred with your credit card:"
payment_card_declined: "Your card was declined."
change_group:
title: "{OPERATOR, select, self{My group} other{User's group}}"
@ -29,15 +28,22 @@ en:
cancel: "Cancel"
validate: "Validate group change"
success: "Group successfully changed"
stripe_form:
payment_card_error: "A problem occurred with your payment card:"
#text editor
text_editor:
text_placeholder: "Type something…"
link_placeholder: "Paste link…"
url_placeholder: "Paste url…"
new_tab: "Open in a new tab"
add_link: "Insert a link"
add_video: "Embed a video"
add_image: "Insert an image"
fab_text_editor:
text_placeholder: "Type something…"
menu_bar:
link_placeholder: "Paste link…"
url_placeholder: "Paste url…"
new_tab: "Open in a new tab"
add_link: "Insert a link"
add_video: "Embed a video"
add_image: "Insert an image"
#modal dialog
fab_modal:
close: "Close"
fab_socials:
follow_us: "Follow us"
networks_update_success: "Social networks update successful"
@ -161,7 +167,7 @@ en:
start_typing: "Start typing..."
member_not_validated: "Attention:</br> The member has not validated."
#payment modal
payment:
abstract_payment_modal:
online_payment: "Online payment"
i_have_read_and_accept_: "I have read, and accept "
_the_general_terms_and_conditions: "the general terms and conditions."
@ -405,6 +411,15 @@ en:
default_places: "Default maximum tickets"
default_places_is_required: "Default maximum tickets is required."
disable_space: "Disable space"
payment_schedule_summary:
your_payment_schedule: "Your payment schedule"
NUMBER_monthly_payment_of_AMOUNT: "{NUMBER} monthly {NUMBER, plural, =1{payment} other{payments}} of {AMOUNT}"
first_debit: "First debit on the day of the order."
monthly_payment_NUMBER: "{NUMBER}{NUMBER, plural, =1{st} =2{nd} =3{rd} other{th}} monthly payment: "
debit: "Debit on the day of the order."
view_full_schedule: "View the complete payment schedule"
select_schedule:
monthly_payment: "Monthly payment"
#shopping cart module for reservations
cart:
summary: "Summary"
@ -422,13 +437,6 @@ en:
cost_of_the_subscription: "Cost of the subscription"
subscription_price: "Subscription price"
you_ve_just_selected_a_subscription_html: "You've just selected a <strong>subscription</strong>:"
monthly_payment: "Monthly payment"
your_payment_schedule: "Your payment schedule"
monthly_payment_NUMBER: "{NUMBER}{NUMBER, plural, =1{st} =2{nd} =3{rd} other{th}} monthly payment: "
NUMBER_monthly_payment_of_AMOUNT: "{NUMBER} monthly {NUMBER, plural, =1{payment} other{payments}} of {AMOUNT}"
first_debit: "First debit on the day of the order."
debit: "Debit on the day of the order."
view_full_schedule: "View the complete payment schedule"
confirm_and_pay: "Confirm and pay"
you_have_settled_the_following_TYPE: "You have settled the following {TYPE, select, Machine{machine slots} Training{training} other{elements}}:"
you_have_settled_a_: "You have settled a"
@ -483,12 +491,15 @@ en:
what_to_do: "What do you want to do?"
tour: "Start the feature tour"
guide: "Open the user's manual"
stripe_confirm_modal:
resolve_action: "Resolve the action"
ok_button: "OK"
# 2nd factor authentication for card payments
stripe_confirm:
pending: "Pending for action..."
success: "Thank you, your card setup is complete. The payment will be proceeded shortly."
# the summary table of all payment schedules
schedules_table:
payment_schedules_table:
schedule_num: "Schedule #"
date: "Date"
price: "Price"
@ -524,7 +535,7 @@ en:
confirm_bank_transfer: "Confirm the bank transfer"
confirm_bank_transfer_body: "You must confirm the receipt of {AMOUNT} for the deadline of {DATE}. By confirming the bank transfer, an invoice will be generated for this due date."
confirm_cancel_subscription: "You're about to cancel this payment schedule and the related subscription. Are you sure?"
payment_modal:
card_payment_modal:
online_payment_disabled: "Online payment is not available. Please contact the FabLab's reception directly."
unexpected_error: "An error occurred. Please report this issue to the Fab-Manager's team."
update_card_modal:

View File

@ -25,7 +25,7 @@
"@typescript-eslint/parser": "^5.17.0",
"eslint": "~8.12.0",
"eslint-config-standard": "~17.0.0-1",
"eslint-plugin-fabmanager": "^0.5.3",
"eslint-plugin-fabmanager": "^0.5.5",
"eslint-plugin-html-erb": "^1.0.1",
"eslint-plugin-import": "~2.25.4",
"eslint-plugin-n": "^15.1.0",

View File

@ -4082,10 +4082,10 @@ eslint-plugin-es@^4.1.0:
eslint-utils "^2.0.0"
regexpp "^3.0.0"
eslint-plugin-fabmanager@^0.5.3:
version "0.5.3"
resolved "https://registry.yarnpkg.com/eslint-plugin-fabmanager/-/eslint-plugin-fabmanager-0.5.3.tgz#28576314182943c999c4a42d4d9ff8a1a9eefa82"
integrity sha512-lubHoF0oSiCn1MaByyB3N7YS1QU0t+mxirDILlkPA/9m/puSF32AvMGd2ztKzYdYfPIOQlgHIO+dUEYBTRTc0A==
eslint-plugin-fabmanager@^0.5.5:
version "0.5.5"
resolved "https://registry.yarnpkg.com/eslint-plugin-fabmanager/-/eslint-plugin-fabmanager-0.5.5.tgz#675ab9e34fed0d92a3f290d1c38ba377d43d3a77"
integrity sha512-5rXy6UHYkT5Ql0m4nQZ0X+JgxYUMJqppG1ECQqMlp2IqBgJGaHePdcIXdXe8i0pXRfF7VmlIL0pN3ZaOxkm6sw==
dependencies:
requireindex "^1.2.0"