summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/runner/runner_list/filtered_search_utils.js
diff options
context:
space:
mode:
Diffstat (limited to 'app/assets/javascripts/runner/runner_list/filtered_search_utils.js')
-rw-r--r--app/assets/javascripts/runner/runner_list/filtered_search_utils.js72
1 files changed, 72 insertions, 0 deletions
diff --git a/app/assets/javascripts/runner/runner_list/filtered_search_utils.js b/app/assets/javascripts/runner/runner_list/filtered_search_utils.js
new file mode 100644
index 00000000000..4ae068c3eb6
--- /dev/null
+++ b/app/assets/javascripts/runner/runner_list/filtered_search_utils.js
@@ -0,0 +1,72 @@
+import { queryToObject, setUrlParams } from '~/lib/utils/url_utility';
+import {
+ PARAM_KEY_STATUS,
+ PARAM_KEY_RUNNER_TYPE,
+ PARAM_KEY_SORT,
+ DEFAULT_SORT,
+} from '../constants';
+
+const getValuesFromFilters = (paramKey, filters) => {
+ return filters
+ .filter(({ type, value }) => type === paramKey && value.operator === '=')
+ .map(({ value }) => value.data);
+};
+
+const getFilterFromParams = (paramKey, params) => {
+ const value = params[paramKey];
+ if (!value) {
+ return [];
+ }
+
+ const values = Array.isArray(value) ? value : [value];
+ return values.map((data) => {
+ return {
+ type: paramKey,
+ value: {
+ data,
+ operator: '=',
+ },
+ };
+ });
+};
+
+export const fromUrlQueryToSearch = (query = window.location.search) => {
+ const params = queryToObject(query, { gatherArrays: true });
+
+ return {
+ filters: [
+ ...getFilterFromParams(PARAM_KEY_STATUS, params),
+ ...getFilterFromParams(PARAM_KEY_RUNNER_TYPE, params),
+ ],
+ sort: params[PARAM_KEY_SORT] || DEFAULT_SORT,
+ };
+};
+
+export const fromSearchToUrl = ({ filters = [], sort = null }, url = window.location.href) => {
+ const urlParams = {
+ [PARAM_KEY_STATUS]: getValuesFromFilters(PARAM_KEY_STATUS, filters),
+ [PARAM_KEY_RUNNER_TYPE]: getValuesFromFilters(PARAM_KEY_RUNNER_TYPE, filters),
+ };
+
+ if (sort && sort !== DEFAULT_SORT) {
+ urlParams[PARAM_KEY_SORT] = sort;
+ }
+
+ return setUrlParams(urlParams, url, false, true, true);
+};
+
+export const fromSearchToVariables = ({ filters = [], sort = null } = {}) => {
+ const variables = {};
+
+ // TODO Get more than one value when GraphQL API supports OR for "status"
+ [variables.status] = getValuesFromFilters(PARAM_KEY_STATUS, filters);
+
+ // TODO Get more than one value when GraphQL API supports OR for "runner type"
+ [variables.type] = getValuesFromFilters(PARAM_KEY_RUNNER_TYPE, filters);
+
+ if (sort) {
+ variables.sort = sort;
+ }
+
+ return variables;
+};