feat: Add table logic for role and permission sections
This commit is contained in:
@@ -1,13 +1,17 @@
|
||||
import type { FormElementDto, VisibilityConditionOperator } from '~~/.api-client'
|
||||
import type { FormElementDto, FormElementVisibilityCondition, VisibilityConditionOperator } from '~~/.api-client'
|
||||
import { VisibilityConditionOperator as VCOperator, VisibilityConditionType as VCType } from '~~/.api-client'
|
||||
|
||||
export function useFormElementVisibility() {
|
||||
/**
|
||||
* Evaluates visibility for all form elements based on their visibility conditions.
|
||||
* Returns a map of element key (id or reference) to visibility status.
|
||||
*/
|
||||
function evaluateFormElementVisibility(allFormElements: FormElementDto[]): Map<string, boolean> {
|
||||
const formElementsByRef = buildFormElementsMap(allFormElements)
|
||||
const visibilityMap = new Map<string, boolean>()
|
||||
|
||||
allFormElements.forEach((element) => {
|
||||
const isVisible = isElementVisible(element, formElementsByRef, visibilityMap)
|
||||
const isVisible = isElementVisible(element, formElementsByRef)
|
||||
const key = element.id || element.reference
|
||||
if (key) {
|
||||
visibilityMap.set(key, isVisible)
|
||||
@@ -27,24 +31,33 @@ export function useFormElementVisibility() {
|
||||
return map
|
||||
}
|
||||
|
||||
function isElementVisible(
|
||||
element: FormElementDto,
|
||||
formElementsByRef: Map<string, FormElementDto>,
|
||||
_visibilityMap: Map<string, boolean>
|
||||
): boolean {
|
||||
if (!element.visibilityCondition) {
|
||||
/**
|
||||
* Evaluates if an element is visible based on its visibility conditions.
|
||||
* Multiple conditions use AND logic - all conditions must be met for the element to be visible.
|
||||
*/
|
||||
function isElementVisible(element: FormElementDto, formElementsByRef: Map<string, FormElementDto>): boolean {
|
||||
const conditions = element.visibilityConditions
|
||||
if (!conditions || conditions.length === 0) {
|
||||
return true
|
||||
}
|
||||
|
||||
const condition = element.visibilityCondition
|
||||
// All conditions must be met (AND logic)
|
||||
return conditions.every((condition) => evaluateSingleCondition(condition, formElementsByRef))
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluates a single visibility condition against the form state.
|
||||
*/
|
||||
function evaluateSingleCondition(
|
||||
condition: FormElementVisibilityCondition,
|
||||
formElementsByRef: Map<string, FormElementDto>
|
||||
): boolean {
|
||||
const sourceElement = formElementsByRef.get(condition.sourceFormElementReference)
|
||||
if (!sourceElement) {
|
||||
return false
|
||||
}
|
||||
|
||||
const sourceValue = getFormElementValue(sourceElement)
|
||||
|
||||
const operator = condition.formElementOperator || VCOperator.Equals
|
||||
const conditionMet = evaluateCondition(sourceValue, condition.formElementExpectedValue, operator)
|
||||
|
||||
@@ -61,20 +74,15 @@ export function useFormElementVisibility() {
|
||||
expectedValue: string,
|
||||
operator: VisibilityConditionOperator
|
||||
): boolean {
|
||||
let result: boolean
|
||||
switch (operator) {
|
||||
case VCOperator.Equals:
|
||||
result = actualValue.toLowerCase() === expectedValue.toLowerCase()
|
||||
return result
|
||||
return actualValue.toLowerCase() === expectedValue.toLowerCase()
|
||||
case VCOperator.NotEquals:
|
||||
result = actualValue.toLowerCase() !== expectedValue.toLowerCase()
|
||||
return result
|
||||
return actualValue.toLowerCase() !== expectedValue.toLowerCase()
|
||||
case VCOperator.IsEmpty:
|
||||
result = actualValue === ''
|
||||
return result
|
||||
return actualValue === ''
|
||||
case VCOperator.IsNotEmpty:
|
||||
result = actualValue !== ''
|
||||
return result
|
||||
return actualValue !== ''
|
||||
default:
|
||||
return false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user