story.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. /*
  2. Copyright (C) 2017 Cloudbase Solutions SRL
  3. This program is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU Affero General Public License as
  5. published by the Free Software Foundation, either version 3 of the
  6. License, or (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU Affero General Public License for more details.
  11. You should have received a copy of the GNU Affero General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. import React from "react";
  15. import { storiesOf } from "@storybook/react";
  16. import Dropdown from ".";
  17. const items = [
  18. { label: "Item 1", value: "item-1" },
  19. {
  20. label: "Item 2 - contains a very long label that doesn't really fit",
  21. value: "item-2",
  22. },
  23. {
  24. label: "containsaverylonglabelwhichalsodoesntcontainwhitespaces",
  25. value: "item-2a",
  26. },
  27. { label: "Item 3", value: "item-3" },
  28. { label: "Item 3", value: "item-3-duplicated" },
  29. ];
  30. class Wrapper extends React.Component<any, any> {
  31. state = {
  32. selectedItem: null,
  33. };
  34. handleChange(selectedItem: any) {
  35. this.setState({ selectedItem });
  36. }
  37. render() {
  38. return (
  39. <Dropdown
  40. items={items}
  41. selectedItem={this.state.selectedItem}
  42. onChange={item => {
  43. this.handleChange(item);
  44. }}
  45. {...this.props}
  46. />
  47. );
  48. }
  49. }
  50. type Props = {
  51. items: any[];
  52. };
  53. type State = {
  54. selectedItems: string[];
  55. };
  56. /* eslint react/no-multi-comp: off */
  57. class MultipleSelectionWrapper extends React.Component<Props, State> {
  58. state = {
  59. selectedItems: [],
  60. };
  61. render() {
  62. return (
  63. <Dropdown
  64. multipleSelection
  65. selectedItems={this.state.selectedItems}
  66. onChange={item => {
  67. console.log("state", this.state);
  68. const itemIndex = this.state.selectedItems.findIndex(
  69. i => i === item.value
  70. );
  71. if (itemIndex > -1) {
  72. this.setState(prevState => ({
  73. selectedItems: prevState.selectedItems.filter(
  74. i => i !== item.value
  75. ),
  76. }));
  77. } else {
  78. this.setState(prevState => ({
  79. selectedItems: [...prevState.selectedItems, item.value],
  80. }));
  81. }
  82. }}
  83. {...this.props}
  84. />
  85. );
  86. }
  87. }
  88. storiesOf("Dropdown", module)
  89. .add("default", () => <Wrapper />)
  90. .add("required", () => <Wrapper required />)
  91. .add("disabled", () => <Wrapper disabled />)
  92. .add("long list", () => (
  93. <Wrapper
  94. items={[
  95. { label: "Item 1", value: "item-1" },
  96. { label: "Item 2", value: "item-2" },
  97. { label: "Item 3", value: "item-3" },
  98. { label: "Item 4", value: "item-4" },
  99. { separator: true },
  100. { label: "Item 1", value: "item-1" },
  101. { label: "Item 2", value: "item-2" },
  102. { label: "Item 3", value: "item-3" },
  103. { label: "Item 4", value: "item-4" },
  104. { label: "Item 1", value: "item-1" },
  105. { label: "Item 2", value: "item-2" },
  106. { label: "Item 3", value: "item-3" },
  107. { label: "Item 4", value: "item-4" },
  108. {
  109. label: "Item - contains a very long label that doesn't really fit",
  110. value: "item-1",
  111. },
  112. {
  113. label: "Item - contains a very long label that doesn't really fit",
  114. value: "item-1",
  115. },
  116. {
  117. label: "containsaverylonglabelwhichalsodoesntcontainwhitespaces",
  118. value: "item-2",
  119. },
  120. {
  121. label: "containsaverylonglabelwhichalsodoesntcontainwhitespaces",
  122. value: "item-2",
  123. },
  124. { label: "Item 3", value: "item-3" },
  125. { label: "Item 4", value: "item-4" },
  126. { label: "Item 1", value: "item-1" },
  127. { label: "Item 2", value: "item-2" },
  128. { label: "Item 3", value: "item-3" },
  129. { label: "Item 4", value: "item-4" },
  130. ]}
  131. />
  132. ))
  133. .add("multiple selection", () => (
  134. <MultipleSelectionWrapper
  135. items={[
  136. { value: "owner" },
  137. { value: "admin" },
  138. { value: "member_1", label: "member" },
  139. { value: "member_2", label: "member" },
  140. ]}
  141. />
  142. ))
  143. .add("subtitle label", () => (
  144. <Wrapper
  145. items={[
  146. {
  147. label: "Item 1",
  148. value: "item-1",
  149. subtitleLabel:
  150. "Pool is in UNALLOCATED status instead of being ALLOCATED.",
  151. disabled: true,
  152. },
  153. { label: "Item 2", value: "item-2" },
  154. { label: "Item 3", value: "item-3" },
  155. { label: "Item 4", value: "item-4" },
  156. { separator: true },
  157. { label: "Item 1", value: "item-1" },
  158. ]}
  159. />
  160. ));