|
1 | | -import * as React from "react"; |
2 | | -import { Modal, ModalProps } from "../dist/Modal"; |
| 1 | +import React from "react"; |
| 2 | +import { createModal } from "../dist/Modal"; |
| 3 | +import type { ModalProps } from "../dist/Modal"; |
3 | 4 | import { sectionName } from "./sectionName"; |
4 | 5 | import { getStoryFactory } from "./getStory"; |
5 | 6 | import { Button } from "../dist/Button"; |
6 | | -import { symToStr } from "tsafe/symToStr"; |
7 | 7 | import { assert } from "tsafe/assert"; |
8 | 8 | import { Equals } from "tsafe"; |
9 | 9 |
|
10 | 10 | const { meta, getStory } = getStoryFactory({ |
11 | 11 | sectionName, |
12 | | - "wrappedComponent": { [symToStr({ Modal })]: Template }, |
13 | | - "description": ` |
14 | | -A button that opens a modale |
| 12 | + "wrappedComponent": { "Modal": Template }, |
| 13 | + "description": `\`import { createModal } from "@codegouvfr/react-dsfr/Modal";\` (Click **show code** for usage details) |
| 14 | +
|
15 | 15 | - [See DSFR documentation](https://www.systeme-de-design.gouv.fr/elements-d-interface/composants/modale) |
16 | | -- [See source code](https://github.com/codegouvfr/react-dsfr/blob/main/src/Modal.tsx)`, |
| 16 | +- [See source code](https://github.com/codegouvfr/react-dsfr/blob/main/src/Modal.tsx) |
| 17 | +`, |
17 | 18 | "argTypes": { |
18 | | - "id": { |
19 | | - "description": "Required : This modal id (shared with button aria-controls)" |
20 | | - }, |
21 | 19 | "title": { |
22 | 20 | "description": `Required : The modal title` |
23 | 21 | }, |
@@ -56,77 +54,98 @@ A button that opens a modale |
56 | 54 | "topAnchor": { |
57 | 55 | "control": "boolean", |
58 | 56 | "description": "Default : false, make modal anchor to the top" |
| 57 | + }, |
| 58 | + "buttons": { |
| 59 | + "control": { "type": null }, |
| 60 | + "description": `The buttons at the bottom of the Modal, it's an array of ButtonProps objects. |
| 61 | + If not stated otherwise all buttons are "secondary" except the last one that is "primary". |
| 62 | + By default all buttons closes the modal, if you want it to be otherwise you can add \`doClosesModal: false\` |
| 63 | + ` |
59 | 64 | } |
60 | | - } |
| 65 | + }, |
| 66 | + "doHideImportInstruction": true |
61 | 67 | }); |
62 | 68 |
|
63 | 69 | export default meta; |
64 | 70 |
|
| 71 | +const { SimpleModal, simpleModalButtonProps } = createModal("simple"); |
| 72 | + |
65 | 73 | function Template(args: ModalProps) { |
66 | 74 | return ( |
67 | 75 | <> |
68 | | - <Button |
69 | | - onClick={() => console.log("onClick")} |
70 | | - nativeButtonProps={{ |
71 | | - "aria-controls": args.id, |
72 | | - "data-fr-opened": "false" |
73 | | - }} |
74 | | - wesh-morray={false} |
75 | | - > |
76 | | - Open Modal |
77 | | - </Button> |
78 | | - <Modal {...args} /> |
| 76 | + <Button {...simpleModalButtonProps}>Open modal</Button> |
| 77 | + <SimpleModal {...args} /> |
79 | 78 | </> |
80 | 79 | ); |
81 | 80 | } |
82 | 81 |
|
83 | | -export const ModalSimple = getStory({ |
84 | | - "id": "fr-modal-1", |
85 | | - "children": |
86 | | - "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas varius tortor nibh, sit amet tempor nibh finibus et. Aenean eu enim justo. Vestibulum aliquam hendrerit molestie. Mauris malesuada nisi sit amet augue accumsan tincidunt. Maecenas tincidunt, velit ac porttitor pulvinar, tortor eros facilisis libero, vitae commodo nunc quam et ligula. Ut nec ipsum sapien. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer id nisi nec nulla luctus lacinia non eu turpis. Etiam in ex imperdiet justo tincidunt egestas. Ut porttitor urna ac augue cursus tincidunt sit amet sed orci.", |
87 | | - "title": "Titre de la modale", |
| 82 | +export const Default = getStory({ |
| 83 | + "children": `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas varius tortor nibh, |
| 84 | +sit amet tempor nibh finibus et. Aenean eu enim justo. Vestibulum aliquam hendrerit molestie. Mauris |
| 85 | +malesuada nisi sit amet augue accumsan tincidunt. Maecenas tincidunt, velit ac porttitor pulvinar, |
| 86 | +tortor eros facilisis libero, vitae commodo nunc quam et ligula. Ut nec ipsum sapien. Interdum et |
| 87 | +malesuada fames ac ante ipsum primis in faucibus. Integer id nisi nec nulla luctus lacinia non eu |
| 88 | +turpis. Etiam in ex imperdiet justo tincidunt egestas. Ut porttitor urna ac augue cursus tincidunt sit amet sed orci.`, |
| 89 | + "title": "Accept terms", |
88 | 90 | "iconId": "fr-icon-checkbox-circle-line", |
89 | | - "size": "medium", |
90 | | - "concealingBackdrop": true, |
91 | | - "topAnchor": false |
92 | | -}); |
93 | | - |
94 | | -ModalSimple.parameters = { |
95 | | - docs: { |
96 | | - source: { |
97 | | - code: ` |
98 | | -<> |
99 | | - <Button onClick={() => console.log("onClick")} nativeButtonProps={{ "aria-controls": args.id, data-fr-opened="false"}} > |
100 | | - Open Modal |
101 | | - </Button> |
102 | | - <Modal id="fr-modal-1" children="Lorem ipsum dolor sit amet" title="Titre de la modale" iconId="fr-icon-checkbox-circle-line" /> |
103 | | -</> |
104 | | -` |
105 | | - } |
106 | | - } |
107 | | -}; |
108 | | - |
109 | | -export const ModalAction = getStory({ |
110 | | - "id": "fr-modal-2", |
111 | | - "children": |
112 | | - "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas varius tortor nibh, sit amet tempor nibh finibus et. Aenean eu enim justo. Vestibulum aliquam hendrerit molestie. Mauris malesuada nisi sit amet augue accumsan tincidunt. Maecenas tincidunt, velit ac porttitor pulvinar, tortor eros facilisis libero, vitae commodo nunc quam et ligula. Ut nec ipsum sapien. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer id nisi nec nulla luctus lacinia non eu turpis. Etiam in ex imperdiet justo tincidunt egestas. Ut porttitor urna ac augue cursus tincidunt sit amet sed orci.", |
113 | | - "title": "Titre de la modale", |
114 | | - "iconId": "fr-icon-checkbox-circle-line", |
115 | | - "size": "medium", |
116 | | - "concealingBackdrop": true, |
117 | | - "topAnchor": false, |
118 | | - "actionArea": [ |
| 91 | + "buttons": [ |
119 | 92 | { |
120 | | - "linkProps": { "href": "#" }, |
121 | | - "iconId": "fr-icon-git-commit-fill", |
122 | | - "children": "Button 1 label", |
123 | | - "priority": "secondary" |
| 93 | + "linkProps": { "href": "https://example.com", "target": "_blank" }, |
| 94 | + "doClosesModal": false, //Default true, clicking a button close the modal. |
| 95 | + "children": "Learn more" |
124 | 96 | }, |
125 | 97 | { |
126 | | - "priority": "secondary", |
127 | | - "linkProps": { "href": "#" }, |
128 | | - "iconId": "fr-icon-chat-check-fill", |
129 | | - "children": "Button 2 label (longer)" |
| 98 | + "iconId": "ri-check-line", |
| 99 | + "children": "Ok", |
| 100 | + "onClick": () => console.log("terms accepted") |
130 | 101 | } |
131 | 102 | ] |
132 | 103 | }); |
| 104 | + |
| 105 | +Default.parameters = { |
| 106 | + "docs": { |
| 107 | + "source": { |
| 108 | + "code": ` |
| 109 | +import { createModal } from "@codegouvfr/react-dsfr/Modal"; |
| 110 | +import { Button } from "@codegouvfr/react-dsfr/Button"; |
| 111 | +
|
| 112 | +const { AcceptTermsModal, acceptTermsModalButtonProps } = createModal("acceptTerms"); |
| 113 | +
|
| 114 | +function MyComponent(){ |
| 115 | +
|
| 116 | + return ( |
| 117 | + <> |
| 118 | + <Button {...acceptTermsModalButtonProps}>Open modal</Button> |
| 119 | + <AcceptTermsModal |
| 120 | + title="Accept terms" |
| 121 | + iconId="fr-icon-checkbox-circle-line" |
| 122 | + buttons={ |
| 123 | + [ |
| 124 | + { |
| 125 | + linkProps: { href: "https://example.com", target: "_blank" }, |
| 126 | + doClosesModal: false, //Default true, clicking a button close the modal. |
| 127 | + children: "Learn more" |
| 128 | + }, |
| 129 | + { |
| 130 | + iconId: "ri-check-line", |
| 131 | + onClick: ()=> console.log("terms accepted"), |
| 132 | + children: "Ok" |
| 133 | + } |
| 134 | + ] |
| 135 | + } |
| 136 | + > |
| 137 | + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas varius tortor nibh, |
| 138 | + sit amet tempor nibh finibus et. Aenean eu enim justo. Vestibulum aliquam hendrerit molestie. Mauris |
| 139 | + malesuada nisi sit amet augue accumsan tincidunt. Maecenas tincidunt, velit ac porttitor pulvinar, |
| 140 | + tortor eros facilisis libero, vitae commodo nunc quam et ligula. Ut nec ipsum sapien. Interdum et |
| 141 | + malesuada fames ac ante ipsum primis in faucibus. Integer id nisi nec nulla luctus lacinia non eu |
| 142 | + turpis. Etiam in ex imperdiet justo tincidunt egestas. Ut porttitor urna ac augue cursus tincidunt sit amet sed orci. |
| 143 | + </AcceptTermsModal> |
| 144 | + </> |
| 145 | + ); |
| 146 | +
|
| 147 | +} |
| 148 | +` |
| 149 | + } |
| 150 | + } |
| 151 | +}; |
0 commit comments