2 * ============LICENSE_START===================================================
3 * SPARKY (AAI UI service)
4 * ============================================================================
5 * Copyright © 2017 AT&T Intellectual Property.
6 * Copyright © 2017 Amdocs
8 * ============================================================================
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 * ============LICENSE_END=====================================================
22 * ECOMP and OpenECOMP are trademarks
23 * and service marks of AT&T Intellectual Property.
25 import isEmpty from 'lodash/isEmpty';
26 import moment from 'moment-timezone';
30 } from 'app/networking/NetworkConstants.js';
33 DISCOVER_FILTERS_ERROR_MSG,
36 FILTER_ATTRIBUTE_FROM,
37 FILTER_ATTRIBUTE_CODE,
38 FILTER_ATTRIBUTE_VALUES,
39 FILTER_ATTRIBUTE_CONTROLS,
40 FILTER_ATTRIBUTE_DEFAULT_VALUE,
43 } from 'generic-components/filterBar/FilterBarConstants.js';
46 } from 'utils/GlobalConstants.js';
48 getSetGlobalMessageEvent
49 } from 'app/globalInlineMessageBar/GlobalInlineMessageBarActions.js';
51 export function buildFilterValueMap(filterValueString) {
52 let filterValueObj = {};
53 let filters = filterValueString.split(',');
55 for (let filterIndex in filters) {
56 let filterStringParts = filters[filterIndex].split('=');
58 filterValueObj[filterStringParts[0]] = filterStringParts[1];
61 return filterValueObj;
64 export function buildFilterValueMapFromObj(filterValues) {
65 let filterValueObj = {};
67 for (let filterIndex in filterValues) {
68 filterValueObj[filterValues[filterIndex].filterId] = filterValues[filterIndex].filterValue;
71 return filterValueObj;
74 export function getFilterListQueryString(filterValueList) {
75 let filterQueryList = [];
77 for (let filter in filterValueList) {
78 if (filterValueList[filter]) {
82 'filterValue': filterValueList[filter]
88 return filterQueryList;
91 function getFilterSearchURL() {
92 return UNIFIED_FILTERS_URL.replace('@@IP-ADDRESS@@', document.location.hostname);
95 function getFiltersQueryObject(viewName) {
101 function getFiltersEvent(actionType, filterList) {
108 export function getUnifiedFilters(viewName, actionType) {
110 return fetch(getFilterSearchURL(), {
111 credentials: 'same-origin',
113 headers: POST_HEADER,
114 body: JSON.stringify(getFiltersQueryObject(viewName))
116 (response) => response.json()
120 getFiltersEvent(actionType, responseJson.filters)
125 dispatch(getSetGlobalMessageEvent(DISCOVER_FILTERS_ERROR_MSG, MESSAGE_LEVEL_WARNING));
131 function extractConvertedDateValues(dateValues) {
132 let convertedValues = {};
133 if (dateValues.from) {
134 let startMoment = moment(dateValues.from);
135 convertedValues.startDate = startMoment.toDate();
136 convertedValues.time_zone = startMoment.format(DATE_TIME_ZONE);
140 let endMoment = moment(dateValues.to);
141 convertedValues.endDate = endMoment.toDate();
142 convertedValues.time_zone = endMoment.format(DATE_TIME_ZONE);
145 convertedValues.code = dateValues.code;
147 return convertedValues;
150 function convertFilterValues(filterValues) {
151 let convertedFilterValues = {};
153 for (let filterId in filterValues) {
154 if (filterValues.hasOwnProperty(filterId) &&
155 !isEmpty(filterValues[filterId]) && !isEmpty(filterValues[filterId].controls)) {
156 let controls = filterValues[filterId].controls;
157 let firstControlKey = Object.keys(controls)[0];
158 if (controls[firstControlKey][FILTER_ATTRIBUTE_VALUES][FILTER_ATTRIBUTE_FROM] ||
159 controls[firstControlKey][FILTER_ATTRIBUTE_VALUES][FILTER_ATTRIBUTE_TO]) {
160 // TODO should check against filter type (ex: dropdown or date)
161 // rather than assuming value attributes (ex: 'to' or 'from')
162 convertedFilterValues[filterId] =
163 extractConvertedDateValues(controls[firstControlKey][FILTER_ATTRIBUTE_VALUES]);
165 let codeValue = controls[firstControlKey][FILTER_ATTRIBUTE_VALUES][FILTER_ATTRIBUTE_CODE];
166 convertedFilterValues[filterId] = codeValue;
171 return convertedFilterValues;
174 function combineMissingFilters(filterValues, allFilters) {
175 let allFilterIds = Object.keys(allFilters);
177 for (let id in allFilterIds) {
178 if (!filterValues.hasOwnProperty(allFilterIds[id])) {
179 filterValues[allFilterIds[id]] = '';
186 function getFilterSelectionEvent(selectedValuesMap, convertedValues) {
188 type: filterBarActionTypes.NEW_SELECTIONS,
190 selectedValuesMap: convertedValues,
191 unifiedValues: selectedValuesMap
196 export function processFilterSelection(filterValues, allFilters) {
197 let convertedFilterValues = convertFilterValues(filterValues);
198 let combinedFilterValues = combineMissingFilters(convertedFilterValues, allFilters);
200 // dispatch NEW_SELECTION event type with converted values as the data
201 return getFilterSelectionEvent(filterValues, combinedFilterValues);
204 export function setNonConvertedFilterValues(nonConvertedValues) {
206 type: filterBarActionTypes.SET_NON_CONVERTED_VALUES,
207 data: nonConvertedValues
211 function convertedFilterValuesEvent(nonConvertedValues, convertedValues) {
213 type: filterBarActionTypes.SET_CONVERTED_VALUES,
215 nonConvertedValues: nonConvertedValues,
216 convertedValues: convertedValues
221 function mapValuesToOption(filterOptions, nonConvertedValue) {
222 let mappedValues = {};
224 // loop over options to find match for value
225 for (let i in filterOptions) {
226 if (filterOptions[i].code === nonConvertedValue) {
227 // found the matching
228 mappedValues = filterOptions[i];
236 function mapValuesToDateOption(nonConvertedValue) {
237 let mappedValues = {};
239 if (nonConvertedValue.startDate) {
240 mappedValues.from = new Date(nonConvertedValue.startDate);
242 mappedValues.from = null;
245 if (nonConvertedValue.endDate) {
246 mappedValues.to = new Date(nonConvertedValue.endDate);
248 mappedValues.to = null;
251 mappedValues.code = nonConvertedValue.code;
256 function mapValuesToFilter(nonConvertedValues, allFilters, currentlySetFilterValues) {
257 let convertedValues = {};
259 for (let nonConvertedId in nonConvertedValues) {
260 if (nonConvertedValues[nonConvertedId] !== '') {
261 let matchingFilterObj = allFilters[nonConvertedId];
262 let filterControlId = Object.keys(matchingFilterObj.controls)[0];
263 let mappedValue = {};
265 if (matchingFilterObj[FILTER_ATTRIBUTE_CONTROLS][filterControlId].type === FILTER_TYPE_ENUM.DATE) {
266 mappedValue = mapValuesToDateOption(nonConvertedValues[nonConvertedId]);
268 mappedValue = mapValuesToOption(matchingFilterObj[FILTER_ATTRIBUTE_CONTROLS][filterControlId].options,
269 nonConvertedValues[nonConvertedId]);
273 values[FILTER_ATTRIBUTE_VALUES] = mappedValue;
274 let filterControlers = {};
275 filterControlers[filterControlId] = values;
277 filter[FILTER_ATTRIBUTE_CONTROLS] = filterControlers;
278 convertedValues[nonConvertedId] = filter;
279 } else if (!isEmpty(currentlySetFilterValues[nonConvertedId])) {
280 // currently a value is set for this filter, need to ensure we map this filter
281 // to an empty value so that it is cleared/reset
282 let matchingFilterObj = allFilters[nonConvertedId];
283 let filterControlId = Object.keys(matchingFilterObj.controls)[0];
284 let mappedValue = {};
286 values[FILTER_ATTRIBUTE_VALUES] = mappedValue;
287 let filterControlers = {};
288 filterControlers[filterControlId] = values;
290 filter[FILTER_ATTRIBUTE_CONTROLS] = filterControlers;
291 convertedValues[nonConvertedId] = filter;
295 return convertedValues;
298 export function convertNonConvertedValues(nonConvertedValues, allFilters, currentlySetFilterValues) {
299 let convertedValues = mapValuesToFilter(nonConvertedValues, allFilters, currentlySetFilterValues);
300 return convertedFilterValuesEvent(nonConvertedValues, convertedValues);
303 export function clearFilters() {
305 type: filterBarActionTypes.CLEAR_FILTERS
309 function getSetUnifiedFilterValuesEvent(unifiedValues) {
311 type: filterBarActionTypes.SET_UNIFIED_VALUES,
316 function getFilterDefault(filters, filterId) {
317 let filterControlId = Object.keys(filters[filterId][FILTER_ATTRIBUTE_CONTROLS])[0];
318 let defaultValue = filters[filterId][FILTER_ATTRIBUTE_CONTROLS][filterControlId][FILTER_ATTRIBUTE_DEFAULT_VALUE];
325 export function setFilterSelectionsToDefaults(filters, filterValues) {
326 let defaultFilterMap = {};
328 for (let filterId in filters) {
329 let filterDefaultValue = getFilterDefault(filters, filterId);
330 if (!isEmpty(filterDefaultValue) || (filterValues && filterValues[filterId])) {
331 let filterControlId = Object.keys(filters[filterId][FILTER_ATTRIBUTE_CONTROLS])[0];
333 controller.values = filterDefaultValue;
334 let controllers = {};
335 controllers[filterControlId] = controller;
337 controls.controls = controllers;
338 defaultFilterMap[filterId] = controls;
342 if (isEmpty(defaultFilterMap)) {
343 // there are no default values, so need to ensure all filters get cleared,
344 // but just incase this 'clearing'
345 let combinedValues = combineMissingFilters(defaultFilterMap, filters);
346 return setNonConvertedFilterValues(combinedValues);
348 // jsut set the Unified Filter Value which will be sent down to the filter (filter
349 // will set itself to the default value and then send notification back up of the selection
350 return getSetUnifiedFilterValuesEvent(defaultFilterMap);