diff --git a/packages/components/src/DraftSettings/index.js b/packages/components/src/DraftSettings/index.js new file mode 100644 index 00000000000..8172b69d2d4 --- /dev/null +++ b/packages/components/src/DraftSettings/index.js @@ -0,0 +1,142 @@ +import React, { useState } from "react"; +import PropTypes from "prop-types"; +import { gistDefaults } from "../utils"; +import { patternInfo, patternList } from "@freesewing/patterns"; +import { FormattedMessage } from "react-intl"; +import List from "@material-ui/core/List"; +import ListSubheader from "@material-ui/core/ListSubheader"; +import CollapsedIcon from "@material-ui/icons/ArrowDropDown"; +import ExpandedIcon from "@material-ui/icons/ArrowRight"; +import DraftSettingSa from "../DraftSettingSa"; +import DraftSettingMargin from "../DraftSettingMargin"; +import DraftSettingComplete from "../DraftSettingComplete"; +import DraftSettingPaperless from "../DraftSettingPaperless"; +import DraftSettingUnits from "../DraftSettingUnits"; +import DraftSettingLanguage from "../DraftSettingLanguage"; +import DraftSettingOnly from "../DraftSettingOnly"; + +const DraftSettings = props => { + const [expanded, setExpanded] = useState([]); + + const toggleGroup = group => { + let shown = expanded.slice(0); + let index = shown.indexOf(group); + if (index === -1) shown.push(group); + else shown.splice(index, 1); + setExpanded(shown); + }; + + let pattern = patternInfo[props.pattern]; + let dflts = gistDefaults(pattern.config, props.gist); + + let noyes = [ + , + + ]; + let units = { + metric: , + imperial: + }; + + const addProps = setting => { + const labels = { + sa: { + none: , + dflt: , + custom: + }, + only: { + dflt: , + custom: + }, + paperless: noyes, + complete: noyes + }; + let childProps = { + triggerAction: props.triggerAction, + updateValue: props.updateValue, + units: props.units, + key: setting, + name: setting, + labels: labels[setting] + }; + childProps.title = ( + + ); + childProps.desc = ( + + ); + if (setting === "only") { + childProps.dflt = "dflt"; + childProps.customDflt = []; + childProps.parts = {}; + for (let part of pattern.parts) + childProps.parts[part] = ; + } + + return childProps; + }; + + let groups = { + preferences: [ + , + , + + ], + advanced: [ + , + , + , + + ] + }; + + return ( + } className="draft-settings gist-side"> + {Object.keys(groups).map(group => { + let open = true; + if (expanded.indexOf(group) === -1) open = false; + return ( + + toggleGroup(group)} + > +

+ {open ? ( + + ) : ( + + )} + +

+
+ {expanded.indexOf(group) === -1 + ? null + : groups[group].map(component => component)} +
+ ); + })} +
+ ); +}; + +DraftSettings.propTypes = { + pattern: PropTypes.oneOf(patternList), + units: PropTypes.oneOf(["metric", "imperial"]).isRequired +}; + +DraftSettings.defaultProps = {}; + +export default DraftSettings; diff --git a/packages/components/src/DraftSettings/stories.js b/packages/components/src/DraftSettings/stories.js new file mode 100644 index 00000000000..de352ae483e --- /dev/null +++ b/packages/components/src/DraftSettings/stories.js @@ -0,0 +1,31 @@ +import React from "react"; +import { storiesOf } from "@storybook/react"; +import DraftSettings from "."; + +const props = { + triggerAction: (type, data) => + console.log(`Action of type ${type} triggered, data passed is`, data), + updateValue: (type, data) => + console.log(`Update ${type} with new value`, data), + gist: { + settings: { + options: {} + } + }, + languages: { + de: "German", + en: "English", + es: "Spanish", + fr: "French", + nl: "Dutch" + }, + language: "en" +}; + +storiesOf("DraftSettings", module) + .add("Simon metric", () => ( + + )) + .add("Trayvon imperial", () => ( + + )); diff --git a/packages/components/src/GistConfigurator/index.js b/packages/components/src/GistConfigurator/index.js index 41ffd3d32db..a86f17788e5 100644 --- a/packages/components/src/GistConfigurator/index.js +++ b/packages/components/src/GistConfigurator/index.js @@ -5,19 +5,36 @@ import Deg from "../PatternOptionDegree"; import Mm from "../PatternOptionMillimeter"; import Bool from "../PatternOptionBool"; import OptionGroup from "../OptionGroup"; -import { optionType, defaultGist, gistDefaults } from "../utils"; +import { optionType, gistDefaults } from "../utils"; import { patternInfo, patternList } from "@freesewing/patterns"; -import { FormattedMessage } from "react-intl"; +import { FormattedMessage, injectIntl } from "react-intl"; +import { i18n as languages } from "@freesewing/i18n"; +import List from "@material-ui/core/List"; +import ListSubheader from "@material-ui/core/ListSubheader"; +import CollapsedIcon from "@material-ui/icons/ArrowDropDown"; +import ExpandedIcon from "@material-ui/icons/ArrowRight"; +import PatternOptions from "../PatternOptions"; +import DraftSettings from "../DraftSettings"; const GistConfigurator = props => { - const [gist, setGist] = useState(props.gist || defaultGist); + console.log(languages); + const [gist, setGist] = useState(props.gist); + const [expanded, setExpanded] = useState([]); const update = (type, name, value) => { console.log("updating", type, name, value); }; + const toggleGroup = group => { + let shown = expanded.slice(0); + let index = shown.indexOf(group); + if (index === -1) shown.push(group); + else shown.splice(index, 1); + setExpanded(shown); + }; + let pattern = patternInfo[props.pattern]; - let dflts = gistDefaults(pattern.config, gist); + let dflts = gistDefaults(pattern.config, props.gist); return (
@@ -25,25 +42,23 @@ const GistConfigurator = props => {

- {Object.keys(pattern.optionGroups).map(group => ( - -

- -

- -
- ))} +

+
); @@ -56,4 +71,4 @@ GistConfigurator.propTypes = { GistConfigurator.defaultProps = {}; -export default GistConfigurator; +export default injectIntl(GistConfigurator); diff --git a/packages/components/src/GistConfigurator/stories.js b/packages/components/src/GistConfigurator/stories.js index 21eaf962d91..bfdf9beb59b 100644 --- a/packages/components/src/GistConfigurator/stories.js +++ b/packages/components/src/GistConfigurator/stories.js @@ -6,13 +6,20 @@ import GistConfigurator from "."; const props = { triggerAction: (type, data) => - console.log(`Action of type ${type} triggered, data passed is`, data) + console.log(`Action of type ${type} triggered, data passed is`, data), + updateValue: (type, data) => + console.log(`Update ${type} with new value`, data), + gist: { + settings: { + options: {} + } + } }; storiesOf("GistConfigurator", module) .add("Simon metric", () => ( - + )) .add("Trayvon imperial", () => ( - + )); diff --git a/packages/components/src/OptionGroup/index.js b/packages/components/src/OptionGroup/index.js index b676b7bda2f..f27ef0ba4ee 100644 --- a/packages/components/src/OptionGroup/index.js +++ b/packages/components/src/OptionGroup/index.js @@ -9,6 +9,8 @@ import Count from "../PatternOptionCount"; import { optionType } from "../utils"; import { FormattedMessage } from "react-intl"; import { injectIntl } from "react-intl"; +import ListItem from "@material-ui/core/ListItem"; +import ListItemText from "@material-ui/core/ListItemText"; const OptionGroup = props => { const update = (name, value) => props.updateValue("option", name, value); @@ -26,33 +28,31 @@ const OptionGroup = props => { title: , desc: , intl: props.intl, - pattern: props.pattern.config.name + pattern: props.pattern.config.name, + key: name }; let noyes = [ , ]; - switch (type) { case "pct": - return ; + return ; break; case "deg": - return ; + return ; break; case "mm": - return ( - - ); + return ; break; case "bool": - return ; + return ; break; case "list": - return ; + return ; break; case "count": - return ; + return ; break; default: throw new Error("Unsupport option type: " + type); @@ -62,8 +62,10 @@ const OptionGroup = props => { return (
{props.options.map(name => { + let key = name; let output = []; if (typeof name === "object") { + key = Object.keys(name).pop(); // Subgroup for (let subGroup of Object.keys(name)) { output.push( @@ -76,7 +78,11 @@ const OptionGroup = props => { } } else output.push(renderOption(name)); - return output; + return ( + + {output} + + ); })}
); diff --git a/packages/components/src/PatternOptions/index.js b/packages/components/src/PatternOptions/index.js new file mode 100644 index 00000000000..2b8b45a41dd --- /dev/null +++ b/packages/components/src/PatternOptions/index.js @@ -0,0 +1,78 @@ +import React, { useState } from "react"; +import PropTypes from "prop-types"; +import Pct from "../PatternOptionPercentage"; +import Deg from "../PatternOptionDegree"; +import Mm from "../PatternOptionMillimeter"; +import Bool from "../PatternOptionBool"; +import OptionGroup from "../OptionGroup"; +import { optionType, defaultGist, gistDefaults } from "../utils"; +import { patternInfo, patternList } from "@freesewing/patterns"; +import { FormattedMessage } from "react-intl"; +import List from "@material-ui/core/List"; +import ListSubheader from "@material-ui/core/ListSubheader"; +import CollapsedIcon from "@material-ui/icons/ArrowDropDown"; +import ExpandedIcon from "@material-ui/icons/ArrowRight"; + +const PatternOptions = props => { + const [expanded, setExpanded] = useState([]); + + const toggleGroup = group => { + let shown = expanded.slice(0); + let index = shown.indexOf(group); + if (index === -1) shown.push(group); + else shown.splice(index, 1); + setExpanded(shown); + }; + + let pattern = patternInfo[props.pattern]; + let dflts = gistDefaults(pattern.config, props.gist); + + return ( + } className="pattern-options gist-side"> + {Object.keys(pattern.optionGroups).map(group => { + let open = true; + if (expanded.indexOf(group) === -1) open = false; + return ( + + toggleGroup(group)} + > +

+ {open ? ( + + ) : ( + + )} + +

+
+ {expanded.indexOf(group) === -1 ? null : ( + + )} +
+ ); + })} +
+ ); +}; + +PatternOptions.propTypes = { + pattern: PropTypes.oneOf(patternList), + units: PropTypes.oneOf(["metric", "imperial"]).isRequired +}; + +PatternOptions.defaultProps = {}; + +export default PatternOptions; diff --git a/packages/components/src/PatternOptions/stories.js b/packages/components/src/PatternOptions/stories.js new file mode 100644 index 00000000000..a386ef12f44 --- /dev/null +++ b/packages/components/src/PatternOptions/stories.js @@ -0,0 +1,28 @@ +import React from "react"; +import { storiesOf } from "@storybook/react"; +import PatternOptions from "."; + +const props = { + triggerAction: (type, data) => + console.log(`Action of type ${type} triggered, data passed is`, data), + updateValue: (type, data) => + console.log(`Update ${type} with new value`, data), + gist: { + settings: { + options: {} + } + } +}; + +storiesOf("PatternOptions", module) + .add("Simon metric", () => ( + + )) + .add("Trayvon imperial", () => ( + + )); diff --git a/packages/components/src/utils/index.js b/packages/components/src/utils/index.js index 020584942b4..c69c6fa3a0d 100644 --- a/packages/components/src/utils/index.js +++ b/packages/components/src/utils/index.js @@ -122,7 +122,7 @@ export const defaultGist = { } }; -export const gistDefaults = (config, gist) => { +export const gistDefaults = (config, gist = { settings: {} }) => { let options = {}; for (let option of Object.keys(config.options)) { if ( @@ -137,7 +137,7 @@ export const gistDefaults = (config, gist) => { delete settings.locale; delete settings.units; for (let setting of Object.keys(settings)) { - if (typeof gist.settings[setting] !== undefined) { + if (typeof gist.settings[setting] !== "undefined") { settings[setting] = gist.settings[setting]; } } diff --git a/packages/css-theme/src/_components.scss b/packages/css-theme/src/_components.scss index d0db4f9b425..a3c0855b858 100644 --- a/packages/css-theme/src/_components.scss +++ b/packages/css-theme/src/_components.scss @@ -1,2 +1,3 @@ @import "components/emblem"; @import "components/pattern-option"; +@import "components/pattern-options"; diff --git a/packages/css-theme/src/_variables.scss b/packages/css-theme/src/_variables.scss index b77a6a10bb0..a2d557581d1 100644 --- a/packages/css-theme/src/_variables.scss +++ b/packages/css-theme/src/_variables.scss @@ -1,3 +1,5 @@ +$fc-bg-light: $oc-gray-0; +$fc-bg-dark: $oc-gray-9; $fc-notice-light: $oc-lime-9; $fc-notice-dark: $oc-lime-3; $fc-hoverbg-light: $oc-gray-1; diff --git a/packages/css-theme/src/components/_pattern-options.scss b/packages/css-theme/src/components/_pattern-options.scss new file mode 100644 index 00000000000..ddc6a933df6 --- /dev/null +++ b/packages/css-theme/src/components/_pattern-options.scss @@ -0,0 +1,20 @@ +li.optiongroup-heading { + background: $fc-bg-light; + z-index: 3; + h3 { + margin: 0; + svg.collapse-icon { margin-bottom: -5px;} + } +} +li.optiongroup-heading:hover { + cursor: pointer; + background: $fc-hoverbg-light; +} +body.dark { + li.optiongroup-heading { + background: $fc-bg-dark; + } + li.optiongroup-heading:hover { + background: $fc-hoverbg-dark; + } +} diff --git a/packages/css-theme/src/theme.scss b/packages/css-theme/src/theme.scss index b5822f156ee..fe10ab96fba 100644 --- a/packages/css-theme/src/theme.scss +++ b/packages/css-theme/src/theme.scss @@ -1,4 +1,4 @@ -@import '../node_modules/open-color/open-color.scss'; +@import '../../../node_modules/open-color/open-color.scss'; @import "variables"; @import "mixins"; @import "components"; diff --git a/packages/patterns/src/info/simon.js b/packages/patterns/src/info/simon.js index 8fa8b4f96af..b379c6bfd95 100644 --- a/packages/patterns/src/info/simon.js +++ b/packages/patterns/src/info/simon.js @@ -30,7 +30,6 @@ export default { "sleeveLengthBonus", "waistEase", "hipsEase", - "collarEase", "yokeDart" ], style: [