playbook_ui 12.37.0 → 12.38.0.pre.alpha.PBNTR78selectkitmultipleprop1094
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/pb_kits/playbook/pb_date/_date.tsx +7 -8
- data/app/pb_kits/playbook/pb_date/docs/_date_alignment.jsx +2 -2
- data/app/pb_kits/playbook/pb_date/docs/_date_default.jsx +29 -5
- data/app/pb_kits/playbook/pb_date/docs/_date_unstyled.jsx +2 -2
- data/app/pb_kits/playbook/pb_date/docs/_date_variants.jsx +5 -5
- data/app/pb_kits/playbook/pb_date_range_inline/_date_range_inline.tsx +45 -31
- data/app/pb_kits/playbook/pb_date_range_stacked/_date_range_stacked.tsx +5 -3
- data/app/pb_kits/playbook/pb_date_stacked/_date_stacked.tsx +24 -21
- data/app/pb_kits/playbook/pb_date_time/_date_time.tsx +1 -1
- data/app/pb_kits/playbook/pb_date_time/dateTime.test.js +1 -1
- data/app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.tsx +2 -2
- data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.test.js +1 -1
- data/app/pb_kits/playbook/pb_date_year_stacked/_date_year_stacked.tsx +6 -8
- data/app/pb_kits/playbook/pb_kit/dateTime.ts +146 -63
- data/app/pb_kits/playbook/pb_label_value/_label_value.tsx +52 -31
- data/app/pb_kits/playbook/pb_message/_message.tsx +24 -24
- data/app/pb_kits/playbook/pb_select/_select.scss +37 -0
- data/app/pb_kits/playbook/pb_select/_select.tsx +9 -5
- data/app/pb_kits/playbook/pb_select/docs/_select_attributes.html.erb +26 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_attributes.md +1 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_multiple.html.erb +36 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_multiple.jsx +50 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_multiple.md +1 -0
- data/app/pb_kits/playbook/pb_select/docs/example.yml +3 -0
- data/app/pb_kits/playbook/pb_select/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_select/select.html.erb +5 -9
- data/app/pb_kits/playbook/pb_select/select.rb +14 -0
- data/app/pb_kits/playbook/pb_select/select.test.js +17 -0
- data/app/pb_kits/playbook/pb_time/_time.tsx +9 -11
- data/app/pb_kits/playbook/pb_time_range_inline/_time_range_inline.tsx +46 -49
- data/app/pb_kits/playbook/pb_time_stacked/_time_stacked.tsx +4 -6
- data/app/pb_kits/playbook/pb_timestamp/_timestamp.tsx +11 -11
- data/app/pb_kits/playbook/pb_weekday_stacked/_weekday_stacked.tsx +8 -11
- data/dist/playbook-rails.js +7 -7
- data/lib/playbook/version.rb +2 -2
- metadata +12 -8
- data/app/pb_kits/playbook/pb_logistic/_logistic.jsx +0 -120
@@ -1,90 +1,173 @@
|
|
1
|
+
const ABBR_DAYS = ['SU', 'M', 'T', 'W', 'TH', 'F', 'S']
|
1
2
|
|
2
|
-
|
3
|
-
import 'moment-strftime'
|
4
|
-
import 'moment-timezone'
|
3
|
+
const days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
5
4
|
|
6
|
-
|
7
|
-
value: string | Date,
|
8
|
-
zone?: string,
|
9
|
-
}
|
5
|
+
const months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
|
10
6
|
|
11
|
-
const
|
12
|
-
|
13
|
-
export default class DateTime {
|
14
|
-
value: Moment & any
|
15
|
-
constructor({ value, zone = 'America/New_York' }: DateTimeType) {
|
16
|
-
this.value = this.convertToTimestampZone(value, zone)
|
17
|
-
}
|
7
|
+
const formatDate = (newDate: Date | string) => {
|
8
|
+
const isTimelessStringDate = typeof newDate === "string" && !newDate.includes("T")
|
18
9
|
|
19
|
-
|
20
|
-
|
10
|
+
if (isTimelessStringDate) {
|
11
|
+
const unhyphenatedDate = new Date((newDate as string).replace(/-/g, "/"))
|
12
|
+
return unhyphenatedDate
|
21
13
|
}
|
22
14
|
|
23
|
-
|
24
|
-
|
25
|
-
}
|
15
|
+
return new Date(newDate)
|
16
|
+
}
|
26
17
|
|
27
|
-
|
28
|
-
|
18
|
+
export const toMinute = (newDate: Date | string, timeZone?: string): string => {
|
19
|
+
const date = formatDate(newDate)
|
20
|
+
if (timeZone) {
|
21
|
+
return date.toLocaleTimeString(undefined, { timeZone, hour: "2-digit", minute: "2-digit" }).slice(3, 5);
|
22
|
+
} else {
|
23
|
+
return date.toLocaleTimeString(undefined, { hour: "2-digit", minute: "2-digit" }).slice(3, 5);
|
29
24
|
}
|
25
|
+
}
|
30
26
|
|
31
|
-
|
32
|
-
|
27
|
+
export const toHour = (newDate: Date | string, timeZone?: string): string => {
|
28
|
+
const date = formatDate(newDate)
|
29
|
+
if (timeZone) {
|
30
|
+
return date.toLocaleTimeString(undefined, { timeZone, hour: "numeric" }).split(' ')[0];
|
31
|
+
} else {
|
32
|
+
return date.toLocaleTimeString(undefined, { hour: "numeric" }).split(' ')[0];
|
33
33
|
}
|
34
|
+
}
|
34
35
|
|
35
|
-
|
36
|
-
|
37
|
-
|
36
|
+
export const toDay = (newDate: Date | string, timeZone?: string): number => {
|
37
|
+
if (timeZone) {
|
38
|
+
const date = new Date(formatDate(newDate).toLocaleString(undefined, { timeZone }));
|
39
|
+
return date.getDate()
|
40
|
+
} else {
|
41
|
+
const date = formatDate(newDate)
|
42
|
+
return date.getDate()
|
43
|
+
}
|
44
|
+
}
|
38
45
|
|
39
|
-
|
40
|
-
|
41
|
-
|
46
|
+
export const toDayAbbr = (newDate: Date | string): string => {
|
47
|
+
const date = formatDate(newDate)
|
48
|
+
return ABBR_DAYS[date.getUTCDay()]
|
49
|
+
}
|
42
50
|
|
43
|
-
|
44
|
-
|
45
|
-
|
51
|
+
export const toWeekday = (newDate: Date | string): string => {
|
52
|
+
const date = formatDate(newDate)
|
53
|
+
return days[date.getUTCDay()]
|
54
|
+
}
|
46
55
|
|
47
|
-
|
48
|
-
|
49
|
-
|
56
|
+
export const toMonth = (newDate: Date | string, timeZone?: string): string => {
|
57
|
+
if (timeZone) {
|
58
|
+
const date = new Date(formatDate(newDate).toLocaleString(undefined, { timeZone }));
|
59
|
+
return months[date.getUTCMonth()]
|
60
|
+
} else {
|
61
|
+
const date = formatDate(newDate)
|
62
|
+
return months[date.getUTCMonth()]
|
63
|
+
}
|
64
|
+
}
|
50
65
|
|
51
|
-
|
52
|
-
|
53
|
-
|
66
|
+
export const toMonthNum = (newDate: Date | string): number => {
|
67
|
+
const date = formatDate(newDate)
|
68
|
+
return date.getUTCMonth() +1
|
69
|
+
}
|
54
70
|
|
55
|
-
|
56
|
-
|
57
|
-
|
71
|
+
export const toYear = (newDate: Date | string, timeZone?: string): number => {
|
72
|
+
if (timeZone) {
|
73
|
+
const date = new Date(newDate.toLocaleString(undefined, { timeZone }));
|
74
|
+
return date.getUTCFullYear()
|
75
|
+
} else {
|
76
|
+
const date = new Date(newDate)
|
77
|
+
return date.getUTCFullYear()
|
78
|
+
}
|
79
|
+
}
|
58
80
|
|
59
|
-
|
60
|
-
|
81
|
+
export const toTime = (newDate: Date | string, timeZone?: string): string => {
|
82
|
+
const date = formatDate(newDate)
|
83
|
+
if (timeZone) {
|
84
|
+
return date.toLocaleTimeString(undefined, { timeZone, timeStyle: "short" }).split(' ')[0];
|
85
|
+
} else {
|
86
|
+
return date.toLocaleTimeString(undefined, { timeStyle: "short" }).split(' ')[0];
|
61
87
|
}
|
88
|
+
}
|
62
89
|
|
63
|
-
|
64
|
-
|
65
|
-
|
90
|
+
export const toMeridiem = (newDate: Date | string, timeZone?: string): string => {
|
91
|
+
const date = formatDate(newDate)
|
92
|
+
if (timeZone) {
|
93
|
+
return date.toLocaleString(undefined, { timeZone, hour12: true }).slice(-2).charAt(0).toLocaleLowerCase();
|
94
|
+
} else {
|
95
|
+
return date.toLocaleString(undefined, { hour12: true }).slice(-2).charAt(0).toLocaleLowerCase();
|
96
|
+
}
|
97
|
+
}
|
66
98
|
|
67
|
-
|
68
|
-
|
69
|
-
|
99
|
+
export const toTimeZone = (newDate: Date | string, timeZone?: string): string => {
|
100
|
+
const date = formatDate(newDate)
|
101
|
+
if (timeZone) {
|
102
|
+
return date.toLocaleString(undefined, { timeZone, timeZoneName: "short" }).split(' ')[3];
|
103
|
+
} else {
|
104
|
+
return date.toLocaleString(undefined, { timeZoneName: "short" }).split(' ')[3];
|
105
|
+
}
|
106
|
+
}
|
70
107
|
|
71
|
-
|
72
|
-
|
73
|
-
}
|
108
|
+
export const toTimeWithMeridiem = (newDate: Date | string, timeZone: string): string => {
|
109
|
+
const date = formatDate(newDate)
|
110
|
+
return `${toTime(date, timeZone)}${toMeridiem(date, timeZone)}`;
|
111
|
+
}
|
74
112
|
|
75
|
-
|
76
|
-
const
|
113
|
+
export const toIso = (newDate: Date | string): string => {
|
114
|
+
const date = formatDate(newDate)
|
115
|
+
return date.toISOString()
|
116
|
+
}
|
77
117
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
118
|
+
export const fromNow = (newDate: Date | string): string => {
|
119
|
+
|
120
|
+
const startDate = formatDate(newDate).getTime()
|
121
|
+
const endDate = new Date().getTime()
|
122
|
+
const elapsedTime = endDate - startDate
|
123
|
+
let elapsedTimeString = `${Math.round(elapsedTime / (365.25 * 24 * 60 * 60 * 1000))} years ago.`; // 730+ days
|
124
|
+
|
125
|
+
const elapsedTimeData = [
|
126
|
+
{ min: 0, max: 44999, value: "a few seconds ago" }, // 0-44 seconds
|
127
|
+
{ min: 45000, max: 89999, value: "a minute ago" }, // 45-89 seconds
|
128
|
+
{ min: 90000, max: 2649999, value: `${Math.round(elapsedTime / 60000)} minutes ago`}, // 90s-44 minutes
|
129
|
+
{ min: 2650000, max: 7299999, value: "an hour ago" }, // 45-120 minutes
|
130
|
+
{ min: 7300000, max: 75699999, value: `${Math.round(elapsedTime / 3600000)} hours ago`}, // 2-21 hours
|
131
|
+
{ min: 75700000, max: 172899999, value: "a day ago" }, // 22-48 hours
|
132
|
+
{ min: 172900000, max: 2169999999, value: `${Math.round(elapsedTime / 86400000)} days ago`}, // 2-25 days
|
133
|
+
{ min: 2170000000, max: 5184999999, value: "a month ago"}, // 26-60 days
|
134
|
+
{ min: 5185000000, max: 27561699999, value: `${Math.round(elapsedTime / 30.44 * 24 * 60 * 60 * 1000)} months ago`}, // 60-319 days
|
135
|
+
{ min: 27561700000, max: 63072999999, value: "a year ago"}, // 320-730 days
|
136
|
+
];
|
137
|
+
|
138
|
+
for (const timeDate of elapsedTimeData) {
|
139
|
+
if (elapsedTime >= timeDate.min && elapsedTime <= timeDate.max) {
|
140
|
+
elapsedTimeString = timeDate.value;
|
141
|
+
break;
|
142
|
+
}
|
143
|
+
}
|
144
|
+
|
145
|
+
return elapsedTimeString
|
146
|
+
}
|
82
147
|
|
83
|
-
|
84
|
-
|
148
|
+
export const toCustomFormat = (newDate: Date | string, format = 'month_day'): string => {
|
149
|
+
const date = formatDate(newDate)
|
150
|
+
if (format == "month_day") {
|
151
|
+
return `${toMonthNum(date)}/${toDay(date)}`
|
152
|
+
} else {
|
153
|
+
return `${date.toLocaleString(undefined, { month: "short" })} ${toDay(date)}`
|
85
154
|
}
|
155
|
+
}
|
86
156
|
|
87
|
-
|
88
|
-
|
89
|
-
|
157
|
+
export default {
|
158
|
+
toMinute,
|
159
|
+
toHour,
|
160
|
+
toDay,
|
161
|
+
toDayAbbr,
|
162
|
+
toWeekday,
|
163
|
+
toMonth,
|
164
|
+
toMonthNum,
|
165
|
+
toYear,
|
166
|
+
toTime,
|
167
|
+
toMeridiem,
|
168
|
+
toTimeZone,
|
169
|
+
toTimeWithMeridiem,
|
170
|
+
toIso,
|
171
|
+
fromNow,
|
172
|
+
toCustomFormat,
|
90
173
|
}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import React from "react";
|
2
2
|
import classnames from "classnames";
|
3
|
-
import DateTime from "../pb_kit/dateTime";
|
4
3
|
import { buildAriaProps, buildCss, buildDataProps } from "../utilities/props";
|
5
4
|
import { globalProps } from "../utilities/globalProps";
|
5
|
+
import DateTime from '../pb_kit/dateTime';
|
6
6
|
|
7
7
|
import Body from "../pb_body/_body";
|
8
8
|
import Caption from "../pb_caption/_caption";
|
@@ -26,9 +26,9 @@ type LabelValueProps = {
|
|
26
26
|
title?: string;
|
27
27
|
};
|
28
28
|
|
29
|
-
const dateString = (value:
|
30
|
-
const month =
|
31
|
-
const day =
|
29
|
+
const dateString = (value: Date) => {
|
30
|
+
const month = DateTime.toMonthNum(value);
|
31
|
+
const day = DateTime.toDay(value);
|
32
32
|
|
33
33
|
return ` · ${month}/${day}`;
|
34
34
|
};
|
@@ -52,7 +52,6 @@ const LabelValue = (props: LabelValueProps) => {
|
|
52
52
|
|
53
53
|
const ariaProps = buildAriaProps(aria);
|
54
54
|
const dataProps = buildDataProps(data);
|
55
|
-
const formattedDate = new DateTime({ value: date });
|
56
55
|
const variantClass = variant === "details" ? "details" : "";
|
57
56
|
const classes = classnames(
|
58
57
|
buildCss("pb_label_value_kit", variantClass),
|
@@ -62,59 +61,81 @@ const LabelValue = (props: LabelValueProps) => {
|
|
62
61
|
|
63
62
|
return (
|
64
63
|
<div
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
64
|
+
{...ariaProps}
|
65
|
+
{...dataProps}
|
66
|
+
className={classes}
|
67
|
+
id={id}
|
68
|
+
title={title}
|
70
69
|
>
|
71
|
-
<Caption dark={dark}
|
70
|
+
<Caption dark={dark}
|
71
|
+
text={label}
|
72
|
+
/>
|
72
73
|
{variant === "details" ? (
|
73
|
-
<Flex inline
|
74
|
+
<Flex inline
|
75
|
+
vertical="center"
|
76
|
+
>
|
74
77
|
{icon && (
|
75
|
-
<Body color="light"
|
76
|
-
|
78
|
+
<Body color="light"
|
79
|
+
dark={dark}
|
80
|
+
marginRight="xs"
|
81
|
+
>
|
82
|
+
<Icon dark={dark}
|
83
|
+
fixedWidth
|
84
|
+
icon={icon}
|
85
|
+
/>
|
77
86
|
</Body>
|
78
87
|
)}
|
79
88
|
{description && (
|
80
89
|
<Body
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
90
|
+
color="light"
|
91
|
+
dark={dark}
|
92
|
+
marginRight="xs"
|
93
|
+
text={description}
|
85
94
|
/>
|
86
95
|
)}
|
87
96
|
{active === true ? (
|
88
|
-
<Flex inline
|
97
|
+
<Flex inline
|
98
|
+
vertical="center"
|
99
|
+
>
|
89
100
|
{title && (
|
90
|
-
<Title dark={dark}
|
101
|
+
<Title dark={dark}
|
102
|
+
size={4}
|
103
|
+
text={title}
|
104
|
+
variant="link"
|
105
|
+
/>
|
91
106
|
)}
|
92
107
|
{date && (
|
93
108
|
<Title
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
109
|
+
dark={dark}
|
110
|
+
marginLeft="xs"
|
111
|
+
size={4}
|
112
|
+
text={" " + dateString(date)}
|
113
|
+
variant="link"
|
99
114
|
/>
|
100
115
|
)}
|
101
116
|
</Flex>
|
102
117
|
) : (
|
103
118
|
<>
|
104
|
-
{title && <Title dark={dark}
|
119
|
+
{title && <Title dark={dark}
|
120
|
+
size={4}
|
121
|
+
text={title}
|
122
|
+
/>
|
123
|
+
}
|
105
124
|
{date && (
|
106
125
|
<Title
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
126
|
+
dark={dark}
|
127
|
+
marginLeft="xs"
|
128
|
+
size={4}
|
129
|
+
text={" " + dateString(date)}
|
111
130
|
/>
|
112
131
|
)}
|
113
132
|
</>
|
114
133
|
)}
|
115
134
|
</Flex>
|
116
135
|
) : (
|
117
|
-
<Body dark={dark}
|
136
|
+
<Body dark={dark}
|
137
|
+
text={value}
|
138
|
+
/>
|
118
139
|
)}
|
119
140
|
</div>
|
120
141
|
);
|
@@ -25,7 +25,7 @@ type MessageProps = {
|
|
25
25
|
label?: string,
|
26
26
|
message: string,
|
27
27
|
timestamp?: string,
|
28
|
-
timestampObject?:
|
28
|
+
timestampObject?: Date,
|
29
29
|
timezone?: string,
|
30
30
|
alignTimestamp?: string,
|
31
31
|
}
|
@@ -62,50 +62,50 @@ const Message = (props: MessageProps) => {
|
|
62
62
|
|
63
63
|
return (
|
64
64
|
<div
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
65
|
+
{...ariaProps}
|
66
|
+
{...dataProps}
|
67
|
+
className={classes}
|
68
|
+
id={id}
|
69
69
|
>
|
70
70
|
{shouldDisplayAvatar &&
|
71
71
|
<Avatar
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
72
|
+
imageUrl={avatarUrl}
|
73
|
+
name={avatarName}
|
74
|
+
size="xs"
|
75
|
+
status={avatarStatus}
|
76
76
|
/>
|
77
77
|
}
|
78
78
|
<div className="content_wrapper">
|
79
79
|
<Flex
|
80
|
-
|
81
|
-
|
80
|
+
justify={alignTimestamp === 'left' ? 'none' : 'between'}
|
81
|
+
orientation="row"
|
82
82
|
>
|
83
83
|
{label &&
|
84
84
|
<Title
|
85
|
-
|
86
|
-
|
87
|
-
|
85
|
+
className="message_title"
|
86
|
+
size={4}
|
87
|
+
text={label}
|
88
88
|
/>
|
89
89
|
}
|
90
90
|
<Timestamp
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
91
|
+
className={`pull-${alignTimestamp} ${timestampObject ? 'message_humanized_time' : null}`}
|
92
|
+
text={timestamp}
|
93
|
+
timestamp={''}
|
94
|
+
timezone={timezone}
|
95
95
|
/>
|
96
96
|
{timestampObject &&
|
97
97
|
<Timestamp
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
98
|
+
className={`pull-${alignTimestamp} message_timestamp`}
|
99
|
+
text={''}
|
100
|
+
timestamp={timestampObject}
|
101
|
+
timezone={timezone}
|
102
102
|
/>
|
103
103
|
}
|
104
104
|
</Flex>
|
105
105
|
{message &&
|
106
106
|
<Body
|
107
|
-
|
108
|
-
|
107
|
+
className="pb_message_body"
|
108
|
+
text={message}
|
109
109
|
/>
|
110
110
|
}
|
111
111
|
{children}
|
@@ -2,6 +2,7 @@
|
|
2
2
|
@import "../pb_textarea/textarea_mixin";
|
3
3
|
@import "../tokens/titles";
|
4
4
|
@import "../tokens/colors";
|
5
|
+
@import "../tokens/spacing";
|
5
6
|
|
6
7
|
[class^=pb_select] {
|
7
8
|
select {
|
@@ -32,6 +33,42 @@
|
|
32
33
|
opacity: 0.5;
|
33
34
|
}
|
34
35
|
}
|
36
|
+
select[multiple] {
|
37
|
+
@include pb_textarea_light;
|
38
|
+
@include pb_body_light;
|
39
|
+
background: none;
|
40
|
+
background-color: $white;
|
41
|
+
appearance: none;
|
42
|
+
cursor: pointer;
|
43
|
+
box-shadow: inset 0 -11px 20px rgba($primary, 0.05);
|
44
|
+
padding-right: 0px !important;
|
45
|
+
color: transparent !important;
|
46
|
+
text-shadow: 0 0 0 $text_lt_default;
|
47
|
+
white-space: nowrap;
|
48
|
+
text-overflow: ellipsis;
|
49
|
+
padding: $space_xs 0px !important;
|
50
|
+
max-height: unset !important;
|
51
|
+
@media (hover:hover) {
|
52
|
+
&:hover, &:active, &:focus {
|
53
|
+
background-color: rgba($focus_input_light, $opacity_5);
|
54
|
+
}
|
55
|
+
}
|
56
|
+
&:focus{
|
57
|
+
border-color: $primary;
|
58
|
+
@include transition_default;
|
59
|
+
}
|
60
|
+
option {
|
61
|
+
padding-left: $space_sm;
|
62
|
+
padding-top: $space_xxs;
|
63
|
+
padding-bottom: $space_xxs;
|
64
|
+
}
|
65
|
+
option:checked {
|
66
|
+
background-color: $hover_light;
|
67
|
+
}
|
68
|
+
option:hover {
|
69
|
+
background-color: $hover_light;
|
70
|
+
}
|
71
|
+
}
|
35
72
|
option {
|
36
73
|
color: $text_lt_default;
|
37
74
|
}
|
@@ -124,11 +124,15 @@ const Select = ({
|
|
124
124
|
htmlFor={name}
|
125
125
|
>
|
126
126
|
{selectBody}
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
127
|
+
{ multiple !== true ?
|
128
|
+
<Icon
|
129
|
+
className="pb_select_kit_caret"
|
130
|
+
fixedWidth
|
131
|
+
icon="angle-down"
|
132
|
+
/>
|
133
|
+
:
|
134
|
+
null
|
135
|
+
}
|
132
136
|
{error &&
|
133
137
|
<Body
|
134
138
|
status="negative"
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<%= pb_rails("select", props: {
|
2
|
+
attributes: {
|
3
|
+
data: { options: "data_attribute" },
|
4
|
+
},
|
5
|
+
label: "Favorite Food",
|
6
|
+
name: "food",
|
7
|
+
options: [
|
8
|
+
{
|
9
|
+
value: "1",
|
10
|
+
value_text: "Burgers",
|
11
|
+
},
|
12
|
+
{
|
13
|
+
value: "2",
|
14
|
+
selected: true,
|
15
|
+
value_text: "Pizza",
|
16
|
+
},
|
17
|
+
{
|
18
|
+
value: "3",
|
19
|
+
value_text: "Tacos",
|
20
|
+
},
|
21
|
+
{
|
22
|
+
value: "4",
|
23
|
+
value_text: "BBQ",
|
24
|
+
},
|
25
|
+
]
|
26
|
+
}) %>
|
@@ -0,0 +1 @@
|
|
1
|
+
Inspect the element and notice the data-attribute being added to the `<select>` element
|
@@ -0,0 +1,36 @@
|
|
1
|
+
<%= pb_rails("select", props: {
|
2
|
+
label: "Favorite Food",
|
3
|
+
name: "food",
|
4
|
+
multiple: true,
|
5
|
+
options: [
|
6
|
+
{
|
7
|
+
value: "1",
|
8
|
+
value_text: "Burgers",
|
9
|
+
},
|
10
|
+
{
|
11
|
+
value: "2",
|
12
|
+
selected: true,
|
13
|
+
value_text: "Pizza",
|
14
|
+
},
|
15
|
+
{
|
16
|
+
value: "3",
|
17
|
+
value_text: "Tacos",
|
18
|
+
},
|
19
|
+
{
|
20
|
+
value: "4",
|
21
|
+
value_text: "BBQ",
|
22
|
+
},
|
23
|
+
{
|
24
|
+
value: "4",
|
25
|
+
value_text: "Sushi",
|
26
|
+
},
|
27
|
+
{
|
28
|
+
value: "4",
|
29
|
+
value_text: "Chinese",
|
30
|
+
},
|
31
|
+
{
|
32
|
+
value: "4",
|
33
|
+
value_text: "Hot Dogs",
|
34
|
+
},
|
35
|
+
]
|
36
|
+
}) %>
|
@@ -0,0 +1,50 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
|
3
|
+
import Select from '../_select'
|
4
|
+
|
5
|
+
const SelectMultiple = (props) => {
|
6
|
+
const options = [
|
7
|
+
{
|
8
|
+
value: '1',
|
9
|
+
text: 'Burgers',
|
10
|
+
},
|
11
|
+
{
|
12
|
+
value: '2',
|
13
|
+
text: 'Pizza',
|
14
|
+
},
|
15
|
+
{
|
16
|
+
value: '3',
|
17
|
+
text: 'Tacos',
|
18
|
+
},
|
19
|
+
{
|
20
|
+
value: '3',
|
21
|
+
text: 'BBQ',
|
22
|
+
},
|
23
|
+
{
|
24
|
+
value: '3',
|
25
|
+
text: 'Sushi',
|
26
|
+
},
|
27
|
+
{
|
28
|
+
value: '3',
|
29
|
+
text: 'Chinese',
|
30
|
+
},
|
31
|
+
{
|
32
|
+
value: '3',
|
33
|
+
text: 'Hot Dogs',
|
34
|
+
},
|
35
|
+
]
|
36
|
+
|
37
|
+
return (
|
38
|
+
<div>
|
39
|
+
<Select
|
40
|
+
label="Favorite Food"
|
41
|
+
multiple
|
42
|
+
name="food"
|
43
|
+
options={options}
|
44
|
+
{...props}
|
45
|
+
/>
|
46
|
+
</div>
|
47
|
+
)
|
48
|
+
}
|
49
|
+
|
50
|
+
export default SelectMultiple
|
@@ -0,0 +1 @@
|
|
1
|
+
We recommend using a typeahead for better UX
|
@@ -11,6 +11,8 @@ examples:
|
|
11
11
|
- select_error: Select w/ Error
|
12
12
|
- select_inline: Select Inline
|
13
13
|
- select_inline_compact: Select Inline Compact
|
14
|
+
- select_attributes: Select W/ Attributes
|
15
|
+
- select_multiple: Select Multiple
|
14
16
|
|
15
17
|
|
16
18
|
|
@@ -25,3 +27,4 @@ examples:
|
|
25
27
|
- select_error: Select w/ Error
|
26
28
|
- select_inline: Select Inline
|
27
29
|
- select_inline_compact: Select Inline Compact
|
30
|
+
- select_multiple: Select Multiple
|
@@ -8,3 +8,4 @@ export { default as SelectValueTextSame } from './_select_value_text_same.jsx'
|
|
8
8
|
export { default as SelectError } from './_select_error.jsx'
|
9
9
|
export { default as SelectInline } from './_select_inline.jsx'
|
10
10
|
export { default as SelectInlineCompact } from './_select_inline_compact.jsx'
|
11
|
+
export { default as SelectMultiple } from './_select_multiple.jsx'
|