diff --git a/CHANGELOG.md b/CHANGELOG.md index b83d0f33f..280f90907 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Updated portuguese translations - Added automatic RuboCop validation on pre-commit +- Use union type instead of enum for SettingName - Fix a bug: wrong variable reference in `SingleSignOnConcern:Merge_form_sso` - Fix a bug: wrong focus behavior on text editor diff --git a/app/frontend/src/javascript/api/setting.ts b/app/frontend/src/javascript/api/setting.ts index 65c4188ec..5e6e985ea 100644 --- a/app/frontend/src/javascript/api/setting.ts +++ b/app/frontend/src/javascript/api/setting.ts @@ -55,7 +55,7 @@ export default class SettingAPI { itemData.localized = item.localized; } - map.set(item.name as SettingName, itemData); + map.set(item.name, itemData); }); return map; } diff --git a/app/frontend/src/javascript/components/dashboard/reservations/reservations-dashboard.tsx b/app/frontend/src/javascript/components/dashboard/reservations/reservations-dashboard.tsx index 6090bfbf9..71ac2a07c 100644 --- a/app/frontend/src/javascript/components/dashboard/reservations/reservations-dashboard.tsx +++ b/app/frontend/src/javascript/components/dashboard/reservations/reservations-dashboard.tsx @@ -20,17 +20,17 @@ const ReservationsDashboard: React.FC = ({ onError, const [modules, setModules] = useState>(); useEffect(() => { - SettingAPI.query([SettingName.SpacesModule, SettingName.MachinesModule]) + SettingAPI.query(['spaces_module', 'machines_module']) .then(res => setModules(res)) .catch(error => onError(error)); }, []); return (
- {modules?.get(SettingName.MachinesModule) !== 'false' && } - {modules?.get(SettingName.SpacesModule) !== 'false' && } - {modules?.get(SettingName.MachinesModule) !== 'false' && } - {modules?.get(SettingName.SpacesModule) !== 'false' && } + {modules?.get('machines_module') !== 'false' && } + {modules?.get('spaces_module') !== 'false' && } + {modules?.get('machines_module') !== 'false' && } + {modules?.get('spaces_module') !== 'false' && }
); }; diff --git a/app/frontend/src/javascript/components/group/change-group.tsx b/app/frontend/src/javascript/components/group/change-group.tsx index 3f4c42e34..d8a59f80f 100644 --- a/app/frontend/src/javascript/components/group/change-group.tsx +++ b/app/frontend/src/javascript/components/group/change-group.tsx @@ -46,7 +46,7 @@ export const ChangeGroup: React.FC = ({ user, onSuccess, onErr useEffect(() => { GroupAPI.index({ disabled: false, admins: user?.role === 'admin' }).then(setGroups).catch(onError); MemberAPI.current().then(setOperator).catch(onError); - SettingAPI.get(SettingName.UserChangeGroup).then((setting) => { + SettingAPI.get('user_change_group').then((setting) => { setAllowedUserChangeGoup(setting.value === 'true'); }).catch(onError); }, []); diff --git a/app/frontend/src/javascript/components/machines/reserve-button.tsx b/app/frontend/src/javascript/components/machines/reserve-button.tsx index 367d663c3..2d0cdd6f6 100644 --- a/app/frontend/src/javascript/components/machines/reserve-button.tsx +++ b/app/frontend/src/javascript/components/machines/reserve-button.tsx @@ -46,7 +46,7 @@ const ReserveButton: React.FC = ({ currentUser, machineId, o // check the trainings after we retrieved the machine data useEffect(() => checkTraining(), [machine]); useEffect(() => { - SettingAPI.get(SettingName.PackOnlyForSubscription) + SettingAPI.get('pack_only_for_subscription') .then(data => setIsPackOnlyForSubscription(data.value === 'true')) .catch(error => onError(error)); }, []); diff --git a/app/frontend/src/javascript/components/payment-schedule/payment-schedules-table.tsx b/app/frontend/src/javascript/components/payment-schedule/payment-schedules-table.tsx index 911913036..719c70ec3 100644 --- a/app/frontend/src/javascript/components/payment-schedule/payment-schedules-table.tsx +++ b/app/frontend/src/javascript/components/payment-schedule/payment-schedules-table.tsx @@ -40,7 +40,7 @@ const PaymentSchedulesTable: React.FC = ({ paymentSc const [gateway, setGateway] = useState(null); useEffect(() => { - SettingAPI.get(SettingName.PaymentGateway) + SettingAPI.get('payment_gateway') .then(setting => setGateway(setting)) .catch(error => onError(error)); }, []); diff --git a/app/frontend/src/javascript/components/payment/abstract-payment-modal.tsx b/app/frontend/src/javascript/components/payment/abstract-payment-modal.tsx index 2fc93aae3..61ebb67f1 100644 --- a/app/frontend/src/javascript/components/payment/abstract-payment-modal.tsx +++ b/app/frontend/src/javascript/components/payment/abstract-payment-modal.tsx @@ -91,7 +91,7 @@ export const AbstractPaymentModal: React.FC = ({ isOp useEffect(() => { mounted.current = true; CustomAssetAPI.get(CustomAssetName.CgvFile).then(asset => setCgv(asset)); - SettingAPI.get(SettingName.PaymentGateway).then((setting) => { + SettingAPI.get('payment_gateway').then((setting) => { // we capitalize the first letter of the name if (setting.value) { setGateway(setting.value.replace(/^\w/, (c) => c.toUpperCase())); diff --git a/app/frontend/src/javascript/components/payment/card-payment-modal.tsx b/app/frontend/src/javascript/components/payment/card-payment-modal.tsx index 971f39278..9263eddb5 100644 --- a/app/frontend/src/javascript/components/payment/card-payment-modal.tsx +++ b/app/frontend/src/javascript/components/payment/card-payment-modal.tsx @@ -35,7 +35,7 @@ const CardPaymentModal: React.FC = ({ isOpen, toggleModal const [gateway, setGateway] = useState(null); useEffect(() => { - SettingAPI.get(SettingName.PaymentGateway) + SettingAPI.get('payment_gateway') .then(setting => setGateway(setting)) .catch(error => onError(error)); }, []); diff --git a/app/frontend/src/javascript/components/payment/local-payment/local-payment-form.tsx b/app/frontend/src/javascript/components/payment/local-payment/local-payment-form.tsx index c7878043f..aa0009b26 100644 --- a/app/frontend/src/javascript/components/payment/local-payment/local-payment-form.tsx +++ b/app/frontend/src/javascript/components/payment/local-payment/local-payment-form.tsx @@ -75,7 +75,7 @@ export const LocalPaymentForm: React.FC = ({ onSubmit, onSucce if (paymentSchedule && method === 'card') { // check that the online payment is active try { - const online = await SettingAPI.get(SettingName.OnlinePaymentModule); + const online = await SettingAPI.get('online_payment_module'); if (online.value !== 'true') { return onError(t('app.admin.local_payment_form.online_payment_disabled')); } diff --git a/app/frontend/src/javascript/components/payment/payzen/payzen-form.tsx b/app/frontend/src/javascript/components/payment/payzen/payzen-form.tsx index 55278d051..bae1b18e3 100644 --- a/app/frontend/src/javascript/components/payment/payzen/payzen-form.tsx +++ b/app/frontend/src/javascript/components/payment/payzen/payzen-form.tsx @@ -27,10 +27,10 @@ export const PayzenForm: React.FC = ({ onSubmit, onSuccess, onE const [loadingClass, setLoadingClass] = useState<'hidden' | 'loader' | 'loader-overlay'>('loader'); useEffect(() => { - SettingAPI.query([SettingName.PayZenEndpoint, SettingName.PayZenPublicKey]).then(settings => { + SettingAPI.query(['payzen_endpoint', 'payzen_public_key']).then(settings => { createToken().then(formToken => { // Load the remote library - KRGlue.loadLibrary(settings.get(SettingName.PayZenEndpoint), settings.get(SettingName.PayZenPublicKey)) + KRGlue.loadLibrary(settings.get('payzen_endpoint'), settings.get('payzen_public_key')) .then(({ KR }) => KR.setFormConfig({ formToken: formToken.formToken diff --git a/app/frontend/src/javascript/components/payment/payzen/payzen-keys-form.tsx b/app/frontend/src/javascript/components/payment/payzen/payzen-keys-form.tsx index ccb271223..4ad4abcb5 100644 --- a/app/frontend/src/javascript/components/payment/payzen/payzen-keys-form.tsx +++ b/app/frontend/src/javascript/components/payment/payzen/payzen-keys-form.tsx @@ -17,9 +17,9 @@ interface PayzenKeysFormProps { } // all settings related to PayZen that are requested by this form -const payZenSettings: Array = [SettingName.PayZenUsername, SettingName.PayZenPassword, SettingName.PayZenEndpoint, SettingName.PayZenHmacKey, SettingName.PayZenPublicKey]; -// settings related the to PayZen REST API (server side) -const restApiSettings: Array = [SettingName.PayZenUsername, SettingName.PayZenPassword, SettingName.PayZenEndpoint, SettingName.PayZenHmacKey]; +const payzenSettings: Array = ['payzen_username', 'payzen_password', 'payzen_endpoint', 'payzen_hmac', 'payzen_public_key']; +// settings related to the PayZen REST API (server side) +const restApiSettings: Array = ['payzen_username', 'payzen_password', 'payzen_endpoint', 'payzen_hmac']; // Prevent multiples call to the payzen keys validation endpoint. // this cannot be handled by a React state because of their asynchronous nature @@ -32,7 +32,7 @@ const PayzenKeysForm: React.FC = ({ onValidKeys, onInvalidK const { t } = useTranslation('admin'); // values of the PayZen settings - const [settings, updateSettings] = useImmer>(new Map(payZenSettings.map(name => [name, '']))); + const [settings, updateSettings] = useImmer>(new Map(payzenSettings.map(name => [name, '']))); // Icon of the fieldset for the PayZen's keys concerning the REST API. Used to display if the key is valid. const [restApiAddOn, setRestApiAddOn] = useState(null); // Style class for the add-on icon, for the REST API @@ -46,7 +46,7 @@ const PayzenKeysForm: React.FC = ({ onValidKeys, onInvalidK * When the component loads for the first time, initialize the keys with the values fetched from the API (if any) */ useEffect(() => { - SettingAPI.query(payZenSettings).then(payZenKeys => { + SettingAPI.query(payzenSettings).then(payZenKeys => { updateSettings(new Map(payZenKeys)); }).catch(error => console.error(error)); }, []); @@ -78,7 +78,7 @@ const PayzenKeysForm: React.FC = ({ onValidKeys, onInvalidK setPublicKeyAddOnClassName('key-invalid'); return; } - updateSettings(draft => draft.set(SettingName.PayZenPublicKey, key)); + updateSettings(draft => draft.set('payzen_public_key', key)); setPublicKeyAddOn(); setPublicKeyAddOnClassName('key-valid'); }; @@ -94,9 +94,9 @@ const PayzenKeysForm: React.FC = ({ onValidKeys, onInvalidK if (valid && !pendingKeysValidation) { pendingKeysValidation = true; PayzenAPI.chargeSDKTest( - settings.get(SettingName.PayZenEndpoint), - settings.get(SettingName.PayZenUsername), - settings.get(SettingName.PayZenPassword) + settings.get('payzen_endpoint'), + settings.get('payzen_username'), + settings.get('payzen_password') ).then(result => { pendingKeysValidation = false; @@ -123,7 +123,7 @@ const PayzenKeysForm: React.FC = ({ onValidKeys, onInvalidK /** * Assign the inputted key to the given settings */ - const setApiKey = (setting: SettingName.PayZenUsername | SettingName.PayZenPassword | SettingName.PayZenEndpoint | SettingName.PayZenHmacKey) => { + const setApiKey = (setting: typeof restApiSettings[number]) => { return (key: string) => { updateSettings(draft => draft.set(setting, key)); }; @@ -148,7 +148,7 @@ const PayzenKeysForm: React.FC = ({ onValidKeys, onInvalidK } - defaultValue={settings.get(SettingName.PayZenPublicKey)} + defaultValue={settings.get('payzen_public_key')} onChange={testPublicKey} addOn={publicKeyAddOn} addOnClassName={publicKeyAddOnClassName} @@ -166,8 +166,8 @@ const PayzenKeysForm: React.FC = ({ onValidKeys, onInvalidK } - defaultValue={settings.get(SettingName.PayZenUsername)} - onChange={setApiKey(SettingName.PayZenUsername)} + defaultValue={settings.get('payzen_username')} + onChange={setApiKey('payzen_username')} debounce={200} required /> @@ -175,8 +175,8 @@ const PayzenKeysForm: React.FC = ({ onValidKeys, onInvalidK } - defaultValue={settings.get(SettingName.PayZenPassword)} - onChange={setApiKey(SettingName.PayZenPassword)} + defaultValue={settings.get('payzen_password')} + onChange={setApiKey('payzen_password')} debounce={200} required /> @@ -185,8 +185,8 @@ const PayzenKeysForm: React.FC = ({ onValidKeys, onInvalidK } - defaultValue={settings.get(SettingName.PayZenEndpoint)} - onChange={setApiKey(SettingName.PayZenEndpoint)} + defaultValue={settings.get('payzen_endpoint')} + onChange={setApiKey('payzen_endpoint')} debounce={200} required /> @@ -194,8 +194,8 @@ const PayzenKeysForm: React.FC = ({ onValidKeys, onInvalidK } - defaultValue={settings.get(SettingName.PayZenHmacKey)} - onChange={setApiKey(SettingName.PayZenHmacKey)} + defaultValue={settings.get('payzen_hmac')} + onChange={setApiKey('payzen_hmac')} debounce={200} required /> diff --git a/app/frontend/src/javascript/components/payment/payzen/payzen-settings.tsx b/app/frontend/src/javascript/components/payment/payzen/payzen-settings.tsx index 706f8fab4..47e469006 100644 --- a/app/frontend/src/javascript/components/payment/payzen/payzen-settings.tsx +++ b/app/frontend/src/javascript/components/payment/payzen/payzen-settings.tsx @@ -21,21 +21,21 @@ interface PayzenSettingsProps { const PAYZEN_HIDDEN = 'HiDdEnHIddEnHIdDEnHiDdEnHIddEnHIdDEn'; // settings related to PayZen that can be shown publicly -const payZenPublicSettings: Array = [SettingName.PayZenPublicKey, SettingName.PayZenEndpoint, SettingName.PayZenUsername]; +const payZenPublicSettings: Array = ['payzen_public_key', 'payzen_endpoint', 'payzen_username']; // settings related to PayZen that must be kept on server-side -const payZenPrivateSettings: Array = [SettingName.PayZenPassword, SettingName.PayZenHmacKey]; +const payZenPrivateSettings: Array = ['payzen_password', 'payzen_hmac']; // other settings related to PayZen -const payZenOtherSettings: Array = [SettingName.PayZenCurrency]; +const payZenOtherSettings: Array = ['payzen_currency']; // all PayZen settings const payZenSettings: Array = payZenPublicSettings.concat(payZenPrivateSettings).concat(payZenOtherSettings); // icons for the inputs of each setting const icons:Map = new Map([ - [SettingName.PayZenHmacKey, 'subscript'], - [SettingName.PayZenPassword, 'key'], - [SettingName.PayZenUsername, 'user'], - [SettingName.PayZenEndpoint, 'link'], - [SettingName.PayZenPublicKey, 'info'] + ['payzen_hmac', 'subscript'], + ['payzen_password', 'key'], + ['payzen_username', 'user'], + ['payzen_endpoint', 'link'], + ['payzen_public_key', 'info'] ]); /** @@ -55,11 +55,11 @@ export const PayzenSettings: React.FC = ({ onEditKeys, onCu */ useEffect(() => { SettingAPI.query(payZenPublicSettings.concat(payZenOtherSettings)).then(payZenKeys => { - SettingAPI.isPresent(SettingName.PayZenPassword).then(pzPassword => { - SettingAPI.isPresent(SettingName.PayZenHmacKey).then(pzHmac => { + SettingAPI.isPresent('payzen_password').then(pzPassword => { + SettingAPI.isPresent('payzen_hmac').then(pzHmac => { const map = new Map(payZenKeys); - map.set(SettingName.PayZenPassword, pzPassword ? PAYZEN_HIDDEN : ''); - map.set(SettingName.PayZenHmacKey, pzHmac ? PAYZEN_HIDDEN : ''); + map.set('payzen_password', pzPassword ? PAYZEN_HIDDEN : ''); + map.set('payzen_hmac', pzHmac ? PAYZEN_HIDDEN : ''); updateSettings(map); }).catch(error => { console.error(error); }); @@ -81,7 +81,7 @@ export const PayzenSettings: React.FC = ({ onEditKeys, onCu const handleCurrencyUpdate = (value: string, validity?: ValidityState): void => { if (!validity || validity.valid) { setError(''); - updateSettings(draft => draft.set(SettingName.PayZenCurrency, value)); + updateSettings(draft => draft.set('payzen_currency', value)); } else { setError(t('app.admin.invoices.payment.payzen_settings.currency_error')); } @@ -92,9 +92,9 @@ export const PayzenSettings: React.FC = ({ onEditKeys, onCu * This will update the setting on the server. */ const saveCurrency = (): void => { - SettingAPI.update(SettingName.PayZenCurrency, settings.get(SettingName.PayZenCurrency)).then(result => { + SettingAPI.update('payzen_currency', settings.get('payzen_currency')).then(result => { setError(''); - updateSettings(draft => draft.set(SettingName.PayZenCurrency, result.value)); + updateSettings(draft => draft.set('payzen_currency', result.value)); onCurrencyUpdateSuccess(result.value); }, reason => { setError(t('app.admin.invoices.payment.payzen_settings.error_while_saving') + reason); @@ -130,7 +130,7 @@ export const PayzenSettings: React.FC = ({ onEditKeys, onCu
- } onChange={handleCurrencyUpdate} diff --git a/app/frontend/src/javascript/components/payment/select-gateway-modal.tsx b/app/frontend/src/javascript/components/payment/select-gateway-modal.tsx index cdd8dc3df..23d48df7d 100644 --- a/app/frontend/src/javascript/components/payment/select-gateway-modal.tsx +++ b/app/frontend/src/javascript/components/payment/select-gateway-modal.tsx @@ -38,7 +38,7 @@ export const SelectGatewayModal: React.FC = ({ isO // request the configured gateway to the API useEffect(() => { - SettingAPI.get(SettingName.PaymentGateway).then(gateway => { + SettingAPI.get('payment_gateway').then(gateway => { setSelectedGateway(gateway.value ? gateway.value : ''); }); }, []); @@ -73,8 +73,8 @@ export const SelectGatewayModal: React.FC = ({ isO const handleValidStripeKeys = (publicKey: string, secretKey: string): void => { setGatewayConfig((prev) => { const newMap = new Map(prev); - newMap.set(SettingName.StripeSecretKey, secretKey); - newMap.set(SettingName.StripePublicKey, publicKey); + newMap.set('stripe_secret_key', secretKey); + newMap.set('stripe_public_key', publicKey); return newMap; }); setPreventConfirmGateway(false); @@ -100,7 +100,7 @@ export const SelectGatewayModal: React.FC = ({ isO */ const updateSettings = (): void => { const settings = new Map(gatewayConfig); - settings.set(SettingName.PaymentGateway, selectedGateway); + settings.set('payment_gateway', selectedGateway); SettingAPI.bulkUpdate(settings, true).then(result => { const errorResults = Array.from(result.values()).filter(item => !item.status); diff --git a/app/frontend/src/javascript/components/payment/stripe/stripe-elements.tsx b/app/frontend/src/javascript/components/payment/stripe/stripe-elements.tsx index 68a912733..803140f63 100644 --- a/app/frontend/src/javascript/components/payment/stripe/stripe-elements.tsx +++ b/app/frontend/src/javascript/components/payment/stripe/stripe-elements.tsx @@ -14,7 +14,7 @@ export const StripeElements: React.FC = memo(({ children }) => { * When this component is mounted, we initialize the tag with the Stripe's public key */ useEffect(() => { - SettingAPI.get(SettingName.StripePublicKey).then(key => { + SettingAPI.get('stripe_public_key').then(key => { if (key?.value) { const promise = loadStripe(key.value); setStripe(promise); diff --git a/app/frontend/src/javascript/components/payment/stripe/stripe-keys-form.tsx b/app/frontend/src/javascript/components/payment/stripe/stripe-keys-form.tsx index ee01742ce..9c96ae6fe 100644 --- a/app/frontend/src/javascript/components/payment/stripe/stripe-keys-form.tsx +++ b/app/frontend/src/javascript/components/payment/stripe/stripe-keys-form.tsx @@ -42,9 +42,9 @@ const StripeKeysForm: React.FC = ({ onValidKeys, onInvalidK useEffect(() => { mounted.current = true; - SettingAPI.query([SettingName.StripePublicKey, SettingName.StripeSecretKey]).then(stripeKeys => { - setPublicKey(stripeKeys.get(SettingName.StripePublicKey)); - setSecretKey(stripeKeys.get(SettingName.StripeSecretKey)); + SettingAPI.query(['stripe_public_key', 'stripe_secret_key']).then(stripeKeys => { + setPublicKey(stripeKeys.get('stripe_public_key')); + setSecretKey(stripeKeys.get('stripe_secret_key')); }).catch(error => console.error(error)); // when the component unmounts, mark it as unmounted diff --git a/app/frontend/src/javascript/components/prepaid-packs/packs-summary.tsx b/app/frontend/src/javascript/components/prepaid-packs/packs-summary.tsx index 1723bddc8..ea5682538 100644 --- a/app/frontend/src/javascript/components/prepaid-packs/packs-summary.tsx +++ b/app/frontend/src/javascript/components/prepaid-packs/packs-summary.tsx @@ -44,10 +44,10 @@ const PacksSummary: React.FC = ({ item, itemType, customer, o const [isPackOnlyForSubscription, setIsPackOnlyForSubscription] = useState(true); useEffect(() => { - SettingAPI.get(SettingName.RenewPackThreshold) + SettingAPI.get('renew_pack_threshold') .then(data => setThreshold(parseFloat(data.value))) .catch(error => onError(error)); - SettingAPI.get(SettingName.PackOnlyForSubscription) + SettingAPI.get('pack_only_for_subscription') .then(data => setIsPackOnlyForSubscription(data.value === 'true')) .catch(error => onError(error)); }, []); diff --git a/app/frontend/src/javascript/components/profile-completion/completion-header-info.tsx b/app/frontend/src/javascript/components/profile-completion/completion-header-info.tsx index fc6085873..7b66a8d9e 100644 --- a/app/frontend/src/javascript/components/profile-completion/completion-header-info.tsx +++ b/app/frontend/src/javascript/components/profile-completion/completion-header-info.tsx @@ -6,7 +6,7 @@ import { Loader } from '../base/loader'; import { react2angular } from 'react2angular'; import { IApplication } from '../../models/application'; import SettingAPI from '../../api/setting'; -import { SettingName } from '../../models/setting'; +import { SettingName, titleSettings } from '../../models/setting'; import UserLib from '../../lib/user'; declare const Application: IApplication; @@ -27,7 +27,7 @@ export const CompletionHeaderInfo: React.FC = ({ user const userLib = new UserLib(user); useEffect(() => { - SettingAPI.query([SettingName.NameGenre, SettingName.FablabName]).then(setSettings).catch(onError); + SettingAPI.query(titleSettings).then(setSettings).catch(onError); }, []); return ( @@ -39,8 +39,8 @@ export const CompletionHeaderInfo: React.FC = ({ user

{t('app.logged.profile_completion.completion_header_info.sso_intro', { - GENDER: settings?.get(SettingName.NameGenre), - NAME: settings?.get(SettingName.FablabName) + GENDER: settings?.get('name_genre'), + NAME: settings?.get('fablab_name') })} diff --git a/app/frontend/src/javascript/components/settings/user-validation-setting.tsx b/app/frontend/src/javascript/components/settings/user-validation-setting.tsx index 414d016a2..9c65b5ed3 100644 --- a/app/frontend/src/javascript/components/settings/user-validation-setting.tsx +++ b/app/frontend/src/javascript/components/settings/user-validation-setting.tsx @@ -36,7 +36,7 @@ export const UserValidationSetting: React.FC = ({ on const updateSetting = (name: SettingName, value: string) => { SettingAPI.update(name, value) .then(() => { - if (name === SettingName.UserValidationRequired) { + if (name === 'user_validation_required') { onSuccess(t('app.admin.settings.account.user_validation_setting.customization_of_SETTING_successfully_saved', { SETTING: t(`app.admin.settings.account.${name}`) // eslint-disable-line fabmanager/scoped-translation })); @@ -45,7 +45,7 @@ export const UserValidationSetting: React.FC = ({ on if (err.status === 304) return; if (err.status === 423) { - if (name === SettingName.UserValidationRequired) { + if (name === 'user_validation_required') { onError(t('app.admin.settings.account.user_validation_setting.error_SETTING_locked', { SETTING: t(`app.admin.settings.account.${name}`) // eslint-disable-line fabmanager/scoped-translation })); @@ -62,19 +62,19 @@ export const UserValidationSetting: React.FC = ({ on * Callback triggered when the 'save' button is clicked. */ const handleSave = () => { - updateSetting(SettingName.UserValidationRequired, userValidationRequired); + updateSetting('user_validation_required', userValidationRequired); if (userValidationRequiredList !== null) { if (userValidationRequired === 'true') { - updateSetting(SettingName.UserValidationRequiredList, userValidationRequiredList); + updateSetting('user_validation_required_list', userValidationRequiredList); } else { - updateSetting(SettingName.UserValidationRequiredList, null); + updateSetting('user_validation_required_list', null); } } }; return (

- = ({ on {t('app.admin.settings.account.user_validation_setting.user_validation_required_list_other_info')} - = ({ show = false, onError, onSuccess }) => { const { t } = useTranslation('shared'); - // regular expression to validate the the input fields + // regular expression to validate the input fields const urlRegex = /^(https?:\/\/)([\da-z.-]+)\.([-a-z\d.]{2,30})([/\w .-]*)*\/?$/; const { handleSubmit, register, setValue, formState } = useForm(); diff --git a/app/frontend/src/javascript/components/user/user-profile-form.tsx b/app/frontend/src/javascript/components/user/user-profile-form.tsx index 18feb3570..1c449c0e5 100644 --- a/app/frontend/src/javascript/components/user/user-profile-form.tsx +++ b/app/frontend/src/javascript/components/user/user-profile-form.tsx @@ -99,7 +99,7 @@ export const UserProfileForm: React.FC = ({ action, size, }); setValue('invoicing_profile_attributes.user_profile_custom_fields_attributes', userProfileCustomFields); }).catch(error => onError(error)); - SettingAPI.query([SettingName.PhoneRequired, SettingName.AddressRequired]) + SettingAPI.query(['phone_required', 'address_required']) .then(settings => setRequiredFieldsSettings(settings)) .catch(error => onError(error)); }, []); @@ -219,7 +219,7 @@ export const UserProfileForm: React.FC = ({ action, size, value: phoneRegex, message: t('app.shared.user_profile_form.phone_number_invalid') }, - required: requiredFieldsSettings.get(SettingName.PhoneRequired) === 'true' + required: requiredFieldsSettings.get('phone_required') === 'true' }} disabled={isDisabled} formState={formState} @@ -232,7 +232,7 @@ export const UserProfileForm: React.FC = ({ action, size,
diff --git a/app/frontend/src/javascript/models/setting.ts b/app/frontend/src/javascript/models/setting.ts index 84eb6ed02..144c53631 100644 --- a/app/frontend/src/javascript/models/setting.ts +++ b/app/frontend/src/javascript/models/setting.ts @@ -1,144 +1,242 @@ import { HistoryValue } from './history-value'; import { TDateISO } from '../typings/date-iso'; -export enum SettingName { - AboutTitle = 'about_title', - AboutBody = 'about_body', - AboutContacts = 'about_contacts', - PrivacyDraft = 'privacy_draft', - PrivacyBody = 'privacy_body', - PrivacyDpo = 'privacy_dpo', - TwitterName = 'twitter_name', - HomeBlogpost = 'home_blogpost', - MachineExplicationsAlert = 'machine_explications_alert', - TrainingExplicationsAlert = 'training_explications_alert', - TrainingInformationMessage = 'training_information_message', - SubscriptionExplicationsAlert = 'subscription_explications_alert', - InvoiceLogo = 'invoice_logo', - InvoiceReference = 'invoice_reference', - InvoiceCodeActive = 'invoice_code-active', - InvoiceCodeValue = 'invoice_code-value', - InvoiceOrderNb = 'invoice_order-nb', - InvoiceVATActive = 'invoice_VAT-active', - InvoiceVATRate = 'invoice_VAT-rate', - InvoiceVATRateMachine = 'invoice_VAT-rate_Machine', - InvoiceVATRateTraining = 'invoice_VAT-rate_Training', - InvoiceVATRateSpace = 'invoice_VAT-rate_Space', - InvoiceVATRateEvent = 'invoice_VAT-rate_Event', - InvoiceVATRateSubscription = 'invoice_VAT-rate_Subscription', - InvoiceText = 'invoice_text', - InvoiceLegals = 'invoice_legals', - BookingWindowStart = 'booking_window_start', - BookingWindowEnd = 'booking_window_end', - BookingMoveEnable = 'booking_move_enable', - BookingMoveDelay = 'booking_move_delay', - BookingCancelEnable = 'booking_cancel_enable', - BookingCancelDelay = 'booking_cancel_delay', - MainColor = 'main_color', - SecondaryColor = 'secondary_color', - FablabName = 'fablab_name', - NameGenre = 'name_genre', - ReminderEnable = 'reminder_enable', - ReminderDelay = 'reminder_delay', - EventExplicationsAlert = 'event_explications_alert', - SpaceExplicationsAlert = 'space_explications_alert', - VisibilityYearly = 'visibility_yearly', - VisibilityOthers = 'visibility_others', - DisplayNameEnable = 'display_name_enable', - MachinesSortBy = 'machines_sort_by', - AccountingJournalCode = 'accounting_journal_code', - AccountingCardClientCode = 'accounting_card_client_code', - AccountingCardClientLabel = 'accounting_card_client_label', - AccountingWalletClientCode = 'accounting_wallet_client_code', - AccountingWalletClientLabel = 'accounting_wallet_client_label', - AccountingOtherClientCode = 'accounting_other_client_code', - AccountingOtherClientLabel = 'accounting_other_client_label', - AccountingWalletCode = 'accounting_wallet_code', - AccountingWalletLabel = 'accounting_wallet_label', - AccountingVATCode = 'accounting_VAT_code', - AccountingVATLabel = 'accounting_VAT_label', - AccountingSubscriptionCode = 'accounting_subscription_code', - AccountingSubscriptionLabel = 'accounting_subscription_label', - AccountingMachineCode = 'accounting_Machine_code', - AccountingMachineLabel = 'accounting_Machine_label', - AccountingTrainingCode = 'accounting_Training_code', - AccountingTrainingLabel = 'accounting_Training_label', - AccountingEventCode = 'accounting_Event_code', - AccountingEventLabel = 'accounting_Event_label', - AccountingSpaceCode = 'accounting_Space_code', - AccountingSpaceLabel = 'accounting_Space_label', - HubLastVersion = 'hub_last_version', - HubPublicKey = 'hub_public_key', - FabAnalytics = 'fab_analytics', - LinkName = 'link_name', - HomeContent = 'home_content', - HomeCss = 'home_css', - Origin = 'origin', - Uuid = 'uuid', - PhoneRequired = 'phone_required', - TrackingId = 'tracking_id', - BookOverlappingSlots = 'book_overlapping_slots', - SlotDuration = 'slot_duration', - EventsInCalendar = 'events_in_calendar', - SpacesModule = 'spaces_module', - PlansModule = 'plans_module', - InvoicingModule = 'invoicing_module', - FacebookAppId = 'facebook_app_id', - TwitterAnalytics = 'twitter_analytics', - RecaptchaSiteKey = 'recaptcha_site_key', - RecaptchaSecretKey = 'recaptcha_secret_key', - FeatureTourDisplay = 'feature_tour_display', - EmailFrom = 'email_from', - DisqusShortname = 'disqus_shortname', - AllowedCadExtensions = 'allowed_cad_extensions', - AllowedCadMimeTypes = 'allowed_cad_mime_types', - OpenlabAppId = 'openlab_app_id', - OpenlabAppSecret = 'openlab_app_secret', - OpenlabDefault = 'openlab_default', - OnlinePaymentModule = 'online_payment_module', - StripePublicKey = 'stripe_public_key', - StripeSecretKey = 'stripe_secret_key', - StripeCurrency = 'stripe_currency', - InvoicePrefix = 'invoice_prefix', - ConfirmationRequired = 'confirmation_required', - WalletModule = 'wallet_module', - StatisticsModule = 'statistics_module', - UpcomingEventsShown = 'upcoming_events_shown', - PaymentSchedulePrefix = 'payment_schedule_prefix', - TrainingsModule = 'trainings_module', - AddressRequired = 'address_required', - PaymentGateway = 'payment_gateway', - PayZenUsername = 'payzen_username', - PayZenPassword = 'payzen_password', - PayZenEndpoint = 'payzen_endpoint', - PayZenPublicKey = 'payzen_public_key', - PayZenHmacKey = 'payzen_hmac', - PayZenCurrency = 'payzen_currency', - PublicAgendaModule = 'public_agenda_module', - RenewPackThreshold = 'renew_pack_threshold', - PackOnlyForSubscription = 'pack_only_for_subscription', - OverlappingCategories = 'overlapping_categories', - ExtendedPricesInSameDay = 'extended_prices_in_same_day', - PublicRegistrations = 'public_registrations', - SocialsFacebook = 'facebook', - SocialsTwitter = 'twitter', - SocialsViadeo = 'viadeo', - SocialsLinkedin = 'linkedin', - SocialsInstagram = 'instagram', - SocialsYoutube = 'youtube', - SocialsVimeo = 'vimeo', - SocialsDailymotion = 'dailymotion', - SocialsGithub = 'github', - SocialsEchosciences = 'echosciences', - SocialsPinterest = 'pinterest', - SocialsLastfm = 'lastfm', - SocialsFlickr = 'flickr', - MachinesModule = 'machines_module', - UserChangeGroup = 'user_change_group', - UserValidationRequired = 'user_validation_required', - UserValidationRequiredList = 'user_validation_required_list', - ShowUsernameInAdminList = 'show_username_in_admin_list' -} +export const homePageSettings = [ + 'twitter_name', + 'home_blogpost', + 'home_content', + 'home_css', + 'upcoming_events_shown' +]; + +export const privacyPolicySettings = [ + 'privacy_draft', + 'privacy_body', + 'privacy_dpo' +]; + +export const aboutPageSettings = [ + 'about_title', + 'about_body', + 'about_contacts', + 'link_name' +]; + +export const socialNetworksSettings = [ + 'facebook', + 'twitter', + 'viadeo', + 'linkedin', + 'instagram', + 'youtube', + 'vimeo', + 'dailymotion', + 'github', + 'echosciences', + 'pinterest', + 'lastfm', + 'flickr' +]; + +export const messagesSettings = [ + 'machine_explications_alert', + 'training_explications_alert', + 'training_information_message', + 'subscription_explications_alert', + 'event_explications_alert', + 'space_explications_alert' +]; + +export const invoicesSettings = [ + 'invoice_logo', + 'invoice_reference', + 'invoice_code-active', + 'invoice_code-value', + 'invoice_order-nb', + 'invoice_VAT-active', + 'invoice_VAT-rate', + 'invoice_VAT-rate_Machine', + 'invoice_VAT-rate_Training', + 'invoice_VAT-rate_Space', + 'invoice_VAT-rate_Event', + 'invoice_VAT-rate_Subscription', + 'invoice_text', + 'invoice_legals', + 'invoice_prefix', + 'payment_schedule_prefix' +]; + +export const bookingSettings = [ + 'booking_window_start', + 'booking_window_end', + 'booking_move_enable', + 'booking_move_delay', + 'booking_cancel_enable', + 'booking_cancel_delay', + 'reminder_enable', + 'reminder_delay', + 'visibility_yearly', + 'visibility_others', + 'display_name_enable', + 'book_overlapping_slots', + 'slot_duration', + 'overlapping_categories' +]; + +export const themeSettings = [ + 'main_color', + 'secondary_color' +]; + +export const titleSettings = [ + 'fablab_name', + 'name_genre' +]; + +export const accountingSettings = [ + 'accounting_journal_code', + 'accounting_card_client_code', + 'accounting_card_client_label', + 'accounting_wallet_client_code', + 'accounting_wallet_client_label', + 'accounting_other_client_code', + 'accounting_other_client_label', + 'accounting_wallet_code', + 'accounting_wallet_label', + 'accounting_VAT_code', + 'accounting_VAT_label', + 'accounting_subscription_code', + 'accounting_subscription_label', + 'accounting_Machine_code', + 'accounting_Machine_label', + 'accounting_Training_code', + 'accounting_Training_label', + 'accounting_Event_code', + 'accounting_Event_label', + 'accounting_Space_code', + 'accounting_Space_label' +]; + +export const modulesSettings = [ + 'spaces_module', + 'plans_module', + 'wallet_module', + 'statistics_module', + 'trainings_module', + 'machines_module', + 'online_payment_module', + 'public_agenda_module', + 'invoicing_module' +]; + +export const stripeSettings = [ + 'stripe_public_key', + 'stripe_secret_key', + 'stripe_currency' +]; + +export const payzenSettings = [ + 'payzen_username', + 'payzen_password', + 'payzen_endpoint', + 'payzen_public_key', + 'payzen_hmac', + 'payzen_currency' +]; + +export const openLabSettings = [ + 'openlab_app_id', + 'openlab_app_secret', + 'openlab_default' +]; + +export const accountSettings = [ + 'phone_required', + 'confirmation_required', + 'address_required', + 'user_change_group', + 'user_validation_required', + 'user_validation_required_list' +]; + +export const analyticsSettings = [ + 'tracking_id', + 'facebook_app_id', + 'twitter_analytics' +]; + +export const fabHubSettings = [ + 'hub_last_version', + 'hub_public_key', + 'fab_analytics', + 'origin', + 'uuid' +]; + +export const projectsSettings = [ + 'allowed_cad_extensions', + 'allowed_cad_mime_types', + 'disqus_shortname' +]; + +export const prepaidPacksSettings = [ + 'renew_pack_threshold', + 'pack_only_for_subscription' +]; + +export const registrationSettings = [ + 'public_registrations', + 'recaptcha_site_key', + 'recaptcha_secret_key' +]; + +export const adminSettings = [ + 'feature_tour_display', + 'show_username_in_admin_list' +]; + +export const pricingSettings = [ + 'extended_prices_in_same_day' +]; + +export const poymentSettings = [ + 'payment_gateway' +]; + +export const displaySettings = [ + 'machines_sort_by', + 'events_in_calendar', + 'email_from' +]; + +export const allSettings = [ + ...homePageSettings, + ...privacyPolicySettings, + ...aboutPageSettings, + ...socialNetworksSettings, + ...messagesSettings, + ...invoicesSettings, + ...bookingSettings, + ...themeSettings, + ...titleSettings, + ...accountingSettings, + ...modulesSettings, + ...stripeSettings, + ...payzenSettings, + ...openLabSettings, + ...accountSettings, + ...analyticsSettings, + ...fabHubSettings, + ...projectsSettings, + ...prepaidPacksSettings, + ...registrationSettings, + ...adminSettings, + ...pricingSettings, + ...poymentSettings, + ...displaySettings +] as const; + +export type SettingName = typeof allSettings[number]; export type SettingValue = string|boolean|number; @@ -153,7 +251,7 @@ export interface Setting { export interface SettingError { error: string, id: number, - name: string + name: SettingName } export interface SettingBulkResult {