2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
6 * Copyright © 2017 Amdocs
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
21 * ECOMP is a trademark and service mark of AT&T Intellectual Property.
23 import isEmpty from 'lodash/isEmpty';
24 import moment from 'moment-timezone';
28 } from 'app/networking/NetworkConstants.js';
31 DISCOVER_FILTERS_ERROR_MSG,
34 FILTER_ATTRIBUTE_FROM,
35 FILTER_ATTRIBUTE_CODE,
36 FILTER_ATTRIBUTE_VALUES,
37 FILTER_ATTRIBUTE_CONTROLS,
38 FILTER_ATTRIBUTE_DEFAULT_VALUE,
41 } from 'generic-components/filterBar/FilterBarConstants.js';
44 } from 'utils/GlobalConstants.js';
46 getSetGlobalMessageEvent
47 } from 'app/globalInlineMessageBar/GlobalInlineMessageBarActions.js';
49 export function buildFilterValueMap(filterValueString) {
50 let filterValueObj = {};
51 let filters = filterValueString.split(',');
53 for (let filterIndex in filters) {
54 let filterStringParts = filters[filterIndex].split('=');
56 filterValueObj[filterStringParts[0]] = filterStringParts[1];
59 return filterValueObj;
62 export function buildFilterValueMapFromObj(filterValues) {
63 let filterValueObj = {};
65 for (let filterIndex in filterValues) {
66 filterValueObj[filterValues[filterIndex].filterId] = filterValues[filterIndex].filterValue;
69 return filterValueObj;
72 export function getFilterListQueryString(filterValueList) {
73 let filterQueryList = [];
75 for (let filter in filterValueList) {
76 if (filterValueList[filter]) {
80 'filterValue': filterValueList[filter]
86 return filterQueryList;
89 function getFilterSearchURL() {
90 return UNIFIED_FILTERS_URL.replace('@@IP-ADDRESS@@', document.location.hostname);
93 function getFiltersQueryObject(viewName) {
99 function getFiltersEvent(actionType, filterList) {
106 export function getUnifiedFilters(viewName, actionType) {
108 return fetch(getFilterSearchURL(), {
109 credentials: 'same-origin',
111 headers: POST_HEADER,
112 body: JSON.stringify(getFiltersQueryObject(viewName))
114 (response) => response.json()
118 getFiltersEvent(actionType, responseJson.filters)
123 dispatch(getSetGlobalMessageEvent(DISCOVER_FILTERS_ERROR_MSG, MESSAGE_LEVEL_WARNING));
129 function extractConvertedDateValues(dateValues) {
130 let convertedValues = {};
131 if (dateValues.from) {
132 let startMoment = moment(dateValues.from);
133 convertedValues.startDate = startMoment.toDate();
134 convertedValues.time_zone = startMoment.format(DATE_TIME_ZONE);
138 let endMoment = moment(dateValues.to);
139 convertedValues.endDate = endMoment.toDate();
140 convertedValues.time_zone = endMoment.format(DATE_TIME_ZONE);
143 convertedValues.code = dateValues.code;
145 return convertedValues;
148 function convertFilterValues(filterValues) {
149 let convertedFilterValues = {};
151 for (let filterId in filterValues) {
152 if (filterValues.hasOwnProperty(filterId) &&
153 !isEmpty(filterValues[filterId]) && !isEmpty(filterValues[filterId].controls)) {
154 let controls = filterValues[filterId].controls;
155 let firstControlKey = Object.keys(controls)[0];
156 if (controls[firstControlKey][FILTER_ATTRIBUTE_VALUES][FILTER_ATTRIBUTE_FROM] ||
157 controls[firstControlKey][FILTER_ATTRIBUTE_VALUES][FILTER_ATTRIBUTE_TO]) {
158 // TODO should check against filter type (ex: dropdown or date)
159 // rather than assuming value attributes (ex: 'to' or 'from')
160 convertedFilterValues[filterId] =
161 extractConvertedDateValues(controls[firstControlKey][FILTER_ATTRIBUTE_VALUES]);
163 let codeValue = controls[firstControlKey][FILTER_ATTRIBUTE_VALUES][FILTER_ATTRIBUTE_CODE];
164 convertedFilterValues[filterId] = codeValue;
169 return convertedFilterValues;
172 function combineMissingFilters(filterValues, allFilters) {
173 let allFilterIds = Object.keys(allFilters);
175 for (let id in allFilterIds) {
176 if (!filterValues.hasOwnProperty(allFilterIds[id])) {
177 filterValues[allFilterIds[id]] = '';
184 function getFilterSelectionEvent(selectedValuesMap, convertedValues) {
186 type: filterBarActionTypes.NEW_SELECTIONS,
188 selectedValuesMap: convertedValues,
189 unifiedValues: selectedValuesMap
194 export function processFilterSelection(filterValues, allFilters) {
195 let convertedFilterValues = convertFilterValues(filterValues);
196 let combinedFilterValues = combineMissingFilters(convertedFilterValues, allFilters);
198 // dispatch NEW_SELECTION event type with converted values as the data
199 return getFilterSelectionEvent(filterValues, combinedFilterValues);
202 export function setNonConvertedFilterValues(nonConvertedValues) {
204 type: filterBarActionTypes.SET_NON_CONVERTED_VALUES,
205 data: nonConvertedValues
209 function convertedFilterValuesEvent(nonConvertedValues, convertedValues) {
211 type: filterBarActionTypes.SET_CONVERTED_VALUES,
213 nonConvertedValues: nonConvertedValues,
214 convertedValues: convertedValues
219 function mapValuesToOption(filterOptions, nonConvertedValue) {
220 let mappedValues = {};
222 // loop over options to find match for value
223 for (let i in filterOptions) {
224 if (filterOptions[i].code === nonConvertedValue) {
225 // found the matching
226 mappedValues = filterOptions[i];
234 function mapValuesToDateOption(nonConvertedValue) {
235 let mappedValues = {};
237 if (nonConvertedValue.startDate) {
238 mappedValues.from = new Date(nonConvertedValue.startDate);
240 mappedValues.from = null;
243 if (nonConvertedValue.endDate) {
244 mappedValues.to = new Date(nonConvertedValue.endDate);
246 mappedValues.to = null;
249 mappedValues.code = nonConvertedValue.code;
254 function mapValuesToFilter(nonConvertedValues, allFilters, currentlySetFilterValues) {
255 let convertedValues = {};
257 for (let nonConvertedId in nonConvertedValues) {
258 if (nonConvertedValues[nonConvertedId] !== '') {
259 let matchingFilterObj = allFilters[nonConvertedId];
260 let filterControlId = Object.keys(matchingFilterObj.controls)[0];
261 let mappedValue = {};
263 if (matchingFilterObj[FILTER_ATTRIBUTE_CONTROLS][filterControlId].type === FILTER_TYPE_ENUM.DATE) {
264 mappedValue = mapValuesToDateOption(nonConvertedValues[nonConvertedId]);
266 mappedValue = mapValuesToOption(matchingFilterObj[FILTER_ATTRIBUTE_CONTROLS][filterControlId].options,
267 nonConvertedValues[nonConvertedId]);
271 values[FILTER_ATTRIBUTE_VALUES] = mappedValue;
272 let filterControlers = {};
273 filterControlers[filterControlId] = values;
275 filter[FILTER_ATTRIBUTE_CONTROLS] = filterControlers;
276 convertedValues[nonConvertedId] = filter;
277 } else if (!isEmpty(currentlySetFilterValues[nonConvertedId])) {
278 // currently a value is set for this filter, need to ensure we map this filter
279 // to an empty value so that it is cleared/reset
280 let matchingFilterObj = allFilters[nonConvertedId];
281 let filterControlId = Object.keys(matchingFilterObj.controls)[0];
282 let mappedValue = {};
284 values[FILTER_ATTRIBUTE_VALUES] = mappedValue;
285 let filterControlers = {};
286 filterControlers[filterControlId] = values;
288 filter[FILTER_ATTRIBUTE_CONTROLS] = filterControlers;
289 convertedValues[nonConvertedId] = filter;
293 return convertedValues;
296 export function convertNonConvertedValues(nonConvertedValues, allFilters, currentlySetFilterValues) {
297 let convertedValues = mapValuesToFilter(nonConvertedValues, allFilters, currentlySetFilterValues);
298 return convertedFilterValuesEvent(nonConvertedValues, convertedValues);
301 export function clearFilters() {
303 type: filterBarActionTypes.CLEAR_FILTERS
307 function getSetUnifiedFilterValuesEvent(unifiedValues) {
309 type: filterBarActionTypes.SET_UNIFIED_VALUES,
314 function getFilterDefault(filters, filterId) {
315 let filterControlId = Object.keys(filters[filterId][FILTER_ATTRIBUTE_CONTROLS])[0];
316 let defaultValue = filters[filterId][FILTER_ATTRIBUTE_CONTROLS][filterControlId][FILTER_ATTRIBUTE_DEFAULT_VALUE];
323 export function setFilterSelectionsToDefaults(filters, filterValues) {
324 let defaultFilterMap = {};
326 for (let filterId in filters) {
327 let filterDefaultValue = getFilterDefault(filters, filterId);
328 if (!isEmpty(filterDefaultValue) || (filterValues && filterValues[filterId])) {
329 let filterControlId = Object.keys(filters[filterId][FILTER_ATTRIBUTE_CONTROLS])[0];
331 controller.values = filterDefaultValue;
332 let controllers = {};
333 controllers[filterControlId] = controller;
335 controls.controls = controllers;
336 defaultFilterMap[filterId] = controls;
340 if (isEmpty(defaultFilterMap)) {
341 // there are no default values, so need to ensure all filters get cleared,
342 // but just incase this 'clearing'
343 let combinedValues = combineMissingFilters(defaultFilterMap, filters);
344 return setNonConvertedFilterValues(combinedValues);
346 // jsut set the Unified Filter Value which will be sent down to the filter (filter
347 // will set itself to the default value and then send notification back up of the selection
348 return getSetUnifiedFilterValuesEvent(defaultFilterMap);