mirror of
https://github.com/strapi/strapi.git
synced 2025-09-25 16:29:34 +00:00
Fix filters related bugs and add tests
This commit is contained in:
parent
dabf6ca462
commit
a09ec8467b
@ -47,7 +47,12 @@ function FilterPickerOption({
|
|||||||
onClick={() => onRemoveFilter(index)}
|
onClick={() => onRemoveFilter(index)}
|
||||||
/>
|
/>
|
||||||
<InputSelect
|
<InputSelect
|
||||||
onChange={onChange}
|
onChange={e => {
|
||||||
|
// Change the attribute
|
||||||
|
onChange(e);
|
||||||
|
// Change the default filter so it reset to the common one which is '='
|
||||||
|
onChange({ target: { name: `${index}.filter`, value: '=' } });
|
||||||
|
}}
|
||||||
name={`${index}.name`}
|
name={`${index}.name`}
|
||||||
value={get(modifiedData, [index, 'name'], '')}
|
value={get(modifiedData, [index, 'name'], '')}
|
||||||
selectOptions={allowedAttributes.map(attr => attr.name)}
|
selectOptions={allowedAttributes.map(attr => attr.name)}
|
||||||
|
@ -451,6 +451,10 @@ function EditView({
|
|||||||
<div className="col-md-12 col-lg-9">
|
<div className="col-md-12 col-lg-9">
|
||||||
<MainWrapper>
|
<MainWrapper>
|
||||||
{fields.map((fieldsRow, key) => {
|
{fields.map((fieldsRow, key) => {
|
||||||
|
if (fieldsRow.length === 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
const [{ name }] = fieldsRow;
|
const [{ name }] = fieldsRow;
|
||||||
const group = get(layout, ['schema', 'attributes', name], {});
|
const group = get(layout, ['schema', 'attributes', name], {});
|
||||||
const groupMetas = get(
|
const groupMetas = get(
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { all, fork, put, call, takeLatest } from 'redux-saga/effects';
|
import { all, fork, put, call, takeLatest } from 'redux-saga/effects';
|
||||||
import { request } from 'strapi-helper-plugin';
|
import { request } from 'strapi-helper-plugin';
|
||||||
import { set, unset } from 'lodash';
|
import { clone, set, unset } from 'lodash';
|
||||||
import pluginId from '../../pluginId';
|
import pluginId from '../../pluginId';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@ -15,21 +15,22 @@ const getRequestUrl = path => `/${pluginId}/explorer/${path}`;
|
|||||||
// eslint-disable-next-line require-yield
|
// eslint-disable-next-line require-yield
|
||||||
export function* getData({ uid, params }) {
|
export function* getData({ uid, params }) {
|
||||||
try {
|
try {
|
||||||
const _start = (params._page - 1) * parseInt(params._limit, 10);
|
const clonedParams = clone(params);
|
||||||
|
const _start = (clonedParams._page - 1) * parseInt(clonedParams._limit, 10);
|
||||||
|
|
||||||
set(params, '_start', _start);
|
set(clonedParams, '_start', _start);
|
||||||
unset(params, '_page');
|
unset(clonedParams, '_page');
|
||||||
|
|
||||||
if (params._q === '') {
|
if (clonedParams._q === '') {
|
||||||
unset(params, '_q');
|
unset(clonedParams, '_q');
|
||||||
}
|
}
|
||||||
|
|
||||||
const search = Object.keys(params)
|
const search = Object.keys(clonedParams)
|
||||||
.reduce((acc, current) => {
|
.reduce((acc, current) => {
|
||||||
if (current !== 'filters') {
|
if (current !== 'filters') {
|
||||||
acc.push(`${current}=${params[current]}`);
|
acc.push(`${current}=${clonedParams[current]}`);
|
||||||
} else {
|
} else {
|
||||||
const filters = params[current].reduce((acc, curr) => {
|
const filters = clonedParams[current].reduce((acc, curr) => {
|
||||||
const key =
|
const key =
|
||||||
curr.filter === '=' ? curr.name : `${curr.name}${curr.filter}`;
|
curr.filter === '=' ? curr.name : `${curr.name}${curr.filter}`;
|
||||||
acc.push(`${key}=${curr.value}`);
|
acc.push(`${key}=${curr.value}`);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { isEmpty } from 'lodash';
|
import { isEmpty, toString } from 'lodash';
|
||||||
/**
|
/**
|
||||||
* Generate filters object from string
|
* Generate filters object from string
|
||||||
* @param {String} search
|
* @param {String} search
|
||||||
@ -18,10 +18,31 @@ const generateFiltersFromSearch = search => {
|
|||||||
.reduce((acc, curr) => {
|
.reduce((acc, curr) => {
|
||||||
const [name, value] = curr.split('=');
|
const [name, value] = curr.split('=');
|
||||||
const split = name.split('_');
|
const split = name.split('_');
|
||||||
const filter = split.length > 1 ? `_${split[1]}` : '=';
|
let filter = `_${split[split.length - 1]}`;
|
||||||
|
|
||||||
|
if (
|
||||||
|
![
|
||||||
|
'_ne',
|
||||||
|
'_lt',
|
||||||
|
'_lte',
|
||||||
|
'_gt',
|
||||||
|
'_gte',
|
||||||
|
'_contains',
|
||||||
|
'_containss',
|
||||||
|
'_in',
|
||||||
|
'_nin',
|
||||||
|
].includes(filter)
|
||||||
|
) {
|
||||||
|
filter = '=';
|
||||||
|
}
|
||||||
|
const toSlice = filter === '=' ? split.length : split.length - 1;
|
||||||
|
|
||||||
acc.push({
|
acc.push({
|
||||||
name: split[0].replace('?', ''),
|
name: split
|
||||||
|
.slice(0, toSlice)
|
||||||
|
.join('_')
|
||||||
|
|
||||||
|
.replace('?', ''),
|
||||||
filter,
|
filter,
|
||||||
value: decodeURIComponent(value),
|
value: decodeURIComponent(value),
|
||||||
});
|
});
|
||||||
@ -32,7 +53,7 @@ const generateFiltersFromSearch = search => {
|
|||||||
|
|
||||||
const generateSearchFromFilters = filters => {
|
const generateSearchFromFilters = filters => {
|
||||||
return Object.keys(filters)
|
return Object.keys(filters)
|
||||||
.filter(key => !isEmpty(filters[key]))
|
.filter(key => !isEmpty(toString(filters[key])))
|
||||||
.map(key => {
|
.map(key => {
|
||||||
let ret = `${key}=${filters[key]}`;
|
let ret = `${key}=${filters[key]}`;
|
||||||
|
|
||||||
|
@ -0,0 +1,103 @@
|
|||||||
|
import {
|
||||||
|
generateFiltersFromSearch,
|
||||||
|
generateSearchFromFilters,
|
||||||
|
} from '../search';
|
||||||
|
|
||||||
|
describe('Content Manager | utils | search', () => {
|
||||||
|
describe('generateFiltersFromSearch', () => {
|
||||||
|
it('should generate an array of filters', () => {
|
||||||
|
const search =
|
||||||
|
'?_sort=id:ASC&source=content-manager&bool=true&big_number_ne=1&created_at_lt=2019-08-01T00:00:00Z&date_lte=2019-08-02T00:00:00Z&decimal_number_gt=2&enum_ne=noon&float_number_gte=3';
|
||||||
|
const expected = [
|
||||||
|
{
|
||||||
|
name: 'bool',
|
||||||
|
filter: '=',
|
||||||
|
value: 'true',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'big_number',
|
||||||
|
filter: '_ne',
|
||||||
|
value: '1',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'created_at',
|
||||||
|
filter: '_lt',
|
||||||
|
value: '2019-08-01T00:00:00Z',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'date',
|
||||||
|
filter: '_lte',
|
||||||
|
value: '2019-08-02T00:00:00Z',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'decimal_number',
|
||||||
|
filter: '_gt',
|
||||||
|
value: '2',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'enum',
|
||||||
|
filter: '_ne',
|
||||||
|
value: 'noon',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'float_number',
|
||||||
|
filter: '_gte',
|
||||||
|
value: '3',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
expect(generateFiltersFromSearch(search)).toEqual(expected);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('generateSearchFromFilters', () => {
|
||||||
|
it('should return a string with all the applied filters', () => {
|
||||||
|
const data = {
|
||||||
|
_limit: 10,
|
||||||
|
_sort: 'id:ASC',
|
||||||
|
_page: 2,
|
||||||
|
source: 'content-manager',
|
||||||
|
filters: [
|
||||||
|
{
|
||||||
|
name: 'bool',
|
||||||
|
filter: '=',
|
||||||
|
value: 'true',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'big_number',
|
||||||
|
filter: '_ne',
|
||||||
|
value: '1',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'created_at',
|
||||||
|
filter: '_lt',
|
||||||
|
value: '2019-08-01T00:00:00Z',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'date',
|
||||||
|
filter: '_lte',
|
||||||
|
value: '2019-08-02T00:00:00Z',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'decimal_number',
|
||||||
|
filter: '_gt',
|
||||||
|
value: '2',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'enum',
|
||||||
|
filter: '_ne',
|
||||||
|
value: 'noon',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'float_number',
|
||||||
|
filter: '_gte',
|
||||||
|
value: '3',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
const expected =
|
||||||
|
'_limit=10&_sort=id:ASC&_page=2&source=content-manager&bool=true&big_number_ne=1&created_at_lt=2019-08-01T00:00:00Z&date_lte=2019-08-02T00:00:00Z&decimal_number_gt=2&enum_ne=noon&float_number_gte=3';
|
||||||
|
expect(generateSearchFromFilters(data)).toEqual(expected);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
Loading…
x
Reference in New Issue
Block a user