diff --git a/frontend/app/components/shared/CustomMetrics/CustomMetrics.tsx b/frontend/app/components/shared/CustomMetrics/CustomMetrics.tsx deleted file mode 100644 index aedd4a097..000000000 --- a/frontend/app/components/shared/CustomMetrics/CustomMetrics.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import React from 'react'; -import { IconButton } from 'UI'; -import { connect } from 'react-redux'; -import { edit, init } from 'Duck/customMetrics'; - -interface Props { - init: (instance?, setDefault?) => void; -} -function CustomMetrics(props: Props) { - return ( -
- props.init()} /> -
- ); -} - -export default connect(null, { edit, init })(CustomMetrics); \ No newline at end of file diff --git a/frontend/app/components/shared/CustomMetrics/SessionListModal/SessionListModal.module.css b/frontend/app/components/shared/CustomMetrics/SessionListModal/SessionListModal.module.css deleted file mode 100644 index 05f1ffb8a..000000000 --- a/frontend/app/components/shared/CustomMetrics/SessionListModal/SessionListModal.module.css +++ /dev/null @@ -1,29 +0,0 @@ -.wrapper { - padding: 20px; - background-color: #f6f6f6; - min-height: calc(100vh - 59px); - } - - .dropdown { - display: flex !important; - padding: 4px 6px; - border-radius: 3px; - color: $gray-darkest; - font-weight: 500; - &:hover { - background-color: $gray-light; - } - } - - .dropdownTrigger { - padding: 4px 8px; - border-radius: 3px; - &:hover { - background-color: $gray-light; - } - } - - .dropdownIcon { - margin-top: 2px; - margin-left: 3px; - } \ No newline at end of file diff --git a/frontend/app/components/shared/CustomMetrics/SessionListModal/SessionListModal.tsx b/frontend/app/components/shared/CustomMetrics/SessionListModal/SessionListModal.tsx deleted file mode 100644 index d13b760d9..000000000 --- a/frontend/app/components/shared/CustomMetrics/SessionListModal/SessionListModal.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import { SlideModal, NoContent, Dropdown, Icon, TimezoneDropdown, Loader } from 'UI'; -import SessionItem from 'Shared/SessionItem'; -import stl from './SessionListModal.module.css'; -import { connect } from 'react-redux'; -import { fetchSessionList, setActiveWidget } from 'Duck/customMetrics'; -import { DateTime } from 'luxon'; -import AnimatedSVG, { ICONS } from 'Shared/AnimatedSVG/AnimatedSVG'; -interface Props { - loading: boolean; - list: any; - fetchSessionList: (params) => void; - activeWidget: any; - setActiveWidget: (widget) => void; -} -function SessionListModal(props: Props) { - const { activeWidget, loading, list } = props; - const [seriesOptions, setSeriesOptions] = useState([ - { text: 'All', value: 'all' }, - ]); - const [activeSeries, setActiveSeries] = useState('all'); - useEffect(() => { - if (!activeWidget || !activeWidget.widget) return; - props.fetchSessionList({ - metricId: activeWidget.widget.metricId, - startDate: activeWidget.startTimestamp, - endDate: activeWidget.endTimestamp, - filters: activeWidget.filters || [], - }); - }, [activeWidget]); - - useEffect(() => { - if (!list) return; - const seriesOptions = list.map(item => ({ - text: item.seriesName, - value: item.seriesId, - })); - setSeriesOptions([ - { text: 'All', value: 'all' }, - ...seriesOptions, - ]); - }, [list]); - - const getListSessionsBySeries = (seriesId) => { - const arr: any = [] - list.forEach(element => { - if (seriesId === 'all') { - const sessionIds = arr.map(i => i.sessionId); - arr.push(...element.sessions.filter(i => !sessionIds.includes(i.sessionId))); - } else { - if (element.seriesId === seriesId) { - arr.push(...element.sessions) - } - } - }); - return arr; - } - - const writeOption = (e, { name, value }) => setActiveSeries(value); - const filteredSessions = getListSessionsBySeries(activeSeries); - const startTime = DateTime.fromMillis(activeWidget.startTimestamp).toFormat('LLL dd, yyyy HH:mm a'); - const endTime = DateTime.fromMillis(activeWidget.endTimestamp).toFormat('LLL dd, yyyy HH:mm a'); - - return ( - -
{ activeWidget.widget.name }
- - )} - isDisplayed={ !!activeWidget } - onClose={ () => props.setActiveWidget(null)} - content={ activeWidget && ( -
-
-
Showing all sessions between {startTime} and {endTime}
-
-
- Timezone - -
- { activeWidget.widget.metricType !== 'table' && ( -
- Series - } - /> -
- )} - {/* Series */} -
-
- - - -
No recordings found!
-
- } - // animatedIcon="no-results" - > - { filteredSessions.map(session => ) } - - - - )} - /> - ); -} - -export default connect(state => ({ - loading: state.getIn(['customMetrics', 'fetchSessionList', 'loading']), - list: state.getIn(['customMetrics', 'sessionList']), - // activeWidget: state.getIn(['customMetrics', 'activeWidget']), -}), { fetchSessionList, setActiveWidget })(SessionListModal); diff --git a/frontend/app/components/shared/CustomMetrics/SessionListModal/index.ts b/frontend/app/components/shared/CustomMetrics/SessionListModal/index.ts deleted file mode 100644 index 75303a134..000000000 --- a/frontend/app/components/shared/CustomMetrics/SessionListModal/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './SessionListModal'; \ No newline at end of file diff --git a/frontend/app/components/shared/CustomMetrics/index.ts b/frontend/app/components/shared/CustomMetrics/index.ts deleted file mode 100644 index ebbb8203c..000000000 --- a/frontend/app/components/shared/CustomMetrics/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './CustomMetrics'; \ No newline at end of file diff --git a/frontend/app/duck/customMetrics.js b/frontend/app/duck/customMetrics.js deleted file mode 100644 index c740f7a57..000000000 --- a/frontend/app/duck/customMetrics.js +++ /dev/null @@ -1,203 +0,0 @@ -import { List, Map } from 'immutable'; -import CustomMetric, { FilterSeries } from 'Types/customMetric' -import { fetchListType, fetchType, saveType, removeType, editType, createRemove, createEdit } from './funcTools/crud'; -import { createRequestReducer, ROOT_KEY } from './funcTools/request'; -import { array, success, createListUpdater, mergeReducers } from './funcTools/tools'; -import Filter from 'Types/filter'; -import Session from 'Types/session'; - -const name = "custom_metric"; -const idKey = "metricId"; - -const FETCH_LIST = fetchListType(name); -const FETCH_SESSION_LIST = fetchListType(`${name}/FETCH_SESSION_LIST`); -const FETCH = fetchType(name); -const SAVE = saveType(name); - -const ADD_SERIES = `${name}/ADD_SERIES`; -const REMOVE_SERIES = `${name}/REMOVE_SERIES`; - -const ADD_SERIES_FILTER_FILTER = `${name}/ADD_SERIES_FILTER_FILTER`; -const REMOVE_SERIES_FILTER_FILTER = `${name}/REMOVE_SERIES_FILTER_FILTER`; - -const EDIT_SERIES_FILTER = `${name}/EDIT_SERIES_FILTER`; -const EDIT_SERIES_FILTER_FILTER = `${name}/EDIT_SERIES_FILTER_FILTER`; -const UPDATE_ACTIVE_STATE = saveType(`${name}/UPDATE_ACTIVE_STATE`); -const EDIT = editType(name); -const INIT = `${name}/INIT`; -const SET_ACTIVE_WIDGET = `${name}/SET_ACTIVE_WIDGET`; -const REMOVE = removeType(name); -const UPDATE_SERIES = `${name}/UPDATE_SERIES`; - -const updateItemInList = createListUpdater(idKey); -const updateInstance = (state, instance) => state.getIn([ "instance", idKey ]) === instance[ idKey ] - ? state.mergeIn([ "instance" ], instance) - : state; - -const defaultInstance = CustomMetric({ - name: 'New', - series: List([ - { - name: 'Series 1', - filter: new Filter({ filters: List(), eventsOrder: 'then' }), - }, - ]) -}) - -const initialState = Map({ - list: List(), - sessionList: List(), - alertMetricId: null, - instance: null, - activeWidget: null, -}); - -// Metric - Series - [] - filters -function reducer(state = initialState, action = {}) { - switch (action.type) { - // Custom Metric - case INIT: - return state.set('instance', action.instance); - case EDIT: - return state.mergeIn([ 'instance' ], action.instance); - case ADD_SERIES: - const series = new FilterSeries(action.series); - return state.updateIn([ 'instance', 'series' ], list => list.push(series)); - case REMOVE_SERIES: - return state.updateIn([ 'instance', 'series' ], list => list.delete(action.index)); - case UPDATE_SERIES: - return state.mergeIn(['instance', 'series', action.index], action.series); - - // Custom Metric - Series - Filters - case EDIT_SERIES_FILTER: - return state.mergeIn(['instance', 'series', action.seriesIndex, 'filter'], action.filter); - - // Custom Metric - Series - Filter - Filters - case EDIT_SERIES_FILTER_FILTER: - return state.updateIn([ 'instance', 'series', action.seriesIndex, 'filter', 'filters' ], filters => filters.set(action.filterIndex, action.filter)); - case ADD_SERIES_FILTER_FILTER: - return state.updateIn([ 'instance', 'series', action.seriesIndex, 'filter', 'filters' ], filters => filters.push(action.filter)); - case REMOVE_SERIES_FILTER_FILTER: - return state.updateIn([ 'instance', 'series', action.seriesIndex, 'filter', 'filters' ], filters => filters.delete(action.index)); - - - - case success(SAVE): - return updateItemInList(updateInstance(state, action.data), action.data); - case success(REMOVE): - return state.update('list', list => list.filter(item => item.metricId !== action.id)); - case success(FETCH): - return state.set("instance", CustomMetric(action.data)); - case success(FETCH_LIST): - const { data } = action; - return state.set("list", List(data.map(CustomMetric))); - case success(FETCH_SESSION_LIST): - return state.set("sessionList", List(action.data.map(item => ({ ...item, sessions: item.sessions.map(s => new Session(s)) })))); - case SET_ACTIVE_WIDGET: - return state.set("activeWidget", action.widget).set('sessionList', List()); - } - return state; -} - -export default mergeReducers( - reducer, - createRequestReducer({ - [ ROOT_KEY ]: FETCH_LIST, - fetch: FETCH, - save: SAVE, - fetchSessionList: FETCH_SESSION_LIST, - }), -); - -export const edit = createEdit(name); -export const remove = createRemove(name); - -export function fetch(id) { - return { - id, - types: array(FETCH), - call: c => c.get(`/errors/${id}`), - } -} - -export const save = (instance) => (dispatch, getState) => { - return dispatch({ - types: SAVE.array, - call: client => client.post( `/${ instance.exists() ? name + 's/' + instance[idKey] : name + 's'}`, instance.toSaveData()), - }).then(() => { - dispatch(fetchList()); - }); -}; - -export function fetchList() { - return { - types: array(FETCH_LIST), - call: client => client.get(`/${name}s`), - }; -} - -export const init = (instance = null, forceNull = false) => (dispatch, getState) => { - dispatch({ - type: INIT, - instance: forceNull ? null : (instance || defaultInstance), - }); -} - - - -export const fetchSessionList = (params) => (dispatch, getState) => { - dispatch({ - types: array(FETCH_SESSION_LIST), - call: client => client.post(`/custom_metrics/${params.metricId}/sessions`, { ...params }), - }); -} - -export const setActiveWidget = (widget) => (dispatch, getState) => { - return dispatch({ - type: SET_ACTIVE_WIDGET, - widget, - }); -} - -export const updateActiveState = (metricId, state) => (dispatch, getState) => { - return dispatch({ - types: UPDATE_ACTIVE_STATE.array, - call: client => client.post(`/custom_metrics/${metricId}/status`, { active: state }), - metricId - }).then(() => { - dispatch(fetchList()); - }); -} - -export const editSeriesFilter = (seriesIndex, filter) => (dispatch, getState) => { - return dispatch({ - type: EDIT_SERIES_FILTER, - seriesIndex, - filter, - }); -} - -export const addSeriesFilterFilter = (seriesIndex, filter) => (dispatch, getState) => { - return dispatch({ - type: ADD_SERIES_FILTER_FILTER, - seriesIndex, - filter, - }); -} - -export const removeSeriesFilterFilter = (seriesIndex, filterIndex) => (dispatch, getState) => { - return dispatch({ - type: REMOVE_SERIES_FILTER_FILTER, - seriesIndex, - index: filterIndex, - }); -} - -export const editSeriesFilterFilter = (seriesIndex, filterIndex, filter) => (dispatch, getState) => { - return dispatch({ - type: EDIT_SERIES_FILTER_FILTER, - seriesIndex, - filterIndex, - filter, - }); -} \ No newline at end of file diff --git a/frontend/app/duck/funnelFilters.js_ b/frontend/app/duck/funnelFilters.js_ deleted file mode 100644 index c9f40846a..000000000 --- a/frontend/app/duck/funnelFilters.js_ +++ /dev/null @@ -1,375 +0,0 @@ -import { List, Map, Set } from 'immutable'; -import { errors as errorsRoute } from "App/routes"; -import Filter from 'Types/filter'; -import SavedFilter from 'Types/filter/savedFilter'; -import Event from 'Types/filter/event'; -import CustomFilter from 'Types/filter/customFilter'; -import withRequestState, { RequestTypes } from './requestStateCreator'; -import { fetch as fetchFunnel, fetchInsights, fetchIssuesFiltered, fetchSessionsFiltered } from './funnels'; - -const ERRORS_ROUTE = errorsRoute(); - -const FETCH_LIST = new RequestTypes('funnelFilters/FETCH_LIST'); -const FETCH_FILTER_OPTIONS = new RequestTypes('funnelFilters/FETCH_FILTER_OPTIONS'); -const SET_FILTER_OPTIONS = 'funnelFilters/SET_FILTER_OPTIONS'; -const SAVE = new RequestTypes('funnelFilters/SAVE'); -const REMOVE = new RequestTypes('funnelFilters/REMOVE'); - -const RESET = 'funnelFilters/RESET'; -const SET_SEARCH_QUERY = 'funnelFilters/SET_SEARCH_QUERY'; -const SET_ACTIVE = 'funnelFilters/SET_ACTIVE'; -const SET_ACTIVE_KEY = 'funnelFilters/SET_ACTIVE_KEY'; -const APPLY = 'funnelFilters/APPLY'; -const ADD_CUSTOM_FILTER = 'funnelFilters/ADD_CUSTOM_FILTER'; -const REMOVE_CUSTOM_FILTER = 'funnelFilters/REMOVE_CUSTOM_FILTER'; -const RESET_KEY = 'funnelFilters/RESET_KEY'; -const ADD_EVENT = 'funnelFilters/ADD_EVENT'; -const EDIT_EVENT = 'funnelFilters/EDIT_EVENT'; -const REMOVE_EVENT = 'funnelFilters/REMOVE_EVENT'; -const MOVE_EVENT = 'funnelFilters/MOVE_EVENT'; -const CLEAR_EVENTS = 'funnelFilters/CLEAR_EVENTS'; -const TOGGLE_FILTER_MODAL = 'funnelFilters/TOGGLE_FILTER_MODAL'; -const ADD_ATTRIBUTE = 'funnelFilters/ADD_ATTRIBUTE'; -const EDIT_ATTRIBUTE = 'funnelFilters/EDIT_ATTRIBUTE'; -const REMOVE_ATTRIBUTE = 'funnelFilters/REMOVE_ATTRIBUTE'; -const SET_ACTIVE_FLOW = 'funnelFilters/SET_ACTIVE_FLOW'; - -const SET_INITIAL_FILTER = 'funnelFilters/SET_INITIAL_FILTER'; - -const initialState = Map({ - activeFilter: null, - list: List(), - appliedFilter: Filter(), - activeFilterKey: null, - saveModalOpen: false, - customFilters: Map(), - searchQuery: '', - activeFlow: null, - filterOptions: Map({ - USEROS: Set(), - USERBROWSER: Set(), - USERDEVICE: Set(), - REFERRER: Set(), - USERCOUNTRY: Set(), - }), -}); - -let hasFilterOptions = false; - -const updateList = (state, instance) => state.update('list', (list) => { - const index = list.findIndex(item => item.filterId === instance.filterId); - return (index >= 0 - ? list.mergeIn([ index ], instance) - : list.push(instance) - ); -}); - -const reducer = (state = initialState, action = {}) => { - let optionsMap = null; - switch (action.type) { - case FETCH_FILTER_OPTIONS.SUCCESS: - // return state.mergeIn(['filterOptions', action.key], fromJS(action.data).map(item => ({text: item, value: item}))); - optionsMap = state.getIn(['filterOptions', action.key]).map(i => i.value).toJS(); - return state.mergeIn(['filterOptions', action.key], Set(action.data.filter(i => !optionsMap.includes(i.value)))); - case SET_FILTER_OPTIONS: - // optionsMap = state.getIn(['filterOptions', action.key]); - // optionsMap = optionsMap ? optionsMap.map(i => i.value).toJS() : [] - // return state.mergeIn(['filterOptions', action.key], Set(action.filterOption.filter(i => !optionsMap.includes(i.value)))); - const tmp = {} - let _state = state; - action.filters.forEach(f => { - if (f.type && f.value && f.value.length > 0) { - tmp[f.type] = tmp[f.type] ? tmp[f.type].concat(f.value) : f.value - } - }) - Object.keys(tmp).forEach(f => { - const options = List(tmp[f]).map(i => ({type: i, value: i})) // TODO should get the unique items - _state = _state.mergeIn(['filterOptions', f], options); - }) - - return _state; - case FETCH_LIST.SUCCESS: - return state; - case SAVE.SUCCESS: - return updateList(state, SavedFilter(action.data)) - .set('saveModalOpen', false); - case REMOVE.SUCCESS: - return state.update( - 'list', - list => list - .filter(filter => filter.filterId !== action.id), - ).set('activeFilter', null); - case SET_ACTIVE: - return state.set('activeFilter', action.filter); - case SET_ACTIVE_FLOW: - return state.set('activeFlow', action.flow); - case SET_ACTIVE_KEY: - return state.set('activeFilterKey', action.filterKey); - case APPLY: - return action.fromUrl - ? state.set('appliedFilter', - Filter(action.filter) - // .set('events', state.getIn([ 'appliedFilter', 'events' ])) - ) - : state.mergeIn(['instance', 'filter'], action.filter); - case ADD_CUSTOM_FILTER: - return state.update('customFilters', vars => vars.set(action.filter, action.value)); - case REMOVE_CUSTOM_FILTER: - return state.update('customFilters', vars => vars.remove(action.filterKey)); - case RESET_KEY: - if (action.key === 'rangeValue') { - return state - .removeIn([ 'appliedFilter', 'rangeValue' ]) - .removeIn([ 'appliedFilter', 'startDate' ]) - .removeIn([ 'appliedFilter', 'endDate' ]); - } else if (action.key === 'duration') { - return state - .removeIn([ 'appliedFilter', 'minDuration' ]) - .removeIn([ 'appliedFilter', 'maxDuration' ]); - } - return state.removeIn([ 'appliedFilter', action.key ]); - case ADD_EVENT: - const eventValue = action.event.value; - const event = Event(action.event).set('value', eventValue); - if (action.index >= 0) // replacing an event - return state.setIn([ 'appliedFilter', 'events', action.index ], event) - else - return state.updateIn([ 'appliedFilter', 'events' ], list => action.single - ? List([ event ]) - : list.push(event)); - case REMOVE_EVENT: - return state.removeIn([ 'appliedFilter', 'events', action.index ]); - case EDIT_EVENT: - return state.mergeIn([ 'appliedFilter', 'events', action.index], action.filter); - case TOGGLE_FILTER_MODAL: - return state.set('saveModalOpen', action.show); - case MOVE_EVENT: - const { fromI, toI } = action; - return state - .updateIn([ 'appliedFilter', 'events' ], list => - list.remove(fromI).insert(toI, list.get(fromI))); - case CLEAR_EVENTS: - return state.setIn([ 'appliedFilter', 'events' ], List()) - .setIn([ 'appliedFilter', 'filters' ], List()) - .set('searchQuery', ''); - - case ADD_ATTRIBUTE: - const filter = CustomFilter(action.filter); - - if (action.index >= 0) // replacing the filter - return state.setIn([ 'appliedFilter', 'filters', action.index], filter); - else - return state.updateIn([ 'appliedFilter', 'filters'], filters => filters.push(filter)); - case EDIT_ATTRIBUTE: - return state.setIn([ 'appliedFilter', 'filters', action.index, action.key ], action.value ); - case REMOVE_ATTRIBUTE: - return state.removeIn([ 'appliedFilter', 'filters', action.index ]); - case SET_SEARCH_QUERY: - return state.set('searchQuery', action.query); - case RESET: - return state.set('appliedFilter', Filter({})) - default: - return state; - } -}; - -export default withRequestState({ - _: [ REMOVE ], - fetchListRequest: FETCH_LIST, - saveRequest: SAVE, - fetchFilterOptions: FETCH_FILTER_OPTIONS, -}, reducer); - -const eventMap = ({value, type, key, operator, source, custom}) => ({value, type, key, operator, source, custom}); -const filterMap = ({value, type, key, operator, source, custom }) => ({value: Array.isArray(value) ? value: [value], custom, type, key, operator, source}); -const reduceThenFetchResource = actionCreator => (...args) => (dispatch, getState) => { - const action = actionCreator(...args); - dispatch(action); - const appliedFilters = getState().getIn([ 'funnelFilters', 'appliedFilter' ]); - const filter = appliedFilters - .update('events', list => list.map(event => event.set('value', event.value || '*')).map(eventMap)) - .toJS(); - - filter.filters = getState().getIn([ 'funnelFilters', 'appliedFilter', 'filters' ]) - .map(filterMap).toJS(); - - if (action.funnelId) { - dispatch(fetchFunnel(action.funnelId)) - dispatch(fetchInsights(action.funnelId, filter)) - dispatch(fetchIssuesFiltered(action.funnelId, filter)) - dispatch(fetchSessionsFiltered(action.funnelId, filter)) - } -} - -export function editAttribute(index, key, value) { - return { - type: EDIT_ATTRIBUTE, - index, - key, - value, - }; -} - -export function addAttribute(filter, index) { - return { - type: ADD_ATTRIBUTE, - filter, - index - }; -} - -export function removeAttribute(index) { - return { - type: REMOVE_ATTRIBUTE, - index, - }; -} - -export function fetchList(range) { - return { - types: FETCH_LIST.toArray(), - call: client => client.get(`/funnels`), - }; -} - -export function fetchFilterOptions(filter, q) { - return { - types: FETCH_FILTER_OPTIONS.toArray(), - call: client => client.get('/sessions/filters/search', { q, type: filter.type }), - key: filter.key - }; -} - -export function setFilterOptions(filters) { - return { - type: SET_FILTER_OPTIONS, - filters - } -} - -export function save(instance) { - return { - types: SAVE.toArray(), - call: client => client.post('/filters', instance.toData()), - instance, - }; -} - -export function remove(id) { - return { - types: REMOVE.toArray(), - call: client => client.delete(`/filters/${ id }`), - id, - }; -} - -export function setActive(filter) { - return { - type: SET_ACTIVE, - filter, - }; -} - -export function setActiveFlow(flow) { - return { - type: SET_ACTIVE_FLOW, - flow, - }; -} - -export function setActiveKey(filterKey) { - return { - type: SET_ACTIVE_KEY, - filterKey, - }; -} - -export const addCustomFilter = reduceThenFetchResource((filter, value) => ({ - type: ADD_CUSTOM_FILTER, - filter, - value, -})); - -export const removeCustomFilter = reduceThenFetchResource(filterKey => ({ - type: REMOVE_CUSTOM_FILTER, - filterKey, -})); - -export const applyFilter = reduceThenFetchResource((filter, funnelId, fromUrl=false) => ({ - type: APPLY, - filter, - funnelId, - fromUrl, -})); - -export const setInitialFilters = () => (dispatch, getState) => { - return dispatch({ - type: APPLY, - filter: getState().getIn(['funnels', 'instance', 'filter']) - }) -} - -export const applySavedFilter = reduceThenFetchResource((filter, fromUrl=false) => ({ - type: APPLY, - filter, - fromUrl, -})); - -export const resetFilterKey = reduceThenFetchResource(key => ({ - type: RESET_KEY, - key, -})); - -export const clearEvents = reduceThenFetchResource(() => ({ - type: CLEAR_EVENTS, -})); - -export function addEvent(event, single = false, index) { - return { - type: ADD_EVENT, - event, - single, - index - }; -} - -export const removeEvent = reduceThenFetchResource((index, funnelId) => ({ - type: REMOVE_EVENT, - index, - funnelId -})); - -export function moveEvent(fromI, toI) { - return { - type: MOVE_EVENT, - fromI, - toI, - }; -} - -export const editEvent = reduceThenFetchResource((index, filter, funnelId) => ({ - type: EDIT_EVENT, - index, - filter, - funnelId -})) - -export function toggleFilterModal(show) { - return { - type: TOGGLE_FILTER_MODAL, - show, - }; -} - -export function setSearchQuery(query) { - return { - type: SET_SEARCH_QUERY, - query - } -} - -export function resetFunnelFilters() { - return { - type: RESET - } -} \ No newline at end of file diff --git a/frontend/app/duck/index.ts b/frontend/app/duck/index.ts index 8b9698c8d..fb5c500ec 100644 --- a/frontend/app/duck/index.ts +++ b/frontend/app/duck/index.ts @@ -9,7 +9,6 @@ import site from './site'; import customFields from './customField'; import integrations from './integrations'; import errors from './errors'; -import customMetrics from './customMetrics'; import search from './search'; import liveSearch from './liveSearch'; @@ -20,13 +19,12 @@ const rootReducer = combineReducers({ site, customFields, errors, - customMetrics, search, liveSearch, ...integrations, - ...sources, + ...sources }); export type RootStore = ReturnType -export default rootReducer +export default rootReducer;