From 19f9be6a3c097e9ceebd20564c53345ad514e3f7 Mon Sep 17 00:00:00 2001 From: Joost De Cock Date: Thu, 27 Jan 2022 12:26:56 +0100 Subject: [PATCH] feat(lab): Added language setting --- packages/freesewing.lab/hooks/useApp.js | 1 + .../components/workbench/default-settings.js | 11 ++ .../menu/core-settings/core-setting-list.js | 48 +++++ .../workbench/menu/core-settings/index.js | 39 ++++ .../workbench/menu/core-settings/setting.js | 169 ++++++++++++++++++ .../components/workbench/menu/index.js | 8 +- .../components/wrappers/workbench.js | 19 +- 7 files changed, 284 insertions(+), 11 deletions(-) create mode 100644 packages/freesewing.shared/components/workbench/default-settings.js create mode 100644 packages/freesewing.shared/components/workbench/menu/core-settings/core-setting-list.js create mode 100644 packages/freesewing.shared/components/workbench/menu/core-settings/index.js create mode 100644 packages/freesewing.shared/components/workbench/menu/core-settings/setting.js diff --git a/packages/freesewing.lab/hooks/useApp.js b/packages/freesewing.lab/hooks/useApp.js index c3b3ab980ad..c8bc39e18d0 100644 --- a/packages/freesewing.lab/hooks/useApp.js +++ b/packages/freesewing.lab/hooks/useApp.js @@ -141,6 +141,7 @@ function useApp(full = true) { // Translation t, + languages: Object.keys(strings), } } diff --git a/packages/freesewing.shared/components/workbench/default-settings.js b/packages/freesewing.shared/components/workbench/default-settings.js new file mode 100644 index 00000000000..3faf00621d2 --- /dev/null +++ b/packages/freesewing.shared/components/workbench/default-settings.js @@ -0,0 +1,11 @@ +const defaultSettings = { + sa: 0, + complete: true, + paperless: false, + units: 'metric', + locale: 'en', + margin: 2, + debug: true, +} + +export default defaultSettings diff --git a/packages/freesewing.shared/components/workbench/menu/core-settings/core-setting-list.js b/packages/freesewing.shared/components/workbench/menu/core-settings/core-setting-list.js new file mode 100644 index 00000000000..04d2b4cbe69 --- /dev/null +++ b/packages/freesewing.shared/components/workbench/menu/core-settings/core-setting-list.js @@ -0,0 +1,48 @@ +import { useState } from 'react' + +const CoreSettingList = props => { + const { dflt, list } = props + const val = props.gist?.settings?.[props.setting] + + const [value, setValue] = useState(val) + + const handleChange = (newVal) => { + if (newVal === dflt) reset() + else { + setValue(newVal) + props.updateGist(['settings', props.setting], newVal) + } + } + + return ( +
+

+ {props.app.t(`settings.${props.setting}.description`)} +

+
+
+ {props.list.map(entry => ( + + ))} +
+
+
+ ) +} + +export default CoreSettingList diff --git a/packages/freesewing.shared/components/workbench/menu/core-settings/index.js b/packages/freesewing.shared/components/workbench/menu/core-settings/index.js new file mode 100644 index 00000000000..c5f76e2fdb9 --- /dev/null +++ b/packages/freesewing.shared/components/workbench/menu/core-settings/index.js @@ -0,0 +1,39 @@ +import SettingsIcon from 'shared/components/icons/settings.js' +import { linkClasses, Chevron } from 'shared/components/navigation/primary.js' +import Setting from './setting.js' + +const settings = { + locale: { + dflt: 'en', + list: ['de', 'en', 'es', 'fr', 'nl'], + }, +} + +const CoreSettings = props => { + + return ( +
+ + + + {props.app.t('app.settings')} + + + + +
+ ) +} + +export default CoreSettings diff --git a/packages/freesewing.shared/components/workbench/menu/core-settings/setting.js b/packages/freesewing.shared/components/workbench/menu/core-settings/setting.js new file mode 100644 index 00000000000..150e616c706 --- /dev/null +++ b/packages/freesewing.shared/components/workbench/menu/core-settings/setting.js @@ -0,0 +1,169 @@ +import { linkClasses, Chevron } from 'shared/components/navigation/primary.js' +import PctDegOption from 'shared/components/workbench/inputs/design-option-pct-deg' +import CountOption from 'shared/components/workbench/inputs/design-option-count' +import ListSetting from './core-setting-list' +import { formatMm, formatPercentage, optionType } from 'shared/utils.js' + +const settings = { + locale: props => { + return ( + + {props.app.t(`i18n.${props.gist.settings.locale}`)} + + ) + }, + pct: props => { + const val = (typeof props.gist?.options?.[props.option] === 'undefined') + ? props.pattern.config.options[props.option].pct/100 + : props.gist.options[props.option] + return ( + + {formatPercentage(val)} + {props.pattern.config.options[props.option]?.toAbs + ? ' | ' +formatMm(props.pattern.config.options[props.option]?.toAbs(val, props.gist)) + : null + } + + ) + }, + bool: props => { + const dflt = props.pattern.config.options[props.option].bool + const current = props.gist?.options?.[props.option] + return ( + + {props.gist?.options?.[props.option] + ? props.app.t('app.yes') + : props.app.t('app.no') + } + + ) + }, + count: props => { + const dflt = props.pattern.config.options[props.option].count + const current = props.gist?.options?.[props.option] + return (dflt==current || typeof current === 'undefined') + ? {dflt} + : {current} + }, + deg: props => { + const dflt = props.pattern.config.options[props.option].deg + const current = props.gist?.options?.[props.option] + return (dflt==current || typeof current === 'undefined') + ? {dflt}° + : {current}° + }, + mm: props => { + return

No mm val yet

+ }, + constant: props => { + return

No constant val yet

+ }, +} + +const Tmp = props =>

