mirror of
https://github.com/OpenNebula/one.git
synced 2025-01-07 17:17:41 +03:00
F OpenNebula/one#6718: add labels in rows (#3238)
This commit is contained in:
parent
9d7b9b107e
commit
4d5fbea058
@ -14,12 +14,26 @@
|
|||||||
* limitations under the License. *
|
* limitations under the License. *
|
||||||
* ------------------------------------------------------------------------- */
|
* ------------------------------------------------------------------------- */
|
||||||
import { Stack, Tooltip, Typography, styled } from '@mui/material'
|
import { Stack, Tooltip, Typography, styled } from '@mui/material'
|
||||||
import PropTypes from 'prop-types'
|
|
||||||
import { ReactElement, isValidElement, useMemo } from 'react'
|
|
||||||
|
|
||||||
import { Translate } from 'client/components/HOC'
|
import { Translate } from 'client/components/HOC'
|
||||||
import { StatusChip } from 'client/components/Status'
|
import { StatusChip } from 'client/components/Status'
|
||||||
import { T } from 'client/constants'
|
import { T } from 'client/constants'
|
||||||
|
import PropTypes from 'prop-types'
|
||||||
|
import { ReactElement, isValidElement, useMemo } from 'react'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Truncate string.
|
||||||
|
*
|
||||||
|
* @param {string} label - string.
|
||||||
|
* @param {number} [maxLength] - max lenght.
|
||||||
|
* @returns {string} - string truncated
|
||||||
|
*/
|
||||||
|
const truncateLabel = (label, maxLength) => {
|
||||||
|
if (label.length > maxLength) {
|
||||||
|
return `${label.substring(0, maxLength)}...`
|
||||||
|
}
|
||||||
|
|
||||||
|
return label
|
||||||
|
}
|
||||||
|
|
||||||
const StyledText = styled(Typography)(({ theme }) => ({
|
const StyledText = styled(Typography)(({ theme }) => ({
|
||||||
'&': {
|
'&': {
|
||||||
@ -40,9 +54,15 @@ const StyledText = styled(Typography)(({ theme }) => ({
|
|||||||
* @param {string[]|TagType} props.tags - Tags to display
|
* @param {string[]|TagType} props.tags - Tags to display
|
||||||
* @param {number} [props.limitTags] - Limit the number of tags to display
|
* @param {number} [props.limitTags] - Limit the number of tags to display
|
||||||
* @param {boolean} [props.clipboard] - If true, the chip will be clickable
|
* @param {boolean} [props.clipboard] - If true, the chip will be clickable
|
||||||
|
* @param {false|number} [props.truncateText] - number by truncate the string
|
||||||
* @returns {ReactElement} - Tag list
|
* @returns {ReactElement} - Tag list
|
||||||
*/
|
*/
|
||||||
const MultipleTags = ({ tags, limitTags = 1, clipboard = false }) => {
|
const MultipleTags = ({
|
||||||
|
tags,
|
||||||
|
limitTags = 1,
|
||||||
|
clipboard = false,
|
||||||
|
truncateText = false,
|
||||||
|
}) => {
|
||||||
if (tags?.length === 0) {
|
if (tags?.length === 0) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
@ -53,6 +73,7 @@ const MultipleTags = ({ tags, limitTags = 1, clipboard = false }) => {
|
|||||||
if (isValidElement(tag)) return tag
|
if (isValidElement(tag)) return tag
|
||||||
|
|
||||||
const text = tag.text ?? tag
|
const text = tag.text ?? tag
|
||||||
|
truncateText && (tag.text = truncateLabel(text, truncateText))
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<StatusChip
|
<StatusChip
|
||||||
@ -92,9 +113,11 @@ const MultipleTags = ({ tags, limitTags = 1, clipboard = false }) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
MultipleTags.propTypes = {
|
MultipleTags.propTypes = {
|
||||||
tags: PropTypes.array,
|
tags: PropTypes.any,
|
||||||
clipboard: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),
|
|
||||||
limitTags: PropTypes.number,
|
limitTags: PropTypes.number,
|
||||||
|
clipboard: PropTypes.bool,
|
||||||
|
truncateText: PropTypes.bool,
|
||||||
}
|
}
|
||||||
|
MultipleTags.displayName = 'MultipleTags'
|
||||||
|
|
||||||
export default MultipleTags
|
export default MultipleTags
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
* See the License for the specific language governing permissions and *
|
* See the License for the specific language governing permissions and *
|
||||||
* limitations under the License. *
|
* limitations under the License. *
|
||||||
* ------------------------------------------------------------------------- */
|
* ------------------------------------------------------------------------- */
|
||||||
|
import MultipleTags from 'client/components/MultipleTags'
|
||||||
import { StatusCircle } from 'client/components/Status'
|
import { StatusCircle } from 'client/components/Status'
|
||||||
import BackupJobsColumns from 'client/components/Tables/BackupJobs/columns'
|
import BackupJobsColumns from 'client/components/Tables/BackupJobs/columns'
|
||||||
import BackupJobsRow from 'client/components/Tables/BackupJobs/row'
|
import BackupJobsRow from 'client/components/Tables/BackupJobs/row'
|
||||||
@ -21,9 +22,13 @@ import WrapperRow from 'client/components/Tables/Enhanced/WrapperRow'
|
|||||||
import Timer from 'client/components/Timer'
|
import Timer from 'client/components/Timer'
|
||||||
import { RESOURCE_NAMES, T } from 'client/constants'
|
import { RESOURCE_NAMES, T } from 'client/constants'
|
||||||
import COLOR from 'client/constants/color'
|
import COLOR from 'client/constants/color'
|
||||||
import { useViews } from 'client/features/Auth'
|
import { useAuth, useViews } from 'client/features/Auth'
|
||||||
import { useGetBackupJobsQuery } from 'client/features/OneApi/backupjobs'
|
import { useGetBackupJobsQuery } from 'client/features/OneApi/backupjobs'
|
||||||
import { timeFromMilliseconds } from 'client/models/Helper'
|
import {
|
||||||
|
getColorFromString,
|
||||||
|
getUniqueLabels,
|
||||||
|
timeFromMilliseconds,
|
||||||
|
} from 'client/models/Helper'
|
||||||
import { ReactElement, useMemo } from 'react'
|
import { ReactElement, useMemo } from 'react'
|
||||||
|
|
||||||
const DEFAULT_DATA_CY = 'backupjobs'
|
const DEFAULT_DATA_CY = 'backupjobs'
|
||||||
@ -126,6 +131,30 @@ const BackupJobsTable = (props) => {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
header: T.Labels,
|
||||||
|
id: 'labels',
|
||||||
|
accessor: ({ TEMPLATE: { LABELS } = {} }) => {
|
||||||
|
const { labels: userLabels } = useAuth()
|
||||||
|
const labels = useMemo(
|
||||||
|
() =>
|
||||||
|
getUniqueLabels(LABELS).reduce((acc, label) => {
|
||||||
|
if (userLabels?.includes(label)) {
|
||||||
|
acc.push({
|
||||||
|
text: label,
|
||||||
|
dataCy: `label-${label}`,
|
||||||
|
stateColor: getColorFromString(label),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return acc
|
||||||
|
}, []),
|
||||||
|
[LABELS]
|
||||||
|
)
|
||||||
|
|
||||||
|
return <MultipleTags tags={labels} truncateText={10} />
|
||||||
|
},
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
const { component, header } = WrapperRow(BackupJobsRow)
|
const { component, header } = WrapperRow(BackupJobsRow)
|
||||||
|
@ -13,17 +13,18 @@
|
|||||||
* See the License for the specific language governing permissions and *
|
* See the License for the specific language governing permissions and *
|
||||||
* limitations under the License. *
|
* limitations under the License. *
|
||||||
* ------------------------------------------------------------------------- */
|
* ------------------------------------------------------------------------- */
|
||||||
|
import MultipleTags from 'client/components/MultipleTags'
|
||||||
import { StatusCircle } from 'client/components/Status'
|
import { StatusCircle } from 'client/components/Status'
|
||||||
import { useViews } from 'client/features/Auth'
|
|
||||||
import { useGetBackupsQuery } from 'client/features/OneApi/image'
|
|
||||||
import { ReactElement, useMemo } from 'react'
|
|
||||||
|
|
||||||
import backupColumns from 'client/components/Tables/Backups/columns'
|
import backupColumns from 'client/components/Tables/Backups/columns'
|
||||||
import BackupRow from 'client/components/Tables/Backups/row'
|
import BackupRow from 'client/components/Tables/Backups/row'
|
||||||
import EnhancedTable, { createColumns } from 'client/components/Tables/Enhanced'
|
import EnhancedTable, { createColumns } from 'client/components/Tables/Enhanced'
|
||||||
import WrapperRow from 'client/components/Tables/Enhanced/WrapperRow'
|
import WrapperRow from 'client/components/Tables/Enhanced/WrapperRow'
|
||||||
import { RESOURCE_NAMES, T } from 'client/constants'
|
import { RESOURCE_NAMES, T } from 'client/constants'
|
||||||
|
import { useAuth, useViews } from 'client/features/Auth'
|
||||||
|
import { useGetBackupsQuery } from 'client/features/OneApi/image'
|
||||||
|
import { getColorFromString, getUniqueLabels } from 'client/models/Helper'
|
||||||
import { getState, getType } from 'client/models/Image'
|
import { getState, getType } from 'client/models/Image'
|
||||||
|
import { ReactElement, useMemo } from 'react'
|
||||||
|
|
||||||
const DEFAULT_DATA_CY = 'backups'
|
const DEFAULT_DATA_CY = 'backups'
|
||||||
|
|
||||||
@ -105,6 +106,30 @@ const BackupsTable = (props) => {
|
|||||||
{ header: T.Group, id: 'group', accessor: 'GNAME' },
|
{ header: T.Group, id: 'group', accessor: 'GNAME' },
|
||||||
{ header: T.Datastore, id: 'datastore', accessor: 'DATASTORE' },
|
{ header: T.Datastore, id: 'datastore', accessor: 'DATASTORE' },
|
||||||
{ header: T.Type, id: 'type', accessor: (template) => getType(template) },
|
{ header: T.Type, id: 'type', accessor: (template) => getType(template) },
|
||||||
|
{
|
||||||
|
header: T.Labels,
|
||||||
|
id: 'labels',
|
||||||
|
accessor: (_, { label: LABELS = [] }) => {
|
||||||
|
const { labels: userLabels } = useAuth()
|
||||||
|
const labels = useMemo(
|
||||||
|
() =>
|
||||||
|
getUniqueLabels(LABELS).reduce((acc, label) => {
|
||||||
|
if (userLabels?.includes(label)) {
|
||||||
|
acc.push({
|
||||||
|
text: label,
|
||||||
|
dataCy: `label-${label}`,
|
||||||
|
stateColor: getColorFromString(label),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return acc
|
||||||
|
}, []),
|
||||||
|
[LABELS]
|
||||||
|
)
|
||||||
|
|
||||||
|
return <MultipleTags tags={labels} truncateText={10} />
|
||||||
|
},
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
const { component, header } = WrapperRow(BackupRow)
|
const { component, header } = WrapperRow(BackupRow)
|
||||||
|
@ -13,11 +13,7 @@
|
|||||||
* See the License for the specific language governing permissions and *
|
* See the License for the specific language governing permissions and *
|
||||||
* limitations under the License. *
|
* limitations under the License. *
|
||||||
* ------------------------------------------------------------------------- */
|
* ------------------------------------------------------------------------- */
|
||||||
import { ReactElement, useCallback, useEffect, useMemo, useState } from 'react'
|
import MultipleTags from 'client/components/MultipleTags'
|
||||||
|
|
||||||
import { useViews } from 'client/features/Auth'
|
|
||||||
import { useGetDatastoresQuery } from 'client/features/OneApi/datastore'
|
|
||||||
|
|
||||||
import { LinearProgressWithLabel, StatusCircle } from 'client/components/Status'
|
import { LinearProgressWithLabel, StatusCircle } from 'client/components/Status'
|
||||||
import DatastoreColumns from 'client/components/Tables/Datastores/columns'
|
import DatastoreColumns from 'client/components/Tables/Datastores/columns'
|
||||||
import DatastoreRow from 'client/components/Tables/Datastores/row'
|
import DatastoreRow from 'client/components/Tables/Datastores/row'
|
||||||
@ -28,7 +24,11 @@ import {
|
|||||||
} from 'client/components/Tables/Enhanced/Utils/DataTableUtils'
|
} from 'client/components/Tables/Enhanced/Utils/DataTableUtils'
|
||||||
import WrapperRow from 'client/components/Tables/Enhanced/WrapperRow'
|
import WrapperRow from 'client/components/Tables/Enhanced/WrapperRow'
|
||||||
import { DS_THRESHOLD, RESOURCE_NAMES, T } from 'client/constants'
|
import { DS_THRESHOLD, RESOURCE_NAMES, T } from 'client/constants'
|
||||||
|
import { useAuth, useViews } from 'client/features/Auth'
|
||||||
|
import { useGetDatastoresQuery } from 'client/features/OneApi/datastore'
|
||||||
import { getCapacityInfo, getState, getType } from 'client/models/Datastore'
|
import { getCapacityInfo, getState, getType } from 'client/models/Datastore'
|
||||||
|
import { getColorFromString, getUniqueLabels } from 'client/models/Helper'
|
||||||
|
import { ReactElement, useCallback, useEffect, useMemo, useState } from 'react'
|
||||||
import { useFormContext } from 'react-hook-form'
|
import { useFormContext } from 'react-hook-form'
|
||||||
|
|
||||||
const DEFAULT_DATA_CY = 'datastores'
|
const DEFAULT_DATA_CY = 'datastores'
|
||||||
@ -187,6 +187,30 @@ const DatastoresTable = (props) => {
|
|||||||
id: 'type',
|
id: 'type',
|
||||||
accessor: (template) => getType(template),
|
accessor: (template) => getType(template),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
header: T.Labels,
|
||||||
|
id: 'labels',
|
||||||
|
accessor: ({ TEMPLATE: { LABELS } = {} }) => {
|
||||||
|
const { labels: userLabels } = useAuth()
|
||||||
|
const labels = useMemo(
|
||||||
|
() =>
|
||||||
|
getUniqueLabels(LABELS).reduce((acc, label) => {
|
||||||
|
if (userLabels?.includes(label)) {
|
||||||
|
acc.push({
|
||||||
|
text: label,
|
||||||
|
dataCy: `label-${label}`,
|
||||||
|
stateColor: getColorFromString(label),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return acc
|
||||||
|
}, []),
|
||||||
|
[LABELS]
|
||||||
|
)
|
||||||
|
|
||||||
|
return <MultipleTags tags={labels} truncateText={10} />
|
||||||
|
},
|
||||||
|
},
|
||||||
]
|
]
|
||||||
const { component, header } = WrapperRow(DatastoreRow)
|
const { component, header } = WrapperRow(DatastoreRow)
|
||||||
|
|
||||||
|
@ -38,6 +38,7 @@ const RowStyle = memo(
|
|||||||
original,
|
original,
|
||||||
value,
|
value,
|
||||||
onClickLabel,
|
onClickLabel,
|
||||||
|
onDeleteLabel,
|
||||||
globalErrors,
|
globalErrors,
|
||||||
headerList = [],
|
headerList = [],
|
||||||
className,
|
className,
|
||||||
@ -52,7 +53,7 @@ const RowStyle = memo(
|
|||||||
case 'string':
|
case 'string':
|
||||||
return <TableCell key={id}>{get(original, accessor)}</TableCell>
|
return <TableCell key={id}>{get(original, accessor)}</TableCell>
|
||||||
case 'function':
|
case 'function':
|
||||||
return <TableCell key={id}>{accessor(original)}</TableCell>
|
return <TableCell key={id}>{accessor(original, value)}</TableCell>
|
||||||
default:
|
default:
|
||||||
return ''
|
return ''
|
||||||
}
|
}
|
||||||
@ -67,6 +68,7 @@ RowStyle.propTypes = {
|
|||||||
original: PropTypes.object,
|
original: PropTypes.object,
|
||||||
value: PropTypes.object,
|
value: PropTypes.object,
|
||||||
onClickLabel: PropTypes.func,
|
onClickLabel: PropTypes.func,
|
||||||
|
onDeleteLabel: PropTypes.func,
|
||||||
globalErrors: PropTypes.array,
|
globalErrors: PropTypes.array,
|
||||||
headerList: PropTypes.oneOfType([PropTypes.array, PropTypes.bool]),
|
headerList: PropTypes.oneOfType([PropTypes.array, PropTypes.bool]),
|
||||||
className: PropTypes.string,
|
className: PropTypes.string,
|
||||||
|
@ -157,7 +157,7 @@ DataListPerPage.propTypes = {
|
|||||||
messageValues: PropTypes.array,
|
messageValues: PropTypes.array,
|
||||||
setFilter: PropTypes.func,
|
setFilter: PropTypes.func,
|
||||||
state: PropTypes.any,
|
state: PropTypes.any,
|
||||||
disableRowSelect: PropTypes.func,
|
disableRowSelect: PropTypes.bool,
|
||||||
onRowClick: PropTypes.func,
|
onRowClick: PropTypes.func,
|
||||||
readOnly: PropTypes.bool,
|
readOnly: PropTypes.bool,
|
||||||
singleSelect: PropTypes.bool,
|
singleSelect: PropTypes.bool,
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
import { ReactElement, useCallback, useEffect, useMemo, useState } from 'react'
|
import { ReactElement, useCallback, useEffect, useMemo, useState } from 'react'
|
||||||
|
|
||||||
import { Tr } from 'client/components/HOC'
|
import { Tr } from 'client/components/HOC'
|
||||||
|
import MultipleTags from 'client/components/MultipleTags'
|
||||||
import { LinearProgressWithLabel, StatusCircle } from 'client/components/Status'
|
import { LinearProgressWithLabel, StatusCircle } from 'client/components/Status'
|
||||||
import EnhancedTable, { createColumns } from 'client/components/Tables/Enhanced'
|
import EnhancedTable, { createColumns } from 'client/components/Tables/Enhanced'
|
||||||
import {
|
import {
|
||||||
@ -26,8 +27,9 @@ import WrapperRow from 'client/components/Tables/Enhanced/WrapperRow'
|
|||||||
import HostColumns from 'client/components/Tables/Hosts/columns'
|
import HostColumns from 'client/components/Tables/Hosts/columns'
|
||||||
import HostRow from 'client/components/Tables/Hosts/row'
|
import HostRow from 'client/components/Tables/Hosts/row'
|
||||||
import { HOST_THRESHOLD, RESOURCE_NAMES, T } from 'client/constants'
|
import { HOST_THRESHOLD, RESOURCE_NAMES, T } from 'client/constants'
|
||||||
import { useViews } from 'client/features/Auth'
|
import { useAuth, useViews } from 'client/features/Auth'
|
||||||
import { useGetHostsQuery } from 'client/features/OneApi/host'
|
import { useGetHostsQuery } from 'client/features/OneApi/host'
|
||||||
|
import { getColorFromString, getUniqueLabels } from 'client/models/Helper'
|
||||||
import { getAllocatedInfo, getState } from 'client/models/Host'
|
import { getAllocatedInfo, getState } from 'client/models/Host'
|
||||||
import { useFormContext } from 'react-hook-form'
|
import { useFormContext } from 'react-hook-form'
|
||||||
|
|
||||||
@ -195,6 +197,31 @@ const HostsTable = (props) => {
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
header: T.Labels,
|
||||||
|
id: 'labels',
|
||||||
|
accessor: ({ TEMPLATE: { LABELS } = {} }) => {
|
||||||
|
const { labels: userLabels } = useAuth()
|
||||||
|
|
||||||
|
const labels = useMemo(
|
||||||
|
() =>
|
||||||
|
getUniqueLabels(LABELS).reduce((acc, label) => {
|
||||||
|
if (userLabels?.includes(label)) {
|
||||||
|
acc.push({
|
||||||
|
text: label,
|
||||||
|
dataCy: `label-${label}`,
|
||||||
|
stateColor: getColorFromString(label),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return acc
|
||||||
|
}, []),
|
||||||
|
[LABELS]
|
||||||
|
)
|
||||||
|
|
||||||
|
return <MultipleTags tags={labels} truncateText={10} />
|
||||||
|
},
|
||||||
|
},
|
||||||
]
|
]
|
||||||
const { component, header } = WrapperRow(HostRow)
|
const { component, header } = WrapperRow(HostRow)
|
||||||
|
|
||||||
|
@ -13,17 +13,18 @@
|
|||||||
* See the License for the specific language governing permissions and *
|
* See the License for the specific language governing permissions and *
|
||||||
* limitations under the License. *
|
* limitations under the License. *
|
||||||
* ------------------------------------------------------------------------- */
|
* ------------------------------------------------------------------------- */
|
||||||
import { ReactElement, useMemo } from 'react'
|
import MultipleTags from 'client/components/MultipleTags'
|
||||||
|
|
||||||
import { StatusCircle } from 'client/components/Status'
|
import { StatusCircle } from 'client/components/Status'
|
||||||
import EnhancedTable, { createColumns } from 'client/components/Tables/Enhanced'
|
import EnhancedTable, { createColumns } from 'client/components/Tables/Enhanced'
|
||||||
import WrapperRow from 'client/components/Tables/Enhanced/WrapperRow'
|
import WrapperRow from 'client/components/Tables/Enhanced/WrapperRow'
|
||||||
import ImageColumns from 'client/components/Tables/Images/columns'
|
import ImageColumns from 'client/components/Tables/Images/columns'
|
||||||
import ImageRow from 'client/components/Tables/Images/row'
|
import ImageRow from 'client/components/Tables/Images/row'
|
||||||
import { RESOURCE_NAMES, T } from 'client/constants'
|
import { RESOURCE_NAMES, T } from 'client/constants'
|
||||||
import { useViews } from 'client/features/Auth'
|
import { useAuth, useViews } from 'client/features/Auth'
|
||||||
import { useGetImagesQuery } from 'client/features/OneApi/image'
|
import { useGetImagesQuery } from 'client/features/OneApi/image'
|
||||||
|
import { getColorFromString, getUniqueLabels } from 'client/models/Helper'
|
||||||
import { getState, getType } from 'client/models/Image'
|
import { getState, getType } from 'client/models/Image'
|
||||||
|
import { ReactElement, useMemo } from 'react'
|
||||||
|
|
||||||
const DEFAULT_DATA_CY = 'images'
|
const DEFAULT_DATA_CY = 'images'
|
||||||
|
|
||||||
@ -65,6 +66,30 @@ const ImagesTable = (props) => {
|
|||||||
{ header: T.Datastore, id: 'datastore', accessor: 'DATASTORE' },
|
{ header: T.Datastore, id: 'datastore', accessor: 'DATASTORE' },
|
||||||
{ header: T.Type, id: 'type', accessor: (template) => getType(template) },
|
{ header: T.Type, id: 'type', accessor: (template) => getType(template) },
|
||||||
{ header: T.VMs, id: 'vms', accessor: 'RUNNING_VMS' },
|
{ header: T.VMs, id: 'vms', accessor: 'RUNNING_VMS' },
|
||||||
|
{
|
||||||
|
header: T.Labels,
|
||||||
|
id: 'labels',
|
||||||
|
accessor: (_, onClickLabel, onDeleteLabel, { label: LABELS = [] }) => {
|
||||||
|
const { labels: userLabels } = useAuth()
|
||||||
|
const labels = useMemo(
|
||||||
|
() =>
|
||||||
|
getUniqueLabels(LABELS).reduce((acc, label) => {
|
||||||
|
if (userLabels?.includes(label)) {
|
||||||
|
acc.push({
|
||||||
|
text: label,
|
||||||
|
dataCy: `label-${label}`,
|
||||||
|
stateColor: getColorFromString(label),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return acc
|
||||||
|
}, []),
|
||||||
|
[LABELS, onDeleteLabel, onClickLabel]
|
||||||
|
)
|
||||||
|
|
||||||
|
return <MultipleTags tags={labels} truncateText={10} />
|
||||||
|
},
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
const { component, header } = WrapperRow(ImageRow)
|
const { component, header } = WrapperRow(ImageRow)
|
||||||
|
@ -13,14 +13,16 @@
|
|||||||
* See the License for the specific language governing permissions and *
|
* See the License for the specific language governing permissions and *
|
||||||
* limitations under the License. *
|
* limitations under the License. *
|
||||||
* ------------------------------------------------------------------------- */
|
* ------------------------------------------------------------------------- */
|
||||||
|
import MultipleTags from 'client/components/MultipleTags'
|
||||||
import { StatusCircle } from 'client/components/Status'
|
import { StatusCircle } from 'client/components/Status'
|
||||||
import EnhancedTable, { createColumns } from 'client/components/Tables/Enhanced'
|
import EnhancedTable, { createColumns } from 'client/components/Tables/Enhanced'
|
||||||
import WrapperRow from 'client/components/Tables/Enhanced/WrapperRow'
|
import WrapperRow from 'client/components/Tables/Enhanced/WrapperRow'
|
||||||
import MarketplaceAppColumns from 'client/components/Tables/MarketplaceApps/columns'
|
import MarketplaceAppColumns from 'client/components/Tables/MarketplaceApps/columns'
|
||||||
import MarketplaceAppRow from 'client/components/Tables/MarketplaceApps/row'
|
import MarketplaceAppRow from 'client/components/Tables/MarketplaceApps/row'
|
||||||
import { RESOURCE_NAMES, T } from 'client/constants'
|
import { RESOURCE_NAMES, T } from 'client/constants'
|
||||||
import { useViews } from 'client/features/Auth'
|
import { useAuth, useViews } from 'client/features/Auth'
|
||||||
import { useGetMarketplaceAppsQuery } from 'client/features/OneApi/marketplaceApp'
|
import { useGetMarketplaceAppsQuery } from 'client/features/OneApi/marketplaceApp'
|
||||||
|
import { getColorFromString, getUniqueLabels } from 'client/models/Helper'
|
||||||
import { getState, getType } from 'client/models/MarketplaceApp'
|
import { getState, getType } from 'client/models/MarketplaceApp'
|
||||||
import { prettyBytes } from 'client/utils'
|
import { prettyBytes } from 'client/utils'
|
||||||
import { ReactElement, useMemo } from 'react'
|
import { ReactElement, useMemo } from 'react'
|
||||||
@ -89,6 +91,30 @@ const MarketplaceAppsTable = (props) => {
|
|||||||
accessor: 'MARKETPLACE',
|
accessor: 'MARKETPLACE',
|
||||||
},
|
},
|
||||||
{ header: T.Zone, id: 'zone', accessor: 'ZONE_ID' },
|
{ header: T.Zone, id: 'zone', accessor: 'ZONE_ID' },
|
||||||
|
{
|
||||||
|
header: T.Labels,
|
||||||
|
id: 'labels',
|
||||||
|
accessor: ({ TEMPLATE: { LABELS } = {} }) => {
|
||||||
|
const { labels: userLabels } = useAuth()
|
||||||
|
const labels = useMemo(
|
||||||
|
() =>
|
||||||
|
getUniqueLabels(LABELS).reduce((acc, label) => {
|
||||||
|
if (userLabels?.includes(label)) {
|
||||||
|
acc.push({
|
||||||
|
text: label,
|
||||||
|
dataCy: `label-${label}`,
|
||||||
|
stateColor: getColorFromString(label),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return acc
|
||||||
|
}, []),
|
||||||
|
[LABELS]
|
||||||
|
)
|
||||||
|
|
||||||
|
return <MultipleTags tags={labels} truncateText={10} />
|
||||||
|
},
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
const { component, header } = WrapperRow(MarketplaceAppRow)
|
const { component, header } = WrapperRow(MarketplaceAppRow)
|
||||||
|
@ -13,15 +13,16 @@
|
|||||||
* See the License for the specific language governing permissions and *
|
* See the License for the specific language governing permissions and *
|
||||||
* limitations under the License. *
|
* limitations under the License. *
|
||||||
* ------------------------------------------------------------------------- */
|
* ------------------------------------------------------------------------- */
|
||||||
import { ReactElement, useMemo } from 'react'
|
import MultipleTags from 'client/components/MultipleTags'
|
||||||
|
|
||||||
import EnhancedTable, { createColumns } from 'client/components/Tables/Enhanced'
|
import EnhancedTable, { createColumns } from 'client/components/Tables/Enhanced'
|
||||||
import WrapperRow from 'client/components/Tables/Enhanced/WrapperRow'
|
import WrapperRow from 'client/components/Tables/Enhanced/WrapperRow'
|
||||||
import SecurityGroupColumns from 'client/components/Tables/SecurityGroups/columns'
|
import SecurityGroupColumns from 'client/components/Tables/SecurityGroups/columns'
|
||||||
import SecurityGroupsRow from 'client/components/Tables/SecurityGroups/row'
|
import SecurityGroupsRow from 'client/components/Tables/SecurityGroups/row'
|
||||||
import { RESOURCE_NAMES, T } from 'client/constants'
|
import { RESOURCE_NAMES, T } from 'client/constants'
|
||||||
import { useViews } from 'client/features/Auth'
|
import { useAuth, useViews } from 'client/features/Auth'
|
||||||
import { useGetSecGroupsQuery } from 'client/features/OneApi/securityGroup'
|
import { useGetSecGroupsQuery } from 'client/features/OneApi/securityGroup'
|
||||||
|
import { getColorFromString, getUniqueLabels } from 'client/models/Helper'
|
||||||
|
import { ReactElement, useMemo } from 'react'
|
||||||
|
|
||||||
const DEFAULT_DATA_CY = 'secgroup'
|
const DEFAULT_DATA_CY = 'secgroup'
|
||||||
|
|
||||||
@ -56,6 +57,31 @@ const SecurityGroupsTable = (props) => {
|
|||||||
{ header: T.Name, id: 'name', accessor: 'NAME' },
|
{ header: T.Name, id: 'name', accessor: 'NAME' },
|
||||||
{ header: T.Owner, id: 'owner', accessor: 'UNAME' },
|
{ header: T.Owner, id: 'owner', accessor: 'UNAME' },
|
||||||
{ header: T.Group, id: 'group', accessor: 'GNAME' },
|
{ header: T.Group, id: 'group', accessor: 'GNAME' },
|
||||||
|
{
|
||||||
|
header: T.Labels,
|
||||||
|
id: 'labels',
|
||||||
|
accessor: ({ TEMPLATE: { LABELS } = {} }) => {
|
||||||
|
const { labels: userLabels } = useAuth()
|
||||||
|
const labels = useMemo(
|
||||||
|
() =>
|
||||||
|
getUniqueLabels(LABELS).reduce((acc, label) => {
|
||||||
|
if (userLabels?.includes(label)) {
|
||||||
|
acc.push({
|
||||||
|
text: label,
|
||||||
|
dataCy: `label-${label}`,
|
||||||
|
stateColor: getColorFromString(label),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return acc
|
||||||
|
}, []),
|
||||||
|
|
||||||
|
[LABELS]
|
||||||
|
)
|
||||||
|
|
||||||
|
return <MultipleTags tags={labels} truncateText={10} />
|
||||||
|
},
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
const { component, header } = WrapperRow(SecurityGroupsRow)
|
const { component, header } = WrapperRow(SecurityGroupsRow)
|
||||||
|
@ -13,17 +13,23 @@
|
|||||||
* See the License for the specific language governing permissions and *
|
* See the License for the specific language governing permissions and *
|
||||||
* limitations under the License. *
|
* limitations under the License. *
|
||||||
* ------------------------------------------------------------------------- */
|
* ------------------------------------------------------------------------- */
|
||||||
import { useMemo, ReactElement } from 'react'
|
|
||||||
import { Alert } from '@mui/material'
|
import { Alert } from '@mui/material'
|
||||||
|
import { Translate } from 'client/components/HOC'
|
||||||
import { useViews } from 'client/features/Auth'
|
import MultipleTags from 'client/components/MultipleTags'
|
||||||
import { useGetServiceTemplatesQuery } from 'client/features/OneApi/serviceTemplate'
|
|
||||||
|
|
||||||
import EnhancedTable, { createColumns } from 'client/components/Tables/Enhanced'
|
import EnhancedTable, { createColumns } from 'client/components/Tables/Enhanced'
|
||||||
|
import WrapperRow from 'client/components/Tables/Enhanced/WrapperRow'
|
||||||
import ServiceTemplateColumns from 'client/components/Tables/ServiceTemplates/columns'
|
import ServiceTemplateColumns from 'client/components/Tables/ServiceTemplates/columns'
|
||||||
import ServiceTemplateRow from 'client/components/Tables/ServiceTemplates/row'
|
import ServiceTemplateRow from 'client/components/Tables/ServiceTemplates/row'
|
||||||
import { Translate } from 'client/components/HOC'
|
import Timer from 'client/components/Timer'
|
||||||
import { T, RESOURCE_NAMES } from 'client/constants'
|
import { RESOURCE_NAMES, T } from 'client/constants'
|
||||||
|
import { useAuth, useViews } from 'client/features/Auth'
|
||||||
|
import { useGetServiceTemplatesQuery } from 'client/features/OneApi/serviceTemplate'
|
||||||
|
import {
|
||||||
|
getColorFromString,
|
||||||
|
getUniqueLabels,
|
||||||
|
timeFromMilliseconds,
|
||||||
|
} from 'client/models/Helper'
|
||||||
|
import { ReactElement, useMemo } from 'react'
|
||||||
|
|
||||||
const DEFAULT_DATA_CY = 'service-templates'
|
const DEFAULT_DATA_CY = 'service-templates'
|
||||||
|
|
||||||
@ -53,6 +59,49 @@ const ServiceTemplatesTable = (props) => {
|
|||||||
[view]
|
[view]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const listHeader = [
|
||||||
|
{ header: T.ID, id: 'id', accessor: 'ID' },
|
||||||
|
{ header: T.Owner, id: 'owner', accessor: 'UNAME' },
|
||||||
|
{ header: T.Group, id: 'group', accessor: 'GNAME' },
|
||||||
|
{ header: T.Name, id: 'name', accessor: 'NAME' },
|
||||||
|
{
|
||||||
|
header: T.StartTime,
|
||||||
|
id: 'start-time',
|
||||||
|
accessor: ({
|
||||||
|
TEMPLATE: { BODY: { registration_time: regTime } = {} },
|
||||||
|
}) => {
|
||||||
|
const time = useMemo(() => timeFromMilliseconds(+regTime), [regTime])
|
||||||
|
|
||||||
|
return <Timer translateWord={T.RegisteredAt} initial={time} />
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: T.Labels,
|
||||||
|
id: 'labels',
|
||||||
|
accessor: ({ TEMPLATE: { BODY: { labels: LABELS = {} } = {} } }) => {
|
||||||
|
const { labels: userLabels } = useAuth()
|
||||||
|
const labels = useMemo(
|
||||||
|
() =>
|
||||||
|
getUniqueLabels(LABELS).reduce((acc, label) => {
|
||||||
|
if (userLabels?.includes(label)) {
|
||||||
|
acc.push({
|
||||||
|
text: label,
|
||||||
|
dataCy: `label-${label}`,
|
||||||
|
stateColor: getColorFromString(label),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return acc
|
||||||
|
}, []),
|
||||||
|
[LABELS]
|
||||||
|
)
|
||||||
|
|
||||||
|
return <MultipleTags tags={labels} truncateText={10} />
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
|
const { component, header } = WrapperRow(ServiceTemplateRow)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<EnhancedTable
|
<EnhancedTable
|
||||||
columns={columns}
|
columns={columns}
|
||||||
@ -62,7 +111,6 @@ const ServiceTemplatesTable = (props) => {
|
|||||||
refetch={refetch}
|
refetch={refetch}
|
||||||
isLoading={isFetching}
|
isLoading={isFetching}
|
||||||
getRowId={(row) => String(row.ID)}
|
getRowId={(row) => String(row.ID)}
|
||||||
RowComponent={ServiceTemplateRow}
|
|
||||||
noDataMessage={
|
noDataMessage={
|
||||||
error?.status === 500 && (
|
error?.status === 500 && (
|
||||||
<Alert severity="error" variant="outlined">
|
<Alert severity="error" variant="outlined">
|
||||||
@ -70,6 +118,8 @@ const ServiceTemplatesTable = (props) => {
|
|||||||
</Alert>
|
</Alert>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
RowComponent={component}
|
||||||
|
headerList={header && listHeader}
|
||||||
{...rest}
|
{...rest}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
|
@ -13,17 +13,20 @@
|
|||||||
* See the License for the specific language governing permissions and *
|
* See the License for the specific language governing permissions and *
|
||||||
* limitations under the License. *
|
* limitations under the License. *
|
||||||
* ------------------------------------------------------------------------- */
|
* ------------------------------------------------------------------------- */
|
||||||
import { useMemo, ReactElement } from 'react'
|
|
||||||
import { Alert } from '@mui/material'
|
import { Alert } from '@mui/material'
|
||||||
|
import { Translate } from 'client/components/HOC'
|
||||||
import { useViews } from 'client/features/Auth'
|
import { StatusCircle } from 'client/components/Status'
|
||||||
import { useGetServicesQuery } from 'client/features/OneApi/service'
|
|
||||||
|
|
||||||
import EnhancedTable, { createColumns } from 'client/components/Tables/Enhanced'
|
import EnhancedTable, { createColumns } from 'client/components/Tables/Enhanced'
|
||||||
|
import WrapperRow from 'client/components/Tables/Enhanced/WrapperRow'
|
||||||
import ServiceColumns from 'client/components/Tables/Services/columns'
|
import ServiceColumns from 'client/components/Tables/Services/columns'
|
||||||
import ServiceRow from 'client/components/Tables/Services/row'
|
import ServiceRow from 'client/components/Tables/Services/row'
|
||||||
import { Translate } from 'client/components/HOC'
|
import Timer from 'client/components/Timer'
|
||||||
import { T, RESOURCE_NAMES } from 'client/constants'
|
import { RESOURCE_NAMES, T } from 'client/constants'
|
||||||
|
import { useViews } from 'client/features/Auth'
|
||||||
|
import { useGetServicesQuery } from 'client/features/OneApi/service'
|
||||||
|
import { timeFromMilliseconds } from 'client/models/Helper'
|
||||||
|
import { getState } from 'client/models/Service'
|
||||||
|
import { ReactElement, useMemo } from 'react'
|
||||||
|
|
||||||
const DEFAULT_DATA_CY = 'services'
|
const DEFAULT_DATA_CY = 'services'
|
||||||
|
|
||||||
@ -48,6 +51,35 @@ const ServicesTable = (props) => {
|
|||||||
[view]
|
[view]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const listHeader = [
|
||||||
|
{
|
||||||
|
header: '',
|
||||||
|
id: 'status-icon',
|
||||||
|
accessor: (service) => {
|
||||||
|
const { color: stateColor, name: stateName } = getState(service)
|
||||||
|
|
||||||
|
return <StatusCircle color={stateColor} tooltip={stateName} />
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ header: T.ID, id: 'id', accessor: 'ID' },
|
||||||
|
{ header: T.Owner, id: 'owner', accessor: 'UNAME' },
|
||||||
|
{ header: T.Group, id: 'group', accessor: 'GNAME' },
|
||||||
|
{ header: T.Name, id: 'name', accessor: 'NAME' },
|
||||||
|
{
|
||||||
|
header: T.StartTime,
|
||||||
|
id: 'start-time',
|
||||||
|
accessor: ({ TEMPLATE: { BODY: { start_time: startTime } = {} } }) => {
|
||||||
|
const time = useMemo(
|
||||||
|
() => timeFromMilliseconds(+startTime),
|
||||||
|
[startTime]
|
||||||
|
)
|
||||||
|
|
||||||
|
return <Timer translateWord={T.RegisteredAt} initial={time} />
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
|
const { component, header } = WrapperRow(ServiceRow)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<EnhancedTable
|
<EnhancedTable
|
||||||
columns={columns}
|
columns={columns}
|
||||||
@ -57,7 +89,6 @@ const ServicesTable = (props) => {
|
|||||||
refetch={refetch}
|
refetch={refetch}
|
||||||
isLoading={isFetching}
|
isLoading={isFetching}
|
||||||
getRowId={(row) => String(row.ID)}
|
getRowId={(row) => String(row.ID)}
|
||||||
RowComponent={ServiceRow}
|
|
||||||
noDataMessage={
|
noDataMessage={
|
||||||
error?.status === 500 && (
|
error?.status === 500 && (
|
||||||
<Alert severity="error" variant="outlined">
|
<Alert severity="error" variant="outlined">
|
||||||
@ -65,6 +96,8 @@ const ServicesTable = (props) => {
|
|||||||
</Alert>
|
</Alert>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
RowComponent={component}
|
||||||
|
headerList={header && listHeader}
|
||||||
{...rest}
|
{...rest}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
* limitations under the License. *
|
* limitations under the License. *
|
||||||
* ------------------------------------------------------------------------- */
|
* ------------------------------------------------------------------------- */
|
||||||
import { Tr } from 'client/components/HOC'
|
import { Tr } from 'client/components/HOC'
|
||||||
|
import MultipleTags from 'client/components/MultipleTags'
|
||||||
import { LinearProgressWithLabel, StatusCircle } from 'client/components/Status'
|
import { LinearProgressWithLabel, StatusCircle } from 'client/components/Status'
|
||||||
import EnhancedTable, { createColumns } from 'client/components/Tables/Enhanced'
|
import EnhancedTable, { createColumns } from 'client/components/Tables/Enhanced'
|
||||||
import {
|
import {
|
||||||
@ -24,8 +25,9 @@ import WrapperRow from 'client/components/Tables/Enhanced/WrapperRow'
|
|||||||
import VNetworkColumns from 'client/components/Tables/VNetworks/columns'
|
import VNetworkColumns from 'client/components/Tables/VNetworks/columns'
|
||||||
import VNetworkRow from 'client/components/Tables/VNetworks/row'
|
import VNetworkRow from 'client/components/Tables/VNetworks/row'
|
||||||
import { RESOURCE_NAMES, T, VNET_THRESHOLD } from 'client/constants'
|
import { RESOURCE_NAMES, T, VNET_THRESHOLD } from 'client/constants'
|
||||||
import { useViews } from 'client/features/Auth'
|
import { useAuth, useViews } from 'client/features/Auth'
|
||||||
import { useGetVNetworksQuery } from 'client/features/OneApi/network'
|
import { useGetVNetworksQuery } from 'client/features/OneApi/network'
|
||||||
|
import { getColorFromString, getUniqueLabels } from 'client/models/Helper'
|
||||||
import { getLeasesInfo, getState } from 'client/models/VirtualNetwork'
|
import { getLeasesInfo, getState } from 'client/models/VirtualNetwork'
|
||||||
import { ReactElement, useCallback, useEffect, useMemo, useState } from 'react'
|
import { ReactElement, useCallback, useEffect, useMemo, useState } from 'react'
|
||||||
import { useFormContext } from 'react-hook-form'
|
import { useFormContext } from 'react-hook-form'
|
||||||
@ -183,6 +185,31 @@ const VNetworksTable = (props) => {
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
header: T.Labels,
|
||||||
|
id: 'labels',
|
||||||
|
accessor: ({ TEMPLATE: { LABELS } = {} }) => {
|
||||||
|
const { labels: userLabels } = useAuth()
|
||||||
|
const labels = useMemo(
|
||||||
|
() =>
|
||||||
|
getUniqueLabels(LABELS).reduce((acc, label) => {
|
||||||
|
if (userLabels?.includes(label)) {
|
||||||
|
acc.push({
|
||||||
|
text: label,
|
||||||
|
dataCy: `label-${label}`,
|
||||||
|
stateColor: getColorFromString(label),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return acc
|
||||||
|
}, []),
|
||||||
|
|
||||||
|
[LABELS]
|
||||||
|
)
|
||||||
|
|
||||||
|
return <MultipleTags tags={labels} truncateText={10} />
|
||||||
|
},
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
const { component, header } = WrapperRow(VNetworkRow)
|
const { component, header } = WrapperRow(VNetworkRow)
|
||||||
|
@ -13,15 +13,16 @@
|
|||||||
* See the License for the specific language governing permissions and *
|
* See the License for the specific language governing permissions and *
|
||||||
* limitations under the License. *
|
* limitations under the License. *
|
||||||
* ------------------------------------------------------------------------- */
|
* ------------------------------------------------------------------------- */
|
||||||
import { ReactElement, useMemo } from 'react'
|
import MultipleTags from 'client/components/MultipleTags'
|
||||||
|
|
||||||
import EnhancedTable, { createColumns } from 'client/components/Tables/Enhanced'
|
import EnhancedTable, { createColumns } from 'client/components/Tables/Enhanced'
|
||||||
import WrapperRow from 'client/components/Tables/Enhanced/WrapperRow'
|
import WrapperRow from 'client/components/Tables/Enhanced/WrapperRow'
|
||||||
import VDCColumns from 'client/components/Tables/VirtualDataCenters/columns'
|
import VDCColumns from 'client/components/Tables/VirtualDataCenters/columns'
|
||||||
import VDCRow from 'client/components/Tables/VirtualDataCenters/row'
|
import VDCRow from 'client/components/Tables/VirtualDataCenters/row'
|
||||||
import { ALL_SELECTED, RESOURCE_NAMES, T } from 'client/constants'
|
import { ALL_SELECTED, RESOURCE_NAMES, T } from 'client/constants'
|
||||||
import { useViews } from 'client/features/Auth'
|
import { useAuth, useViews } from 'client/features/Auth'
|
||||||
import { useGetVDCsQuery } from 'client/features/OneApi/vdc'
|
import { useGetVDCsQuery } from 'client/features/OneApi/vdc'
|
||||||
|
import { getColorFromString, getUniqueLabels } from 'client/models/Helper'
|
||||||
|
import { ReactElement, useMemo } from 'react'
|
||||||
|
|
||||||
const DEFAULT_DATA_CY = 'vdcs'
|
const DEFAULT_DATA_CY = 'vdcs'
|
||||||
|
|
||||||
@ -115,6 +116,30 @@ const VDCsTable = (props) => {
|
|||||||
return isAllSelected(datastoresArray) ? T.All : datastoresArray.length
|
return isAllSelected(datastoresArray) ? T.All : datastoresArray.length
|
||||||
}, [DATASTORES.DATASTORE]),
|
}, [DATASTORES.DATASTORE]),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
header: T.Labels,
|
||||||
|
id: 'labels',
|
||||||
|
accessor: ({ TEMPLATE: { LABELS } }) => {
|
||||||
|
const { labels: userLabels } = useAuth()
|
||||||
|
const labels = useMemo(
|
||||||
|
() =>
|
||||||
|
getUniqueLabels(LABELS).reduce((acc, label) => {
|
||||||
|
if (userLabels?.includes(label)) {
|
||||||
|
acc.push({
|
||||||
|
text: label,
|
||||||
|
dataCy: `label-${label}`,
|
||||||
|
stateColor: getColorFromString(label),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return acc
|
||||||
|
}, []),
|
||||||
|
[LABELS]
|
||||||
|
)
|
||||||
|
|
||||||
|
return <MultipleTags tags={labels} truncateText={10} />
|
||||||
|
},
|
||||||
|
},
|
||||||
]
|
]
|
||||||
const { component, header } = WrapperRow(VDCRow)
|
const { component, header } = WrapperRow(VDCRow)
|
||||||
|
|
||||||
|
@ -13,16 +13,20 @@
|
|||||||
* See the License for the specific language governing permissions and *
|
* See the License for the specific language governing permissions and *
|
||||||
* limitations under the License. *
|
* limitations under the License. *
|
||||||
* ------------------------------------------------------------------------- */
|
* ------------------------------------------------------------------------- */
|
||||||
import { ReactElement, useEffect, useMemo } from 'react'
|
import MultipleTags from 'client/components/MultipleTags'
|
||||||
|
|
||||||
import EnhancedTable, { createColumns } from 'client/components/Tables/Enhanced'
|
import EnhancedTable, { createColumns } from 'client/components/Tables/Enhanced'
|
||||||
import WrapperRow from 'client/components/Tables/Enhanced/WrapperRow'
|
import WrapperRow from 'client/components/Tables/Enhanced/WrapperRow'
|
||||||
import VmTemplateColumns from 'client/components/Tables/VmTemplates/columns'
|
import VmTemplateColumns from 'client/components/Tables/VmTemplates/columns'
|
||||||
import VmTemplateRow from 'client/components/Tables/VmTemplates/row'
|
import VmTemplateRow from 'client/components/Tables/VmTemplates/row'
|
||||||
import { RESOURCE_NAMES, T } from 'client/constants'
|
import { RESOURCE_NAMES, T } from 'client/constants'
|
||||||
import { useViews } from 'client/features/Auth'
|
import { useAuth, useViews } from 'client/features/Auth'
|
||||||
import { useGetTemplatesQuery } from 'client/features/OneApi/vmTemplate'
|
import { useGetTemplatesQuery } from 'client/features/OneApi/vmTemplate'
|
||||||
import { timeToString } from 'client/models/Helper'
|
import {
|
||||||
|
getColorFromString,
|
||||||
|
getUniqueLabels,
|
||||||
|
timeToString,
|
||||||
|
} from 'client/models/Helper'
|
||||||
|
import { ReactElement, useEffect, useMemo } from 'react'
|
||||||
|
|
||||||
const DEFAULT_DATA_CY = 'vm-templates'
|
const DEFAULT_DATA_CY = 'vm-templates'
|
||||||
|
|
||||||
@ -58,6 +62,31 @@ const VmTemplatesTable = (props) => {
|
|||||||
id: 'registration-time',
|
id: 'registration-time',
|
||||||
accessor: (vm) => timeToString(vm.REGTIME),
|
accessor: (vm) => timeToString(vm.REGTIME),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
header: T.Labels,
|
||||||
|
id: 'labels',
|
||||||
|
accessor: ({ TEMPLATE: { LABELS } = {} }) => {
|
||||||
|
const { labels: userLabels } = useAuth()
|
||||||
|
const labels = useMemo(
|
||||||
|
() =>
|
||||||
|
getUniqueLabels(LABELS).reduce((acc, label) => {
|
||||||
|
if (userLabels?.includes(label)) {
|
||||||
|
acc.push({
|
||||||
|
text: label,
|
||||||
|
dataCy: `label-${label}`,
|
||||||
|
stateColor: getColorFromString(label),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return acc
|
||||||
|
}, []),
|
||||||
|
|
||||||
|
[LABELS]
|
||||||
|
)
|
||||||
|
|
||||||
|
return <MultipleTags tags={labels} truncateText={10} />
|
||||||
|
},
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
const { component, header } = WrapperRow(VmTemplateRow)
|
const { component, header } = WrapperRow(VmTemplateRow)
|
||||||
|
@ -15,10 +15,11 @@
|
|||||||
* ------------------------------------------------------------------------- */
|
* ------------------------------------------------------------------------- */
|
||||||
import { ReactElement, useMemo } from 'react'
|
import { ReactElement, useMemo } from 'react'
|
||||||
|
|
||||||
import { useViews } from 'client/features/Auth'
|
import { useAuth, useViews } from 'client/features/Auth'
|
||||||
import { useGetVmsQuery } from 'client/features/OneApi/vm'
|
import { useGetVmsQuery } from 'client/features/OneApi/vm'
|
||||||
|
|
||||||
import { ConsoleButton } from 'client/components/Buttons'
|
import { ConsoleButton } from 'client/components/Buttons'
|
||||||
|
import MultipleTags from 'client/components/MultipleTags'
|
||||||
import { StatusCircle } from 'client/components/Status'
|
import { StatusCircle } from 'client/components/Status'
|
||||||
import EnhancedTable, { createColumns } from 'client/components/Tables/Enhanced'
|
import EnhancedTable, { createColumns } from 'client/components/Tables/Enhanced'
|
||||||
import WrapperRow from 'client/components/Tables/Enhanced/WrapperRow'
|
import WrapperRow from 'client/components/Tables/Enhanced/WrapperRow'
|
||||||
@ -32,6 +33,7 @@ import {
|
|||||||
VM_EXTENDED_POOL,
|
VM_EXTENDED_POOL,
|
||||||
VM_STATES,
|
VM_STATES,
|
||||||
} from 'client/constants'
|
} from 'client/constants'
|
||||||
|
import { getColorFromString, getUniqueLabels } from 'client/models/Helper'
|
||||||
import { getIps, getLastHistory, getState } from 'client/models/VirtualMachine'
|
import { getIps, getLastHistory, getState } from 'client/models/VirtualMachine'
|
||||||
|
|
||||||
const DEFAULT_DATA_CY = 'vms'
|
const DEFAULT_DATA_CY = 'vms'
|
||||||
@ -182,6 +184,31 @@ const VmsTable = (props) => {
|
|||||||
</>
|
</>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
header: T.Labels,
|
||||||
|
id: 'labels',
|
||||||
|
accessor: ({ USER_TEMPLATE: { LABELS } = {} }) => {
|
||||||
|
const { labels: userLabels } = useAuth()
|
||||||
|
const labels = useMemo(
|
||||||
|
() =>
|
||||||
|
getUniqueLabels(LABELS).reduce((acc, label) => {
|
||||||
|
if (userLabels?.includes(label)) {
|
||||||
|
acc.push({
|
||||||
|
text: label,
|
||||||
|
dataCy: `label-${label}`,
|
||||||
|
stateColor: getColorFromString(label),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return acc
|
||||||
|
}, []),
|
||||||
|
|
||||||
|
[LABELS]
|
||||||
|
)
|
||||||
|
|
||||||
|
return <MultipleTags tags={labels} truncateText={10} />
|
||||||
|
},
|
||||||
|
},
|
||||||
]
|
]
|
||||||
const { component, header } = WrapperRow(VmRow)
|
const { component, header } = WrapperRow(VmRow)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user