Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,7 @@ yarn-error.log*
storybook-static

.env.options

.yalc
yalc.lock
.yalc/**
17 changes: 17 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,16 @@ const meta: Meta<TArgs> = {
description:
"data.value – template resolved via parseWithoutPartsOfUrl (e.g. \"{reqsJsonPath[0]['.data.flag']['-']}\")",
},
criteria: {
control: { type: 'radio' },
options: ['equals', 'notEquals', null],
mapping: { equals: 'equals', notEquals: 'notEquals', null: undefined },
description: 'data.criteria – optional comparison operator (equals / notEquals)',
},
valueToCompare: {
control: 'object',
description: 'data.valueToCompare – string or array of strings to compare with resolved value',
},

// provider knobs
isLoading: {
Expand All @@ -56,6 +66,8 @@ const meta: Meta<TArgs> = {
const data: TInner = {
id: args.id,
value: args.value,
criteria: args.criteria as TInner['criteria'],
valueToCompare: args.valueToCompare as TInner['valueToCompare'],
}

return (
Expand All @@ -76,8 +88,15 @@ const meta: Meta<TArgs> = {
fontSize: 13,
}}
>
I am only visible when <code>value</code> resolves to something other than{' '}
<code>~undefined-value~</code>.
I am visible when:
<ul style={{ marginTop: 6 }}>
<li>
<code>value</code> resolves (not <code>~undefined-value~</code>)
</li>
<li>
If <code>criteria</code> is set, the comparison passes against <code>valueToCompare</code>
</li>
</ul>
</div>
</VisibilityContainer>
</div>
Expand Down Expand Up @@ -115,6 +134,8 @@ export const Default: Story = {
id: 'example-visibility-container',
// typical template used by parseWithoutPartsOfUrl
value: "{reqsJsonPath[0]['.data.flag']['-']}",
criteria: undefined,
valueToCompare: undefined,

// providers
isLoading: false,
Expand Down Expand Up @@ -152,3 +173,71 @@ export const LoadingMultiQuery: Story = {
isLoading: true,
},
}

export const CriteriaEqualsPasses: Story = {
args: {
...Default.args,
id: 'visibility-criteria-equals-passes',
criteria: 'equals',
valueToCompare: ['show'],
value: "{reqsJsonPath[0]['.data.flag']['-']}",
multiQueryData: {
req0: {
data: {
flag: 'show',
},
},
},
},
}

export const CriteriaEqualsFails: Story = {
args: {
...Default.args,
id: 'visibility-criteria-equals-fails',
criteria: 'equals',
valueToCompare: ['Role'],
value: "{reqsJsonPath[0]['.data.flag']['-']}",
multiQueryData: {
req0: {
data: {
flag: 'ClusterRole',
},
},
},
},
}

export const CriteriaNotEqualsPasses: Story = {
args: {
...Default.args,
id: 'visibility-criteria-not-equals-passes',
criteria: 'notEquals',
valueToCompare: ['Role'],
value: "{reqsJsonPath[0]['.data.flag']['-']}",
multiQueryData: {
req0: {
data: {
flag: 'ClusterRole',
},
},
},
},
}

export const CriteriaNotEqualsFails: Story = {
args: {
...Default.args,
id: 'visibility-criteria-not-equals-fails',
criteria: 'notEquals',
valueToCompare: ['Role'],
value: "{reqsJsonPath[0]['.data.flag']['-']}",
multiQueryData: {
req0: {
data: {
flag: 'Role',
},
},
},
},
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ export const VisibilityContainer: FC<{ data: TDynamicComponentsAppTypeMap['Visib
// eslint-disable-next-line @typescript-eslint/no-unused-vars
id,
value,
criteria,
valueToCompare,
} = data

const valuePrepared = parseWithoutPartsOfUrl({
Expand All @@ -24,11 +26,26 @@ export const VisibilityContainer: FC<{ data: TDynamicComponentsAppTypeMap['Visib
customFallback: '~undefined-value~',
})

const shouldHideByCriteria = (() => {
if (!criteria || !valueToCompare) return false

const targets = Array.isArray(valueToCompare) ? valueToCompare.map(String) : [String(valueToCompare)]
const matches = targets.includes(String(valuePrepared))

if (criteria === 'equals') return !matches
if (criteria === 'notEquals') return matches
return false
})()

if (isMultiqueryLoading) {
return <div>Loading multiquery</div>
}

return (
<Styled.VisibilityContainer $hidden={valuePrepared === '~undefined-value~'}>{children}</Styled.VisibilityContainer>
<Styled.VisibilityContainer
$hidden={!valuePrepared || valuePrepared === '~undefined-value~' || shouldHideByCriteria}
>
{children}
</Styled.VisibilityContainer>
)
}
2 changes: 2 additions & 0 deletions src/components/organisms/DynamicComponents/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,8 @@ export type TDynamicComponentsAppTypeMap = {
VisibilityContainer: {
id: number | string
value: string
criteria?: 'equals' | 'notEquals'
valueToCompare?: string | string[]
}
ArrayOfObjectsToKeyValues: {
id: number | string
Expand Down