playbook_ui 13.19.0.pre.alpha.PBNTR207tabledivsupport2261 → 13.19.0.pre.alpha.PBNTR211tablekitsubcomponentsreact2318
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/pb_kits/playbook/index.js +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +4 -4
- data/app/pb_kits/playbook/pb_icon/_icon.tsx +28 -16
- data/app/pb_kits/playbook/pb_icon/docs/_icon_custom.html.erb +5 -11
- data/app/pb_kits/playbook/pb_icon/docs/_icon_custom.jsx +44 -18
- data/app/pb_kits/playbook/pb_icon/docs/_icon_custom.md +4 -8
- data/app/pb_kits/playbook/pb_icon/icon.html.erb +6 -4
- data/app/pb_kits/playbook/pb_icon/icon.rb +27 -10
- data/app/pb_kits/playbook/pb_table/SubKits/_table_body.tsx +64 -0
- data/app/pb_kits/playbook/pb_table/SubKits/_table_cell.tsx +66 -0
- data/app/pb_kits/playbook/pb_table/SubKits/_table_head.tsx +64 -0
- data/app/pb_kits/playbook/pb_table/SubKits/_table_header.tsx +66 -0
- data/app/pb_kits/playbook/pb_table/SubKits/_table_row.tsx +74 -0
- data/app/pb_kits/playbook/pb_table/SubKits/index.tsx +5 -0
- data/app/pb_kits/playbook/pb_table/_table.tsx +13 -0
- data/app/pb_kits/playbook/pb_table/docs/_table_side_highlight.jsx +24 -25
- data/app/pb_kits/playbook/pb_table/docs/_table_with_subcomponents.html.erb +34 -0
- data/app/pb_kits/playbook/pb_table/docs/_table_with_subcomponents.jsx +47 -0
- data/app/pb_kits/playbook/pb_table/docs/_table_with_subcomponents_as_divs.html.erb +34 -0
- data/app/pb_kits/playbook/pb_table/docs/_table_with_subcomponents_as_divs.jsx +48 -0
- data/app/pb_kits/playbook/pb_table/docs/example.yml +7 -2
- data/app/pb_kits/playbook/pb_table/docs/index.js +2 -0
- data/app/pb_kits/playbook/pb_table/styles/_striped.scss +2 -2
- data/app/pb_kits/playbook/pb_table/styles/_structure.scss +4 -2
- data/app/pb_kits/playbook/pb_table/table.test.js +142 -1
- data/app/pb_kits/playbook/pb_table/table_body.html.erb +17 -0
- data/app/pb_kits/playbook/pb_table/table_body.rb +15 -0
- data/app/pb_kits/playbook/pb_table/table_cell.html.erb +17 -0
- data/app/pb_kits/playbook/pb_table/table_cell.rb +17 -0
- data/app/pb_kits/playbook/pb_table/table_head.html.erb +17 -0
- data/app/pb_kits/playbook/pb_table/table_head.rb +15 -0
- data/app/pb_kits/playbook/pb_table/table_header.html.erb +49 -39
- data/app/pb_kits/playbook/pb_table/table_header.rb +8 -1
- data/app/pb_kits/playbook/pb_table/table_row.html.erb +17 -7
- data/app/pb_kits/playbook/pb_table/table_row.rb +8 -1
- data/dist/playbook-rails.js +6 -6
- data/lib/playbook/version.rb +1 -1
- metadata +18 -3
- data/app/pb_kits/playbook/pb_table/_table_row.tsx +0 -47
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a2a8401ba8a89fbd4477ebe4c6b623775ac8d8549ccc3ed7cdb8b45be2e3378
|
4
|
+
data.tar.gz: fec2e78f34f867ffbc5a821d9fbdd87d6babdf9b6f2fcbbaac7bcfdcf60dcbc8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 62ede5709d8065b9bc8940baea20b1445fbcf757f7f536e668b444958243a78b35a56a7c1631776c903ab5af597ceb8277078fa76388ed72b54ceae678c99efd
|
7
|
+
data.tar.gz: 24fb2f1a7d742933a49e6b4a2582b2bcf967cc7665919b8960eef63caed35c40d22b1b4e046d4b2d792df5433ce27587ab7c86938fb147c3952e5b0479dff003
|
@@ -93,7 +93,7 @@ export { default as StarRating } from './pb_star_rating/_star_rating'
|
|
93
93
|
export { default as StatChange } from './pb_stat_change/_stat_change'
|
94
94
|
export { default as StatValue } from './pb_stat_value/_stat_value'
|
95
95
|
export { default as Table } from './pb_table/_table'
|
96
|
-
export { default as TableRow } from './pb_table/_table_row'
|
96
|
+
export { default as TableRow } from './pb_table/SubKits/_table_row'
|
97
97
|
export { default as TextInput } from './pb_text_input/_text_input'
|
98
98
|
export { default as Textarea } from './pb_textarea/_textarea'
|
99
99
|
export { default as Time } from './pb_time/_time'
|
@@ -20,7 +20,7 @@ import AdvancedTableContext from "./Context/AdvancedTableContext";
|
|
20
20
|
import { TableHeader } from "./SubKits/TableHeader";
|
21
21
|
import { TableBody } from "./SubKits/TableBody";
|
22
22
|
|
23
|
-
import { DataType
|
23
|
+
import { DataType } from "./Utilities/types";
|
24
24
|
|
25
25
|
type AdvancedTableProps = {
|
26
26
|
aria?: { [key: string]: string };
|
@@ -80,7 +80,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
80
80
|
? expandedControl.onChange
|
81
81
|
: setLocalExpanded;
|
82
82
|
|
83
|
-
const columnHelper = createColumnHelper
|
83
|
+
const columnHelper = createColumnHelper();
|
84
84
|
|
85
85
|
//Create cells for first columns
|
86
86
|
const createCellFunction = (cellAccessors: string[]) => {
|
@@ -163,7 +163,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
163
163
|
data: loading ? Array(loadingStateRowCount).fill({}) : tableData,
|
164
164
|
columns,
|
165
165
|
onExpandedChange: setExpanded,
|
166
|
-
getSubRows: (row) => row.children,
|
166
|
+
getSubRows: (row: DataType) => row.children,
|
167
167
|
getCoreRowModel: getCoreRowModel(),
|
168
168
|
getExpandedRowModel: getExpandedRowModel(),
|
169
169
|
getSortedRowModel: getSortedRowModel(),
|
@@ -192,7 +192,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
192
192
|
const handleExpandOrCollapse = (row: Row<DataType>) => {
|
193
193
|
onToggleExpansionClick && onToggleExpansionClick(row);
|
194
194
|
|
195
|
-
const expandedState = expanded
|
195
|
+
const expandedState = expanded;
|
196
196
|
const targetParent = row?.parentId;
|
197
197
|
return setExpanded(
|
198
198
|
updateExpandAndCollapseState(tableRows, expandedState, targetParent)
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import React from 'react'
|
1
|
+
import React, { ReactSVGElement } from 'react'
|
2
2
|
import classnames from 'classnames'
|
3
3
|
import { buildAriaProps, buildDataProps, buildHtmlProps } from '../utilities/props'
|
4
4
|
import { GlobalProps, globalProps } from '../utilities/globalProps'
|
@@ -27,7 +27,7 @@ type IconProps = {
|
|
27
27
|
data?: {[key: string]: string},
|
28
28
|
fixedWidth?: boolean,
|
29
29
|
flip?: "horizontal" | "vertical" | "both" | "none",
|
30
|
-
icon: string,
|
30
|
+
icon: string | ReactSVGElement,
|
31
31
|
htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
|
32
32
|
id?: string,
|
33
33
|
inverse?: boolean,
|
@@ -47,6 +47,11 @@ const flipMap = {
|
|
47
47
|
none: ""
|
48
48
|
}
|
49
49
|
|
50
|
+
declare global {
|
51
|
+
// eslint-disable-next-line no-var
|
52
|
+
var PB_ICONS: {[key: string]: React.FunctionComponent<any>}
|
53
|
+
}
|
54
|
+
|
50
55
|
const Icon = (props: IconProps) => {
|
51
56
|
const {
|
52
57
|
aria = {},
|
@@ -57,7 +62,7 @@ const Icon = (props: IconProps) => {
|
|
57
62
|
fixedWidth = true,
|
58
63
|
flip = "none",
|
59
64
|
htmlOptions = {},
|
60
|
-
icon,
|
65
|
+
icon = "",
|
61
66
|
id,
|
62
67
|
inverse = false,
|
63
68
|
listItem = false,
|
@@ -69,6 +74,8 @@ const Icon = (props: IconProps) => {
|
|
69
74
|
spin = false,
|
70
75
|
} = props
|
71
76
|
|
77
|
+
let iconElement: ReactSVGElement | null = typeof(icon) === "object" ? icon : null
|
78
|
+
|
72
79
|
const faClasses = {
|
73
80
|
'fa-border': border,
|
74
81
|
'fa-fw': fixedWidth,
|
@@ -79,19 +86,23 @@ const Icon = (props: IconProps) => {
|
|
79
86
|
[`fa-${size}`]: size,
|
80
87
|
[`fa-pull-${pull}`]: pull,
|
81
88
|
[`fa-rotate-${rotation}`]: rotation,
|
89
|
+
}
|
90
|
+
|
91
|
+
if (!customIcon && !iconElement) {
|
92
|
+
const PowerIcon: React.FunctionComponent<any> | undefined =
|
93
|
+
window.PB_ICONS ? window.PB_ICONS[icon as string] : null
|
82
94
|
|
95
|
+
if (PowerIcon) {
|
96
|
+
iconElement = <PowerIcon /> as ReactSVGElement
|
97
|
+
} else {
|
98
|
+
faClasses[`fa-${icon}`] = icon as string
|
99
|
+
}
|
83
100
|
}
|
84
101
|
|
85
|
-
// Lets check and see if the icon prop is referring to a custom Power icon...
|
86
|
-
// If so, then set fa-icon to "custom"
|
87
|
-
// this ensures the JS will not do any further operations
|
88
|
-
// faClasses[`fa-${icon}`] = customIcon ? 'custom' : icon
|
89
|
-
if (!customIcon) faClasses[`fa-${icon}`] = icon
|
90
|
-
|
91
102
|
const classes = classnames(
|
92
103
|
flipMap[flip],
|
93
|
-
'pb_icon_kit',
|
94
|
-
customIcon ? '' : fontStyle,
|
104
|
+
(!iconElement && !customIcon) ? 'pb_icon_kit' : '',
|
105
|
+
(iconElement || customIcon) ? 'pb_custom_icon' : fontStyle,
|
95
106
|
faClasses,
|
96
107
|
globalProps(props),
|
97
108
|
className
|
@@ -110,20 +121,22 @@ const Icon = (props: IconProps) => {
|
|
110
121
|
|
111
122
|
// Add a conditional here to show only the SVG if custom
|
112
123
|
const displaySVG = (customIcon: any) => {
|
113
|
-
if (customIcon)
|
124
|
+
if (iconElement || customIcon)
|
114
125
|
return (
|
115
126
|
<>
|
116
127
|
{
|
117
|
-
React.cloneElement(customIcon, {
|
128
|
+
React.cloneElement(iconElement || customIcon, {
|
118
129
|
...dataProps,
|
119
130
|
...htmlProps,
|
120
131
|
className: classes,
|
121
132
|
id,
|
133
|
+
width: 'auto',
|
134
|
+
height: 'auto',
|
122
135
|
})
|
123
136
|
}
|
124
137
|
</>
|
125
138
|
)
|
126
|
-
else if (isValidEmoji(icon))
|
139
|
+
else if (isValidEmoji(icon as string))
|
127
140
|
return (
|
128
141
|
<>
|
129
142
|
<span
|
@@ -136,7 +149,6 @@ const Icon = (props: IconProps) => {
|
|
136
149
|
</span>
|
137
150
|
</>
|
138
151
|
)
|
139
|
-
|
140
152
|
else
|
141
153
|
return (
|
142
154
|
<>
|
@@ -161,4 +173,4 @@ const Icon = (props: IconProps) => {
|
|
161
173
|
)
|
162
174
|
}
|
163
175
|
|
164
|
-
export default Icon
|
176
|
+
export default Icon
|
@@ -2,15 +2,9 @@
|
|
2
2
|
<div class="icon-wrapper">
|
3
3
|
|
4
4
|
<% svg_url = "https://upload.wikimedia.org/wikipedia/commons/3/3b/Wrench_font_awesome.svg" %>
|
5
|
-
<p><%= pb_rails("icon", props: {
|
6
|
-
<p><%= pb_rails("icon", props: { rotation: 90,
|
7
|
-
<p><%= pb_rails("icon", props: { spin: true,
|
8
|
-
<p><%= pb_rails("icon", props: { size: "5x",
|
9
|
-
<p><%= pb_rails("icon", props: { flip: "horizontal", size: "5x",
|
10
|
-
|
11
|
-
<%= pb_rails("body", props: {
|
12
|
-
text: "Custom icons are compatible with other icon props (size, rotation,
|
13
|
-
spin, flip, etc). Their SVG fill colors will be inherited from
|
14
|
-
parent element's css color properties."
|
15
|
-
} ) %>
|
5
|
+
<p><%= pb_rails("icon", props: { icon: svg_url } ) %></p>
|
6
|
+
<p><%= pb_rails("icon", props: { rotation: 90, icon: svg_url, size: "2x" } ) %></p>
|
7
|
+
<p><%= pb_rails("icon", props: { spin: true, icon: svg_url, size: "3x" } ) %></p>
|
8
|
+
<p><%= pb_rails("icon", props: { size: "5x", icon: svg_url } ) %></p>
|
9
|
+
<p><%= pb_rails("icon", props: { flip: "horizontal", size: "5x", icon: svg_url } ) %></p>
|
16
10
|
</div>
|
@@ -1,33 +1,59 @@
|
|
1
1
|
import React from 'react'
|
2
2
|
import { Icon } from '../../'
|
3
3
|
|
4
|
-
// import Icons as config from 'power-icons'
|
5
4
|
const config = {
|
6
|
-
|
7
|
-
<svg
|
8
|
-
ariaHidden="true"
|
9
|
-
focusable="false"
|
10
|
-
role="img"
|
11
|
-
viewBox="0 0 512 512"
|
5
|
+
icon: (
|
6
|
+
<svg viewBox="0 -256 1792 1792"
|
12
7
|
xmlns="http://www.w3.org/2000/svg"
|
13
8
|
>
|
14
|
-
<
|
15
|
-
d="
|
16
|
-
|
17
|
-
/>
|
9
|
+
<g transform="matrix(1,0,0,-1,53.152542,1217.0847)">
|
10
|
+
<path d="m 384,64 q 0,26 -19,45 -19,19 -45,19 -26,0 -45,-19 -19,-19 -19,-45 0,-26 19,-45 19,-19 45,-19 26,0 45,19 19,19 19,45 z m 644,420 -682,-682 q -37,-37 -90,-37 -52,0 -91,37 L 59,-90 Q 21,-54 21,0 21,53 59,91 L 740,772 Q 779,674 854.5,598.5 930,523 1028,484 z m 634,435 q 0,-39 -23,-106 Q 1592,679 1474.5,595.5 1357,512 1216,512 1031,512 899.5,643.5 768,775 768,960 q 0,185 131.5,316.5 131.5,131.5 316.5,131.5 58,0 121.5,-16.5 63.5,-16.5 107.5,-46.5 16,-11 16,-28 0,-17 -16,-28 L 1152,1120 V 896 l 193,-107 q 5,3 79,48.5 74,45.5 135.5,81 61.5,35.5 70.5,35.5 15,0 23.5,-10 8.5,-10 8.5,-25 z" />
|
11
|
+
</g>
|
18
12
|
</svg>
|
19
13
|
),
|
20
14
|
}
|
21
15
|
|
22
16
|
const IconCustom = (props) => {
|
23
17
|
return (
|
24
|
-
<
|
25
|
-
<
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
18
|
+
<React.Fragment>
|
19
|
+
<p>
|
20
|
+
<Icon
|
21
|
+
icon={config.icon}
|
22
|
+
{...props}
|
23
|
+
/>
|
24
|
+
</p>
|
25
|
+
<p>
|
26
|
+
<Icon
|
27
|
+
icon={config.icon}
|
28
|
+
rotation={90}
|
29
|
+
size="2x"
|
30
|
+
{...props}
|
31
|
+
/>
|
32
|
+
</p>
|
33
|
+
<p>
|
34
|
+
<Icon
|
35
|
+
icon={config.icon}
|
36
|
+
size="3x"
|
37
|
+
spin
|
38
|
+
{...props}
|
39
|
+
/>
|
40
|
+
</p>
|
41
|
+
<p>
|
42
|
+
<Icon
|
43
|
+
icon={config.icon}
|
44
|
+
size="5x"
|
45
|
+
{...props}
|
46
|
+
/>
|
47
|
+
</p>
|
48
|
+
<p>
|
49
|
+
<Icon
|
50
|
+
flip="horizontal"
|
51
|
+
icon={config.icon}
|
52
|
+
size="5x"
|
53
|
+
{...props}
|
54
|
+
/>
|
55
|
+
</p>
|
56
|
+
</React.Fragment>
|
31
57
|
)
|
32
58
|
}
|
33
59
|
|
@@ -4,16 +4,12 @@ When using custom icons it is important to introduce a "clean" SVG. In order to
|
|
4
4
|
|
5
5
|
Attributes must be React compatible e.g. <code>xmlns:xlink</code> should be <code>xmlnsXlink</code> and so on. <strong>There should be no hyphenated attributes and no semi-colons!.</strong>
|
6
6
|
|
7
|
-
Fill colors with regards to <code>g</code> or <code>path</code> nodes, e.g. <code>fill="black"</code>, should be replaced with
|
7
|
+
Fill colors with regards to <code>g</code> or <code>path</code> nodes, e.g. <code>fill="black"</code>, should be replaced with <code>currentColor</code> ala <code>fill="currentColor"</code>. Your mileage may vary depending on the complexity of your SVG.
|
8
8
|
|
9
|
-
Pay attention to your custom icon's dimensions and `viewBox` attribute. It is best to use a `viewBox="0 0 512 512"` starting point
|
9
|
+
Pay attention to your custom icon's dimensions and `viewBox` attribute. It is best to use a `viewBox="0 0 512 512"` starting point **when designing instead of trying to retrofit the viewbox afterwards**!
|
10
10
|
|
11
|
-
You must source
|
12
|
-
|
13
|
-
### React
|
14
|
-
|
15
|
-
So long as you have a valid React `<SVG>` node, you can send it as the `customIcon` prop and the kit will take care of the rest.
|
11
|
+
You must source _your own SVG into component/view_ you are working on. This can easily be done in programmatic and maintainable ways.
|
16
12
|
|
17
13
|
### Rails
|
18
14
|
|
19
|
-
|
15
|
+
Sending the absolute path to the `icon` prop results in an `<SVG>` tag within the working view.
|
@@ -1,7 +1,9 @@
|
|
1
|
-
<% if object.
|
2
|
-
<%= object.render_svg
|
3
|
-
<% elsif object.valid_emoji
|
4
|
-
<span class="pb_icon_kit_emoji"
|
1
|
+
<% if object.is_svg? %>
|
2
|
+
<%= object.render_svg %>
|
3
|
+
<% elsif object.valid_emoji? %>
|
4
|
+
<span class="pb_icon_kit_emoji">
|
5
|
+
<%= object.icon.html_safe %>
|
6
|
+
</span>
|
5
7
|
<% else %>
|
6
8
|
<%= content_tag(:i, nil,
|
7
9
|
id: object.id,
|
@@ -38,7 +38,7 @@ module Playbook
|
|
38
38
|
prop :spin, type: Playbook::Props::Boolean,
|
39
39
|
default: false
|
40
40
|
|
41
|
-
def valid_emoji
|
41
|
+
def valid_emoji?
|
42
42
|
emoji_regex = /\p{Emoji}/
|
43
43
|
emoji_regex.match?(icon)
|
44
44
|
end
|
@@ -79,19 +79,36 @@ module Playbook
|
|
79
79
|
)
|
80
80
|
end
|
81
81
|
|
82
|
-
def
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
82
|
+
def asset_path
|
83
|
+
return unless Rails.application.config.respond_to?(:icon_path)
|
84
|
+
return unless Dir.entries(Rails.application.config.icon_path).include? "#{icon}.svg"
|
85
|
+
|
86
|
+
Rails.root.join(Rails.application.config.icon_path, "#{icon}.svg")
|
87
|
+
end
|
88
|
+
|
89
|
+
def render_svg
|
90
|
+
doc = Nokogiri::XML(URI.open(asset_path || icon || custom_icon)) # rubocop:disable Security/Open
|
91
|
+
svg = doc.at_css "svg"
|
92
|
+
svg["class"] = "pb_custom_icon " + object.custom_icon_classname
|
93
|
+
svg["id"] = object.id
|
94
|
+
svg["data"] = object.data
|
95
|
+
svg["aria"] = object.aria
|
96
|
+
svg["height"] = "auto"
|
97
|
+
svg["width"] = "auto"
|
98
|
+
doc.at_css("path")["fill"] = "currentColor"
|
99
|
+
raw doc
|
100
|
+
end
|
101
|
+
|
102
|
+
def is_svg?
|
103
|
+
(icon || custom_icon.to_s).include?(".svg") || asset_path.present?
|
91
104
|
end
|
92
105
|
|
93
106
|
private
|
94
107
|
|
108
|
+
def svg_size
|
109
|
+
size.nil? ? "1x" : size
|
110
|
+
end
|
111
|
+
|
95
112
|
def border_class
|
96
113
|
border ? "fa-border" : nil
|
97
114
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
import React from "react";
|
2
|
+
import classnames from "classnames";
|
3
|
+
import {
|
4
|
+
buildAriaProps,
|
5
|
+
buildDataProps,
|
6
|
+
buildHtmlProps,
|
7
|
+
} from "../../utilities/props";
|
8
|
+
import { globalProps } from "../../utilities/globalProps";
|
9
|
+
|
10
|
+
type TableBodyPropTypes = {
|
11
|
+
aria?: { [key: string]: string };
|
12
|
+
children: React.ReactNode[] | React.ReactNode;
|
13
|
+
className: string;
|
14
|
+
data?: { [key: string]: string };
|
15
|
+
htmlOptions?: { [key: string]: string | number | boolean | (() => void) };
|
16
|
+
id?: string;
|
17
|
+
tag?: "table" | "div";
|
18
|
+
};
|
19
|
+
|
20
|
+
const TableBody = (props: TableBodyPropTypes) => {
|
21
|
+
const {
|
22
|
+
aria = {},
|
23
|
+
children,
|
24
|
+
className,
|
25
|
+
data = {},
|
26
|
+
htmlOptions = {},
|
27
|
+
id,
|
28
|
+
tag = "table",
|
29
|
+
} = props;
|
30
|
+
|
31
|
+
const ariaProps = buildAriaProps(aria);
|
32
|
+
const dataProps = buildDataProps(data);
|
33
|
+
const htmlProps = buildHtmlProps(htmlOptions);
|
34
|
+
const classes = classnames("pb_table_tbody", globalProps(props), className);
|
35
|
+
const isTableTag = tag === "table";
|
36
|
+
|
37
|
+
return (
|
38
|
+
<>
|
39
|
+
{isTableTag ? (
|
40
|
+
<tbody
|
41
|
+
{...ariaProps}
|
42
|
+
{...dataProps}
|
43
|
+
{...htmlProps}
|
44
|
+
className={classes}
|
45
|
+
id={id}
|
46
|
+
>
|
47
|
+
{children}
|
48
|
+
</tbody>
|
49
|
+
) : (
|
50
|
+
<div
|
51
|
+
{...ariaProps}
|
52
|
+
{...dataProps}
|
53
|
+
{...htmlProps}
|
54
|
+
className={classes}
|
55
|
+
id={id}
|
56
|
+
>
|
57
|
+
{children}
|
58
|
+
</div>
|
59
|
+
)}
|
60
|
+
</>
|
61
|
+
);
|
62
|
+
};
|
63
|
+
|
64
|
+
export default TableBody;
|
@@ -0,0 +1,66 @@
|
|
1
|
+
import React from "react";
|
2
|
+
import classnames from "classnames";
|
3
|
+
import {
|
4
|
+
buildAriaProps,
|
5
|
+
buildDataProps,
|
6
|
+
buildHtmlProps,
|
7
|
+
} from "../../utilities/props";
|
8
|
+
import { globalProps } from "../../utilities/globalProps";
|
9
|
+
|
10
|
+
type TableCellPropTypes = {
|
11
|
+
aria?: { [key: string]: string };
|
12
|
+
children: React.ReactNode[] | React.ReactNode;
|
13
|
+
className: string;
|
14
|
+
data?: { [key: string]: string };
|
15
|
+
htmlOptions?: { [key: string]: string | number | boolean | (() => void) };
|
16
|
+
id?: string;
|
17
|
+
tag?: "table" | "div";
|
18
|
+
text?: string
|
19
|
+
};
|
20
|
+
|
21
|
+
const TableCell = (props: TableCellPropTypes) => {
|
22
|
+
const {
|
23
|
+
aria = {},
|
24
|
+
children,
|
25
|
+
className,
|
26
|
+
data = {},
|
27
|
+
htmlOptions = {},
|
28
|
+
id,
|
29
|
+
tag = "table",
|
30
|
+
text,
|
31
|
+
} = props;
|
32
|
+
|
33
|
+
const ariaProps = buildAriaProps(aria);
|
34
|
+
const dataProps = buildDataProps(data);
|
35
|
+
const htmlProps = buildHtmlProps(htmlOptions);
|
36
|
+
const classes = classnames("pb_table_td", globalProps(props), className);
|
37
|
+
const isTableTag = tag === "table";
|
38
|
+
|
39
|
+
return (
|
40
|
+
<>
|
41
|
+
{isTableTag ? (
|
42
|
+
<td
|
43
|
+
{...ariaProps}
|
44
|
+
{...dataProps}
|
45
|
+
{...htmlProps}
|
46
|
+
className={classes}
|
47
|
+
id={id}
|
48
|
+
>
|
49
|
+
{text || children}
|
50
|
+
</td>
|
51
|
+
) : (
|
52
|
+
<div
|
53
|
+
{...ariaProps}
|
54
|
+
{...dataProps}
|
55
|
+
{...htmlProps}
|
56
|
+
className={classes}
|
57
|
+
id={id}
|
58
|
+
>
|
59
|
+
{text || children}
|
60
|
+
</div>
|
61
|
+
)}
|
62
|
+
</>
|
63
|
+
);
|
64
|
+
};
|
65
|
+
|
66
|
+
export default TableCell;
|
@@ -0,0 +1,64 @@
|
|
1
|
+
import React from "react";
|
2
|
+
import classnames from "classnames";
|
3
|
+
import {
|
4
|
+
buildAriaProps,
|
5
|
+
buildDataProps,
|
6
|
+
buildHtmlProps,
|
7
|
+
} from "../../utilities/props";
|
8
|
+
import { globalProps } from "../../utilities/globalProps";
|
9
|
+
|
10
|
+
type TableHeadPropTypes = {
|
11
|
+
aria?: { [key: string]: string };
|
12
|
+
children: React.ReactNode[] | React.ReactNode;
|
13
|
+
className: string;
|
14
|
+
data?: { [key: string]: string };
|
15
|
+
htmlOptions?: { [key: string]: string | number | boolean | (() => void) };
|
16
|
+
id?: string;
|
17
|
+
tag?: "table" | "div";
|
18
|
+
};
|
19
|
+
|
20
|
+
const TableHead = (props: TableHeadPropTypes) => {
|
21
|
+
const {
|
22
|
+
aria = {},
|
23
|
+
children,
|
24
|
+
className,
|
25
|
+
data = {},
|
26
|
+
htmlOptions = {},
|
27
|
+
id,
|
28
|
+
tag = "table",
|
29
|
+
} = props;
|
30
|
+
|
31
|
+
const ariaProps = buildAriaProps(aria);
|
32
|
+
const dataProps = buildDataProps(data);
|
33
|
+
const htmlProps = buildHtmlProps(htmlOptions);
|
34
|
+
const classes = classnames("pb_table_thead", globalProps(props), className);
|
35
|
+
const isTableTag = tag === "table";
|
36
|
+
|
37
|
+
return (
|
38
|
+
<>
|
39
|
+
{isTableTag ? (
|
40
|
+
<thead
|
41
|
+
{...ariaProps}
|
42
|
+
{...dataProps}
|
43
|
+
{...htmlProps}
|
44
|
+
className={classes}
|
45
|
+
id={id}
|
46
|
+
>
|
47
|
+
{children}
|
48
|
+
</thead>
|
49
|
+
) : (
|
50
|
+
<div
|
51
|
+
{...ariaProps}
|
52
|
+
{...dataProps}
|
53
|
+
{...htmlProps}
|
54
|
+
className={classes}
|
55
|
+
id={id}
|
56
|
+
>
|
57
|
+
{children}
|
58
|
+
</div>
|
59
|
+
)}
|
60
|
+
</>
|
61
|
+
);
|
62
|
+
};
|
63
|
+
|
64
|
+
export default TableHead;
|
@@ -0,0 +1,66 @@
|
|
1
|
+
import React from "react";
|
2
|
+
import classnames from "classnames";
|
3
|
+
import {
|
4
|
+
buildAriaProps,
|
5
|
+
buildDataProps,
|
6
|
+
buildHtmlProps,
|
7
|
+
} from "../../utilities/props";
|
8
|
+
import { globalProps } from "../../utilities/globalProps";
|
9
|
+
|
10
|
+
type TableHeaderPropTypes = {
|
11
|
+
aria?: { [key: string]: string };
|
12
|
+
children: React.ReactNode[] | React.ReactNode;
|
13
|
+
className: string;
|
14
|
+
data?: { [key: string]: string };
|
15
|
+
htmlOptions?: { [key: string]: string | number | boolean | (() => void) };
|
16
|
+
id?: string;
|
17
|
+
tag?: "table" | "div";
|
18
|
+
text?: string;
|
19
|
+
};
|
20
|
+
|
21
|
+
const TableHeader = (props: TableHeaderPropTypes) => {
|
22
|
+
const {
|
23
|
+
aria = {},
|
24
|
+
children,
|
25
|
+
className,
|
26
|
+
data = {},
|
27
|
+
htmlOptions = {},
|
28
|
+
id,
|
29
|
+
tag = "table",
|
30
|
+
text
|
31
|
+
} = props;
|
32
|
+
|
33
|
+
const ariaProps = buildAriaProps(aria);
|
34
|
+
const dataProps = buildDataProps(data);
|
35
|
+
const htmlProps = buildHtmlProps(htmlOptions);
|
36
|
+
const classes = classnames("pb_table_th", globalProps(props), className);
|
37
|
+
const isTableTag = tag === "table";
|
38
|
+
|
39
|
+
return (
|
40
|
+
<>
|
41
|
+
{isTableTag ? (
|
42
|
+
<th
|
43
|
+
{...ariaProps}
|
44
|
+
{...dataProps}
|
45
|
+
{...htmlProps}
|
46
|
+
className={classes}
|
47
|
+
id={id}
|
48
|
+
>
|
49
|
+
{text || children}
|
50
|
+
</th>
|
51
|
+
) : (
|
52
|
+
<div
|
53
|
+
{...ariaProps}
|
54
|
+
{...dataProps}
|
55
|
+
{...htmlProps}
|
56
|
+
className={classes}
|
57
|
+
id={id}
|
58
|
+
>
|
59
|
+
{text || children}
|
60
|
+
</div>
|
61
|
+
)}
|
62
|
+
</>
|
63
|
+
);
|
64
|
+
};
|
65
|
+
|
66
|
+
export default TableHeader;
|