not yet

+ +const inputs = { + locale: props => ({ + key, + title: props.app.t(`i18n.${key}`) + }))} + />, +} + + +const Setting = props => { + const Input = inputs[props.setting] + const Value = settings[props.setting] + + const toggleBoolean = () => { + const dflt = props.pattern.config.options[props.option].bool + const current = props.gist?.options?.[props.option] + if (typeof current === 'undefined') + props.updateGist(['options', props.option], !dflt) + else props.unsetGist(['options', props.option]) + } + + if (props.setting === 'bool') return ( +
  • + +
  • + + ) + + return ( +
  • +
    + +
    + + <>° + + + { props.app.t(`settings.${props.setting}.title`) } + +
    + + +
    + +
    +
  • + ) +} + +export default Setting diff --git a/packages/freesewing.shared/components/workbench/menu/index.js b/packages/freesewing.shared/components/workbench/menu/index.js index 2ce8d73cc0b..6482e517c74 100644 --- a/packages/freesewing.shared/components/workbench/menu/index.js +++ b/packages/freesewing.shared/components/workbench/menu/index.js @@ -1,11 +1,17 @@ import ModesMenu from './modes.js' import DesignOptions from './design-options' +import CoreSettings from './core-settings' const WorkbenchMenu = props => { return ( ) } diff --git a/packages/freesewing.shared/components/wrappers/workbench.js b/packages/freesewing.shared/components/wrappers/workbench.js index 007899e99a1..05b7a73bd69 100644 --- a/packages/freesewing.shared/components/wrappers/workbench.js +++ b/packages/freesewing.shared/components/wrappers/workbench.js @@ -6,21 +6,20 @@ import Measurements, { Input } from 'shared/components/workbench/measurements/in import LabDraft from 'shared/components/workbench/draft/index.js' import set from 'lodash.set' import unset from 'lodash.unset' +import defaultSettings from 'shared/components/workbench/default-settings.js' + // Generates a default pattern gist to start from -const defaultGist = (pattern, language='en') => ({ +const defaultGist = (pattern, language='en') => { + const gist = { design: pattern.config.name, version: pattern.config.version, - settings: { - sa: 0, - complete: true, - paperless: false, - units: 'metric', - locale: language, - margin: 2, - debug: true, + settings: defaultSettings } -}) + if (language) gist.settings.locale = language + + return gist +} const hasRequiredMeasurements = (pattern, gist) => { for (const m of pattern.config.measurements) {