Skip to content
Draft
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
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
v-if="pType !== 'basic'"
class="config-card-prop-section-title"
>
{{ pType === 'advanced' ? t('baseConfigCard.sections.advanced') : t('baseConfigCard.sections.plugin') }}
{{ pType === 'advanced' ? t('baseConfigCard.sections.advanced') : pType === 'plugin' ? t('baseConfigCard.sections.plugin') : t('baseConfigCard.sections.policy') }}
</div>

<ConfigCardItem
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ import type {
RecordItem,
DefaultCommonFieldsConfigurationSchema,
SupportedEntityType,
PolicyConfigurationSchema,
} from '../../types'
import { ConfigurationSchemaType, ConfigurationSchemaSection, SupportedEntityTypesArray } from '../../types'
import composables from '../../composables'
Expand Down Expand Up @@ -169,6 +170,18 @@ const props = defineProps({
required: false,
default: () => ({}),
},
/** Record key that contains the policy configuration */
policyConfigKey: {
type: String,
required: false,
default: '',
},
/** Configuration schema for the policy configuration section */
policyConfigSchema: {
type: Object as PropType<PolicyConfigurationSchema>,
required: false,
default: () => ({}),
},
/**
* Fetch url for the item to display configuration for.
* We will handle the replacement of {controlPlaneId}, {workspace}, and {id}.
Expand Down Expand Up @@ -452,11 +465,59 @@ const orderedPluginConfigArray = computed((): RecordItem[] => {
}).filter(item => !item.hidden) // strip hidden fields
})

const propertyLists = computed((): { basic: RecordItem[], advanced: RecordItem[], plugin: RecordItem[] } => {
const orderedPolicyConfigArray = computed((): RecordItem[] => {
if (!record.value || !props.policyConfigKey) {
return []
}

// each item is an array of the key and the order
// ex. [ ['id', 1], ['description', 5], ... ]
const configRecord = record.value[props.policyConfigKey] || {}
const fieldCount = Object.keys(configRecord).length
const sortableKeys = []
for (const key in configRecord) {
const configOrder = props.policyConfigSchema?.[key]?.order
const recEntry = configRecord[key]
// if no order provided, prioritize entries that have values
let order = recEntry !== null && recEntry !== undefined && recEntry !== '' ? fieldCount - 1 : fieldCount

// check if order exists in config
// config order overrides default order
if (configOrder) {
// -1 means send it to the end
order = configOrder === -1 ? fieldCount + 1 : configOrder
}

sortableKeys.push([key, order])
}

sortableKeys.sort(function(a, b) {
return (a[1] as number) - (b[1] as number)
})

return sortableKeys.map((sKey: Array<string | number>) => {
const key = sKey[0] as string
const recordEntry = configRecord[key]
const configEntry = props.policyConfigSchema?.[key] || {}

return {
key,
value: recordEntry,
hidden: configEntry.hidden || false,
type: configEntry.type ?? ConfigurationSchemaType.Text,
label: configEntry.label ?? convertKeyToTitle(key),
tooltip: configEntry.tooltip ?? undefined,
section: ConfigurationSchemaSection.Policy,
} as RecordItem
}).filter(item => !item.hidden) // strip hidden fields
})

const propertyLists = computed((): { basic: RecordItem[], advanced: RecordItem[], plugin: RecordItem[], policy: RecordItem[] } => {
return {
basic: orderedRecordArray.value?.filter((orderedItem: RecordItem) => orderedItem.section === ConfigurationSchemaSection.Basic),
advanced: orderedRecordArray.value?.filter((orderedItem: RecordItem) => orderedItem.section === ConfigurationSchemaSection.Advanced),
plugin: orderedPluginConfigArray.value?.concat(orderedRecordArray.value?.filter((orderedItem: RecordItem) => orderedItem.section === ConfigurationSchemaSection.Plugin)),
policy: orderedPolicyConfigArray.value?.concat(orderedRecordArray.value?.filter((orderedItem: RecordItem) => orderedItem.section === ConfigurationSchemaSection.Policy)),
}
})

Expand All @@ -475,6 +536,10 @@ const propListTypes = computed((): string[] => {
types.push('plugin')
}

if (propertyLists.value.policy.length) {
types.push('policy')
}

return types
})

Expand Down
3 changes: 2 additions & 1 deletion packages/entities/entities-shared/src/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@
},
"sections": {
"advanced": "Advanced",
"plugin": "Plugin Specific Configuration"
"plugin": "Plugin Specific Configuration",
"policy": "Policy Specific Configuration"
},
"commonFields": {
"id_label": "ID",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ export enum ConfigurationSchemaSection {
Basic = 'basic',
Advanced = 'advanced', // default
Plugin = 'plugin',
Policy = 'policy',
}

export interface ConfigurationSchemaItem {
Expand Down Expand Up @@ -99,6 +100,8 @@ export interface PluginConfigurationSchema {
[key: string]: PluginConfigurationSchemaItem
}

export interface PolicyConfigurationSchema extends PluginConfigurationSchema {}

export interface RecordItem extends ConfigurationSchemaItem {
key: string
value: any
Expand Down
Loading