@transferwise/components 0.0.0-experimental-2a98831 → 0.0.0-experimental-3e45476
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.
- package/build/table/TableCell.js +7 -1
- package/build/table/TableCell.js.map +1 -1
- package/build/table/TableCell.mjs +7 -1
- package/build/table/TableCell.mjs.map +1 -1
- package/build/test-utils/assets/wise-card.svg +1 -0
- package/build/types/table/TableCell.d.ts +6 -3
- package/build/types/table/TableCell.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/table/Table.story.tsx +59 -1
- package/src/table/TableCell.spec.tsx +17 -0
- package/src/table/TableCell.tsx +14 -5
- package/src/test-utils/assets/wise-card.svg +1 -0
package/build/table/TableCell.js
CHANGED
|
@@ -38,6 +38,12 @@ const TableCell = ({
|
|
|
38
38
|
sentiment: cell?.sentiment ?? 'neutral'
|
|
39
39
|
});
|
|
40
40
|
}
|
|
41
|
+
if (cell?.type === 'media' && cell.media) {
|
|
42
|
+
// eslint-disable-next-line jsx-a11y/alt-text
|
|
43
|
+
mediaContent = /*#__PURE__*/jsxRuntime.jsx("img", {
|
|
44
|
+
...cell.media
|
|
45
|
+
});
|
|
46
|
+
}
|
|
41
47
|
if (mediaContent) {
|
|
42
48
|
return /*#__PURE__*/jsxRuntime.jsx("div", {
|
|
43
49
|
"aria-hidden": "true",
|
|
@@ -63,7 +69,7 @@ const TableCell = ({
|
|
|
63
69
|
children: [cell?.type === 'text' && cell?.text && /*#__PURE__*/jsxRuntime.jsx(TableStatusText, {
|
|
64
70
|
text: cell?.text,
|
|
65
71
|
status: cell?.status
|
|
66
|
-
}), cell?.type && ['leading', 'currency', 'status'].includes(cell?.type) && /*#__PURE__*/jsxRuntime.jsxs("div", {
|
|
72
|
+
}), cell?.type && ['leading', 'currency', 'status', 'media'].includes(cell?.type) && /*#__PURE__*/jsxRuntime.jsxs("div", {
|
|
67
73
|
className: clsx.clsx('np-table-content', {
|
|
68
74
|
'np-table-content--reversed': alignment === 'right'
|
|
69
75
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableCell.js","sources":["../../src/table/TableCell.tsx"],"sourcesContent":["import TableStatusText from './TableStatusText';\nimport StatusIcon from '../statusIcon';\nimport { Flag } from '@wise/art';\nimport React from 'react';\nimport { clsx } from 'clsx';\nimport Body from '../body';\nimport Money, { MoneyProps } from '../money';\nimport AvatarView from '../avatarView';\n\ninterface TableCellTypeProp {\n type: 'leading' | 'text' | 'currency' | 'status';\n}\n\n// `Leading` and `Status` cell types have 2 text fields: `primaryText` and `secondaryText`\ninterface TableCellTextProps {\n primaryText?: string;\n secondaryText?: string;\n}\n\n// `Leading`, `Text` and `Currency` cells' types can have a status indicator with `error` or `success` values\ninterface TableCellStatusProp {\n status?: 'error' | 'success';\n}\n\nexport interface TableCellLeading\n extends TableCellTypeProp,\n TableCellTextProps,\n TableCellStatusProp {\n avatar?: {\n src?: string;\n profileName?: string | null;\n };\n}\n\nexport interface TableCellText extends TableCellTypeProp, TableCellStatusProp {\n text?: string;\n}\n\nexport interface TableCellCurrency extends TableCellTypeProp, TableCellStatusProp {\n primaryCurrency?: MoneyProps;\n secondaryCurrency?: MoneyProps;\n}\n\nexport interface TableCellStatus extends TableCellTypeProp, TableCellTextProps {\n sentiment?: 'negative' | 'neutral' | 'positive' | 'warning' | 'pending';\n}\n\nexport interface TableCellType {\n cell?: TableCellLeading & TableCellText & TableCellCurrency & TableCellStatus;\n alignment?: 'left' | 'right';\n}\n\n// These properties should be exported only on the lib level to prevent visual issues because of incorrect usage.\nexport interface TableCellProps extends TableCellType {\n className?: string;\n colSpan?: number;\n children?: React.ReactNode;\n}\n\nconst TableCell = ({ cell, alignment = 'left', className, colSpan, children }: TableCellProps) => {\n const getContentMedia = () => {\n let mediaContent = null;\n\n if (cell?.type === 'leading' && (cell?.avatar?.src || cell?.avatar?.profileName)) {\n mediaContent = (\n <AvatarView profileName={cell?.avatar?.profileName} size={40} imgSrc={cell?.avatar?.src} />\n );\n }\n\n if (cell?.type === 'currency' && cell?.primaryCurrency?.currency) {\n mediaContent = (\n <Flag code={cell?.primaryCurrency?.currency?.toLowerCase()} intrinsicSize={24} />\n );\n }\n\n if (cell?.type === 'status') {\n mediaContent = <StatusIcon size={24} sentiment={cell?.sentiment ?? 'neutral'} />;\n }\n\n if (mediaContent) {\n return (\n <div\n aria-hidden=\"true\"\n className=\"np-table-content-media\"\n data-testid=\"np-table-content-media\"\n >\n {mediaContent}\n </div>\n );\n }\n };\n\n const formatCurrencyValue = (currency?: MoneyProps) => {\n if (currency) {\n return <Money amount={currency.amount} currency={currency.currency} alwaysShowDecimals />;\n }\n\n return '';\n };\n\n return (\n <td\n className={clsx(\n 'np-table-cell',\n cell?.type ? `np-table-cell--${cell?.type}` : '',\n `np-table-cell--${alignment}`,\n className,\n )}\n colSpan={colSpan}\n >\n {cell?.type === 'text' && cell?.text && (\n <TableStatusText text={cell?.text} status={cell?.status} />\n )}\n {cell?.type && ['leading', 'currency', 'status'].includes(cell?.type) && (\n <div\n className={clsx('np-table-content', {\n 'np-table-content--reversed': alignment === 'right',\n })}\n data-testid=\"np-table-content\"\n >\n {getContentMedia()}\n <div className=\"np-table-content-body\">\n {(cell?.primaryCurrency ?? cell?.primaryText) && (\n <TableStatusText\n text={\n cell?.type === 'currency'\n ? formatCurrencyValue(cell?.primaryCurrency)\n : (cell?.primaryText ?? '')\n }\n status={cell?.type !== 'status' ? cell?.status : undefined}\n typography=\"default-bold\"\n />\n )}\n {(cell?.secondaryCurrency ?? cell?.secondaryText) && (\n <Body>\n {cell?.type === 'currency'\n ? formatCurrencyValue(cell?.secondaryCurrency)\n : cell?.secondaryText}\n </Body>\n )}\n </div>\n </div>\n )}\n {children}\n </td>\n );\n};\n\nexport default TableCell;\n"],"names":["TableCell","cell","alignment","className","colSpan","children","getContentMedia","mediaContent","type","avatar","src","profileName","_jsx","AvatarView","size","imgSrc","primaryCurrency","currency","Flag","code","toLowerCase","intrinsicSize","StatusIcon","sentiment","formatCurrencyValue","Money","amount","alwaysShowDecimals","_jsxs","clsx","text","TableStatusText","status","includes","primaryText","undefined","typography","secondaryCurrency","secondaryText","Body"],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"TableCell.js","sources":["../../src/table/TableCell.tsx"],"sourcesContent":["import TableStatusText from './TableStatusText';\nimport StatusIcon from '../statusIcon';\nimport { Flag } from '@wise/art';\nimport React, { ImgHTMLAttributes } from 'react';\nimport { clsx } from 'clsx';\nimport Body from '../body';\nimport Money, { MoneyProps } from '../money';\nimport AvatarView from '../avatarView';\n\ninterface TableCellTypeProp {\n type: 'leading' | 'text' | 'currency' | 'status' | 'media';\n}\n\n// `Media`, `Leading` and `Status` cell types have 2 text fields: `primaryText` and `secondaryText`\ninterface TableCellTextProps {\n primaryText?: string;\n secondaryText?: string;\n}\n\n// `Leading`, `Text` and `Currency` cells' types can have a status indicator with `error` or `success` values\ninterface TableCellStatusProp {\n status?: 'error' | 'success';\n}\n\nexport interface TableCellMedia extends TableCellTypeProp, TableCellTextProps {\n media?: ImgHTMLAttributes<HTMLImageElement>;\n}\n\nexport interface TableCellLeading\n extends TableCellTypeProp,\n TableCellTextProps,\n TableCellStatusProp {\n avatar?: {\n src?: string;\n profileName?: string | null;\n };\n}\n\nexport interface TableCellText extends TableCellTypeProp, TableCellStatusProp {\n text?: string;\n}\n\nexport interface TableCellCurrency extends TableCellTypeProp, TableCellStatusProp {\n primaryCurrency?: MoneyProps;\n secondaryCurrency?: MoneyProps;\n}\n\nexport interface TableCellStatus extends TableCellTypeProp, TableCellTextProps {\n sentiment?: 'negative' | 'neutral' | 'positive' | 'warning' | 'pending';\n}\n\nexport interface TableCellType {\n cell?: TableCellLeading & TableCellText & TableCellCurrency & TableCellStatus & TableCellMedia;\n alignment?: 'left' | 'right';\n}\n\n// These properties should be exported only on the lib level to prevent visual issues because of incorrect usage.\nexport interface TableCellProps extends TableCellType {\n className?: string;\n colSpan?: number;\n children?: React.ReactNode;\n}\n\nconst TableCell = ({ cell, alignment = 'left', className, colSpan, children }: TableCellProps) => {\n const getContentMedia = () => {\n let mediaContent = null;\n\n if (cell?.type === 'leading' && (cell?.avatar?.src || cell?.avatar?.profileName)) {\n mediaContent = (\n <AvatarView profileName={cell?.avatar?.profileName} size={40} imgSrc={cell?.avatar?.src} />\n );\n }\n\n if (cell?.type === 'currency' && cell?.primaryCurrency?.currency) {\n mediaContent = (\n <Flag code={cell?.primaryCurrency?.currency?.toLowerCase()} intrinsicSize={24} />\n );\n }\n\n if (cell?.type === 'status') {\n mediaContent = <StatusIcon size={24} sentiment={cell?.sentiment ?? 'neutral'} />;\n }\n\n if (cell?.type === 'media' && cell.media) {\n // eslint-disable-next-line jsx-a11y/alt-text\n mediaContent = <img {...cell.media} />;\n }\n\n if (mediaContent) {\n return (\n <div\n aria-hidden=\"true\"\n className=\"np-table-content-media\"\n data-testid=\"np-table-content-media\"\n >\n {mediaContent}\n </div>\n );\n }\n };\n\n const formatCurrencyValue = (currency?: MoneyProps) => {\n if (currency) {\n return <Money amount={currency.amount} currency={currency.currency} alwaysShowDecimals />;\n }\n\n return '';\n };\n\n return (\n <td\n className={clsx(\n 'np-table-cell',\n cell?.type ? `np-table-cell--${cell?.type}` : '',\n `np-table-cell--${alignment}`,\n className,\n )}\n colSpan={colSpan}\n >\n {cell?.type === 'text' && cell?.text && (\n <TableStatusText text={cell?.text} status={cell?.status} />\n )}\n {cell?.type && ['leading', 'currency', 'status', 'media'].includes(cell?.type) && (\n <div\n className={clsx('np-table-content', {\n 'np-table-content--reversed': alignment === 'right',\n })}\n data-testid=\"np-table-content\"\n >\n {getContentMedia()}\n <div className=\"np-table-content-body\">\n {(cell?.primaryCurrency ?? cell?.primaryText) && (\n <TableStatusText\n text={\n cell?.type === 'currency'\n ? formatCurrencyValue(cell?.primaryCurrency)\n : (cell?.primaryText ?? '')\n }\n status={cell?.type !== 'status' ? cell?.status : undefined}\n typography=\"default-bold\"\n />\n )}\n {(cell?.secondaryCurrency ?? cell?.secondaryText) && (\n <Body>\n {cell?.type === 'currency'\n ? formatCurrencyValue(cell?.secondaryCurrency)\n : cell?.secondaryText}\n </Body>\n )}\n </div>\n </div>\n )}\n {children}\n </td>\n );\n};\n\nexport default TableCell;\n"],"names":["TableCell","cell","alignment","className","colSpan","children","getContentMedia","mediaContent","type","avatar","src","profileName","_jsx","AvatarView","size","imgSrc","primaryCurrency","currency","Flag","code","toLowerCase","intrinsicSize","StatusIcon","sentiment","media","formatCurrencyValue","Money","amount","alwaysShowDecimals","_jsxs","clsx","text","TableStatusText","status","includes","primaryText","undefined","typography","secondaryCurrency","secondaryText","Body"],"mappings":"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"}
|
|
@@ -36,6 +36,12 @@ const TableCell = ({
|
|
|
36
36
|
sentiment: cell?.sentiment ?? 'neutral'
|
|
37
37
|
});
|
|
38
38
|
}
|
|
39
|
+
if (cell?.type === 'media' && cell.media) {
|
|
40
|
+
// eslint-disable-next-line jsx-a11y/alt-text
|
|
41
|
+
mediaContent = /*#__PURE__*/jsx("img", {
|
|
42
|
+
...cell.media
|
|
43
|
+
});
|
|
44
|
+
}
|
|
39
45
|
if (mediaContent) {
|
|
40
46
|
return /*#__PURE__*/jsx("div", {
|
|
41
47
|
"aria-hidden": "true",
|
|
@@ -61,7 +67,7 @@ const TableCell = ({
|
|
|
61
67
|
children: [cell?.type === 'text' && cell?.text && /*#__PURE__*/jsx(TableStatusText, {
|
|
62
68
|
text: cell?.text,
|
|
63
69
|
status: cell?.status
|
|
64
|
-
}), cell?.type && ['leading', 'currency', 'status'].includes(cell?.type) && /*#__PURE__*/jsxs("div", {
|
|
70
|
+
}), cell?.type && ['leading', 'currency', 'status', 'media'].includes(cell?.type) && /*#__PURE__*/jsxs("div", {
|
|
65
71
|
className: clsx('np-table-content', {
|
|
66
72
|
'np-table-content--reversed': alignment === 'right'
|
|
67
73
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableCell.mjs","sources":["../../src/table/TableCell.tsx"],"sourcesContent":["import TableStatusText from './TableStatusText';\nimport StatusIcon from '../statusIcon';\nimport { Flag } from '@wise/art';\nimport React from 'react';\nimport { clsx } from 'clsx';\nimport Body from '../body';\nimport Money, { MoneyProps } from '../money';\nimport AvatarView from '../avatarView';\n\ninterface TableCellTypeProp {\n type: 'leading' | 'text' | 'currency' | 'status';\n}\n\n// `Leading` and `Status` cell types have 2 text fields: `primaryText` and `secondaryText`\ninterface TableCellTextProps {\n primaryText?: string;\n secondaryText?: string;\n}\n\n// `Leading`, `Text` and `Currency` cells' types can have a status indicator with `error` or `success` values\ninterface TableCellStatusProp {\n status?: 'error' | 'success';\n}\n\nexport interface TableCellLeading\n extends TableCellTypeProp,\n TableCellTextProps,\n TableCellStatusProp {\n avatar?: {\n src?: string;\n profileName?: string | null;\n };\n}\n\nexport interface TableCellText extends TableCellTypeProp, TableCellStatusProp {\n text?: string;\n}\n\nexport interface TableCellCurrency extends TableCellTypeProp, TableCellStatusProp {\n primaryCurrency?: MoneyProps;\n secondaryCurrency?: MoneyProps;\n}\n\nexport interface TableCellStatus extends TableCellTypeProp, TableCellTextProps {\n sentiment?: 'negative' | 'neutral' | 'positive' | 'warning' | 'pending';\n}\n\nexport interface TableCellType {\n cell?: TableCellLeading & TableCellText & TableCellCurrency & TableCellStatus;\n alignment?: 'left' | 'right';\n}\n\n// These properties should be exported only on the lib level to prevent visual issues because of incorrect usage.\nexport interface TableCellProps extends TableCellType {\n className?: string;\n colSpan?: number;\n children?: React.ReactNode;\n}\n\nconst TableCell = ({ cell, alignment = 'left', className, colSpan, children }: TableCellProps) => {\n const getContentMedia = () => {\n let mediaContent = null;\n\n if (cell?.type === 'leading' && (cell?.avatar?.src || cell?.avatar?.profileName)) {\n mediaContent = (\n <AvatarView profileName={cell?.avatar?.profileName} size={40} imgSrc={cell?.avatar?.src} />\n );\n }\n\n if (cell?.type === 'currency' && cell?.primaryCurrency?.currency) {\n mediaContent = (\n <Flag code={cell?.primaryCurrency?.currency?.toLowerCase()} intrinsicSize={24} />\n );\n }\n\n if (cell?.type === 'status') {\n mediaContent = <StatusIcon size={24} sentiment={cell?.sentiment ?? 'neutral'} />;\n }\n\n if (mediaContent) {\n return (\n <div\n aria-hidden=\"true\"\n className=\"np-table-content-media\"\n data-testid=\"np-table-content-media\"\n >\n {mediaContent}\n </div>\n );\n }\n };\n\n const formatCurrencyValue = (currency?: MoneyProps) => {\n if (currency) {\n return <Money amount={currency.amount} currency={currency.currency} alwaysShowDecimals />;\n }\n\n return '';\n };\n\n return (\n <td\n className={clsx(\n 'np-table-cell',\n cell?.type ? `np-table-cell--${cell?.type}` : '',\n `np-table-cell--${alignment}`,\n className,\n )}\n colSpan={colSpan}\n >\n {cell?.type === 'text' && cell?.text && (\n <TableStatusText text={cell?.text} status={cell?.status} />\n )}\n {cell?.type && ['leading', 'currency', 'status'].includes(cell?.type) && (\n <div\n className={clsx('np-table-content', {\n 'np-table-content--reversed': alignment === 'right',\n })}\n data-testid=\"np-table-content\"\n >\n {getContentMedia()}\n <div className=\"np-table-content-body\">\n {(cell?.primaryCurrency ?? cell?.primaryText) && (\n <TableStatusText\n text={\n cell?.type === 'currency'\n ? formatCurrencyValue(cell?.primaryCurrency)\n : (cell?.primaryText ?? '')\n }\n status={cell?.type !== 'status' ? cell?.status : undefined}\n typography=\"default-bold\"\n />\n )}\n {(cell?.secondaryCurrency ?? cell?.secondaryText) && (\n <Body>\n {cell?.type === 'currency'\n ? formatCurrencyValue(cell?.secondaryCurrency)\n : cell?.secondaryText}\n </Body>\n )}\n </div>\n </div>\n )}\n {children}\n </td>\n );\n};\n\nexport default TableCell;\n"],"names":["TableCell","cell","alignment","className","colSpan","children","getContentMedia","mediaContent","type","avatar","src","profileName","_jsx","AvatarView","size","imgSrc","primaryCurrency","currency","Flag","code","toLowerCase","intrinsicSize","StatusIcon","sentiment","formatCurrencyValue","Money","amount","alwaysShowDecimals","_jsxs","clsx","text","TableStatusText","status","includes","primaryText","undefined","typography","secondaryCurrency","secondaryText","Body"],"mappings":";;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"TableCell.mjs","sources":["../../src/table/TableCell.tsx"],"sourcesContent":["import TableStatusText from './TableStatusText';\nimport StatusIcon from '../statusIcon';\nimport { Flag } from '@wise/art';\nimport React, { ImgHTMLAttributes } from 'react';\nimport { clsx } from 'clsx';\nimport Body from '../body';\nimport Money, { MoneyProps } from '../money';\nimport AvatarView from '../avatarView';\n\ninterface TableCellTypeProp {\n type: 'leading' | 'text' | 'currency' | 'status' | 'media';\n}\n\n// `Media`, `Leading` and `Status` cell types have 2 text fields: `primaryText` and `secondaryText`\ninterface TableCellTextProps {\n primaryText?: string;\n secondaryText?: string;\n}\n\n// `Leading`, `Text` and `Currency` cells' types can have a status indicator with `error` or `success` values\ninterface TableCellStatusProp {\n status?: 'error' | 'success';\n}\n\nexport interface TableCellMedia extends TableCellTypeProp, TableCellTextProps {\n media?: ImgHTMLAttributes<HTMLImageElement>;\n}\n\nexport interface TableCellLeading\n extends TableCellTypeProp,\n TableCellTextProps,\n TableCellStatusProp {\n avatar?: {\n src?: string;\n profileName?: string | null;\n };\n}\n\nexport interface TableCellText extends TableCellTypeProp, TableCellStatusProp {\n text?: string;\n}\n\nexport interface TableCellCurrency extends TableCellTypeProp, TableCellStatusProp {\n primaryCurrency?: MoneyProps;\n secondaryCurrency?: MoneyProps;\n}\n\nexport interface TableCellStatus extends TableCellTypeProp, TableCellTextProps {\n sentiment?: 'negative' | 'neutral' | 'positive' | 'warning' | 'pending';\n}\n\nexport interface TableCellType {\n cell?: TableCellLeading & TableCellText & TableCellCurrency & TableCellStatus & TableCellMedia;\n alignment?: 'left' | 'right';\n}\n\n// These properties should be exported only on the lib level to prevent visual issues because of incorrect usage.\nexport interface TableCellProps extends TableCellType {\n className?: string;\n colSpan?: number;\n children?: React.ReactNode;\n}\n\nconst TableCell = ({ cell, alignment = 'left', className, colSpan, children }: TableCellProps) => {\n const getContentMedia = () => {\n let mediaContent = null;\n\n if (cell?.type === 'leading' && (cell?.avatar?.src || cell?.avatar?.profileName)) {\n mediaContent = (\n <AvatarView profileName={cell?.avatar?.profileName} size={40} imgSrc={cell?.avatar?.src} />\n );\n }\n\n if (cell?.type === 'currency' && cell?.primaryCurrency?.currency) {\n mediaContent = (\n <Flag code={cell?.primaryCurrency?.currency?.toLowerCase()} intrinsicSize={24} />\n );\n }\n\n if (cell?.type === 'status') {\n mediaContent = <StatusIcon size={24} sentiment={cell?.sentiment ?? 'neutral'} />;\n }\n\n if (cell?.type === 'media' && cell.media) {\n // eslint-disable-next-line jsx-a11y/alt-text\n mediaContent = <img {...cell.media} />;\n }\n\n if (mediaContent) {\n return (\n <div\n aria-hidden=\"true\"\n className=\"np-table-content-media\"\n data-testid=\"np-table-content-media\"\n >\n {mediaContent}\n </div>\n );\n }\n };\n\n const formatCurrencyValue = (currency?: MoneyProps) => {\n if (currency) {\n return <Money amount={currency.amount} currency={currency.currency} alwaysShowDecimals />;\n }\n\n return '';\n };\n\n return (\n <td\n className={clsx(\n 'np-table-cell',\n cell?.type ? `np-table-cell--${cell?.type}` : '',\n `np-table-cell--${alignment}`,\n className,\n )}\n colSpan={colSpan}\n >\n {cell?.type === 'text' && cell?.text && (\n <TableStatusText text={cell?.text} status={cell?.status} />\n )}\n {cell?.type && ['leading', 'currency', 'status', 'media'].includes(cell?.type) && (\n <div\n className={clsx('np-table-content', {\n 'np-table-content--reversed': alignment === 'right',\n })}\n data-testid=\"np-table-content\"\n >\n {getContentMedia()}\n <div className=\"np-table-content-body\">\n {(cell?.primaryCurrency ?? cell?.primaryText) && (\n <TableStatusText\n text={\n cell?.type === 'currency'\n ? formatCurrencyValue(cell?.primaryCurrency)\n : (cell?.primaryText ?? '')\n }\n status={cell?.type !== 'status' ? cell?.status : undefined}\n typography=\"default-bold\"\n />\n )}\n {(cell?.secondaryCurrency ?? cell?.secondaryText) && (\n <Body>\n {cell?.type === 'currency'\n ? formatCurrencyValue(cell?.secondaryCurrency)\n : cell?.secondaryText}\n </Body>\n )}\n </div>\n </div>\n )}\n {children}\n </td>\n );\n};\n\nexport default TableCell;\n"],"names":["TableCell","cell","alignment","className","colSpan","children","getContentMedia","mediaContent","type","avatar","src","profileName","_jsx","AvatarView","size","imgSrc","primaryCurrency","currency","Flag","code","toLowerCase","intrinsicSize","StatusIcon","sentiment","media","formatCurrencyValue","Money","amount","alwaysShowDecimals","_jsxs","clsx","text","TableStatusText","status","includes","primaryText","undefined","typography","secondaryCurrency","secondaryText","Body"],"mappings":";;;;;;;;;;AA+DMA,MAAAA,SAAS,GAAGA,CAAC;EAAEC,IAAI;AAAEC,EAAAA,SAAS,GAAG,MAAM;EAAEC,SAAS;EAAEC,OAAO;AAAEC,EAAAA,QAAAA;AAAQ,CAAkB,KAAI;EAC/F,MAAMC,eAAe,GAAGA,MAAK;IAC3B,IAAIC,YAAY,GAAG,IAAI,CAAA;AAEvB,IAAA,IAAIN,IAAI,EAAEO,IAAI,KAAK,SAAS,KAAKP,IAAI,EAAEQ,MAAM,EAAEC,GAAG,IAAIT,IAAI,EAAEQ,MAAM,EAAEE,WAAW,CAAC,EAAE;MAChFJ,YAAY,gBACVK,GAAA,CAACC,UAAU,EAAA;AAACF,QAAAA,WAAW,EAAEV,IAAI,EAAEQ,MAAM,EAAEE,WAAY;AAACG,QAAAA,IAAI,EAAE,EAAG;AAACC,QAAAA,MAAM,EAAEd,IAAI,EAAEQ,MAAM,EAAEC,GAAAA;AAAI,OAAA,CACzF,CAAA;AACH,KAAA;IAEA,IAAIT,IAAI,EAAEO,IAAI,KAAK,UAAU,IAAIP,IAAI,EAAEe,eAAe,EAAEC,QAAQ,EAAE;MAChEV,YAAY,gBACVK,GAAA,CAACM,IAAI,EAAA;QAACC,IAAI,EAAElB,IAAI,EAAEe,eAAe,EAAEC,QAAQ,EAAEG,WAAW,EAAG;AAACC,QAAAA,aAAa,EAAE,EAAA;AAAG,OAAG,CAClF,CAAA;AACH,KAAA;AAEA,IAAA,IAAIpB,IAAI,EAAEO,IAAI,KAAK,QAAQ,EAAE;MAC3BD,YAAY,gBAAGK,GAAA,CAACU,UAAU,EAAA;AAACR,QAAAA,IAAI,EAAE,EAAG;AAACS,QAAAA,SAAS,EAAEtB,IAAI,EAAEsB,SAAS,IAAI,SAAA;AAAU,QAAG,CAAA;AAClF,KAAA;IAEA,IAAItB,IAAI,EAAEO,IAAI,KAAK,OAAO,IAAIP,IAAI,CAACuB,KAAK,EAAE;AACxC;AACAjB,MAAAA,YAAY,gBAAGK,GAAA,CAAA,KAAA,EAAA;AAAA,QAAA,GAASX,IAAI,CAACuB,KAAAA;AAAK,OAAC,CAAG,CAAA;AACxC,KAAA;AAEA,IAAA,IAAIjB,YAAY,EAAE;AAChB,MAAA,oBACEK,GAAA,CAAA,KAAA,EAAA;AACE,QAAA,aAAA,EAAY,MAAM;AAClBT,QAAAA,SAAS,EAAC,wBAAwB;AAClC,QAAA,aAAA,EAAY,wBAAwB;AAAAE,QAAAA,QAAA,EAEnCE,YAAAA;AAAY,OACV,CAAC,CAAA;AAEV,KAAA;GACD,CAAA;EAED,MAAMkB,mBAAmB,GAAIR,QAAqB,IAAI;AACpD,IAAA,IAAIA,QAAQ,EAAE;MACZ,oBAAOL,GAAA,CAACc,KAAK,EAAA;QAACC,MAAM,EAAEV,QAAQ,CAACU,MAAO;QAACV,QAAQ,EAAEA,QAAQ,CAACA,QAAS;QAACW,kBAAkB,EAAA,IAAA;AAAA,OAAA,CAAG,CAAA;AAC3F,KAAA;AAEA,IAAA,OAAO,EAAE,CAAA;GACV,CAAA;AAED,EAAA,oBACEC,IAAA,CAAA,IAAA,EAAA;IACE1B,SAAS,EAAE2B,IAAI,CACb,eAAe,EACf7B,IAAI,EAAEO,IAAI,GAAG,CAAkBP,eAAAA,EAAAA,IAAI,EAAEO,IAAI,CAAA,CAAE,GAAG,EAAE,EAChD,kBAAkBN,SAAS,CAAA,CAAE,EAC7BC,SAAS,CACT;AACFC,IAAAA,OAAO,EAAEA,OAAQ;AAAAC,IAAAA,QAAA,EAEhBJ,CAAAA,IAAI,EAAEO,IAAI,KAAK,MAAM,IAAIP,IAAI,EAAE8B,IAAI,iBAClCnB,GAAA,CAACoB,eAAe,EAAA;MAACD,IAAI,EAAE9B,IAAI,EAAE8B,IAAK;MAACE,MAAM,EAAEhC,IAAI,EAAEgC,MAAAA;KAAO,CACzD,EACAhC,IAAI,EAAEO,IAAI,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC0B,QAAQ,CAACjC,IAAI,EAAEO,IAAI,CAAC,iBAC5EqB,IAAA,CAAA,KAAA,EAAA;AACE1B,MAAAA,SAAS,EAAE2B,IAAI,CAAC,kBAAkB,EAAE;QAClC,4BAA4B,EAAE5B,SAAS,KAAK,OAAA;AAC7C,OAAA,CAAE;AACH,MAAA,aAAA,EAAY,kBAAkB;AAAAG,MAAAA,QAAA,EAE7BC,CAAAA,eAAe,EAAE,eAClBuB,IAAA,CAAA,KAAA,EAAA;AAAK1B,QAAAA,SAAS,EAAC,uBAAuB;AAAAE,QAAAA,QAAA,EACnC,CAAA,CAACJ,IAAI,EAAEe,eAAe,IAAIf,IAAI,EAAEkC,WAAW,kBAC1CvB,GAAA,CAACoB,eAAe,EAAA;AACdD,UAAAA,IAAI,EACF9B,IAAI,EAAEO,IAAI,KAAK,UAAU,GACrBiB,mBAAmB,CAACxB,IAAI,EAAEe,eAAe,CAAC,GACzCf,IAAI,EAAEkC,WAAW,IAAI,EAC3B;UACDF,MAAM,EAAEhC,IAAI,EAAEO,IAAI,KAAK,QAAQ,GAAGP,IAAI,EAAEgC,MAAM,GAAGG,SAAU;AAC3DC,UAAAA,UAAU,EAAC,cAAA;AAAc,SAAA,CAE5B,EACA,CAACpC,IAAI,EAAEqC,iBAAiB,IAAIrC,IAAI,EAAEsC,aAAa,kBAC9C3B,GAAA,CAAC4B,IAAI,EAAA;AAAAnC,UAAAA,QAAA,EACFJ,IAAI,EAAEO,IAAI,KAAK,UAAU,GACtBiB,mBAAmB,CAACxB,IAAI,EAAEqC,iBAAiB,CAAC,GAC5CrC,IAAI,EAAEsC,aAAAA;AAAa,SACnB,CACP,CAAA;AAAA,OACE,CACP,CAAA;KAAK,CACN,EACAlC,QAAQ,CAAA;AAAA,GACP,CAAC,CAAA;AAET;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="64" height="42" fill="none" xmlns="http://www.w3.org/2000/svg"><g filter="url(#business_green_wise_2023_active__a)"><g filter="url(#business_green_wise_2023_active__b)" clip-path="url(#business_green_wise_2023_active__c)"><g clip-path="url(#business_green_wise_2023_active__d)"><rect width="64" height="42" rx="5" fill="#163300"/><mask id="business_green_wise_2023_active__e" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="43" y="6" width="15" height="14"><path d="m43.917 15.059 3.65-4.294h-.002l-2.218-3.892h12.07l-4.672 12.916h-2.648l3.87-10.716h-4.991l1.11 1.922-.006.053-1.706 1.986h2.792l-.733 2.025h-6.516Z" fill="#F0F"/></mask><g mask="url(#business_green_wise_2023_active__e)"><path fill="#9FE870" d="M42.667 5.333h16v16h-16z"/></g><g style="mix-blend-mode:overlay" opacity=".2" filter="url(#business_green_wise_2023_active__f)"><path fill="#fff" d="m35.549-5.015 35.995-.628.907 51.992-35.994.628z"/></g><g style="mix-blend-mode:overlay" opacity=".14" filter="url(#business_green_wise_2023_active__g)"><path fill="#000" d="m-18.197-5.015 35.995-.628.907 51.992-35.994.628z"/></g></g></g></g><defs><filter id="business_green_wise_2023_active__a" x="0" y="-.6" width="64" height="42.6" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/><feOffset dy="-.6"/><feGaussianBlur stdDeviation=".3"/><feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/><feColorMatrix values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.3 0"/><feBlend in2="shape" result="effect1_innerShadow_957_18749"/><feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/><feOffset/><feGaussianBlur stdDeviation=".2"/><feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/><feColorMatrix values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.4 0"/><feBlend in2="effect1_innerShadow_957_18749" result="effect2_innerShadow_957_18749"/></filter><filter id="business_green_wise_2023_active__b" x="0" y="-.6" width="64" height="42.6" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/><feOffset dy="-.6"/><feGaussianBlur stdDeviation=".3"/><feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/><feColorMatrix values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.3 0"/><feBlend in2="shape" result="effect1_innerShadow_957_18749"/><feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/><feOffset/><feGaussianBlur stdDeviation=".2"/><feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/><feColorMatrix values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.4 0"/><feBlend in2="effect1_innerShadow_957_18749" result="effect2_innerShadow_957_18749"/></filter><filter id="business_green_wise_2023_active__f" x="24.549" y="-16.644" width="58.902" height="74.62" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur stdDeviation="5.5" result="effect1_foregroundBlur_957_18749"/></filter><filter id="business_green_wise_2023_active__g" x="-36.197" y="-23.644" width="72.902" height="88.62" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur stdDeviation="9" result="effect1_foregroundBlur_957_18749"/></filter><clipPath id="business_green_wise_2023_active__c"><rect width="64" height="42" rx="5" fill="#fff"/></clipPath><clipPath id="business_green_wise_2023_active__d"><rect width="64" height="42" rx="5" fill="#fff"/></clipPath></defs></svg>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { ImgHTMLAttributes } from 'react';
|
|
2
2
|
import { MoneyProps } from '../money';
|
|
3
3
|
interface TableCellTypeProp {
|
|
4
|
-
type: 'leading' | 'text' | 'currency' | 'status';
|
|
4
|
+
type: 'leading' | 'text' | 'currency' | 'status' | 'media';
|
|
5
5
|
}
|
|
6
6
|
interface TableCellTextProps {
|
|
7
7
|
primaryText?: string;
|
|
@@ -10,6 +10,9 @@ interface TableCellTextProps {
|
|
|
10
10
|
interface TableCellStatusProp {
|
|
11
11
|
status?: 'error' | 'success';
|
|
12
12
|
}
|
|
13
|
+
export interface TableCellMedia extends TableCellTypeProp, TableCellTextProps {
|
|
14
|
+
media?: ImgHTMLAttributes<HTMLImageElement>;
|
|
15
|
+
}
|
|
13
16
|
export interface TableCellLeading extends TableCellTypeProp, TableCellTextProps, TableCellStatusProp {
|
|
14
17
|
avatar?: {
|
|
15
18
|
src?: string;
|
|
@@ -27,7 +30,7 @@ export interface TableCellStatus extends TableCellTypeProp, TableCellTextProps {
|
|
|
27
30
|
sentiment?: 'negative' | 'neutral' | 'positive' | 'warning' | 'pending';
|
|
28
31
|
}
|
|
29
32
|
export interface TableCellType {
|
|
30
|
-
cell?: TableCellLeading & TableCellText & TableCellCurrency & TableCellStatus;
|
|
33
|
+
cell?: TableCellLeading & TableCellText & TableCellCurrency & TableCellStatus & TableCellMedia;
|
|
31
34
|
alignment?: 'left' | 'right';
|
|
32
35
|
}
|
|
33
36
|
export interface TableCellProps extends TableCellType {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableCell.d.ts","sourceRoot":"","sources":["../../../src/table/TableCell.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"TableCell.d.ts","sourceRoot":"","sources":["../../../src/table/TableCell.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAGjD,OAAc,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAG7C,UAAU,iBAAiB;IACzB,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;CAC5D;AAGD,UAAU,kBAAkB;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAGD,UAAU,mBAAmB;IAC3B,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,cAAe,SAAQ,iBAAiB,EAAE,kBAAkB;IAC3E,KAAK,CAAC,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,gBACf,SAAQ,iBAAiB,EACvB,kBAAkB,EAClB,mBAAmB;IACrB,MAAM,CAAC,EAAE;QACP,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC7B,CAAC;CACH;AAED,MAAM,WAAW,aAAc,SAAQ,iBAAiB,EAAE,mBAAmB;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB,EAAE,mBAAmB;IAC/E,eAAe,CAAC,EAAE,UAAU,CAAC;IAC7B,iBAAiB,CAAC,EAAE,UAAU,CAAC;CAChC;AAED,MAAM,WAAW,eAAgB,SAAQ,iBAAiB,EAAE,kBAAkB;IAC5E,SAAS,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;CACzE;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,gBAAgB,GAAG,aAAa,GAAG,iBAAiB,GAAG,eAAe,GAAG,cAAc,CAAC;IAC/F,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC9B;AAGD,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED,QAAA,MAAM,SAAS,sDAAgE,cAAc,sBA4F5F,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@transferwise/components",
|
|
3
|
-
"version": "0.0.0-experimental-
|
|
3
|
+
"version": "0.0.0-experimental-3e45476",
|
|
4
4
|
"description": "Neptune React components",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -92,12 +92,12 @@
|
|
|
92
92
|
"rollup-preserve-directives": "^1.1.1",
|
|
93
93
|
"storybook": "^8.2.2",
|
|
94
94
|
"@transferwise/less-config": "3.1.0",
|
|
95
|
-
"@transferwise/neptune-css": "0.0.0-experimental-
|
|
95
|
+
"@transferwise/neptune-css": "0.0.0-experimental-3e45476",
|
|
96
96
|
"@wise/components-theming": "1.6.1"
|
|
97
97
|
},
|
|
98
98
|
"peerDependencies": {
|
|
99
99
|
"@transferwise/icons": "^3.13.1",
|
|
100
|
-
"@transferwise/neptune-css": "0.0.0-experimental-
|
|
100
|
+
"@transferwise/neptune-css": "0.0.0-experimental-3e45476",
|
|
101
101
|
"@wise/art": "^2.16",
|
|
102
102
|
"@wise/components-theming": "^1.0.0",
|
|
103
103
|
"react": ">=18",
|
|
@@ -21,7 +21,7 @@ const tableData = {
|
|
|
21
21
|
header: 'Location',
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
|
-
header: '
|
|
24
|
+
header: 'Employment Date',
|
|
25
25
|
className: 'np-table-header--custom-class',
|
|
26
26
|
},
|
|
27
27
|
{
|
|
@@ -32,6 +32,9 @@ const tableData = {
|
|
|
32
32
|
header: 'Status',
|
|
33
33
|
status: 'error',
|
|
34
34
|
},
|
|
35
|
+
{
|
|
36
|
+
header: 'Card',
|
|
37
|
+
},
|
|
35
38
|
] satisfies TableHeaderType[],
|
|
36
39
|
rows: [
|
|
37
40
|
{
|
|
@@ -81,6 +84,17 @@ const tableData = {
|
|
|
81
84
|
sentiment: 'negative',
|
|
82
85
|
},
|
|
83
86
|
},
|
|
87
|
+
{
|
|
88
|
+
cell: {
|
|
89
|
+
type: 'media',
|
|
90
|
+
media: {
|
|
91
|
+
src: '../wise-card.svg',
|
|
92
|
+
alt: 'Wise Card',
|
|
93
|
+
width: 48,
|
|
94
|
+
},
|
|
95
|
+
primaryText: '•••• 9204',
|
|
96
|
+
},
|
|
97
|
+
},
|
|
84
98
|
],
|
|
85
99
|
},
|
|
86
100
|
{
|
|
@@ -130,6 +144,17 @@ const tableData = {
|
|
|
130
144
|
sentiment: 'neutral',
|
|
131
145
|
},
|
|
132
146
|
},
|
|
147
|
+
{
|
|
148
|
+
cell: {
|
|
149
|
+
type: 'media',
|
|
150
|
+
media: {
|
|
151
|
+
src: '../wise-card.svg',
|
|
152
|
+
alt: 'Wise Card',
|
|
153
|
+
width: 48,
|
|
154
|
+
},
|
|
155
|
+
primaryText: '•••• 9200',
|
|
156
|
+
},
|
|
157
|
+
},
|
|
133
158
|
],
|
|
134
159
|
},
|
|
135
160
|
{
|
|
@@ -179,6 +204,17 @@ const tableData = {
|
|
|
179
204
|
sentiment: 'positive',
|
|
180
205
|
},
|
|
181
206
|
},
|
|
207
|
+
{
|
|
208
|
+
cell: {
|
|
209
|
+
type: 'media',
|
|
210
|
+
media: {
|
|
211
|
+
src: '../wise-card.svg',
|
|
212
|
+
alt: 'Wise Card',
|
|
213
|
+
width: 48,
|
|
214
|
+
},
|
|
215
|
+
primaryText: '•••• 9200',
|
|
216
|
+
},
|
|
217
|
+
},
|
|
182
218
|
],
|
|
183
219
|
},
|
|
184
220
|
{
|
|
@@ -231,6 +267,17 @@ const tableData = {
|
|
|
231
267
|
sentiment: 'warning',
|
|
232
268
|
},
|
|
233
269
|
},
|
|
270
|
+
{
|
|
271
|
+
cell: {
|
|
272
|
+
type: 'media',
|
|
273
|
+
media: {
|
|
274
|
+
src: '../wise-card.svg',
|
|
275
|
+
alt: 'Wise Card',
|
|
276
|
+
width: 48,
|
|
277
|
+
},
|
|
278
|
+
primaryText: '•••• 9200',
|
|
279
|
+
},
|
|
280
|
+
},
|
|
234
281
|
],
|
|
235
282
|
},
|
|
236
283
|
{
|
|
@@ -283,6 +330,17 @@ const tableData = {
|
|
|
283
330
|
sentiment: 'pending',
|
|
284
331
|
},
|
|
285
332
|
},
|
|
333
|
+
{
|
|
334
|
+
cell: {
|
|
335
|
+
type: 'media',
|
|
336
|
+
media: {
|
|
337
|
+
src: '../wise-card.svg',
|
|
338
|
+
alt: 'Wise Card',
|
|
339
|
+
width: 48,
|
|
340
|
+
},
|
|
341
|
+
primaryText: '•••• 9200',
|
|
342
|
+
},
|
|
343
|
+
},
|
|
286
344
|
],
|
|
287
345
|
},
|
|
288
346
|
] satisfies TableRowType[] | TableRowClickableType[],
|
|
@@ -3,6 +3,7 @@ import '@testing-library/jest-dom';
|
|
|
3
3
|
import TableCell, {
|
|
4
4
|
TableCellCurrency,
|
|
5
5
|
TableCellLeading,
|
|
6
|
+
TableCellMedia,
|
|
6
7
|
TableCellStatus,
|
|
7
8
|
TableCellText,
|
|
8
9
|
} from './TableCell';
|
|
@@ -40,6 +41,15 @@ describe('TableCell Component', () => {
|
|
|
40
41
|
secondaryText: '6 days ago',
|
|
41
42
|
sentiment: 'pending',
|
|
42
43
|
} satisfies TableCellStatus,
|
|
44
|
+
media: {
|
|
45
|
+
type: 'media',
|
|
46
|
+
primaryText: 'Media content',
|
|
47
|
+
secondaryText: 'Media secondary content',
|
|
48
|
+
media: {
|
|
49
|
+
src: 'https://via.placeholder.com/150',
|
|
50
|
+
alt: 'Media content alt',
|
|
51
|
+
},
|
|
52
|
+
} satisfies TableCellMedia,
|
|
43
53
|
custom: <div>Custom content</div>,
|
|
44
54
|
};
|
|
45
55
|
|
|
@@ -295,4 +305,11 @@ describe('TableCell Component', () => {
|
|
|
295
305
|
);
|
|
296
306
|
expect(screen.queryByText('6 days ago')).not.toBeInTheDocument();
|
|
297
307
|
});
|
|
308
|
+
|
|
309
|
+
it('renders `media` cell type content', () => {
|
|
310
|
+
render(<TableCell cell={{ ...cellContentMocks.media }} />);
|
|
311
|
+
expect(screen.getByTestId('np-table-content-media')).toBeInTheDocument();
|
|
312
|
+
expect(screen.getByAltText('Media content alt')).toBeInTheDocument();
|
|
313
|
+
expect(screen.getByText('Media content')).toBeInTheDocument();
|
|
314
|
+
});
|
|
298
315
|
});
|
package/src/table/TableCell.tsx
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import TableStatusText from './TableStatusText';
|
|
2
2
|
import StatusIcon from '../statusIcon';
|
|
3
3
|
import { Flag } from '@wise/art';
|
|
4
|
-
import React from 'react';
|
|
4
|
+
import React, { ImgHTMLAttributes } from 'react';
|
|
5
5
|
import { clsx } from 'clsx';
|
|
6
6
|
import Body from '../body';
|
|
7
7
|
import Money, { MoneyProps } from '../money';
|
|
8
8
|
import AvatarView from '../avatarView';
|
|
9
9
|
|
|
10
10
|
interface TableCellTypeProp {
|
|
11
|
-
type: 'leading' | 'text' | 'currency' | 'status';
|
|
11
|
+
type: 'leading' | 'text' | 'currency' | 'status' | 'media';
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
// `Leading` and `Status` cell types have 2 text fields: `primaryText` and `secondaryText`
|
|
14
|
+
// `Media`, `Leading` and `Status` cell types have 2 text fields: `primaryText` and `secondaryText`
|
|
15
15
|
interface TableCellTextProps {
|
|
16
16
|
primaryText?: string;
|
|
17
17
|
secondaryText?: string;
|
|
@@ -22,6 +22,10 @@ interface TableCellStatusProp {
|
|
|
22
22
|
status?: 'error' | 'success';
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
+
export interface TableCellMedia extends TableCellTypeProp, TableCellTextProps {
|
|
26
|
+
media?: ImgHTMLAttributes<HTMLImageElement>;
|
|
27
|
+
}
|
|
28
|
+
|
|
25
29
|
export interface TableCellLeading
|
|
26
30
|
extends TableCellTypeProp,
|
|
27
31
|
TableCellTextProps,
|
|
@@ -46,7 +50,7 @@ export interface TableCellStatus extends TableCellTypeProp, TableCellTextProps {
|
|
|
46
50
|
}
|
|
47
51
|
|
|
48
52
|
export interface TableCellType {
|
|
49
|
-
cell?: TableCellLeading & TableCellText & TableCellCurrency & TableCellStatus;
|
|
53
|
+
cell?: TableCellLeading & TableCellText & TableCellCurrency & TableCellStatus & TableCellMedia;
|
|
50
54
|
alignment?: 'left' | 'right';
|
|
51
55
|
}
|
|
52
56
|
|
|
@@ -77,6 +81,11 @@ const TableCell = ({ cell, alignment = 'left', className, colSpan, children }: T
|
|
|
77
81
|
mediaContent = <StatusIcon size={24} sentiment={cell?.sentiment ?? 'neutral'} />;
|
|
78
82
|
}
|
|
79
83
|
|
|
84
|
+
if (cell?.type === 'media' && cell.media) {
|
|
85
|
+
// eslint-disable-next-line jsx-a11y/alt-text
|
|
86
|
+
mediaContent = <img {...cell.media} />;
|
|
87
|
+
}
|
|
88
|
+
|
|
80
89
|
if (mediaContent) {
|
|
81
90
|
return (
|
|
82
91
|
<div
|
|
@@ -111,7 +120,7 @@ const TableCell = ({ cell, alignment = 'left', className, colSpan, children }: T
|
|
|
111
120
|
{cell?.type === 'text' && cell?.text && (
|
|
112
121
|
<TableStatusText text={cell?.text} status={cell?.status} />
|
|
113
122
|
)}
|
|
114
|
-
{cell?.type && ['leading', 'currency', 'status'].includes(cell?.type) && (
|
|
123
|
+
{cell?.type && ['leading', 'currency', 'status', 'media'].includes(cell?.type) && (
|
|
115
124
|
<div
|
|
116
125
|
className={clsx('np-table-content', {
|
|
117
126
|
'np-table-content--reversed': alignment === 'right',
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="64" height="42" fill="none" xmlns="http://www.w3.org/2000/svg"><g filter="url(#business_green_wise_2023_active__a)"><g filter="url(#business_green_wise_2023_active__b)" clip-path="url(#business_green_wise_2023_active__c)"><g clip-path="url(#business_green_wise_2023_active__d)"><rect width="64" height="42" rx="5" fill="#163300"/><mask id="business_green_wise_2023_active__e" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="43" y="6" width="15" height="14"><path d="m43.917 15.059 3.65-4.294h-.002l-2.218-3.892h12.07l-4.672 12.916h-2.648l3.87-10.716h-4.991l1.11 1.922-.006.053-1.706 1.986h2.792l-.733 2.025h-6.516Z" fill="#F0F"/></mask><g mask="url(#business_green_wise_2023_active__e)"><path fill="#9FE870" d="M42.667 5.333h16v16h-16z"/></g><g style="mix-blend-mode:overlay" opacity=".2" filter="url(#business_green_wise_2023_active__f)"><path fill="#fff" d="m35.549-5.015 35.995-.628.907 51.992-35.994.628z"/></g><g style="mix-blend-mode:overlay" opacity=".14" filter="url(#business_green_wise_2023_active__g)"><path fill="#000" d="m-18.197-5.015 35.995-.628.907 51.992-35.994.628z"/></g></g></g></g><defs><filter id="business_green_wise_2023_active__a" x="0" y="-.6" width="64" height="42.6" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/><feOffset dy="-.6"/><feGaussianBlur stdDeviation=".3"/><feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/><feColorMatrix values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.3 0"/><feBlend in2="shape" result="effect1_innerShadow_957_18749"/><feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/><feOffset/><feGaussianBlur stdDeviation=".2"/><feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/><feColorMatrix values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.4 0"/><feBlend in2="effect1_innerShadow_957_18749" result="effect2_innerShadow_957_18749"/></filter><filter id="business_green_wise_2023_active__b" x="0" y="-.6" width="64" height="42.6" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/><feOffset dy="-.6"/><feGaussianBlur stdDeviation=".3"/><feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/><feColorMatrix values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.3 0"/><feBlend in2="shape" result="effect1_innerShadow_957_18749"/><feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/><feOffset/><feGaussianBlur stdDeviation=".2"/><feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/><feColorMatrix values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.4 0"/><feBlend in2="effect1_innerShadow_957_18749" result="effect2_innerShadow_957_18749"/></filter><filter id="business_green_wise_2023_active__f" x="24.549" y="-16.644" width="58.902" height="74.62" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur stdDeviation="5.5" result="effect1_foregroundBlur_957_18749"/></filter><filter id="business_green_wise_2023_active__g" x="-36.197" y="-23.644" width="72.902" height="88.62" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur stdDeviation="9" result="effect1_foregroundBlur_957_18749"/></filter><clipPath id="business_green_wise_2023_active__c"><rect width="64" height="42" rx="5" fill="#fff"/></clipPath><clipPath id="business_green_wise_2023_active__d"><rect width="64" height="42" rx="5" fill="#fff"/></clipPath></defs></svg>
|