From 2c7df54770ee9f7e4b7a02c173dea8f7a1b81cd7 Mon Sep 17 00:00:00 2001 From: Samuil Berenzon Date: Wed, 29 Jan 2025 20:00:44 +0000 Subject: [PATCH 1/9] bp --- .../navigation/partials/OptionConcepts/func.tsx | 10 ++++++++++ .../navigation/partials/OptionConcepts/index.ts | 3 +++ .../navigation/partials/OptionConcepts/stories.ts | 15 +++++++++++++++ .../navigation/partials/OptionConcepts/styles.ts | 7 +++++++ 4 files changed, 35 insertions(+) create mode 100644 apps/frontend/ui/src/navigation/partials/OptionConcepts/func.tsx create mode 100644 apps/frontend/ui/src/navigation/partials/OptionConcepts/index.ts create mode 100644 apps/frontend/ui/src/navigation/partials/OptionConcepts/stories.ts create mode 100644 apps/frontend/ui/src/navigation/partials/OptionConcepts/styles.ts diff --git a/apps/frontend/ui/src/navigation/partials/OptionConcepts/func.tsx b/apps/frontend/ui/src/navigation/partials/OptionConcepts/func.tsx new file mode 100644 index 0000000..5e8ac0d --- /dev/null +++ b/apps/frontend/ui/src/navigation/partials/OptionConcepts/func.tsx @@ -0,0 +1,10 @@ +import type { JSX } from "react"; + +import useOptionConceptsClasses from "./styles"; + +type TProps = {}; + +export default function OptionConcepts({}: TProps): JSX.Element { + const classes = useOptionConceptsClasses(); + return
OptionConcepts
; +} diff --git a/apps/frontend/ui/src/navigation/partials/OptionConcepts/index.ts b/apps/frontend/ui/src/navigation/partials/OptionConcepts/index.ts new file mode 100644 index 0000000..602f93e --- /dev/null +++ b/apps/frontend/ui/src/navigation/partials/OptionConcepts/index.ts @@ -0,0 +1,3 @@ +import OptionConcepts from "@app-ui/navigation/partials/OptionConcepts/func"; + +export default OptionConcepts; diff --git a/apps/frontend/ui/src/navigation/partials/OptionConcepts/stories.ts b/apps/frontend/ui/src/navigation/partials/OptionConcepts/stories.ts new file mode 100644 index 0000000..58304b6 --- /dev/null +++ b/apps/frontend/ui/src/navigation/partials/OptionConcepts/stories.ts @@ -0,0 +1,15 @@ +import type { Meta, StoryObj } from "@storybook/react"; + +import OptionConcepts from "@app-ui/navigation/partials/OptionConcepts"; + +const meta: Meta = { + title: "App/UI/Navigation/Partials/OptionConcepts", + component: OptionConcepts, + args: {}, +}; + +export default meta; + +type Story = StoryObj; + +export const Index: Story = {}; diff --git a/apps/frontend/ui/src/navigation/partials/OptionConcepts/styles.ts b/apps/frontend/ui/src/navigation/partials/OptionConcepts/styles.ts new file mode 100644 index 0000000..a68de0e --- /dev/null +++ b/apps/frontend/ui/src/navigation/partials/OptionConcepts/styles.ts @@ -0,0 +1,7 @@ +import { makeStyles } from "@lib-theme"; + +const useOptionConceptsClasses = makeStyles({ + root: {}, +}); + +export default useOptionConceptsClasses; From 82df9e7a162acdf2491a751ff1e17d5c8ebb0a2f Mon Sep 17 00:00:00 2001 From: Samuil Berenzon Date: Wed, 29 Jan 2025 21:02:13 +0000 Subject: [PATCH 2/9] prep for template --- .../partials/OptionConcepts/func.tsx | 62 +++++++++++++++++-- .../partials/OptionConcepts/styles.ts | 15 ++++- .../template/MenuItemRadio/func.tsx | 10 +++ .../template/MenuItemRadio/index.ts | 3 + .../template/MenuItemRadio/styles.ts | 9 +++ .../partials/OptionConcepts/template/index.ts | 1 + libs/components/src/index.ts | 2 + package-lock.json | 8 +-- package.json | 2 +- 9 files changed, 101 insertions(+), 11 deletions(-) create mode 100644 apps/frontend/ui/src/navigation/partials/OptionConcepts/template/MenuItemRadio/func.tsx create mode 100644 apps/frontend/ui/src/navigation/partials/OptionConcepts/template/MenuItemRadio/index.ts create mode 100644 apps/frontend/ui/src/navigation/partials/OptionConcepts/template/MenuItemRadio/styles.ts create mode 100644 apps/frontend/ui/src/navigation/partials/OptionConcepts/template/index.ts diff --git a/apps/frontend/ui/src/navigation/partials/OptionConcepts/func.tsx b/apps/frontend/ui/src/navigation/partials/OptionConcepts/func.tsx index 5e8ac0d..c36b135 100644 --- a/apps/frontend/ui/src/navigation/partials/OptionConcepts/func.tsx +++ b/apps/frontend/ui/src/navigation/partials/OptionConcepts/func.tsx @@ -1,10 +1,64 @@ +import { useState } from "react"; import type { JSX } from "react"; -import useOptionConceptsClasses from "./styles"; +import { Flex, Button, MenuItemRadio, MenuList } from "@lib-components"; +import { Subtitle2, Caption2 } from "@lib-theme"; +import type { MenuProps as TMenuProps } from "@fluentui/react-components"; -type TProps = {}; +import useOptionConceptsClasses from "@app-ui/navigation/partials/OptionConcepts/styles"; -export default function OptionConcepts({}: TProps): JSX.Element { +type TProps = { + concepts: string[]; + onSearch: (value: string) => void; +}; + +export default function OptionConcepts({ + concepts, + onSearch, +}: TProps): JSX.Element { const classes = useOptionConceptsClasses(); - return
OptionConcepts
; + const [checkedValues, setCheckedValues] = useState>({ + option: [], + }); + const onChange: TMenuProps["onCheckedValueChange"] = ( + _, + { name, checkedItems }, + ) => { + setCheckedValues((s) => ({ ...s, [name]: checkedItems })); + }; + return ( + + + Search through recongizable concepts + Choose from the given list below + + + + Option 1 + + + Option 2 + + + Option 3 + + + Option 4 + + + + + ); } diff --git a/apps/frontend/ui/src/navigation/partials/OptionConcepts/styles.ts b/apps/frontend/ui/src/navigation/partials/OptionConcepts/styles.ts index a68de0e..bb5d96f 100644 --- a/apps/frontend/ui/src/navigation/partials/OptionConcepts/styles.ts +++ b/apps/frontend/ui/src/navigation/partials/OptionConcepts/styles.ts @@ -1,7 +1,18 @@ -import { makeStyles } from "@lib-theme"; +import { makeStyles, EThemeDimensions, tokens } from "@lib-theme"; const useOptionConceptsClasses = makeStyles({ - root: {}, + root: { + width: EThemeDimensions.L8, + backgroundColor: tokens.colorNeutralBackground2, + borderRadius: tokens.borderRadiusLarge, + }, + list: { + width: "100%", + maxHeight: EThemeDimensions.L6, + overflow: "auto", + backgroundColor: tokens.colorNeutralBackground1, + borderRadius: tokens.borderRadiusMedium, + }, }); export default useOptionConceptsClasses; diff --git a/apps/frontend/ui/src/navigation/partials/OptionConcepts/template/MenuItemRadio/func.tsx b/apps/frontend/ui/src/navigation/partials/OptionConcepts/template/MenuItemRadio/func.tsx new file mode 100644 index 0000000..28bd997 --- /dev/null +++ b/apps/frontend/ui/src/navigation/partials/OptionConcepts/template/MenuItemRadio/func.tsx @@ -0,0 +1,10 @@ +import type { JSX } from "react"; + +import useMenuItemRadioClasses from "./styles"; + +type TProps = {}; + +export default function MenuItemRadio({}: TProps): JSX.Element { + const classes = useMenuItemRadioClasses(); + return
MenuItemRadio
; +} diff --git a/apps/frontend/ui/src/navigation/partials/OptionConcepts/template/MenuItemRadio/index.ts b/apps/frontend/ui/src/navigation/partials/OptionConcepts/template/MenuItemRadio/index.ts new file mode 100644 index 0000000..40f575b --- /dev/null +++ b/apps/frontend/ui/src/navigation/partials/OptionConcepts/template/MenuItemRadio/index.ts @@ -0,0 +1,3 @@ +import MenuItemRadio from "@app-ui/navigation/partials/OptionConcepts/template/MenuItemRadio/func"; + +export default MenuItemRadio; diff --git a/apps/frontend/ui/src/navigation/partials/OptionConcepts/template/MenuItemRadio/styles.ts b/apps/frontend/ui/src/navigation/partials/OptionConcepts/template/MenuItemRadio/styles.ts new file mode 100644 index 0000000..3d5ae16 --- /dev/null +++ b/apps/frontend/ui/src/navigation/partials/OptionConcepts/template/MenuItemRadio/styles.ts @@ -0,0 +1,9 @@ +import { makeStyles, tokens } from "@lib-theme"; + +const useMenuItemRadioClasses = makeStyles({ + root: { + fontSize: tokens.fontSizeBase100, + }, +}); + +export default useMenuItemRadioClasses; diff --git a/apps/frontend/ui/src/navigation/partials/OptionConcepts/template/index.ts b/apps/frontend/ui/src/navigation/partials/OptionConcepts/template/index.ts new file mode 100644 index 0000000..9e7ebbd --- /dev/null +++ b/apps/frontend/ui/src/navigation/partials/OptionConcepts/template/index.ts @@ -0,0 +1 @@ +export { default as MenuItemRadioTemplate } from "@app-ui/navigation/partials/OptionConcepts/template/MenuItemRadio"; diff --git a/libs/components/src/index.ts b/libs/components/src/index.ts index 442c269..295896e 100644 --- a/libs/components/src/index.ts +++ b/libs/components/src/index.ts @@ -2,6 +2,8 @@ export { Divider } from "@fluentui/react-components"; export { Tab } from "@fluentui/react-components"; export { TabList } from "@fluentui/react-components"; export { Button } from "@fluentui/react-components"; +export { MenuList } from "@fluentui/react-components"; +export { MenuItemRadio } from "@fluentui/react-components"; export { Collapse } from "@fluentui/react-motion-components-preview"; diff --git a/package-lock.json b/package-lock.json index cb1af74..c84b38e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "@fluentui/react-motion-components-preview": "^0.3.1", "@griffel/react": "^1.5.25", "@reduxjs/toolkit": "^2.2.8", - "fluentui-helpers": "0.2.1", + "fluentui-helpers": "0.3.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-redux": "^9.1.2" @@ -9951,9 +9951,9 @@ "dev": true }, "node_modules/fluentui-helpers": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fluentui-helpers/-/fluentui-helpers-0.2.1.tgz", - "integrity": "sha512-yVTr0yz2ZQLwGX3bgph1pOt4zP7W3b30iNEyNFlWyOPuqUlxMl2JDEGeg/8QOcObsyPPY2D27svFoxz7QT4aag==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fluentui-helpers/-/fluentui-helpers-0.3.0.tgz", + "integrity": "sha512-syhmFb/HbGzCL9T/dkeHbQ3CTeeBJuJfgitfK2Jxj7T+JseLztIZDgwdLmakJusqkbBLXdEuTO6KHhHyI1ociQ==", "license": "MIT", "peerDependencies": { "@fluentui/react-components": "^9", diff --git a/package.json b/package.json index 84ac324..7deff09 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "@fluentui/react-motion-components-preview": "^0.3.1", "@griffel/react": "^1.5.25", "@reduxjs/toolkit": "^2.2.8", - "fluentui-helpers": "0.2.1", + "fluentui-helpers": "0.3.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-redux": "^9.1.2" From 6dc7d2fae7625251f3f2e8f7e927118868e780f8 Mon Sep 17 00:00:00 2001 From: Samuil Berenzon Date: Wed, 29 Jan 2025 21:17:31 +0000 Subject: [PATCH 3/9] core done, tests missing --- .../partials/OptionConcepts/func.tsx | 31 +++++-------------- .../partials/OptionConcepts/hooks.ts | 18 +++++++++++ .../partials/OptionConcepts/stories.ts | 21 ++++++++++++- .../partials/OptionConcepts/styles.ts | 2 +- .../template/MenuItemRadio/func.tsx | 15 ++++++--- .../template/MenuItemRadio/styles.ts | 9 ------ 6 files changed, 56 insertions(+), 40 deletions(-) create mode 100644 apps/frontend/ui/src/navigation/partials/OptionConcepts/hooks.ts delete mode 100644 apps/frontend/ui/src/navigation/partials/OptionConcepts/template/MenuItemRadio/styles.ts diff --git a/apps/frontend/ui/src/navigation/partials/OptionConcepts/func.tsx b/apps/frontend/ui/src/navigation/partials/OptionConcepts/func.tsx index c36b135..603e6ea 100644 --- a/apps/frontend/ui/src/navigation/partials/OptionConcepts/func.tsx +++ b/apps/frontend/ui/src/navigation/partials/OptionConcepts/func.tsx @@ -1,11 +1,11 @@ -import { useState } from "react"; import type { JSX } from "react"; -import { Flex, Button, MenuItemRadio, MenuList } from "@lib-components"; +import { Flex, Button, MenuList } from "@lib-components"; import { Subtitle2, Caption2 } from "@lib-theme"; -import type { MenuProps as TMenuProps } from "@fluentui/react-components"; import useOptionConceptsClasses from "@app-ui/navigation/partials/OptionConcepts/styles"; +import { MenuItemRadioTemplate } from "@app-ui/navigation/partials/OptionConcepts/template"; +import { useSelectionState } from "@app-ui/navigation/partials/OptionConcepts/hooks"; type TProps = { concepts: string[]; @@ -17,15 +17,7 @@ export default function OptionConcepts({ onSearch, }: TProps): JSX.Element { const classes = useOptionConceptsClasses(); - const [checkedValues, setCheckedValues] = useState>({ - option: [], - }); - const onChange: TMenuProps["onCheckedValueChange"] = ( - _, - { name, checkedItems }, - ) => { - setCheckedValues((s) => ({ ...s, [name]: checkedItems })); - }; + const { checkedValues, onChange } = useSelectionState(); return ( @@ -37,18 +29,9 @@ export default function OptionConcepts({ checkedValues={checkedValues} onCheckedValueChange={onChange} > - - Option 1 - - - Option 2 - - - Option 3 - - - Option 4 - + {concepts.map((concept) => ( + + ))} + + ); +} diff --git a/apps/frontend/ui/src/navigation/templates/OptionLayout/index.ts b/apps/frontend/ui/src/navigation/templates/OptionLayout/index.ts new file mode 100644 index 0000000..22f5e55 --- /dev/null +++ b/apps/frontend/ui/src/navigation/templates/OptionLayout/index.ts @@ -0,0 +1,3 @@ +import OptionLayout from "@app-ui/navigation/templates/OptionLayout/func"; + +export default OptionLayout; diff --git a/apps/frontend/ui/src/navigation/templates/OptionLayout/styles.ts b/apps/frontend/ui/src/navigation/templates/OptionLayout/styles.ts new file mode 100644 index 0000000..dcca2f4 --- /dev/null +++ b/apps/frontend/ui/src/navigation/templates/OptionLayout/styles.ts @@ -0,0 +1,11 @@ +import { makeStyles, tokens, EThemeDimensions } from "@lib-theme"; + +const useOptionLayoutClasses = makeStyles({ + root: { + width: EThemeDimensions.L8, + backgroundColor: tokens.colorNeutralBackground2, + borderRadius: tokens.borderRadiusLarge, + }, +}); + +export default useOptionLayoutClasses; diff --git a/apps/frontend/ui/src/navigation/templates/index.ts b/apps/frontend/ui/src/navigation/templates/index.ts new file mode 100644 index 0000000..0773614 --- /dev/null +++ b/apps/frontend/ui/src/navigation/templates/index.ts @@ -0,0 +1 @@ +export { default as OptionLayoutTemplate } from "@app-ui/navigation/templates/OptionLayout"; From e61ff3b842c8d1cb965d66a201a7c4f8e9c4bab2 Mon Sep 17 00:00:00 2001 From: Samuil Berenzon Date: Thu, 30 Jan 2025 20:32:28 +0000 Subject: [PATCH 9/9] update --- .../partials/OptionConcepts/func.tsx | 28 ++++++++----------- .../partials/OptionConcepts/styles.ts | 5 ---- 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/apps/frontend/ui/src/navigation/partials/OptionConcepts/func.tsx b/apps/frontend/ui/src/navigation/partials/OptionConcepts/func.tsx index c1a50f1..499db14 100644 --- a/apps/frontend/ui/src/navigation/partials/OptionConcepts/func.tsx +++ b/apps/frontend/ui/src/navigation/partials/OptionConcepts/func.tsx @@ -1,8 +1,8 @@ import type { JSX } from "react"; -import { Flex, Button, MenuList } from "@lib-components"; -import { Subtitle2, Caption2 } from "@lib-theme"; +import { MenuList } from "@lib-components"; +import { OptionLayoutTemplate } from "@app-ui/navigation/templates"; import useOptionConceptsClasses from "@app-ui/navigation/partials/OptionConcepts/styles"; import { MenuItemRadioTemplate } from "@app-ui/navigation/partials/OptionConcepts/template"; import { useSelectionState } from "@app-ui/navigation/partials/OptionConcepts/hooks"; @@ -19,11 +19,14 @@ export default function OptionConcepts({ const classes = useOptionConceptsClasses(); const { checkedValues, onChange } = useSelectionState(); return ( - - - Search through recongizable concepts - Choose from the given list below - + { + onSearch(checkedValues.concept[0]); + }} + disabledSearch={checkedValues.concept.length === 0} + > ))} - - + ); } diff --git a/apps/frontend/ui/src/navigation/partials/OptionConcepts/styles.ts b/apps/frontend/ui/src/navigation/partials/OptionConcepts/styles.ts index d63050b..bc7f86e 100644 --- a/apps/frontend/ui/src/navigation/partials/OptionConcepts/styles.ts +++ b/apps/frontend/ui/src/navigation/partials/OptionConcepts/styles.ts @@ -1,11 +1,6 @@ import { makeStyles, EThemeDimensions, tokens } from "@lib-theme"; const useOptionConceptsClasses = makeStyles({ - root: { - width: EThemeDimensions.L8, - backgroundColor: tokens.colorNeutralBackground2, - borderRadius: tokens.borderRadiusLarge, - }, list: { width: "100%", height: EThemeDimensions.M4,