@@ -305,16 +305,6 @@ const onBlur = (): void => {
}
}
-.condition {
- display: flex;
- flex-wrap: nowrap;
- align-items: flex-end;
-}
-
-.observer {
- width: 100%;
-}
-
.status {
align-self: flex-start;
padding-top: 28px;
@@ -324,39 +314,6 @@ const onBlur = (): void => {
padding-left: var(--spacing-4xs);
}
-.select {
- flex-shrink: 0;
- flex-grow: 0;
- flex-basis: 160px;
- --input-border-radius: 0;
- --input-border-right-color: transparent;
-}
-
-.input {
- flex-shrink: 0;
- flex-basis: 160px;
- flex-grow: 1;
-}
-
-.inputLeft {
- --input-border-top-right-radius: 0;
- --input-border-bottom-right-radius: 0;
- --input-border-right-color: transparent;
-}
-
-.inputRight {
- --input-border-top-left-radius: 0;
- --input-border-bottom-left-radius: 0;
-}
-
-.hideRightInput {
- .select {
- --input-border-top-right-radius: var(--border-radius-base);
- --input-border-bottom-right-radius: var(--border-radius-base);
- --input-border-right-color: var(--input-border-color-base);
- }
-}
-
.remove {
position: absolute;
left: 0;
@@ -364,91 +321,4 @@ const onBlur = (): void => {
opacity: 0;
transition: opacity 100ms ease-in;
}
-
-.medium {
- flex-wrap: wrap;
-
- .select {
- --input-border-top-right-radius: var(--border-radius-base);
- --input-border-bottom-right-radius: 0;
- --input-border-bottom-color: transparent;
- --input-border-right-color: var(--input-border-color-base);
- }
-
- .inputLeft {
- --input-border-top-right-radius: 0;
- --input-border-bottom-left-radius: 0;
- --input-border-right-color: transparent;
- --input-border-bottom-color: transparent;
- }
-
- .inputRight {
- flex-basis: 340px;
- flex-shrink: 1;
- --input-border-top-right-radius: 0;
- --input-border-bottom-left-radius: var(--border-radius-base);
- }
-
- &.hideRightInput {
- .select {
- --input-border-bottom-color: var(--input-border-color-base);
- --input-border-top-left-radius: 0;
- --input-border-bottom-left-radius: 0;
- --input-border-top-right-radius: var(--border-radius-base);
- --input-border-bottom-right-radius: var(--border-radius-base);
- }
-
- .inputLeft {
- --input-border-top-right-radius: 0;
- --input-border-bottom-left-radius: var(--border-radius-base);
- --input-border-bottom-right-radius: 0;
- --input-border-bottom-color: var(--input-border-color-base);
- }
- }
-}
-
-.stacked {
- display: block;
-
- .select {
- width: 100%;
- --input-border-right-color: var(--input-border-color-base);
- --input-border-bottom-color: transparent;
- --input-border-radius: 0;
- }
-
- .inputLeft {
- --input-border-right-color: var(--input-border-color-base);
- --input-border-bottom-color: transparent;
- --input-border-top-left-radius: var(--border-radius-base);
- --input-border-top-right-radius: var(--border-radius-base);
- --input-border-bottom-left-radius: 0;
- --input-border-bottom-right-radius: 0;
- }
-
- .inputRight {
- --input-border-top-left-radius: 0;
- --input-border-top-right-radius: 0;
- --input-border-bottom-left-radius: var(--border-radius-base);
- --input-border-bottom-right-radius: var(--border-radius-base);
- }
-
- &.hideRightInput {
- .select {
- --input-border-bottom-color: var(--input-border-color-base);
- --input-border-top-left-radius: 0;
- --input-border-top-right-radius: 0;
- --input-border-bottom-left-radius: var(--border-radius-base);
- --input-border-bottom-right-radius: var(--border-radius-base);
- }
-
- .inputLeft {
- --input-border-top-left-radius: var(--border-radius-base);
- --input-border-top-right-radius: var(--border-radius-base);
- --input-border-bottom-left-radius: 0;
- --input-border-bottom-right-radius: 0;
- --input-border-bottom-color: transparent;
- }
- }
-}
diff --git a/packages/editor-ui/src/components/FilterConditions/FilterConditions.vue b/packages/editor-ui/src/components/FilterConditions/FilterConditions.vue
index de993a9f36130..698aff50c0611 100644
--- a/packages/editor-ui/src/components/FilterConditions/FilterConditions.vue
+++ b/packages/editor-ui/src/components/FilterConditions/FilterConditions.vue
@@ -138,6 +138,7 @@ function getIssues(index: number): string[] {
:underline="true"
:show-options="true"
:show-expression-selector="false"
+ size="small"
color="text-dark"
>
diff --git a/packages/editor-ui/src/components/FilterConditions/constants.ts b/packages/editor-ui/src/components/FilterConditions/constants.ts
index 59d65975298a2..b5b6e16c6b872 100644
--- a/packages/editor-ui/src/components/FilterConditions/constants.ts
+++ b/packages/editor-ui/src/components/FilterConditions/constants.ts
@@ -247,37 +247,37 @@ export const DEFAULT_OPERATOR_VALUE: FilterConditionValue['operator'] =
export const OPERATOR_GROUPS: FilterOperatorGroup[] = [
{
id: 'string',
- name: 'filter.operatorGroup.string',
+ name: 'type.string',
icon: 'font',
children: OPERATORS.filter((operator) => operator.type === 'string'),
},
{
id: 'number',
- name: 'filter.operatorGroup.number',
+ name: 'type.number',
icon: 'hashtag',
children: OPERATORS.filter((operator) => operator.type === 'number'),
},
{
id: 'dateTime',
- name: 'filter.operatorGroup.date',
+ name: 'type.dateTime',
icon: 'calendar',
children: OPERATORS.filter((operator) => operator.type === 'dateTime'),
},
{
id: 'boolean',
- name: 'filter.operatorGroup.boolean',
+ name: 'type.boolean',
icon: 'check-square',
children: OPERATORS.filter((operator) => operator.type === 'boolean'),
},
{
id: 'array',
- name: 'filter.operatorGroup.array',
+ name: 'type.array',
icon: 'list',
children: OPERATORS.filter((operator) => operator.type === 'array'),
},
{
id: 'object',
- name: 'filter.operatorGroup.object',
+ name: 'type.object',
icon: 'cube',
children: OPERATORS.filter((operator) => operator.type === 'object'),
},
diff --git a/packages/editor-ui/src/components/FixedCollectionParameter.vue b/packages/editor-ui/src/components/FixedCollectionParameter.vue
index 764516e95268f..a5d4f7b14ebb9 100644
--- a/packages/editor-ui/src/components/FixedCollectionParameter.vue
+++ b/packages/editor-ui/src/components/FixedCollectionParameter.vue
@@ -185,7 +185,6 @@ export default defineComponent({
multipleValues(): boolean {
return !!this.parameter.typeOptions?.multipleValues;
},
-
parameterOptions(): INodePropertyCollection[] {
if (this.multipleValues && isINodePropertyCollectionList(this.parameter.options)) {
return this.parameter.options;
diff --git a/packages/editor-ui/src/components/InlineExpressionEditor/InlineExpressionEditorInput.vue b/packages/editor-ui/src/components/InlineExpressionEditor/InlineExpressionEditorInput.vue
index d436f60954a0f..6e31365b8cf65 100644
--- a/packages/editor-ui/src/components/InlineExpressionEditor/InlineExpressionEditorInput.vue
+++ b/packages/editor-ui/src/components/InlineExpressionEditor/InlineExpressionEditorInput.vue
@@ -35,9 +35,9 @@ export default defineComponent({
type: Boolean,
default: false,
},
- isSingleLine: {
- type: Boolean,
- default: false,
+ rows: {
+ type: Number,
+ default: 5,
},
path: {
type: String,
@@ -92,7 +92,7 @@ export default defineComponent({
mounted() {
const extensions = [
n8nLang(),
- inputTheme({ isSingleLine: this.isSingleLine }),
+ inputTheme({ rows: this.rows }),
Prec.highest(
keymap.of([
{ key: 'Tab', run: acceptCompletion },
diff --git a/packages/editor-ui/src/components/InlineExpressionEditor/theme.ts b/packages/editor-ui/src/components/InlineExpressionEditor/theme.ts
index f6dd6aed2640d..7e85f0cb213a9 100644
--- a/packages/editor-ui/src/components/InlineExpressionEditor/theme.ts
+++ b/packages/editor-ui/src/components/InlineExpressionEditor/theme.ts
@@ -15,11 +15,12 @@ const commonThemeProps = {
},
};
-export const inputTheme = ({ isSingleLine } = { isSingleLine: false }) => {
+export const inputTheme = ({ rows } = { rows: 5 }) => {
+ const maxHeight = Math.max(rows * 22 + 8);
const theme = EditorView.theme({
...commonThemeProps,
'&': {
- maxHeight: isSingleLine ? '30px' : '112px',
+ maxHeight: `${maxHeight}px`,
minHeight: '30px',
width: '100%',
fontSize: 'var(--font-size-2xs)',
diff --git a/packages/editor-ui/src/components/InputTriple/InputTriple.vue b/packages/editor-ui/src/components/InputTriple/InputTriple.vue
new file mode 100644
index 0000000000000..b3a907416de89
--- /dev/null
+++ b/packages/editor-ui/src/components/InputTriple/InputTriple.vue
@@ -0,0 +1,163 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/editor-ui/src/components/InputTriple/__tests__/InputTriple.test.ts b/packages/editor-ui/src/components/InputTriple/__tests__/InputTriple.test.ts
new file mode 100644
index 0000000000000..a29373ec25583
--- /dev/null
+++ b/packages/editor-ui/src/components/InputTriple/__tests__/InputTriple.test.ts
@@ -0,0 +1,38 @@
+import { createComponentRenderer } from '@/__tests__/render';
+import InputTriple from '../InputTriple.vue';
+
+const renderComponent = createComponentRenderer(InputTriple);
+
+describe('InputTriple.vue', () => {
+ afterEach(() => {
+ vi.clearAllMocks();
+ });
+
+ it('renders layout correctly', async () => {
+ const { container } = renderComponent({
+ props: { middleWidth: '200px' },
+ slots: {
+ left: '
left
',
+ middle: '
middle
',
+ right: '
right
',
+ },
+ });
+
+ expect(container.querySelector('.triple')).toBeInTheDocument();
+ expect(container.querySelectorAll('.item')).toHaveLength(3);
+ expect(container.querySelector('.middle')).toHaveStyle('flex-basis: 200px');
+ });
+
+ it('does not render missing slots', async () => {
+ const { container } = renderComponent({
+ props: { middleWidth: '200px' },
+ slots: {
+ left: '
left
',
+ middle: '
middle
',
+ },
+ });
+
+ expect(container.querySelector('.triple')).toBeInTheDocument();
+ expect(container.querySelectorAll('.item')).toHaveLength(2);
+ });
+});
diff --git a/packages/editor-ui/src/components/ParameterInput.vue b/packages/editor-ui/src/components/ParameterInput.vue
index 54f36b073821e..b22139753d85c 100644
--- a/packages/editor-ui/src/components/ParameterInput.vue
+++ b/packages/editor-ui/src/components/ParameterInput.vue
@@ -46,7 +46,8 @@
:model-value="expressionDisplayValue"
:title="displayTitle"
:is-read-only="isReadOnly"
- :is-single-line="isSingleLine"
+ :rows="rows"
+ :is-assignment="isAssignment"
:path="path"
:additional-expression-data="additionalExpressionData"
:class="{ 'ph-no-capture': shouldRedactValue }"
@@ -549,7 +550,11 @@ export default defineComponent({
isReadOnly: {
type: Boolean,
},
- isSingleLine: {
+ rows: {
+ type: Number,
+ default: 5,
+ },
+ isAssignment: {
type: Boolean,
},
parameter: {
@@ -1314,7 +1319,11 @@ export default defineComponent({
(!this.modelValue || this.modelValue === '[Object: null]')
) {
this.valueChanged('={{ 0 }}');
- } else if (this.parameter.type === 'number' || this.parameter.type === 'boolean') {
+ } else if (
+ this.parameter.type === 'number' ||
+ this.parameter.type === 'boolean' ||
+ typeof this.modelValue !== 'string'
+ ) {
this.valueChanged(`={{ ${this.modelValue} }}`);
} else {
this.valueChanged(`=${this.modelValue}`);
@@ -1345,7 +1354,6 @@ export default defineComponent({
// Strip the '=' from the beginning
newValue = this.modelValue ? this.modelValue.toString().substring(1) : null;
}
-
this.valueChanged(newValue);
}
} else if (command === 'refreshOptions') {
@@ -1416,6 +1424,7 @@ export default defineComponent({
.droppable {
--input-border-color: var(--color-ndv-droppable-parameter);
+ --input-border-right-color: var(--color-ndv-droppable-parameter);
--input-border-style: dashed;
textarea,
@@ -1427,6 +1436,7 @@ export default defineComponent({
.activeDrop {
--input-border-color: var(--color-success);
+ --input-border-right-color: var(--color-success);
--input-background-color: var(--color-foreground-xlight);
--input-border-style: solid;
diff --git a/packages/editor-ui/src/components/ParameterInputFull.vue b/packages/editor-ui/src/components/ParameterInputFull.vue
index d3a892e069859..370d130eee87f 100644
--- a/packages/editor-ui/src/components/ParameterInputFull.vue
+++ b/packages/editor-ui/src/components/ParameterInputFull.vue
@@ -49,7 +49,8 @@
:model-value="value"
:path="path"
:is-read-only="isReadOnly"
- :is-single-line="isSingleLine"
+ :is-assignment="isAssignment"
+ :rows="rows"
:droppable="droppable"
:active-drop="activeDrop"
:force-show-expression="forceShowExpression"
@@ -140,7 +141,11 @@ export default defineComponent({
type: Boolean,
default: false,
},
- isSingleLine: {
+ rows: {
+ type: Number,
+ default: 5,
+ },
+ isAssignment: {
type: Boolean,
default: false,
},
@@ -387,6 +392,7 @@ export default defineComponent({
position: absolute;
bottom: -22px;
right: 0;
+ z-index: 1;
opacity: 0;
transition: opacity 100ms ease-in;
diff --git a/packages/editor-ui/src/components/ParameterInputList.vue b/packages/editor-ui/src/components/ParameterInputList.vue
index ead05e44f3e17..0822aca9e218a 100644
--- a/packages/editor-ui/src/components/ParameterInputList.vue
+++ b/packages/editor-ui/src/components/ParameterInputList.vue
@@ -117,6 +117,15 @@
:read-only="isReadOnly"
@valueChanged="valueChanged"
/>
+