diff --git a/apps/web/src/common/modules/widgets/_components/WidgetFormDataSourcePopover.vue b/apps/web/src/common/modules/widgets/_components/WidgetFormDataSourcePopover.vue index 54ce6a92e6..58c34a028b 100644 --- a/apps/web/src/common/modules/widgets/_components/WidgetFormDataSourcePopover.vue +++ b/apps/web/src/common/modules/widgets/_components/WidgetFormDataSourcePopover.vue @@ -6,7 +6,7 @@ import type { TranslateResult } from 'vue-i18n'; import { SpaceConnector } from '@cloudforet/core-lib/space-connector'; import { - PButton, PPopover, PSelectCard, PI, + PButton, PPopover, PSelectCard, PI, PDivider, } from '@cloudforet/mirinae'; import { POPOVER_TRIGGER } from '@cloudforet/mirinae/src/data-display/popover/type'; @@ -397,7 +397,7 @@ watch(() => state.showPopover, (val) => { {{ i18n.t('COMMON.WIDGETS.DATA_TABLE.FORM.TRANSFORMATIONS') }} -
+
state.showPopover, (val) => {
+
state.showPopover, (val) => { .data-source-popper-operator-wrapper { //display: flex; //flex-direction: column; - width: 43rem; + width: 43.5rem; padding: 1rem; .conetent { @@ -514,16 +517,20 @@ watch(() => state.showPopover, (val) => { } .content-part { - @apply grid grid-cols-12; + overflow-y: scroll; max-height: 22.5rem; - overflow: auto; - gap: 0.5rem; + height: auto; + .left-part, .right-part { - @apply col-span-6; + height: 100%; display: flex; flex-direction: column; gap: 0.5rem; } + .content-divider { + margin: 0 1.125rem; + height: 30.125rem; + } } .operator-card-contents { @@ -616,6 +623,7 @@ watch(() => state.showPopover, (val) => { /* custom design-system component - p-select-card */ :deep(.p-select-card) { + height: 5.625rem; padding: 1rem; .select-card-contents { @apply flex justify-start items-center; diff --git a/apps/web/src/common/modules/widgets/_widget-field-value-manager/constant/validator-registry.ts b/apps/web/src/common/modules/widgets/_widget-field-value-manager/constant/validator-registry.ts index 4b06637bde..e5c8a18b29 100644 --- a/apps/web/src/common/modules/widgets/_widget-field-value-manager/constant/validator-registry.ts +++ b/apps/web/src/common/modules/widgets/_widget-field-value-manager/constant/validator-registry.ts @@ -50,11 +50,22 @@ export const widgetValidatorRegistry: WidgetValidatorRegistry = { } return !!fieldValue.data; }, - formatRules: (fieldValue: FormatRulesValue, widgetConfig) => { + formatRules: (fieldValue: FormatRulesValue, widgetConfig, allValueMap) => { const _fieldsSchema = integrateFieldsSchema(widgetConfig.requiredFieldsSchema, widgetConfig.optionalFieldsSchema); const formatRulesOptions = (_fieldsSchema.formatRules?.options ?? {}) as FormatRulesOptions; const type = formatRulesOptions.formatRulesType; + if (formatRulesOptions.useField) { + if (formatRulesOptions.dependentField) { + const dependentValue: string|string[]|undefined = allValueMap?.[formatRulesOptions.dependentField]?.value?.data; + if (!dependentValue) return !!fieldValue.field; + if (Array.isArray(dependentValue)) { + return !dependentValue.includes(fieldValue.field); + } + return dependentValue !== fieldValue.field; + } + return !!fieldValue.field; + } if (type === FORMAT_RULE_TYPE.textThreshold) { return fieldValue.rules.every((d) => !!d.text && !!d.color); } @@ -64,9 +75,6 @@ export const widgetValidatorRegistry: WidgetValidatorRegistry = { if (type === FORMAT_RULE_TYPE.textNumberThreshold) { return fieldValue.rules.every((d) => !!d.text && !!d.number && !!d.color); } - if (formatRulesOptions.useField) { - return !!fieldValue.field; - } return true; }, categoryBy: (fieldValue: CategoryByValue, widgetConfig) => { diff --git a/apps/web/src/common/modules/widgets/_widget-field-value-manager/index.ts b/apps/web/src/common/modules/widgets/_widget-field-value-manager/index.ts index d88a61b20c..912f729007 100644 --- a/apps/web/src/common/modules/widgets/_widget-field-value-manager/index.ts +++ b/apps/web/src/common/modules/widgets/_widget-field-value-manager/index.ts @@ -48,7 +48,6 @@ export default class WidgetFieldValueManager { dataTable: PublicDataTableModel|PrivateDataTableModel, originData: WidgetFieldValueMap, ) { - console.debug('WidgetFieldValueManager.constructor()', widgetConfig, dataTable, originData); this.widgetConfig = widgetConfig; this.dataTable = dataTable; this.widgetInvalid = !dataTable; diff --git a/apps/web/src/common/modules/widgets/_widget-fields/format-rules/WidgetFieldFormatRules.vue b/apps/web/src/common/modules/widgets/_widget-fields/format-rules/WidgetFieldFormatRules.vue index f5cade9d4c..3e7b43476b 100644 --- a/apps/web/src/common/modules/widgets/_widget-fields/format-rules/WidgetFieldFormatRules.vue +++ b/apps/web/src/common/modules/widgets/_widget-fields/format-rules/WidgetFieldFormatRules.vue @@ -38,6 +38,19 @@ const state = reactive({ fieldValue: computed(() => props.fieldManager.data[FIELD_KEY].value), type: computed(() => props.widgetFieldSchema?.options?.formatRulesType as FormatRulesType), invalid: computed(() => !validator(state.fieldValue, props.widgetConfig)), + fieldInvalid: computed(() => { + if (!props.widgetFieldSchema?.options?.useField) return false; + if (state.fieldValue.field === undefined) return true; + const dependentField = props.widgetFieldSchema?.options?.dependentField; + const dependentValue: string|string[]|undefined = props.fieldManager.data[dependentField]?.value?.data; + if (dependentField && dependentValue) { + if (Array.isArray(dependentValue)) { + return dependentValue.includes(state.fieldValue.field); + } + return dependentValue === state.fieldValue.field; + } + return false; + }), selectedField: computed(() => { if (props.widgetFieldSchema?.options?.useField) { return state.fieldValue.field; @@ -98,7 +111,7 @@ const handleUpdateField = (val: string) => { diff --git a/apps/web/src/common/modules/widgets/_widget-fields/format-rules/type.ts b/apps/web/src/common/modules/widgets/_widget-fields/format-rules/type.ts index 5d3e827c27..d614401d81 100644 --- a/apps/web/src/common/modules/widgets/_widget-fields/format-rules/type.ts +++ b/apps/web/src/common/modules/widgets/_widget-fields/format-rules/type.ts @@ -16,6 +16,7 @@ export interface FormatRulesValue { export interface FormatRulesOptions { useField?: boolean; dataTarget?: FieldDataTargetType; + dependentField?: string; // groupBy field, xAxis field, yAxis field.. etc. formatRulesType: FormatRulesType; description?: string; baseColor?: string; diff --git a/apps/web/src/common/modules/widgets/_widgets/color-coded-heatmap/widget-config.ts b/apps/web/src/common/modules/widgets/_widgets/color-coded-heatmap/widget-config.ts index 5bd494a74d..7c862a2380 100644 --- a/apps/web/src/common/modules/widgets/_widgets/color-coded-heatmap/widget-config.ts +++ b/apps/web/src/common/modules/widgets/_widgets/color-coded-heatmap/widget-config.ts @@ -26,6 +26,7 @@ const colorCodedHeatmap: WidgetConfig = { options: { dataTarget: 'labels_info', useField: true, + dependentField: 'groupBy', formatRulesType: FORMAT_RULE_TYPE.textThreshold, description: 'COMMON.WIDGETS.ADVANCED_FORMAT_RULES.COLOR_CODED_HEATMAP_DESC', },