Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
113 changes: 78 additions & 35 deletions dashboard/src/views/BusinessMetadata/BusinessMetadataAtrributeForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,9 @@ import {
tooltipClasses,
TooltipProps,
styled,
FilterOptionsState
FilterOptionsState,
ToggleButton,
ToggleButtonGroup
} from "@mui/material";
import { customSortBy, isEmpty, serverError } from "@utils/Utils";
import { Controller, useForm } from "react-hook-form";
Expand Down Expand Up @@ -463,41 +465,82 @@ const BusinessMetadataAttributeForm = ({
watched?.[index] &&
watched?.[index]?.multiValueSelect) ||
isEmpty(editbmAttribute)) && (
<Controller
control={control}
name={`attributeDefs.${index}.multiValueSelect` as const}
key={`attributeDefs.${index}.multiValueSelect`}
data-cy={`attributeDefs.${index}.multiValueSelect`}
defaultValue={field?.multiValueSelect}
render={({ field: { value, onChange } }) => (
<>
<Grid
container
columnSpacing={{ xs: 1, sm: 2, md: 2 }}
marginBottom="1rem"
alignItems="center"
>
<Grid item md={3} textAlign="right">
<InputLabel>Enable Multivalues</InputLabel>
</Grid>
<Grid item md={7}>
{" "}
<FormControlLabel
control={
<Checkbox
disabled={isEmpty(editbmAttribute) ? false : true}
size="small"
checked={value}
onChange={onChange}
<>
<Controller
control={control}
name={`attributeDefs.${index}.multiValueSelect` as const}
key={`attributeDefs.${index}.multiValueSelect`}
data-cy={`attributeDefs.${index}.multiValueSelect`}
defaultValue={field?.multiValueSelect}
render={({ field: { value, onChange } }) => (
<>
<Grid
container
columnSpacing={{ xs: 1, sm: 2, md: 2 }}
marginBottom="1rem"
alignItems="center"
>
<Grid item md={3} textAlign="right">
<InputLabel>Enable Multivalues</InputLabel>
</Grid>
<Grid item md={7}>
<Stack direction="row" spacing={2} alignItems="center">
<FormControlLabel
control={
<Checkbox
disabled={isEmpty(editbmAttribute) ? false : true}
size="small"
checked={value}
onChange={(e) => {
onChange(e.target.checked);
// Reset cardinality toggle when multivalues is unchecked
if (!e.target.checked) {
attributeDefsSetValue(
`attributeDefs.${index}.cardinalityToggle`,
"SET"
);
}
}}
/>
}
label={undefined}
/>
}
label={undefined}
/>
</Grid>{" "}
</Grid>
</>
)}
/>
{value && (
<Controller
control={control}
name={`attributeDefs.${index}.cardinalityToggle` as const}
key={`attributeDefs.${index}.cardinalityToggle`}
defaultValue={field?.cardinalityToggle || "SET"}
render={({ field: { value: toggleValue, onChange: toggleOnChange } }) => (
<ToggleButtonGroup
size="small"
value={toggleValue || "SET"}
exclusive
disabled={!isEmpty(editbmAttribute)}
onChange={(e, newValue) => {
if (newValue !== null) {
toggleOnChange(newValue);
}
}}
aria-label="cardinality toggle"
>
<ToggleButton value="SET" aria-label="SET">
SET
</ToggleButton>
<ToggleButton value="LIST" aria-label="LIST">
LIST
</ToggleButton>
</ToggleButtonGroup>
)}
/>
)}
</Stack>
</Grid>
</Grid>
</>
)}
/>
</>
)}
{watched?.[index] && watched?.[index]?.typeName == "string" && (
<Controller
Expand Down
23 changes: 19 additions & 4 deletions dashboard/src/views/BusinessMetadata/BusinessMetadataForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,9 @@ const BusinessMetaDataForm = ({
...(currentTypeName == "enumeration" && {
enumValues: enumTypeOptions
}),
multiValueSelect: str.indexOf("<") != -1 ? true : false
multiValueSelect: str.indexOf("<") != -1 ? true : false,
// Set cardinalityToggle based on existing cardinality (SET or LIST), default to SET
cardinalityToggle: editbmAttribute?.cardinality === "LIST" ? "LIST" : "SET"
}
];
const dispatchState = useAppDispatch();
Expand All @@ -142,6 +144,7 @@ const BusinessMetaDataForm = ({
},
isOptional: true,
cardinality: "SINGLE",
cardinalityToggle: "SET", // Default toggle value when multivalues is enabled
valuesMinCount: 0,
valuesMaxCount: 1,
isUnique: false,
Expand All @@ -157,7 +160,7 @@ const BusinessMetaDataForm = ({
control,
name: "attributeDefs",
rules: {
required: true
required: false // Allow creating BM without attributes
}
});

Expand Down Expand Up @@ -203,7 +206,9 @@ const BusinessMetaDataForm = ({
...(currentTypeName == "enumeration" && {
enumValues: enumTypeOptions
}),
multiValueSelect: str.indexOf("<") != -1 ? true : false
multiValueSelect: str.indexOf("<") != -1 ? true : false,
// Set cardinalityToggle based on existing cardinality (SET or LIST), default to SET
cardinalityToggle: editbmAttribute?.cardinality === "LIST" ? "LIST" : "SET"
}
];
if (!isEmpty(editbmAttribute)) {
Expand Down Expand Up @@ -255,10 +260,19 @@ const BusinessMetaDataForm = ({

let attributes = !isEmpty(attributeDefsData)
? attributeDefsData.map((item) => {
const { multiValueSelect, enumType, enumValues, ...rest } = item;
const { multiValueSelect, enumType, enumValues, cardinality, cardinalityToggle, ...rest } = item;

// Determine cardinality based on multiValueSelect and cardinality toggle
let finalCardinality = "SINGLE";
if (multiValueSelect) {
// If multivalues is enabled, use the cardinalityToggle (SET or LIST)
// Default to SET if not specified
finalCardinality = cardinalityToggle === "LIST" ? "LIST" : (cardinality === "LIST" ? "LIST" : "SET");
}

const baseObj = {
...rest,
cardinality: finalCardinality,
options: {
applicableEntityTypes: JSON.stringify(
rest.options.applicableEntityTypes
Expand Down Expand Up @@ -508,6 +522,7 @@ const BusinessMetaDataForm = ({
},
isOptional: true,
cardinality: "SINGLE",
cardinalityToggle: "SET", // Default toggle value when multivalues is enabled
valuesMinCount: 0,
valuesMaxCount: 1,
isUnique: false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,18 @@ const BusinessMetadataAtrribute = ({ componentProps, row }: any) => {
header: "Enable Multivalues",
enableSorting: false
},
{
accessorKey: "cardinality",
cell: (info: any) =>
!isEmpty(info.getValue()) ? (
<Typography>{info.getValue()}</Typography>
) : (
<span>N/A</span>
),
header: "Cardinality",
enableSorting: true,
show: true
},
{
accessorKey: "maxStrLength",
cell: (info: any) => {
Expand Down Expand Up @@ -217,7 +229,9 @@ const BusinessMetadataAtrribute = ({ componentProps, row }: any) => {
...(currentTypeName == "enumeration" && {
enumValues: enumTypeOptions
}),
multiValueSelect: str.indexOf("<") != -1 ? true : false
multiValueSelect: str.indexOf("<") != -1 ? true : false,
// Set cardinalityToggle based on existing cardinality (SET or LIST), default to SET
cardinalityToggle: original?.cardinality === "LIST" ? "LIST" : "SET"
}
];
setForm(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,10 +179,19 @@ const BusinessMetadataDetailsLayout = () => {
let attributeDefsData = [...formAttributes];

let attributes = attributeDefsData.map((item) => {
const { multiValueSelect, enumValues, enumType, ...rest } = item;
const { multiValueSelect, enumValues, enumType, cardinality, cardinalityToggle, ...rest } = item;

// Determine cardinality based on multiValueSelect and cardinality toggle
let finalCardinality = "SINGLE";
if (multiValueSelect) {
// If multivalues is enabled, use the cardinalityToggle (SET or LIST)
// Default to SET if not specified
finalCardinality = cardinalityToggle === "LIST" ? "LIST" : (cardinality === "LIST" ? "LIST" : "SET");
}

return {
...rest,
cardinality: finalCardinality,
...{
options: {
applicableEntityTypes: JSON.stringify(
Expand Down
8 changes: 8 additions & 0 deletions dashboardv2/public/css/scss/business-metadata.scss
Original file line number Diff line number Diff line change
Expand Up @@ -240,4 +240,12 @@
.business-metadata-detail-attr-key {
width: 30%;
}
}

// Disabled state for cardinality toggle buttons
.cardinality-btn.disabled,
.cardinality-btn[disabled] {
opacity: 0.6;
cursor: not-allowed;
pointer-events: none;
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,17 @@
<div class="form-group" data-id="multiValueSelect">
<label class="control-label col-sm-3" for="multiValSelect">Enable Multivalues</label>
<div class="col-sm-8">
<input type="checkbox" class="form-check-input multi-value-select" data-id="multiValueSelectStatus">
<div class="row">
<div class="col-sm-6">
<input type="checkbox" class="form-check-input multi-value-select" data-id="multiValueSelectStatus">
</div>
<div class="col-sm-6" data-id="cardinalityToggleContainer" style="display: none;">
<div class="btn-group" role="group" data-id="cardinalityToggle">
<button type="button" class="btn btn-sm btn-default cardinality-btn" data-value="SET" data-id="cardinalitySET">SET</button>
<button type="button" class="btn btn-sm btn-default cardinality-btn active" data-value="LIST" data-id="cardinalityLIST">LIST</button>
</div>
</div>
</div>
</div>
</div>
<div class="form-group enumtype-container" data-id="enumTypeSelectorContainer">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,15 @@ define(['require',
attrDetails.typeName = attrObj.typeName.replace("array<", "").replace(">", "");
attrDetails.multiValued = true;
}
// Set cardinalityToggle based on existing cardinality (SET or LIST), default to SET
if (attrObj.cardinality) {
attrDetails.cardinalityToggle = (attrObj.cardinality === "LIST") ? "LIST" : "SET";
} else {
// If cardinality is not set but it's an array type, default to SET
if (attrObj.typeName.includes('array')) {
attrDetails.cardinalityToggle = "SET";
}
}
}
});
this.showDetails = false;
Expand Down Expand Up @@ -197,6 +206,27 @@ define(['require',
}
})
},
cardinality: {
label: "Cardinality",
cell: "html",
editable: false,
sortable: true,
formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
fromRaw: function(rawValue, model) {
var cardinality = model.get('cardinality');
if (!cardinality) {
// If cardinality is not set, determine from typeName
if (model.get('typeName').indexOf('array<') > -1) {
// Default to SET for array types if cardinality is not specified
cardinality = "SET";
} else {
cardinality = "SINGLE";
}
}
return _.escape(cardinality);
}
})
},
maxStrLength: {
label: "Max Length",
cell: "html",
Expand Down
Loading