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: [