Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • in-sylva-development/in-sylva.search.app
1 result
Show changes
Commits on Source (11)
Showing
with 764 additions and 701 deletions
......@@ -4,28 +4,27 @@
"private": true,
"homepage": ".",
"dependencies": {
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-i18next": "^14.1.1",
"react-router-dom": "^6.24.1",
"react-scripts": "^5.0.1",
"react-use-storage": "^0.5.1",
"@elastic/eui": "^95.3.0",
"@elastic/datemath": "^5.0.3",
"@elastic/eui": "^27.4.0",
"@in-sylva/json-view": "git+ssh://git@forgemia.inra.fr:in-sylva-development/json-view.git",
"@in-sylva/react-use-storage": "git+ssh://git@forgemia.inra.fr:in-sylva-development/react-use-storage.git",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
"@material-ui/lab": "^4.0.0-alpha.48",
"@material-ui/styles": "^4.10.0",
"downloadjs": "^1.4.7",
"i18next": "^23.11.2",
"i18next-http-backend": "^2.5.1",
"@mui/material": "^5.15.21",
"@mui/icons-material": "^5.15.21",
"mui-datatables": "^4.3.0",
"moment": "^2.27.0",
"mui-datatables": "^3.4.0",
"ol": "^6.3.2-dev.1594217558556",
"proj4": "^2.11.0",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-hanger": "^2.2.1",
"react-html-parser": "^2.0.2",
"react-i18next": "^14.1.1",
"react-router-dom": "^5.2.0",
"react-scripts": "^3.3.0"
"@emotion/css": "^11.11.2",
"@emotion/react": "^11.11.4",
"@emotion/styled": "^11.11.5",
"i18next": "^23.11.5",
"i18next-http-backend": "^2.5.2",
"@microlink/react-json-view": "^1.23.1",
"downloadjs": "^1.4.7",
"ol": "^9.2.4",
"proj4": "^2.11.0"
},
"scripts": {
"start": "react-scripts start",
......@@ -52,7 +51,6 @@
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.1.3",
"husky": "8.0.3",
"jscs": "^3.0.7",
"lint-staged": "14.0.1",
"prettier": "^3.2.5"
},
......@@ -62,6 +60,9 @@
}
},
"eslintConfig": {
"rules": {
"react/prop-types": "off"
},
"env": {
"node": true,
"browser": true,
......@@ -69,8 +70,7 @@
},
"extends": [
"plugin:react/recommended",
"plugin:prettier/recommended",
"airbnb"
"plugin:prettier/recommended"
],
"parserOptions": {
"ecmaFeatures": {
......
......@@ -9,5 +9,9 @@
"send": "Send",
"save": "Save",
"validate": "Validate"
},
"errorPage": {
"title": "An error has occurred.",
"reload": "Reload page to try again."
}
}
{
"pageTitle": "In-Sylva Metadata Search Platform",
"tabs": {
"composeSearch": "Compose search",
"results": "Results",
......@@ -24,10 +23,9 @@
"removeFieldButton": "Remove field",
"clearValues": "Clear values",
"addFieldPopover": {
"openPopoverButton": "Add field",
"title": "Select a field",
"button": "Add this field",
"selectSection": "Select a section"
"title": "Add a field",
"selectSection": "Select a field",
"validateButton": "Add this field"
},
"fieldContentPopover": {
"addFieldValues": "Add field values",
......@@ -35,9 +33,25 @@
"firstValue": "1st value",
"secondValue": "2nd value",
"inputTextValue": "Type value",
"betweenDate": "between",
"andDate": "and",
"selectValues": "Select values"
"betweenDate": "Between",
"andDate": "And",
"dateSelection": "Select a date",
"selectValues": "Select values",
"operatorSelection": {
"label": "Select an operator",
"numeric": {
"value": "Equal to",
"under": "Under",
"over": "Over",
"range": "Within a range"
},
"date": {
"value": "Exact date",
"before": "Before a certain day",
"after": "After a certain day",
"range": "Within a range"
}
}
}
},
"searchHistory": {
......@@ -49,8 +63,8 @@
},
"searchOptions": {
"title": "Search option",
"matchAll": "Match all criterias",
"matchAtLeastOne": "Match at least one criteria"
"matchAll": "Match all fields criteria",
"matchAtLeastOne": "Match at least one field criteria"
},
"partnerSources": {
"title": "Partner sources",
......
......@@ -9,5 +9,9 @@
"send": "Envoyer",
"save": "Sauvegarder",
"validate": "Valider"
},
"errorPage": {
"title": "Une erreur est survenue.",
"reload": "Rechargez la page pour essayer à nouveau."
}
}
{
"pageTitle": "Plateforme de recherche de métadonnées In-Sylva",
"tabs": {
"composeSearch": "Composer une recherche",
"results": "Résultats",
......@@ -24,10 +23,9 @@
"removeFieldButton": "Supprimer le champ",
"clearValues": "Vider les valeurs",
"addFieldPopover": {
"openPopoverButton": "Selectionnez un champ",
"title": "Ajouter ce champ",
"button": "Selectionnez une section",
"selectSection": "Ajouter un champ"
"title": "Ajouter un champ",
"selectSection": "Sélectionnez un champ",
"validateButton": "Ajouter ce champ"
},
"fieldContentPopover": {
"addValue": "Ajouter une valeur",
......@@ -35,9 +33,25 @@
"firstValue": "1ère valeur",
"secondValue": "2ème valeur",
"inputTextValue": "Entrez une valeur",
"betweenDate": "entre",
"andDate": "et",
"selectValues": "Sélectionnez au moins une valeur"
"betweenDate": "Entre le",
"andDate": "Et le",
"dateSelection": "Choisir une date",
"selectValues": "Sélectionnez au moins une valeur",
"operatorSelection": {
"label": "Sélectionnez un opérateur",
"numeric": {
"value": "Egal à",
"under": "Inférieur à",
"over": "Supérieur à",
"range": "Dans un interval"
},
"date": {
"value": "Date exacte",
"before": "Avant une date",
"after": "Après une date",
"range": "Dans une période de temps"
}
}
}
},
"searchHistory": {
......@@ -49,8 +63,8 @@
},
"searchOptions": {
"title": "Option de recherche",
"matchAll": "Répondre à tous les critères",
"matchAtLeastOne": "Répondre à au moins un critère"
"matchAll": "Répondre à tous les critères de champ",
"matchAtLeastOne": "Répondre à minimum un critère de champ"
},
"partnerSources": {
"title": "Liste des sources de partenaires",
......
import React from 'react';
import { EuiPage, EuiPageBody } from '@elastic/eui';
import { HashRouter, Route, Switch, Redirect } from 'react-router-dom';
import {
RouterProvider,
createHashRouter,
Route,
createRoutesFromElements,
Navigate,
} from 'react-router-dom';
import Home from './pages/home';
import Search from './pages/search';
import Profile from './pages/profile';
import Layout from './components/Layout';
import ErrorBoundary from './pages/error/ErrorBoundary';
const App = () => {
return (
<EuiPage style={{ padding: '0px' }} restrictWidth={false}>
<EuiPageBody>
<HashRouter>
<Switch>
<Route exact path="/" render={() => <Redirect to="/app/home" />} />
<Route component={Layout} />
</Switch>
</HashRouter>
</EuiPageBody>
</EuiPage>
const router = createHashRouter(
createRoutesFromElements(
<>
<Route path="/" element={<Navigate to="/app/home" />} />
<Route errorElement={<ErrorBoundary />} element={<Layout />}>
<Route index path="/app/home" element={<Home />} />
<Route path="/app/search" element={<Search />} />
<Route path="/app/profile" element={<Profile />} />
</Route>
</>
)
);
return <RouterProvider router={router} />;
};
export default App;
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
it('renders without crashing', () => {
const div = document.createElement('div');
ReactDOM.render(<App />, div);
ReactDOM.unmountComponentAtNode(div);
});
import React from 'react';
import { Link } from 'react-router-dom';
import { NavLink } from 'react-router-dom';
import {
EuiHeader,
EuiHeaderSection,
......@@ -13,18 +13,16 @@ import logoInSylva from '../../assets/favicon.svg';
import { useTranslation } from 'react-i18next';
import LanguageSwitcher from '../LanguageSwitcher/LanguageSwitcher';
const structure = [
const routes = [
{
id: 0,
label: 'home',
href: '/app/home',
icon: '',
},
{
id: 1,
label: 'search',
href: '/app/search',
icon: '',
},
];
......@@ -32,30 +30,28 @@ const Header = () => {
const { t } = useTranslation(['header', 'common']);
return (
<>
<EuiHeader>
<EuiHeaderSection grow={true}>
<EuiHeaderSectionItem>
<img style={style.logo} src={logoInSylva} alt={t('common:inSylvaLogoAlt')} />
</EuiHeaderSectionItem>
<EuiHeaderLinks>
{structure.map((link) => (
<EuiHeaderLink iconType="empty" key={link.id}>
<Link to={link.href}>{t(`tabs.${link.label}`)}</Link>
</EuiHeaderLink>
))}
</EuiHeaderLinks>
</EuiHeaderSection>
<EuiHeaderSection side="right">
<EuiHeaderSectionItem style={style.languageSwitcherItem} border={'none'}>
<LanguageSwitcher />
</EuiHeaderSectionItem>
<EuiHeaderSectionItem style={style.userMenuItem} border={'none'}>
<HeaderUserMenu />
</EuiHeaderSectionItem>
</EuiHeaderSection>
</EuiHeader>
</>
<EuiHeader>
<EuiHeaderSection grow={true}>
<EuiHeaderSectionItem>
<img style={style.logo} src={logoInSylva} alt={t('common:inSylvaLogoAlt')} />
</EuiHeaderSectionItem>
<EuiHeaderLinks>
{routes.map((link) => (
<EuiHeaderLink key={link.id}>
<NavLink to={link.href}>{t(`tabs.${link.label}`)}</NavLink>
</EuiHeaderLink>
))}
</EuiHeaderLinks>
</EuiHeaderSection>
<EuiHeaderSection side="right">
<EuiHeaderSectionItem style={style.languageSwitcherItem} border={'none'}>
<LanguageSwitcher />
</EuiHeaderSectionItem>
<EuiHeaderSectionItem style={style.userMenuItem} border={'none'}>
<HeaderUserMenu />
</EuiHeaderSectionItem>
</EuiHeaderSection>
</EuiHeader>
);
};
......
......@@ -50,41 +50,37 @@ const HeaderUserMenu = () => {
return user.username ? (
<EuiPopover
id="headerUserMenu"
ownFocus
button={HeaderUserButton}
isOpen={isOpen}
anchorPosition="downRight"
closePopover={closeMenu}
panelPaddingSize="none"
button={HeaderUserButton}
anchorPosition="downRight"
ownFocus
>
<div>
<EuiFlexGroup gutterSize="m" className="euiHeaderProfile" responsive={false}>
<EuiFlexItem grow={false}>
<EuiAvatar name={user.username} size="xl" />
</EuiFlexItem>
<EuiFlexItem>
<EuiText>{user.username}</EuiText>
<EuiSpacer size="m" />
<EuiFlexGroup>
<EuiFlexItem>
<EuiFlexGroup justifyContent="spaceBetween">
<EuiFlexItem grow={false}>
<EuiLink href="#/app/profile">
{t('userMenu.editProfileButton')}
</EuiLink>
</EuiFlexItem>
<EuiFlexItem grow={false}>
<EuiLink onClick={() => signOut()}>
{t('userMenu.logOutButton')}
</EuiLink>
</EuiFlexItem>
</EuiFlexGroup>
</EuiFlexItem>
</EuiFlexGroup>
</EuiFlexItem>
</EuiFlexGroup>
</div>
<EuiFlexGroup gutterSize="m" responsive={false}>
<EuiFlexItem grow={false}>
<EuiAvatar name={user.username} size="xl" />
</EuiFlexItem>
<EuiFlexItem>
<EuiText>{user.username}</EuiText>
<EuiSpacer size="m" />
<EuiFlexGroup>
<EuiFlexItem>
<EuiFlexGroup justifyContent="spaceBetween">
<EuiFlexItem grow={false}>
<EuiLink href="#/app/profile" onClick={closeMenu}>
{t('userMenu.editProfileButton')}
</EuiLink>
</EuiFlexItem>
<EuiFlexItem grow={false}>
<EuiLink onClick={() => signOut()}>
{t('userMenu.logOutButton')}
</EuiLink>
</EuiFlexItem>
</EuiFlexGroup>
</EuiFlexItem>
</EuiFlexGroup>
</EuiFlexItem>
</EuiFlexGroup>
</EuiPopover>
) : (
<></>
......
import React from 'react';
import { Route, Switch, withRouter } from 'react-router-dom';
import { Outlet } from 'react-router-dom';
import Header from '../../components/Header';
import Search from '../../pages/search';
import Home from '../../pages/home';
import Profile from '../../pages/profile';
import { EuiPageContent } from '@elastic/eui';
import { EuiPage, EuiPageBody, EuiPageSection } from '@elastic/eui';
import styles from './styles.js';
const Layout = () => {
return (
<>
<Header />
<EuiPageContent style={styles.pageContent}>
<Switch>
<Route path="/app/home" component={Home} />
<Route path="/app/search" component={Search} />
<Route path="/app/profile" component={Profile} />
</Switch>
</EuiPageContent>
</>
<EuiPage style={styles.page} restrictWidth={false}>
<EuiPageBody>
<Header />
<EuiPageSection style={styles.pageContent} grow={true}>
<Outlet />
</EuiPageSection>
</EuiPageBody>
</EuiPage>
);
};
export default withRouter(Layout);
export default Layout;
const styles = {
page: {
padding: '0px',
},
pageContent: {
borderRadius: 0,
border: 0,
boxShadow: 'none',
backgroundColor: '#ffffff',
},
};
......
import React, { Suspense } from 'react';
import ReactDOM from 'react-dom';
import '@elastic/eui/dist/eui_theme_light.css';
import { UserProvider, checkUserLogin } from './context/UserContext';
import App from './App';
import { getLoginUrl, getUrlParam, redirect } from './Utils.js';
import './i18n';
import Loading from './components/Loading';
import { createRoot } from 'react-dom/client';
import { EuiProvider } from '@elastic/eui';
const userId = getUrlParam('kcId', '');
const accessToken = getUrlParam('accessToken', '');
......@@ -16,13 +17,15 @@ if (refreshToken.includes('#/app/search')) {
checkUserLogin(userId, accessToken, refreshToken);
if (sessionStorage.getItem('access_token')) {
ReactDOM.render(
const root = createRoot(document.getElementById('root'));
root.render(
<UserProvider>
<Suspense fallback={<Loading />}>
<App userId={userId} accessToken={accessToken} refreshToken={refreshToken} />
<EuiProvider>
<App />
</EuiProvider>
</Suspense>
</UserProvider>,
document.getElementById('root')
</UserProvider>
);
} else {
redirect(getLoginUrl() + '?requestType=search');
......
import React from 'react';
import { EuiFlexGroup, EuiPage, EuiTitle } from '@elastic/eui';
import { useTranslation } from 'react-i18next';
import { useRouteError } from 'react-router-dom';
const ErrorBoundary = () => {
const { t } = useTranslation('common');
const error = useRouteError();
console.error(error);
return (
<EuiPage grow={true} style={{ height: '100vh' }}>
<EuiFlexGroup alignItems={'center'} justifyContent={'center'} direction={'column'}>
<EuiTitle size={'l'}>
<h2>{t('common:errorPage.title')}</h2>
</EuiTitle>
<EuiTitle size={'s'}>
<h2>{t('common:errorPage.reload')}</h2>
</EuiTitle>
</EuiFlexGroup>
</EuiPage>
);
};
export default ErrorBoundary;
import React from 'react';
import {
EuiPageContentHeader,
EuiPageContentHeaderSection,
EuiTitle,
} from '@elastic/eui';
import { useTranslation } from 'react-i18next';
import { EuiTitle, EuiSpacer } from '@elastic/eui';
const Home = () => {
const { t } = useTranslation('home');
return (
<EuiPageContentHeader>
<EuiPageContentHeaderSection>
<EuiTitle>
<h2>{t('pageTitle')}</h2>
</EuiTitle>
<br />
<p>{t('searchToolDescription.part1')}</p>
<br />
<p>{t('searchToolDescription.part2')}</p>
<br />
<p>{t('searchToolDescription.part3')}</p>
<br />
<p>{t('searchToolDescription.part4')}</p>
<br />
<p>{t('searchToolDescription.part5')}</p>
<br />
<p>{t('searchToolDescription.part6')}</p>
</EuiPageContentHeaderSection>
</EuiPageContentHeader>
<>
<EuiTitle size="m">
<h4>{t('home:pageTitle')}</h4>
</EuiTitle>
<EuiSpacer size={'l'} />
<p>{t('home:searchToolDescription.part1')}</p>
<br />
<p>{t('home:searchToolDescription.part2')}</p>
<br />
<p>{t('home:searchToolDescription.part3')}</p>
<br />
<p>{t('home:searchToolDescription.part4')}</p>
<br />
<p>{t('home:searchToolDescription.part5')}</p>
<br />
<p>{t('home:searchToolDescription.part6')}</p>
</>
);
};
......
......@@ -159,7 +159,7 @@ const Profile = () => {
};
const onSendGroupRequest = () => {
const groupList = [];
let groupList = [];
if (userGroups) {
userGroups.forEach((group) => {
groupList.push(group.label);
......@@ -174,92 +174,85 @@ const Profile = () => {
return (
<>
<EuiPageContentHeader>
<EuiPageContentHeaderSection>
<EuiTitle>
<h2>{t('pageTitle')}</h2>
</EuiTitle>
</EuiPageContentHeaderSection>
</EuiPageContentHeader>
<EuiPageContentBody>
<EuiForm component="form">
<EuiTitle size="s">
<h3>{t('groups.groupsList')}</h3>
</EuiTitle>
<EuiFormRow fullWidth label="">
<EuiBasicTable items={groups} columns={groupColumns} />
</EuiFormRow>
<EuiSpacer size="l" />
<EuiTitle size="s">
<h3>{t('requestsList.requestsList')}</h3>
</EuiTitle>
<EuiFormRow fullWidth label="">
<EuiBasicTable items={userRequests} columns={requestsColumns} />
</EuiFormRow>
<EuiSpacer size="l" />
<EuiTitle size="s">
<h3>{t('groupRequests.requestGroupAssignment')}</h3>
</EuiTitle>
{getUserGroupLabels() ? (
<p
style={styles.currentRoleOrGroupText}
>{`${t('groupRequests.currentGroups')} ${getUserGroupLabels()}`}</p>
) : (
<p>{t('groupRequests.noGroup')}</p>
)}
<EuiFormRow error={valueError} isInvalid={valueError !== undefined}>
<EuiComboBox
placeholder={'Select groups'}
options={groups}
selectedOptions={userGroups}
onChange={(selectedOptions) => {
setValueError(undefined);
setUserGroups(selectedOptions);
}}
onSearchChange={onValueSearchChange}
/>
</EuiFormRow>
<EuiSpacer size="m" />
<EuiButton
onClick={() => {
onSendGroupRequest();
}}
fill
>
{t('common:validationActions.send')}
</EuiButton>
<EuiSpacer size="l" />
<EuiTitle size="s">
<h3>{t('roleRequests.requestRoleAssignment')}</h3>
</EuiTitle>
{userRole ? (
<p
style={styles.currentRoleOrGroupText}
>{`${t('roleRequests.currentRole')} ${userRole}`}</p>
) : (
<></>
)}
<EuiFormRow>
<EuiSelect
hasNoInitialSelection
options={roles}
value={selectedRole}
onChange={(e) => {
setSelectedRole(e.target.value);
}}
/>
</EuiFormRow>
<EuiSpacer size="m" />
<EuiButton
onClick={() => {
onSendRoleRequest();
}}
fill
>
{t('common:validationActions.send')}
</EuiButton>
</EuiForm>
</EuiPageContentBody>
<EuiTitle>
<h2>{t('pageTitle')}</h2>
</EuiTitle>
<EuiSpacer size={'l'} />
<EuiTitle size="s">
<h3>{t('groups.groupsList')}</h3>
</EuiTitle>
<EuiFormRow fullWidth label="">
<EuiBasicTable items={groups} columns={groupColumns} />
</EuiFormRow>
<EuiSpacer size="l" />
<EuiTitle size="s">
<h3>{t('requestsList.requestsList')}</h3>
</EuiTitle>
<EuiFormRow fullWidth label="">
<EuiBasicTable items={userRequests} columns={requestsColumns} />
</EuiFormRow>
<EuiSpacer size="l" />
<EuiTitle size="s">
<h3>{t('groupRequests.requestGroupAssignment')}</h3>
</EuiTitle>
{getUserGroupLabels() ? (
<p
style={styles.currentRoleOrGroupText}
>{`${t('groupRequests.currentGroups')} ${getUserGroupLabels()}`}</p>
) : (
<p>{t('groupRequests.noGroup')}</p>
)}
<EuiFormRow error={valueError} isInvalid={valueError !== undefined}>
<EuiComboBox
placeholder={'Select groups'}
options={groups}
selectedOptions={userGroups}
onChange={(selectedOptions) => {
setValueError(undefined);
setUserGroups(selectedOptions);
}}
onSearchChange={onValueSearchChange}
/>
</EuiFormRow>
<EuiSpacer size="m" />
<EuiButton
onClick={() => {
onSendGroupRequest();
}}
fill
>
{t('common:validationActions.send')}
</EuiButton>
<EuiSpacer size="l" />
<EuiTitle size="s">
<h3>{t('roleRequests.requestRoleAssignment')}</h3>
</EuiTitle>
{userRole ? (
<p
style={styles.currentRoleOrGroupText}
>{`${t('roleRequests.currentRole')} ${userRole}`}</p>
) : (
<></>
)}
<EuiFormRow>
<EuiSelect
hasNoInitialSelection
options={roles}
value={selectedRole}
onChange={(e) => {
setSelectedRole(e.target.value);
}}
/>
</EuiFormRow>
<EuiSpacer size="m" />
<EuiButton
onClick={() => {
onSendRoleRequest();
}}
fill
>
{t('common:validationActions.send')}
</EuiButton>
</>
);
};
......
import React, { Fragment } from 'react';
import React from 'react';
import { EuiFlyout, EuiFlyoutBody, EuiText } from '@elastic/eui';
import { useTranslation } from 'react-i18next';
import JsonView from '@in-sylva/json-view';
import ReactJson from '@microlink/react-json-view';
const ResourceFlyout = ({
resourceFlyoutData,
......@@ -24,16 +24,14 @@ const ResourceFlyout = ({
>
<EuiFlyoutBody>
<EuiText size="s">
<Fragment>
<JsonView
src={resourceFlyoutData}
name={t('results:flyout.JSON.title')}
collapsed={true}
iconStyle={'triangle'}
enableClipboard={false}
displayDataTypes={false}
/>
</Fragment>
<ReactJson
src={resourceFlyoutData}
name={t('results:flyout.JSON.title')}
iconStyle={'triangle'}
displayDataTypes={false}
enableClipboard={false}
collapsed={true}
/>
</EuiText>
</EuiFlyoutBody>
</EuiFlyout>
......
import React, { useEffect, useMemo, useState } from 'react';
import { Trans, useTranslation } from 'react-i18next';
import MUIDataTable from 'mui-datatables';
import { createTheme, ThemeProvider } from '@material-ui/core';
import { EuiButton, EuiFlexGroup, EuiFlexItem } from '@elastic/eui';
import { createTheme, ThemeProvider } from '@mui/material';
const getMuiTheme = () =>
createTheme({
overrides: {
components: {
MuiTableRow: {
root: {
'&:hover': {
cursor: 'pointer',
styleOverrides: {
root: {
'&:hover': {
cursor: 'pointer',
},
},
},
},
......
import { makeStyles } from '@material-ui/core/styles';
const style = makeStyles((theme) => ({
const styles = {
container: {
display: 'flex',
flexWrap: 'wrap',
},
textField: {
marginLeft: theme.spacing(1),
marginRight: theme.spacing(1),
width: 240,
noBorder: {
border: 'none',
},
}));
};
export default style;
export default styles;
......@@ -13,38 +13,38 @@ export const Operators = [
export const DateOptions = [
{
text: 'Date',
text: 'search:advancedSearch.fields.fieldContentPopover.operatorSelection.date.value',
value: '=',
},
{
text: 'Before',
text: 'search:advancedSearch.fields.fieldContentPopover.operatorSelection.date.before',
value: '<=',
},
{
text: 'After',
text: 'search:advancedSearch.fields.fieldContentPopover.operatorSelection.date.after',
value: '>=',
},
{
text: 'Period',
text: 'search:advancedSearch.fields.fieldContentPopover.operatorSelection.date.range',
value: 'between',
},
];
export const NumericOptions = [
{
text: 'Equal to',
text: 'search:advancedSearch.fields.fieldContentPopover.operatorSelection.numeric.value',
value: '=',
},
{
text: 'Under',
text: 'search:advancedSearch.fields.fieldContentPopover.operatorSelection.numeric.under',
value: '<=',
},
{
text: 'Over',
text: 'search:advancedSearch.fields.fieldContentPopover.operatorSelection.numeric.over',
value: '>=',
},
{
text: 'Between',
text: 'search:advancedSearch.fields.fieldContentPopover.operatorSelection.numeric.range',
value: 'between',
},
];