karavan-space/src/knowledgebase/components/ComponentsTab.tsx (55 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import React from 'react';
import {
Gallery,
PageSection, PageSectionVariants
} from '@patternfly/react-core';
import '../../designer/karavan.css';
import {ComponentCard} from "./ComponentCard";
import {ComponentModal} from "./ComponentModal";
import {Component} from "karavan-core/lib/model/ComponentModels";
import {ComponentApi} from "karavan-core/lib/api/ComponentApi";
interface Props {
dark: boolean,
filter: string,
onRefresh?: () => Promise<void>
}
interface State {
component?: Component;
isModalOpen: boolean;
repository: string,
path: string,
components: Component[],
}
export class ComponentsTab extends React.Component<Props, State> {
public state: State = {
isModalOpen: false,
repository: '',
path: '',
components: [],
};
componentDidMount() {
this.setState({components: ComponentApi.getComponents()})
}
select = (c: Component)=> {
this.setState({component: c, isModalOpen: true})
}
render() {
const component = this.state.component;
const {filter} = this.props;
const components = ComponentApi.getComponents().filter(c => {
return c.component.name.toLowerCase().includes(filter.toLowerCase())
|| c.component.title.toLowerCase().includes(filter.toLowerCase())
|| c.component.description.toLowerCase().includes(filter.toLowerCase())
}).sort((a, b) => (a.component.title?.toLowerCase() > b.component.title?.toLowerCase() ? 1 : -1)) ;
return (
<PageSection variant={this.props.dark ? PageSectionVariants.darker : PageSectionVariants.light} padding={{ default: 'noPadding' }} className="kamelet-section">
<ComponentModal key={component?.component.name + this.state.isModalOpen.toString()}
isOpen={this.state.isModalOpen} component={component}/>
<PageSection isFilled className="kamelets-page" variant={this.props.dark ? PageSectionVariants.darker : PageSectionVariants.light}>
<Gallery hasGutter>
{components.map(c => (
<ComponentCard key={c.component.name} component={c} onClickCard={this.select}/>
))}
</Gallery>
</PageSection>
</PageSection>
);
}
};