ui filter component for catalog filter
Issue-ID: SDC-1041
Change-Id: I29ad16dc6df7b35958d2670dcf363a9ce99ee5d7
Signed-off-by: svishnev <shlomo-stanisla.vishnevetskiy@amdocs.com>
diff --git a/openecomp-ui/resources/scss/_components.scss b/openecomp-ui/resources/scss/_components.scss
index 13af598..5579762 100644
--- a/openecomp-ui/resources/scss/_components.scss
+++ b/openecomp-ui/resources/scss/_components.scss
@@ -21,6 +21,7 @@
@import "components/commitModal";
@import "components/userNotifications";
@import "components/overlay";
+@import "components/accordion";
%noselect {
-webkit-touch-callout: none;
diff --git a/openecomp-ui/resources/scss/components/_accordion.scss b/openecomp-ui/resources/scss/components/_accordion.scss
new file mode 100644
index 0000000..c96bc71
--- /dev/null
+++ b/openecomp-ui/resources/scss/components/_accordion.scss
@@ -0,0 +1,28 @@
+.accordion {
+ display: flex;
+ flex-direction: column;
+ .accordion-header {
+ display: flex;
+ flex-direction: row;
+ cursor: pointer;
+ margin-bottom: 10px;
+ .svg-icon-wrapper {
+ margin-right: 20px;
+ transition: transform .4s;
+ &.down {
+ transform: rotate(180deg);
+ }
+ }
+ }
+ .accordion-body {
+ padding-left: 10px;
+ opacity: 0;
+ overflow-y: hidden;
+ max-height: 0;
+ transition: max-height .3s cubic-bezier(0, 1.18, 1, 1), opacity 0.33s linear;
+ &.open {
+ opacity: 1;
+ max-height: 100%;
+ }
+ }
+}
\ No newline at end of file
diff --git a/openecomp-ui/resources/scss/modules/_onboardingCatalog.scss b/openecomp-ui/resources/scss/modules/_onboardingCatalog.scss
index 1201d4a..39f7636 100644
--- a/openecomp-ui/resources/scss/modules/_onboardingCatalog.scss
+++ b/openecomp-ui/resources/scss/modules/_onboardingCatalog.scss
@@ -4,8 +4,13 @@
background-color: $background-gray;
overflow: hidden;
height: 100%;
- @import "onboardingCatalog/onboardHeader";
- @import "onboardingCatalog/catalogHeader";
+ display: flex;
+ @import "onboardingCatalog/catalogFilter.scss";
+ .catalog-parts {
+ width: 100%;
+ @import "onboardingCatalog/onboardHeader";
+ @import "onboardingCatalog/catalogHeader";
+ }
@import "onboardingCatalog/vendorPageHeader";
@import "onboardingCatalog/catalogList";
@import "onboardingCatalog/vspOverlay";
diff --git a/openecomp-ui/resources/scss/modules/onboardingCatalog/_catalogFilter.scss b/openecomp-ui/resources/scss/modules/onboardingCatalog/_catalogFilter.scss
new file mode 100644
index 0000000..84657b1
--- /dev/null
+++ b/openecomp-ui/resources/scss/modules/onboardingCatalog/_catalogFilter.scss
@@ -0,0 +1,11 @@
+.catalog-filter {
+ width: 242px;
+ overflow-y: auto;
+ height: 100%;
+ box-shadow: 1px 0px 4px 0px rgba(24, 24, 25, 0.17);
+ background-color: $white;
+ padding: 12px 18px;
+ .form-group {
+ margin-bottom: 10px;
+ }
+}
\ No newline at end of file
diff --git a/openecomp-ui/src/nfvo-components/accordion/Accordion.jsx b/openecomp-ui/src/nfvo-components/accordion/Accordion.jsx
new file mode 100644
index 0000000..ac19072
--- /dev/null
+++ b/openecomp-ui/src/nfvo-components/accordion/Accordion.jsx
@@ -0,0 +1,52 @@
+/*
+ * Copyright © 2016-2018 European Support Limited
+ *
+ * Licensed 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 SVGIcon from 'sdc-ui/lib/react/SVGIcon.js';
+import PropTypes from 'prop-types';
+
+
+class Accordion extends React.Component {
+
+ static propTypes = {
+ title: PropTypes.string,
+ children: PropTypes.node
+ }
+
+ constructor(props) {
+ super(props);
+ this.state = {
+ open: false
+ };
+ }
+ render() {
+ const {children, title} = this.props;
+ const {open} = this.state;
+ return (
+ <div className='accordion'>
+ <div onClick={()=>this.setState({open: !open})} className='accordion-header'>
+ <SVGIcon name='chevronUp' iconClassName={open ? 'down' : ''}/>
+ <div className='title'>{title}</div>
+ </div>
+ <div className={`accordion-body ${open ? 'open' : ''}`}>
+ {children}
+ </div>
+ </div>
+ );
+ }
+}
+
+export default Accordion;
\ No newline at end of file
diff --git a/openecomp-ui/src/sdc-app/onboarding/onboard/OnboardReducer.js b/openecomp-ui/src/sdc-app/onboarding/onboard/OnboardReducer.js
index 7214501..b2e7b04 100644
--- a/openecomp-ui/src/sdc-app/onboarding/onboard/OnboardReducer.js
+++ b/openecomp-ui/src/sdc-app/onboarding/onboard/OnboardReducer.js
@@ -16,9 +16,11 @@
import {actionTypes, tabsMapping} from './OnboardConstants.js';
import {combineReducers} from 'redux';
import onboardingCatalogReducer from './onboardingCatalog/OnboardingCatalogReducer.js';
+import filterReducer from './filter/FilterReducer.js';
const onboardReducer = combineReducers({
onboardingCatalog: onboardingCatalogReducer,
+ filter: filterReducer,
activeTab: (state = tabsMapping.WORKSPACE, action) => action.type === actionTypes.CHANGE_ACTIVE_ONBOARD_TAB ? action.activeTab : state,
searchValue: (state = '', action) => action.type === actionTypes.CHANGE_SEARCH_VALUE ? action.searchValue : state
});
diff --git a/openecomp-ui/src/sdc-app/onboarding/onboard/OnboardView.jsx b/openecomp-ui/src/sdc-app/onboarding/onboard/OnboardView.jsx
index f31ce4c..f64c1e5 100644
--- a/openecomp-ui/src/sdc-app/onboarding/onboard/OnboardView.jsx
+++ b/openecomp-ui/src/sdc-app/onboarding/onboard/OnboardView.jsx
@@ -1,17 +1,17 @@
-/*!
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+/*
+ * Copyright © 2016-2018 European Support Limited
*
* Licensed 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
- *
+ *
+ * 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.
+ * 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 PropTypes from 'prop-types';
@@ -24,6 +24,7 @@
import objectValues from 'lodash/values.js';
import {catalogItemTypes} from './onboardingCatalog/OnboardingCatalogConstants.js';
import NotificationsView from 'sdc-app/onboarding/userNotifications/NotificationsView.jsx';
+import Filter from 'sdc-app/onboarding/onboard/filter/Filter.jsx';
const OnboardHeaderTabs = ({onTabClick, activeTab}) => (
<div className='onboard-header-tabs'>
@@ -88,8 +89,11 @@
let {activeTab, onTabClick, onSearch, searchValue} = this.props;
return (
<div className='catalog-view'>
- <OnboardHeader activeTab={activeTab} onTabClick={onTabClick} searchValue={searchValue} onSearch={value => onSearch(value)}/>
- {this.renderViewByTab(activeTab)}
+ <Filter/>
+ <div className='catalog-parts'>
+ <OnboardHeader activeTab={activeTab} onTabClick={onTabClick} searchValue={searchValue} onSearch={value => onSearch(value)}/>
+ {this.renderViewByTab(activeTab)}
+ </div>
</div>
);
}
diff --git a/openecomp-ui/src/sdc-app/onboarding/onboard/filter/Filter.jsx b/openecomp-ui/src/sdc-app/onboarding/onboard/filter/Filter.jsx
new file mode 100644
index 0000000..bf1927d
--- /dev/null
+++ b/openecomp-ui/src/sdc-app/onboarding/onboard/filter/Filter.jsx
@@ -0,0 +1,74 @@
+/*
+ * Copyright © 2016-2018 European Support Limited
+ *
+ * Licensed 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 {connect} from 'react-redux';
+import React from 'react';
+import PropTypes from 'prop-types';
+import i18n from 'nfvo-utils/i18n/i18n.js';
+import Input from 'nfvo-components/input/validation/Input.jsx';
+import Accordion from 'nfvo-components/accordion/Accordion.jsx';
+import {actionTypes} from './FilterConstants.js';
+import featureToggle from 'sdc-app/features/featureToggle.js';
+
+const mapStateToProps = ({onboard: {filter}}) => {
+ return {
+ data: filter
+ };
+};
+
+const mapActionsToProps = (dispatch) => {
+ return {
+ onDataChanged: (deltaData) =>
+ dispatch({
+ type: actionTypes.FILTER_DATA_CHANGED,
+ deltaData
+ })
+ };
+};
+
+const Filter = ({onDataChanged, data: {entityTypeVsp, entityTypeVlm, roleOwner, roleContributor, roleViewer,
+ procedureNetwork, procedureManual, recentlyUpdated}}) => (
+ <div className='catalog-filter'>
+ <Input label={i18n('Recently Updated')} type='checkbox' checked={recentlyUpdated}
+ onChange={recentlyUpdated => onDataChanged({recentlyUpdated})} data-test-id='filter-recently-updated' value='' />
+
+ <Accordion title={i18n('ENTITY TYPE')}>
+ <Input label={i18n('VSP')} type='checkbox' checked={entityTypeVsp} onChange={entityTypeVsp => onDataChanged({entityTypeVsp})} data-test-id='filter-type-vsp' value='' />
+ <Input label={i18n('VLM')} type='checkbox' checked={entityTypeVlm} onChange={entityTypeVlm => onDataChanged({entityTypeVlm})} data-test-id='filter-type-vlm' value='' />
+ </Accordion>
+
+ <Accordion title={i18n('ROLE')}>
+ <Input label={i18n('Owner')} type='checkbox' checked={roleOwner} onChange={roleOwner => onDataChanged({roleOwner})} data-test-id='filter-role-owner' value='' />
+ <Input label={i18n('Contributer')} type='checkbox' checked={roleContributor}
+ onChange={roleContributor => onDataChanged({roleContributor})} data-test-id='filter-role-contributor' value='' />
+ <Input label={i18n('Viewer')} type='checkbox' checked={roleViewer} onChange={roleViewer => onDataChanged({roleViewer})} data-test-id='filter-role-viewr' value='' />
+ </Accordion>
+
+ <Accordion title={i18n('ONBOARDING PROCEDURE')}>
+ <Input label={i18n('Network Package')} type='checkbox' checked={procedureNetwork}
+ onChange={procedureNetwork => onDataChanged({procedureNetwork})} data-test-id='filter-procedure-network' value='' />
+ <Input label={i18n('Manual')} type='checkbox' checked={procedureManual}
+ onChange={procedureManual => onDataChanged({procedureManual})} data-test-id='filter-procedure-manual' value='' />
+ </Accordion>
+ </div>
+);
+
+Filter.PropTypes = {
+ onDataChanged: PropTypes.func,
+ data: PropTypes.object
+};
+
+export default featureToggle('ONBOARDING_FILTER')(connect(mapStateToProps, mapActionsToProps)(Filter));
diff --git a/openecomp-ui/src/sdc-app/onboarding/onboard/filter/FilterConstants.js b/openecomp-ui/src/sdc-app/onboarding/onboard/filter/FilterConstants.js
new file mode 100644
index 0000000..36a415c
--- /dev/null
+++ b/openecomp-ui/src/sdc-app/onboarding/onboard/filter/FilterConstants.js
@@ -0,0 +1,21 @@
+/*
+ * Copyright © 2016-2018 European Support Limited
+ *
+ * Licensed 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 keyMirror from 'nfvo-utils/KeyMirror.js';
+
+export const actionTypes = keyMirror({
+ FILTER_DATA_CHANGED: null
+});
diff --git a/openecomp-ui/src/sdc-app/onboarding/onboard/filter/FilterReducer.js b/openecomp-ui/src/sdc-app/onboarding/onboard/filter/FilterReducer.js
new file mode 100644
index 0000000..963226c
--- /dev/null
+++ b/openecomp-ui/src/sdc-app/onboarding/onboard/filter/FilterReducer.js
@@ -0,0 +1,28 @@
+/*
+ * Copyright © 2016-2018 European Support Limited
+ *
+ * Licensed 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 {actionTypes} from './FilterConstants.js';
+
+export default (state = {}, action) => {
+ switch (action.type) {
+ case actionTypes.FILTER_DATA_CHANGED:
+ return {
+ ...state,
+ ...action.deltaData
+ };
+ default:
+ return state;
+ }
+};