88a01becfc7c520661e3b2c660d0d773eabdf485
[sdc.git] /
1 /*!
2  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
13  * or implied. See the License for the specific language governing
14  * permissions and limitations under the License.
15  */
16 import React from 'react';
17
18 import i18n from 'nfvo-utils/i18n/i18n.js';
19 import ListEditorView from 'nfvo-components/listEditor/ListEditorView.jsx';
20 import ListEditorItemView from 'nfvo-components/listEditor/ListEditorItemView.jsx';
21 import ListEditorItemViewField from 'nfvo-components/listEditor/ListEditorItemViewField.jsx';
22
23 const ComponentPropType = React.PropTypes.shape({
24         id: React.PropTypes.string,
25         name: React.PropTypes.string,
26         displayName: React.PropTypes.string,
27         description: React.PropTypes.string
28 });
29
30 class SoftwareProductComponentsListView extends React.Component {
31
32         state = {
33                 localFilter: ''
34         };
35
36         static propTypes = {
37                 isReadOnlyMode: React.PropTypes.bool,
38                 componentsList: React.PropTypes.arrayOf(ComponentPropType),
39                 onComponentSelect: React.PropTypes.func
40         };
41
42         render() {
43                 let {componentsList = [], isManual} =  this.props;
44                 return (
45                         <div className=''>
46                                 {
47                                         (componentsList.length > 0 || isManual) && this.renderComponents()
48                                 }
49                         </div>
50                 );
51         }
52
53         renderComponents() {
54                 const {localFilter} = this.state;
55                 const {isManual, onAddComponent, isReadOnlyMode, currentSoftwareProduct: {id: softwareProductId}, componentsList } = this.props;
56                 return (
57                         <ListEditorView
58                                 title={i18n('Virtual Function Components')}
59                                 filterValue={localFilter}
60                                 placeholder={i18n('Filter Components')}
61                                 onFilter={value => this.setState({localFilter: value})}
62                                 isReadOnlyMode={isReadOnlyMode || !!this.filterList().length}
63                                 plusButtonTitle={i18n('Add Component')}
64                                 onAdd={isManual && componentsList.length === 0 ? () => onAddComponent(softwareProductId) : false}
65                                 twoColumns>
66                                 {this.filterList().map(component => this.renderComponentsListItem(component))}
67                         </ListEditorView>
68                 );
69         }
70
71         renderComponentsListItem(component) {
72                 let {id: componentId, name, displayName, description = ''} = component;
73                 let {currentSoftwareProduct: {id, version}, onComponentSelect} = this.props;
74                 return (
75                         <ListEditorItemView
76                                 key={name + Math.floor(Math.random() * (100 - 1) + 1).toString()}
77                                 className='list-editor-item-view'                               
78                                 onSelect={() => onComponentSelect({id, componentId, version})}>
79                                 <ListEditorItemViewField>
80                                         <div className='name'>{displayName}</div>
81                                 </ListEditorItemViewField>
82                                 <ListEditorItemViewField>
83                                         <div className='description'>{description}</div>
84                                 </ListEditorItemViewField>
85                         </ListEditorItemView>
86                 );
87         }
88
89         filterList() {
90                 let {componentsList = []} = this.props;
91
92                 let {localFilter} = this.state;
93                 if (localFilter.trim()) {
94                         const filter = new RegExp(escape(localFilter), 'i');
95                         return componentsList.filter(({displayName = '', description = ''}) => {
96                                 return escape(displayName).match(filter) || escape(description).match(filter);
97                         });
98                 }
99                 else {
100                         return componentsList;
101                 }
102         }
103 }
104
105 export default SoftwareProductComponentsListView;