-
-
-
-
-
-
+
);
};
diff --git a/frontend/app/components/shared/SaveFilterButton/SaveFilterButton.tsx b/frontend/app/components/shared/SaveFilterButton/SaveFilterButton.tsx
index 61fe72edf..dc6df25e1 100644
--- a/frontend/app/components/shared/SaveFilterButton/SaveFilterButton.tsx
+++ b/frontend/app/components/shared/SaveFilterButton/SaveFilterButton.tsx
@@ -1,24 +1,28 @@
import React, { useState } from 'react';
-import { Button } from 'UI';
+import { Button } from 'antd';
import SaveSearchModal from 'Shared/SaveSearchModal';
import { observer } from 'mobx-react-lite';
import { useStore } from 'App/mstore';
-
-function SaveFilterButton() {
+function SaveFilterButton({ disabled }: { disabled?: boolean }) {
const { searchStore } = useStore();
const savedSearch = searchStore.savedSearch;
const [showModal, setshowModal] = useState(false);
return (
- {showModal && ( setshowModal(false)} />)}
+ {showModal && (
+ setshowModal(false)}
+ />
+ )}
);
}
diff --git a/frontend/app/components/shared/SearchActions/SearchActions.tsx b/frontend/app/components/shared/SearchActions/SearchActions.tsx
new file mode 100644
index 000000000..52dbcd5fd
--- /dev/null
+++ b/frontend/app/components/shared/SearchActions/SearchActions.tsx
@@ -0,0 +1,53 @@
+import React from 'react';
+import AnimatedSVG, { ICONS } from 'Shared/AnimatedSVG/AnimatedSVG';
+import SaveFilterButton from 'Shared/SaveFilterButton';
+import { observer } from 'mobx-react-lite';
+import { useStore } from 'App/mstore';
+import TagList from '../MainSearchBar/components/TagList';
+import SavedSearch from '../SavedSearch/SavedSearch';
+import { Button } from 'antd';
+
+function SearchActions() {
+ const { aiFiltersStore, searchStore, customFieldStore } = useStore();
+ const appliedFilter = searchStore.instance;
+ const metaLoading = customFieldStore.isLoading;
+ const hasEvents =
+ appliedFilter.filters.filter((i: any) => i.isEvent).length > 0;
+ const hasFilters =
+ appliedFilter.filters.filter((i: any) => !i.isEvent).length > 0;
+ const savedSearch = searchStore.savedSearch;
+ const hasSavedSearch = savedSearch && savedSearch.exists();
+ const hasSearch = hasFilters || hasSavedSearch;
+
+ const showPanel = hasEvents || hasFilters || aiFiltersStore.isLoading;
+ return !metaLoading ? (
+
+
+
+
+
+
+
+
+ {showPanel ? (
+ <>
+ {aiFiltersStore.isLoading ? (
+
+
+
Translating your query into search steps...
+
+ ) : null}
+ >
+ ) : null}
+
+ ) : null;
+}
+
+export default observer(SearchActions);
diff --git a/frontend/app/components/shared/SearchActions/index.ts b/frontend/app/components/shared/SearchActions/index.ts
new file mode 100644
index 000000000..120182f5c
--- /dev/null
+++ b/frontend/app/components/shared/SearchActions/index.ts
@@ -0,0 +1 @@
+export { default } from './SearchActions';
\ No newline at end of file
diff --git a/frontend/app/components/shared/SessionSearchField/AiSessionSearchField.tsx b/frontend/app/components/shared/SessionFilters/AiSessionSearchField.tsx
similarity index 100%
rename from frontend/app/components/shared/SessionSearchField/AiSessionSearchField.tsx
rename to frontend/app/components/shared/SessionFilters/AiSessionSearchField.tsx
diff --git a/frontend/app/components/shared/SessionFilters/SessionFilters.tsx b/frontend/app/components/shared/SessionFilters/SessionFilters.tsx
new file mode 100644
index 000000000..7297b2d15
--- /dev/null
+++ b/frontend/app/components/shared/SessionFilters/SessionFilters.tsx
@@ -0,0 +1,97 @@
+import React, { useEffect } from 'react';
+import { debounce } from 'App/utils';
+import FilterList from 'Shared/Filters/FilterList';
+
+import { observer } from 'mobx-react-lite';
+import { useStore } from 'App/mstore';
+import useSessionSearchQueryHandler from 'App/hooks/useSessionSearchQueryHandler';
+import { FilterKey } from 'App/types/filter/filterType';
+import { addOptionsToFilter } from 'App/types/filter/newFilter';
+
+let debounceFetch: any = () => {};
+function SessionFilters() {
+ const {
+ searchStore,
+ projectsStore,
+ customFieldStore,
+ tagWatchStore,
+ } = useStore();
+
+ const appliedFilter = searchStore.instance;
+ const metaLoading = customFieldStore.isLoading;
+ const saveRequestPayloads =
+ projectsStore.instance?.saveRequestPayloads ?? false;
+
+ useSessionSearchQueryHandler({
+ appliedFilter,
+ loading: metaLoading,
+ onBeforeLoad: async () => {
+ const tags = await tagWatchStore.getTags();
+ if (tags) {
+ addOptionsToFilter(
+ FilterKey.TAGGED_ELEMENT,
+ tags.map((tag) => ({
+ label: tag.name,
+ value: tag.tagId.toString(),
+ }))
+ );
+ searchStore.refreshFilterOptions();
+ }
+ },
+ });
+
+ useEffect(() => {
+ debounceFetch = debounce(() => searchStore.fetchSessions(), 500);
+ }, []);
+
+ useEffect(() => {
+ debounceFetch();
+ }, [appliedFilter.filters]);
+
+ const onAddFilter = (filter: any) => {
+ searchStore.addFilter(filter);
+ };
+
+ const onUpdateFilter = (filterIndex: any, filter: any) => {
+ searchStore.updateFilter(filterIndex, filter);
+ };
+
+ const onFilterMove = (newFilters: any) => {
+ searchStore.updateFilter(0, {
+ ...appliedFilter,
+ filters: newFilters,
+ });
+
+ debounceFetch();
+ };
+
+ const onRemoveFilter = (filterIndex: any) => {
+ searchStore.removeFilter(filterIndex);
+
+ debounceFetch();
+ };
+
+ const onChangeEventsOrder = (e: any, { value }: any) => {
+ searchStore.edit({
+ eventsOrder: value,
+ });
+
+ debounceFetch();
+ };
+
+ return (
+
+
+
+ );
+}
+
+export default observer(SessionFilters);
diff --git a/frontend/app/components/shared/SessionSearchField/SessionSearchField.module.css b/frontend/app/components/shared/SessionFilters/SessionSearchField.module.css
similarity index 100%
rename from frontend/app/components/shared/SessionSearchField/SessionSearchField.module.css
rename to frontend/app/components/shared/SessionFilters/SessionSearchField.module.css
diff --git a/frontend/app/components/shared/SessionFilters/index.ts b/frontend/app/components/shared/SessionFilters/index.ts
new file mode 100644
index 000000000..9493929ff
--- /dev/null
+++ b/frontend/app/components/shared/SessionFilters/index.ts
@@ -0,0 +1 @@
+export { default } from './SessionFilters';
\ No newline at end of file
diff --git a/frontend/app/components/shared/SessionSearch/SessionSearch.tsx b/frontend/app/components/shared/SessionSearch/SessionSearch.tsx
deleted file mode 100644
index 99e830466..000000000
--- a/frontend/app/components/shared/SessionSearch/SessionSearch.tsx
+++ /dev/null
@@ -1,133 +0,0 @@
-import React, { useEffect } from 'react';
-import AnimatedSVG, { ICONS } from 'Shared/AnimatedSVG/AnimatedSVG';
-import FilterList from 'Shared/Filters/FilterList';
-import FilterSelection from 'Shared/Filters/FilterSelection';
-import SaveFilterButton from 'Shared/SaveFilterButton';
-import { FilterKey } from 'Types/filter/filterType';
-import { addOptionsToFilter } from 'Types/filter/newFilter';
-import { Button, Loader } from 'UI';
-import { observer } from 'mobx-react-lite';
-import { useStore } from 'App/mstore';
-import { debounce } from 'App/utils';
-import useSessionSearchQueryHandler from 'App/hooks/useSessionSearchQueryHandler';
-
-let debounceFetch: any = () => {
-};
-
-function SessionSearch() {
- const { tagWatchStore, aiFiltersStore, searchStore, customFieldStore, projectsStore } = useStore();
- const appliedFilter = searchStore.instance;
- const metaLoading = customFieldStore.isLoading;
- const hasEvents = appliedFilter.filters.filter((i: any) => i.isEvent).length > 0;
- const hasFilters = appliedFilter.filters.filter((i: any) => !i.isEvent).length > 0;
- const saveRequestPayloads = projectsStore.instance?.saveRequestPayloads ?? false;
-
- useSessionSearchQueryHandler({
- appliedFilter,
- loading: metaLoading,
- onBeforeLoad: async () => {
- const tags = await tagWatchStore.getTags();
- if (tags) {
- addOptionsToFilter(
- FilterKey.TAGGED_ELEMENT,
- tags.map((tag) => ({
- label: tag.name,
- value: tag.tagId.toString()
- }))
- );
- searchStore.refreshFilterOptions();
- }
- }
- });
-
- useEffect(() => {
- debounceFetch = debounce(() => searchStore.fetchSessions(), 500);
- // void searchStore.fetchSessions(true)
- }, []);
-
- useEffect(() => {
- debounceFetch();
- }, [appliedFilter.filters]);
-
- const onAddFilter = (filter: any) => {
- searchStore.addFilter(filter);
- };
-
- const onUpdateFilter = (filterIndex: any, filter: any) => {
- searchStore.updateFilter(filterIndex, filter);
- };
-
- const onFilterMove = (newFilters: any) => {
- searchStore.updateFilter(0, {
- ...appliedFilter,
- filters: newFilters
- });
-
- debounceFetch();
- };
-
- const onRemoveFilter = (filterIndex: any) => {
- const newFilters = appliedFilter.filters.filter((_filter: any, i: any) => {
- return i !== filterIndex;
- });
-
- searchStore.removeFilter(filterIndex);
-
- debounceFetch();
- };
-
- const onChangeEventsOrder = (e: any, { value }: any) => {
- searchStore.edit({
- eventsOrder: value
- });
-
- debounceFetch();
- };
-
- const showPanel = hasEvents || hasFilters || aiFiltersStore.isLoading;
- return !metaLoading ? (
- <>
- {showPanel ? (
-
-
- {aiFiltersStore.isLoading ? (
-
-
-
Translating your query into search steps...
-
- ) : null}
- {hasEvents || hasFilters ? (
-
- ) : null}
-
-
- {hasEvents || hasFilters ? (
-
-
-
-
-
-
-
-
-
-
- ) : null}
-
- ) : (
- <>>
- )}
- >
- ) : null;
-}
-
-export default observer(SessionSearch);
diff --git a/frontend/app/components/shared/SessionSearch/index.ts b/frontend/app/components/shared/SessionSearch/index.ts
deleted file mode 100644
index d9c909f0d..000000000
--- a/frontend/app/components/shared/SessionSearch/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from './SessionSearch';
\ No newline at end of file
diff --git a/frontend/app/components/shared/SessionSearchField/SessionSearchField.tsx b/frontend/app/components/shared/SessionSearchField/SessionSearchField.tsx
deleted file mode 100644
index ff1a04afc..000000000
--- a/frontend/app/components/shared/SessionSearchField/SessionSearchField.tsx
+++ /dev/null
@@ -1,71 +0,0 @@
-import React, { useState } from 'react';
-import { Input } from 'UI';
-import FilterModal from 'Shared/Filters/FilterModal';
-import { debounce } from 'App/utils';
-import { assist as assistRoute, isRoute } from 'App/routes';
-
-const ASSIST_ROUTE = assistRoute();
-import { observer } from 'mobx-react-lite';
-import { useStore } from 'App/mstore';
-
-interface Props {
-
-}
-
-function SessionSearchField(props: Props) {
- const { searchStore, searchStoreLive } = useStore();
- const isLive =
- isRoute(ASSIST_ROUTE, window.location.pathname) ||
- window.location.pathname.includes('multiview');
-
- const fetchFilterSearch = isLive
- ? searchStoreLive.fetchFilterSearch.bind(searchStoreLive)
- : searchStore.fetchFilterSearch.bind(searchStore);
-
- const debounceFetchFilterSearch = React.useCallback(
- debounce(fetchFilterSearch, 1000),
- []
- );
- const [showModal, setShowModal] = useState(false);
- const [searchQuery, setSearchQuery] = useState('');
-
- const onSearchChange = ({ target: { value } }: any) => {
- setSearchQuery(value);
- debounceFetchFilterSearch({ q: value });
- };
-
- const onAddFilter = (filter: any) => {
- isLive
- ? searchStoreLive.addFilterByKeyAndValue(filter.key, filter.value)
- : searchStore.addFilterByKeyAndValue(filter.key, filter.value);
- };
-
- return (
-
-
setShowModal(true)}
- onBlur={() => setTimeout(setShowModal, 200, false)}
- onChange={onSearchChange}
- placeholder={'Search sessions using any captured event (click, input, page, error...)'}
- style={{ minWidth: 360 }}
- id="search"
- type="search"
- autoComplete="off"
- className="hover:border-gray-medium text-lg placeholder-lg h-9 shadow-sm"
- />
-
- {showModal && (
-
-
-
- )}
-
- );
-}
-
-export default observer(SessionSearchField);
diff --git a/frontend/app/components/shared/SessionSearchField/index.ts b/frontend/app/components/shared/SessionSearchField/index.ts
deleted file mode 100644
index 1f99e0c0b..000000000
--- a/frontend/app/components/shared/SessionSearchField/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from './SessionSearchField';
\ No newline at end of file
diff --git a/frontend/app/styles/general.css b/frontend/app/styles/general.css
index 05d022b1b..e95217db4 100644
--- a/frontend/app/styles/general.css
+++ b/frontend/app/styles/general.css
@@ -436,3 +436,9 @@ p {
display: flex;
align-items: center;
}
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ -webkit-appearance: none; /* Remove default styling */
+ appearance: none;
+ margin: 0; /* Fix margin if necessary */
+}