diff --git a/org.knime.ui.js/package.json b/org.knime.ui.js/package.json index a35eabf9b..d4842afbf 100644 --- a/org.knime.ui.js/package.json +++ b/org.knime.ui.js/package.json @@ -46,7 +46,7 @@ "@knime/rich-text-editor": "^1.7.11", "@knime/styles": "^1.14.3", "@knime/ui-extension-renderer": "2.3.0", - "@knime/utils": "^1.7.1", + "@knime/utils": "^1.9.1", "@knime/virtual-tree": "^1.6.11", "@open-rpc/client-js": "^1.8.1", "@tiptap/extension-heading": "^2.26.1", diff --git a/org.knime.ui.js/pnpm-lock.yaml b/org.knime.ui.js/pnpm-lock.yaml index 25818e243..c002a1e33 100644 --- a/org.knime.ui.js/pnpm-lock.yaml +++ b/org.knime.ui.js/pnpm-lock.yaml @@ -51,8 +51,8 @@ importers: specifier: 2.3.0 version: 2.3.0(@fontsource/roboto-mono@4.5.10)(@fontsource/roboto@4.5.8)(@popperjs/core@2.11.8)(consola@3.4.2)(focus-trap@7.6.4)(vue@3.5.18(typescript@5.8.3)) '@knime/utils': - specifier: ^1.7.1 - version: 1.7.1(@fontsource/roboto-mono@4.5.10)(@fontsource/roboto@4.5.8)(consola@3.4.2) + specifier: ^1.9.1 + version: 1.9.1(consola@3.4.2) '@knime/virtual-tree': specifier: ^1.6.11 version: 1.6.11(@fontsource/roboto-mono@4.5.10)(@fontsource/roboto@4.5.8)(@popperjs/core@2.11.8)(consola@3.4.2)(focus-trap@7.6.4)(vue@3.5.18(typescript@5.8.3)) @@ -1307,8 +1307,8 @@ packages: peerDependencies: consola: 3.x - '@knime/utils@1.8.0': - resolution: {integrity: sha512-XvOAVfaHQTML8l8mD5phmqsyCPXseLvaPxLB7AjAyMNw7Zd7ZjcwG4ki5Qnw1Z17/Xiy7QrQ3ktNb0u1PwA4jw==} + '@knime/utils@1.9.1': + resolution: {integrity: sha512-JnnudAxop5wziV7/YQEOFShHC08nn1bctYu7m1qbdI+Cr/ZtJlfPSJoDR+pAIUMe10Gg/GXH8kW2/HdFp8iEug==} engines: {node: '>=22 <25'} peerDependencies: consola: 3.x @@ -2799,9 +2799,6 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} - dompurify@3.2.7: - resolution: {integrity: sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==} - dompurify@3.3.0: resolution: {integrity: sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==} @@ -7458,7 +7455,7 @@ snapshots: '@knime/kds-components@0.5.2(@vueuse/core@13.8.0(vue@3.5.18(typescript@5.8.3)))(vue@3.5.18(typescript@5.8.3))': dependencies: '@knime/kds-styles': 0.5.2 - '@knime/utils': 1.8.0(consola@3.4.2) + '@knime/utils': 1.9.1(consola@3.4.2) '@vueuse/core': 13.8.0(vue@3.5.18(typescript@5.8.3)) consola: 3.4.2 vue: 3.5.18(typescript@5.8.3) @@ -7608,12 +7605,12 @@ snapshots: consola: 3.4.2 date-fns: 2.30.0 date-fns-tz: 2.0.0(date-fns@2.30.0) - dompurify: 3.2.7 + dompurify: 3.3.0 transitivePeerDependencies: - '@fontsource/roboto' - '@fontsource/roboto-mono' - '@knime/utils@1.8.0(consola@3.4.2)': + '@knime/utils@1.9.1(consola@3.4.2)': dependencies: consola: 3.4.2 date-fns: 2.30.0 @@ -9210,10 +9207,6 @@ snapshots: dependencies: domelementtype: 2.3.0 - dompurify@3.2.7: - optionalDependencies: - '@types/trusted-types': 2.0.7 - dompurify@3.3.0: optionalDependencies: '@types/trusted-types': 2.0.7 diff --git a/org.knime.ui.js/src/api/custom-types.ts b/org.knime.ui.js/src/api/custom-types.ts index 1a8fc74bc..c83366b1f 100644 --- a/org.knime.ui.js/src/api/custom-types.ts +++ b/org.knime.ui.js/src/api/custom-types.ts @@ -4,9 +4,7 @@ import type { EditableMetadata, MetaNode, NativeNode, - NodeCategory, NodeDescription, - NodeTemplate, PortGroup, PortType, ProjectMetadata, @@ -152,18 +150,6 @@ export interface Schedule { user: string; workflowPath: string; } - -export type ExtendedPortType = PortType & { - typeId: string; - type?: string; - description: string; -}; - -export type NodeTemplateWithExtendedPorts = NodeTemplate & { - inPorts: ExtendedPortType[]; - outPorts: ExtendedPortType[]; -}; - export type WorkflowObject = XY & { id: string; type: "node" | "annotation" | "componentPlaceholder"; @@ -187,10 +173,6 @@ export type ExampleProject = { export type NodeRelation = "PREDECESSORS" | "SUCCESSORS"; -export type NodeCategoryWithExtendedPorts = NodeCategory & { - nodes?: NodeTemplateWithExtendedPorts[]; -}; - export type AncestorInfo = { ancestorItemIds: string[]; itemName: string | null; diff --git a/org.knime.ui.js/src/api/gateway-api/generated-api.ts b/org.knime.ui.js/src/api/gateway-api/generated-api.ts index 5022eb915..696e93456 100644 --- a/org.knime.ui.js/src/api/gateway-api/generated-api.ts +++ b/org.knime.ui.js/src/api/gateway-api/generated-api.ts @@ -1212,6 +1212,118 @@ export interface ComponentPortDescription { } +/** + * ... + * @export + * @interface ComponentSearchItem + */ +export interface ComponentSearchItem { + + /** + * Space item ID of this component + * @type {string} + * @memberof ComponentSearchItem + */ + id: string; + /** + * The name of the component as given by the component creator + * @type {string} + * @memberof ComponentSearchItem + */ + name: string; + /** + * The description of the component as given by the component creator + * @type {string} + * @memberof ComponentSearchItem + */ + description?: string; + /** + * serialised data of component icon + * @type {string} + * @memberof ComponentSearchItem + */ + icon?: string; + /** + * The type (a.k.a. \"kind\") of the component + * @type {string} + * @memberof ComponentSearchItem + */ + type: ComponentSearchItem.TypeEnum; + /** + * The components's input ports. + * @type {Array} + * @memberof ComponentSearchItem + */ + inPorts?: Array; + /** + * The node's output ports. + * @type {Array} + * @memberof ComponentSearchItem + */ + outPorts?: Array; + +} + + +/** + * @export + * @namespace ComponentSearchItem + */ +export namespace ComponentSearchItem { + /** + * @export + * @enum {string} + */ + export enum TypeEnum { + Source = 'Source', + Manipulator = 'Manipulator', + Visualizer = 'Visualizer', + Learner = 'Learner', + Sink = 'Sink', + Other = 'Other' + } +} +/** + * + * @export + * @interface ComponentSearchItemPort + */ +export interface ComponentSearchItemPort { + + /** + * The name of the port as given by the component creator. Not to be confused with the human-readable name of the port _type_. + * @type {string} + * @memberof ComponentSearchItemPort + */ + name?: string; + /** + * The description of the component as given by the component creator. + * @type {string} + * @memberof ComponentSearchItemPort + */ + description?: string; + /** + * The human-readable name of the port type. This is given by the port type implementation. + * @type {string} + * @memberof ComponentSearchItemPort + */ + portTypeName: string; + /** + * Hex string of port type color + * @type {string} + * @memberof ComponentSearchItemPort + */ + color?: string; + /** + * Whether the port is optional + * @type {boolean} + * @memberof ComponentSearchItemPort + */ + optional?: boolean; + +} + + /** * Event that can consist of multiple generic events. * @export @@ -6923,6 +7035,28 @@ const space = function(rpcClient: RPCClient) { return rpcClient.call('SpaceService.renameSpace', { ...defaultParams, ...params }); }, + /** + * Search among components in this provider + * @param {string} [params.query] + * @param {number} [params.limit] + * @param {number} [params.offset] + * @param {*} [params.options] Override http request option. + * @throws {RequiredError} + * @throws {ServiceCallException} If a Gateway service call failed for some reason. + * @throws {LoggedOutException} If a web request could not be authorized because the space provider isn't logged in + * @throws {NetworkException} If a Gateway service call failed due to a network error. + */ + async searchComponents( + params: { query?: string, limit?: number, offset?: number } + ): Promise> { + const defaultParams = { + query: null, + limit: null, + offset: null, + } + + return rpcClient.call('SpaceService.searchComponents', { ...defaultParams, ...params }); + }, } }; diff --git a/org.knime.ui.js/src/components/common/InfiniteLoadingList/InfiniteLoadingList.vue b/org.knime.ui.js/src/components/common/InfiniteLoadingList/InfiniteLoadingList.vue new file mode 100644 index 000000000..4cf277da3 --- /dev/null +++ b/org.knime.ui.js/src/components/common/InfiniteLoadingList/InfiniteLoadingList.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/org.knime.ui.js/src/components/common/NodeList/InfiniteNodeList.vue b/org.knime.ui.js/src/components/common/NodeList/InfiniteNodeList.vue new file mode 100644 index 000000000..cb20bf349 --- /dev/null +++ b/org.knime.ui.js/src/components/common/NodeList/InfiniteNodeList.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/org.knime.ui.js/src/components/common/NodeList/NodeList.vue b/org.knime.ui.js/src/components/common/NodeList/NodeList.vue index dd4136aaf..069843866 100644 --- a/org.knime.ui.js/src/components/common/NodeList/NodeList.vue +++ b/org.knime.ui.js/src/components/common/NodeList/NodeList.vue @@ -5,9 +5,9 @@ import { useActiveElement } from "@vueuse/core"; import { Button, useKeyPressedUntilMouseClick } from "@knime/components"; import CircleArrowIcon from "@knime/styles/img/icons/circle-arrow-right.svg"; -import type { NodeTemplateWithExtendedPorts } from "@/api/custom-types"; import NodeTemplate from "@/components/common/NodeTemplate/NodeTemplate.vue"; import type { NodeRepositoryDisplayModesType } from "@/store/settings"; +import type { NodeTemplateWithExtendedPorts } from "@/util/dataMappers"; const NODES_PER_ROW_ICON_MODE = 3; const NODES_PER_ROW_LIST_MODE = 1; @@ -17,7 +17,7 @@ type Props = { hasMoreNodes?: boolean; displayMode?: NodeRepositoryDisplayModesType; selectedNode?: NodeTemplateWithExtendedPorts | null; - showDescriptionForNode?: NodeTemplateWithExtendedPorts | null; + showDetailsFor?: NodeTemplateWithExtendedPorts | null; highlightFirst?: boolean; }; @@ -35,13 +35,13 @@ const props = withDefaults(defineProps(), { hasMoreNodes: false, displayMode: "icon", selectedNode: null, - showDescriptionForNode: null, + showDetailsFor: null, highlightFirst: false, }); const emit = defineEmits<{ enterKey: [node: NodeTemplateWithExtendedPorts]; - helpKey: [node: NodeTemplateWithExtendedPorts]; + showNodeDetails: [node: NodeTemplateWithExtendedPorts]; showMore: []; "update:selectedNode": [node: NodeTemplateWithExtendedPorts | null]; navReachedTop: [event: NavReachedEvent]; @@ -73,7 +73,7 @@ const nodeTemplateProps = ( isHighlighted: props.selectedNode === null && index === 0 && props.highlightFirst, isSelected: props.selectedNode?.id === node.id, - isDescriptionActive: props.showDescriptionForNode?.id === node.id, + isDescriptionActive: props.showDetailsFor?.id === node.id, displayMode: props.displayMode, }; }; @@ -261,7 +261,7 @@ defineExpose({ focusFirst, focusLast }); :aria-label="`Select node ${node.name}`" :data-index="index" @keydown.enter.stop.prevent="$emit('enterKey', node)" - @keydown.i.stop.prevent="$emit('helpKey', node)" + @keydown.i.stop.prevent="$emit('showNodeDetails', node)" > diff --git a/org.knime.ui.js/src/components/common/NodeTemplate/DraggableNodeTemplate.vue b/org.knime.ui.js/src/components/common/NodeTemplate/DraggableNodeTemplate.vue index e6542ec6b..a832c794a 100644 --- a/org.knime.ui.js/src/components/common/NodeTemplate/DraggableNodeTemplate.vue +++ b/org.knime.ui.js/src/components/common/NodeTemplate/DraggableNodeTemplate.vue @@ -2,11 +2,11 @@ import { ref, useTemplateRef } from "vue"; import { storeToRefs } from "pinia"; -import type { NodeTemplateWithExtendedPorts } from "@/api/custom-types"; import { useAddNodeToWorkflow } from "@/composables/useAddNodeToWorkflow"; import { useDragNodeIntoCanvas } from "@/composables/useDragNodeIntoCanvas"; import { usePanelStore } from "@/store/panel"; import type { NodeRepositoryDisplayModesType } from "@/store/settings"; +import type { NodeTemplateWithExtendedPorts } from "@/util/dataMappers"; import NodeTemplate from "../NodeTemplate/NodeTemplate.vue"; /** @@ -32,7 +32,7 @@ const emit = defineEmits<{ showNodeDescription: []; }>(); -const addNodeToWorkflow = useAddNodeToWorkflow(); +const { addNodeWithAutoPositioning } = useAddNodeToWorkflow(); const panelStore = usePanelStore(); const { isExtensionPanelOpen } = storeToRefs(panelStore); @@ -100,7 +100,7 @@ const onDragEnd = (event: DragEvent) => { :show-floating-help-icon="true" @dragstart="onDragStart" @dragend="onDragEnd" - @dblclick="addNodeToWorkflow(nodeTemplate)" + @dblclick="addNodeWithAutoPositioning(nodeTemplate.nodeFactory!)" @drag="dragNodeIntoCanvas.onDrag" @help-icon-click="emit('showNodeDescription')" /> diff --git a/org.knime.ui.js/src/components/common/NodeTemplate/NodeTemplate.vue b/org.knime.ui.js/src/components/common/NodeTemplate/NodeTemplate.vue index 402d063b8..9065bba54 100644 --- a/org.knime.ui.js/src/components/common/NodeTemplate/NodeTemplate.vue +++ b/org.knime.ui.js/src/components/common/NodeTemplate/NodeTemplate.vue @@ -3,8 +3,8 @@ import { computed, ref } from "vue"; import { NodePreview } from "@knime/components"; -import type { NodeTemplateWithExtendedPorts } from "@/api/custom-types"; import type { NodeRepositoryDisplayModesType } from "@/store/settings"; +import type { NodeTemplateWithExtendedPorts } from "@/util/dataMappers"; import NodeTemplateIconMode from "./NodeTemplateIconMode.vue"; import NodeTemplateListMode from "./NodeTemplateListMode.vue"; @@ -12,7 +12,7 @@ import NodeTemplateListMode from "./NodeTemplateListMode.vue"; /** * Basic NodeTemplate without any drag or insert features. This component should stay reusable. */ -export interface Props { +export type Props = { /** * Additional to the properties of the NodeTemplate from the gateway API, this object * contains the port information (color and kind) which was mapped from the store @@ -23,7 +23,7 @@ export interface Props { isDescriptionActive?: boolean; isHighlighted?: boolean; showFloatingHelpIcon?: boolean; -} +}; const props = withDefaults(defineProps(), { displayMode: "icon", @@ -86,6 +86,7 @@ defineExpose({ getNodePreview }); :in-ports="nodeTemplate.inPorts" :out-ports="nodeTemplate.outPorts" :icon="nodeTemplate.icon" + :is-component="nodeTemplate.component" /> diff --git a/org.knime.ui.js/src/components/common/NodeTemplate/NodeTemplateIconMode.vue b/org.knime.ui.js/src/components/common/NodeTemplate/NodeTemplateIconMode.vue index d783c2e4e..9957380ab 100644 --- a/org.knime.ui.js/src/components/common/NodeTemplate/NodeTemplateIconMode.vue +++ b/org.knime.ui.js/src/components/common/NodeTemplate/NodeTemplateIconMode.vue @@ -3,7 +3,7 @@ import { computed } from "vue"; import ExtensionCommunityIcon from "@knime/styles/img/icons/extension-community.svg"; -import type { NodeTemplateWithExtendedPorts } from "@/api/custom-types"; +import type { NodeTemplateWithExtendedPorts } from "@/util/dataMappers"; import NodeTemplateHelpIcon from "./NodeTemplateHelpIcon.vue"; diff --git a/org.knime.ui.js/src/components/common/NodeTemplate/NodeTemplateListMode.vue b/org.knime.ui.js/src/components/common/NodeTemplate/NodeTemplateListMode.vue index 5eadea16d..97c4c42bb 100644 --- a/org.knime.ui.js/src/components/common/NodeTemplate/NodeTemplateListMode.vue +++ b/org.knime.ui.js/src/components/common/NodeTemplate/NodeTemplateListMode.vue @@ -3,7 +3,7 @@ import { computed } from "vue"; import ExtensionCommunityIcon from "@knime/styles/img/icons/extension-community.svg"; -import type { NodeTemplateWithExtendedPorts } from "@/api/custom-types"; +import type { NodeTemplateWithExtendedPorts } from "@/util/dataMappers"; import NodeTemplateHelpIcon from "./NodeTemplateHelpIcon.vue"; diff --git a/org.knime.ui.js/src/components/common/skeleton-loader/SkeletonNodes.vue b/org.knime.ui.js/src/components/common/skeleton-loader/SkeletonNodes.vue index 825bcdd8d..d7cf353cf 100644 --- a/org.knime.ui.js/src/components/common/skeleton-loader/SkeletonNodes.vue +++ b/org.knime.ui.js/src/components/common/skeleton-loader/SkeletonNodes.vue @@ -3,7 +3,7 @@ import SkeletonItem from "./SkeletonItem.vue"; type Props = { numberOfNodes?: number; - displayMode?: string; + displayMode?: "icon" | "list"; }; withDefaults(defineProps(), { diff --git a/org.knime.ui.js/src/components/componentSearch/ComponentSearchResults.vue b/org.knime.ui.js/src/components/componentSearch/ComponentSearchResults.vue new file mode 100644 index 000000000..eb0e10f84 --- /dev/null +++ b/org.knime.ui.js/src/components/componentSearch/ComponentSearchResults.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/org.knime.ui.js/src/components/kai/chat/message/SuggestedNodes.vue b/org.knime.ui.js/src/components/kai/chat/message/SuggestedNodes.vue index 8500506f6..626436160 100644 --- a/org.knime.ui.js/src/components/kai/chat/message/SuggestedNodes.vue +++ b/org.knime.ui.js/src/components/kai/chat/message/SuggestedNodes.vue @@ -3,10 +3,10 @@ import { computed, ref } from "vue"; import NodeIcon from "@knime/styles/img/icons/node.svg"; -import type { NodeTemplateWithExtendedPorts } from "@/api/custom-types"; import NodeList from "@/components/common/NodeList/NodeList.vue"; import DraggableNodeTemplate from "@/components/common/NodeTemplate/DraggableNodeTemplate.vue"; import { useAddNodeToWorkflow } from "@/composables/useAddNodeToWorkflow"; +import type { NodeTemplateWithExtendedPorts } from "@/util/dataMappers"; import { useKaiExtensionPanel } from "../../useKaiExtensionPanel"; type Props = { @@ -16,7 +16,7 @@ type Props = { const props = defineProps(); const { toggleNodeDescription } = useKaiExtensionPanel(); -const addNodeToWorkflow = useAddNodeToWorkflow(); +const { addNodeWithAutoPositioning } = useAddNodeToWorkflow(); const hasNodeTemplates = computed(() => props.nodeTemplates.length > 0); @@ -24,7 +24,7 @@ const selectedNode = ref(null); const handleEnterKey = (node: NodeTemplateWithExtendedPorts) => { if (node.nodeFactory) { - addNodeToWorkflow({ nodeFactory: node.nodeFactory }); + addNodeWithAutoPositioning(node.nodeFactory); } }; diff --git a/org.knime.ui.js/src/components/kai/chat/message/useNodeTemplates.ts b/org.knime.ui.js/src/components/kai/chat/message/useNodeTemplates.ts index 56eb7fbcb..3552d93b4 100644 --- a/org.knime.ui.js/src/components/kai/chat/message/useNodeTemplates.ts +++ b/org.knime.ui.js/src/components/kai/chat/message/useNodeTemplates.ts @@ -1,8 +1,8 @@ import { type Ref, ref, watch } from "vue"; -import type { NodeTemplateWithExtendedPorts } from "@/api/custom-types"; import { KaiMessage } from "@/api/gateway-api/generated-api"; import { useNodeTemplatesStore } from "@/store/nodeTemplates/nodeTemplates"; +import type { NodeTemplateWithExtendedPorts } from "@/util/dataMappers"; import type { ExtensionWithNodes, Extensions, diff --git a/org.knime.ui.js/src/components/nodeDescription/NodeDescription.vue b/org.knime.ui.js/src/components/nodeDescription/NodeDescription.vue index 917abf4db..4b01dcadc 100644 --- a/org.knime.ui.js/src/components/nodeDescription/NodeDescription.vue +++ b/org.knime.ui.js/src/components/nodeDescription/NodeDescription.vue @@ -12,7 +12,7 @@ import { useNodeDescriptionStore } from "@/store/nodeDescription/nodeDescription import type { ComponentNodeDescriptionWithExtendedPorts, NativeNodeDescriptionWithExtendedPorts, -} from "@/util/portDataMapper"; +} from "@/util/dataMappers"; import SidebarPanelLayout from "../common/side-panel/SidebarPanelLayout.vue"; import SidebarPanelScrollContainer from "../common/side-panel/SidebarPanelScrollContainer.vue"; diff --git a/org.knime.ui.js/src/components/nodeDescription/NodeDescriptionContent.vue b/org.knime.ui.js/src/components/nodeDescription/NodeDescriptionContent.vue index ba7431b3d..7912d07a3 100644 --- a/org.knime.ui.js/src/components/nodeDescription/NodeDescriptionContent.vue +++ b/org.knime.ui.js/src/components/nodeDescription/NodeDescriptionContent.vue @@ -8,7 +8,7 @@ import MetadataDescription from "@/components/workflowMetadata/MetadataDescripti import type { ComponentNodeDescriptionWithExtendedPorts, NativeNodeDescriptionWithExtendedPorts, -} from "@/util/portDataMapper"; +} from "@/util/dataMappers"; type Props = { descriptionData: diff --git a/org.knime.ui.js/src/components/nodeDescription/NodeDescriptionExtensionInfo.vue b/org.knime.ui.js/src/components/nodeDescription/NodeDescriptionExtensionInfo.vue index b6bc68a94..f1d75cc86 100644 --- a/org.knime.ui.js/src/components/nodeDescription/NodeDescriptionExtensionInfo.vue +++ b/org.knime.ui.js/src/components/nodeDescription/NodeDescriptionExtensionInfo.vue @@ -2,7 +2,7 @@ import KNIMETriangleIcon from "@knime/styles/img/KNIME_Triangle.svg"; import ExtensionIcon from "@knime/styles/img/icons/extension.svg"; -import type { NativeNodeDescriptionWithExtendedPorts } from "@/util/portDataMapper"; +import type { NativeNodeDescriptionWithExtendedPorts } from "@/util/dataMappers"; type Props = { descriptionData: NativeNodeDescriptionWithExtendedPorts; diff --git a/org.knime.ui.js/src/components/nodeRepository/NodeRepository.vue b/org.knime.ui.js/src/components/nodeRepository/NodeRepository.vue index 1c51c6306..521d619a6 100644 --- a/org.knime.ui.js/src/components/nodeRepository/NodeRepository.vue +++ b/org.knime.ui.js/src/components/nodeRepository/NodeRepository.vue @@ -1,19 +1,20 @@