Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

proof-of-concept: intelligibility filter #217

Draft
wants to merge 3 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/actions/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export enum ActionTypes {
RUN_SEARCH = 'RUN_SEARCH',
CHANGE_ISV_SEARCH_LETTERS = 'CHANGE_ISV_SEARCH_LETTERS',
CHANGE_ISV_SEARCH_BY_WORDFORMS = 'CHANGE_ISV_SEARCH_BY_WORDFORMS',
INTELLIGIBILITY_FILTER = 'INTELLIGIBILITY_FILTER',
POS_FILTER = 'POS_FILTER',
SET_ALPHABETS = 'SET_ALPHABETS',
SHOW_MODAL_DIALOG = 'SHOW_MODAL_DIALOG',
Expand Down Expand Up @@ -137,6 +138,13 @@ export function changeIsvSearchByWordForms(data: boolean) {
};
}

export function intelligibilityFilterAction(data: string) {
return {
type: ActionTypes.INTELLIGIBILITY_FILTER,
data,
};
}

export function posFilterAction(data: string) {
return {
type: ActionTypes.POS_FILTER,
Expand Down
1 change: 1 addition & 0 deletions src/components/Controls/Controls.scss
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@

.search-type-selector,
.pos-selector,
.intelligibility-selector,
.flavorisation-selector {
flex: 1 1 auto;
margin: 0 var(--gap-size);
Expand Down
3 changes: 3 additions & 0 deletions src/components/Controls/Controls.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ import { LangSelector } from 'components/LangSelector';
import { POSSelector } from 'components/POSSelector';
import { SearchTypeSelector } from 'components/SearchTypeSelector';

import { IntelligibilitySelector } from "../IntelligibilitySelector";

import './Controls.scss';

export const Controls =
Expand Down Expand Up @@ -64,6 +66,7 @@ export const Controls =
<SearchTypeSelector key="searchType" />
<FlavorisationSelector key="flavorisation" />
<POSSelector key="posFilter" />
<IntelligibilitySelector key="intelligibilityFilter" />
</Expand>
</div>
);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
.intelligibility-selector {
.selector__select {
width: 50%;

@media (max-width: 450px) {
width: 65%;
}
}
}
39 changes: 39 additions & 0 deletions src/components/IntelligibilitySelector/IntelligibilitySelector.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { useCallback } from 'react';
import { useDispatch } from 'react-redux';

import { t } from 'translations';

import { intelligibilityFilterAction } from 'actions';

import { useIntelligibilityFilter } from 'hooks/useIntelligibilityFilter';

import { Selector } from 'components/Selector';

import { langs } from "../../consts";

import './IntelligibilitySelector.scss';

const sortedLangs = [...langs].sort();

export const IntelligibilitySelector =
() => {
const dispatch = useDispatch();
const intelligibilityFilter = useIntelligibilityFilter();
const options = ['', ...sortedLangs].map((value) => ({
name: value ? t(`${value}Lang`) : t('anyLanguage'),
value,
}));
const onSelect = useCallback((pos) => {
dispatch(intelligibilityFilterAction(pos));
}, [dispatch]);

return (
<Selector
className="intelligibility-selector"
options={options}
onSelect={onSelect}
value={intelligibilityFilter}
label={t('targetLanguage')}
/>
);
};
1 change: 1 addition & 0 deletions src/components/IntelligibilitySelector/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './IntelligibilitySelector';
5 changes: 4 additions & 1 deletion src/components/Results/Results.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,16 @@ import { isScrollBarVisible } from 'utils/isScrollBarVisible';
import { ResultsCard } from 'components/ResultsCard';
import { ResultsEmpty } from 'components/ResultsEmpty';

import { useIntelligibilityFilter } from "../../hooks/useIntelligibilityFilter";

import './Results.scss';

export const Results =
() => {
const worksheetUrl = getTablePublicUrl(tablesData[0].spreadsheetId, tablesData[0].sheetId);
const results = useResults();
const posFilter = usePosFilter();
const intelligibilityFilter = useIntelligibilityFilter();
const lang = useLang();
const containerRef = useRef<HTMLDivElement>();
const fromText = useFromText();
Expand All @@ -41,7 +44,7 @@ export const Results =
if (!results || !results.length) {
if (empty) {
return (
<ResultsEmpty showReset={posFilter !== ''}/>
<ResultsEmpty showReset={posFilter !== '' || intelligibilityFilter !== ''}/>
);
}

Expand Down
8 changes: 8 additions & 0 deletions src/components/ResultsCard/ResultsCard.scss
Original file line number Diff line number Diff line change
Expand Up @@ -150,4 +150,12 @@
}
}
}

&__status {
opacity: 0.5;

&.verified {
opacity: initial;
}
}
}
17 changes: 17 additions & 0 deletions src/components/ResultsCard/ResultsCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ import { wordHasForms } from 'utils/wordHasForms';

import { Clipboard } from 'components/Clipboard';

import { useIntelligibilityFilter } from "../../hooks/useIntelligibilityFilter";
import { getIntelligibilityReport } from "../../utils/getIntelligibilityReport";

import './ResultsCard.scss';

import ErrorIcon from './images/error-icon.svg';
Expand Down Expand Up @@ -96,6 +99,8 @@ export const ResultsCard =
const wordId = Dictionary.getField(item.raw, 'id').toString();
const pos = getPartOfSpeech(item.details);
const dispatch = useDispatch();
const intFilter = useIntelligibilityFilter();
const intelligibility = Dictionary.getField(item.raw, 'intelligibility');
const lang = useLang();

const cardBiInfo: ICardAnalytics = useMemo(() => (
Expand Down Expand Up @@ -177,6 +182,11 @@ export const ResultsCard =

const short = useShortCardView();

const status = intFilter ? getIntelligibilityReport(
intFilter,
intelligibility
) : null;

return (
<div
className={classNames('results-card', { short })}
Expand All @@ -185,6 +195,13 @@ export const ResultsCard =
onClick={reportClick}
>
<div className="results-card__translate">
{ status
? <span
key="intelligibilityStatus"
className={classNames({ 'results-card__status': true, verified: status.verified })}
title={status.status}>{status.emoji}&nbsp;</span>
: undefined
}
{item.to !== 'isv' ? (
<Clipboard
str={item.translate}
Expand Down
7 changes: 5 additions & 2 deletions src/components/ResultsEmpty/ResultsEmpty.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { useDispatch } from 'react-redux';

import { t } from 'translations';

import { posFilterAction } from 'actions';
import { intelligibilityFilterAction, posFilterAction } from 'actions';

import './ResultsEmpty.scss';

Expand All @@ -25,7 +25,10 @@ export const ResultsEmpty =
type="button"
className="results-empty__button"
aria-label="Reset filters"
onClick={() => dispatch(posFilterAction(''))}
onClick={() => {
dispatch(posFilterAction(''));
dispatch(intelligibilityFilterAction(''));
}}
>
{t('resultsNotFoundResetFilters')}
</button>
Expand Down
1 change: 1 addition & 0 deletions src/consts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ export const initialFields = [
'en',
'sameInLanguages',
'genesis',
'intelligibility',
];

export const initialAddFields = [
Expand Down
7 changes: 7 additions & 0 deletions src/hooks/useIntelligibilityFilter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { useSelector } from 'react-redux';

import { IMainState } from 'reducers';

export function useIntelligibilityFilter() {
return useSelector((state: IMainState) => state.intelligibilityFilter);
}
1 change: 1 addition & 0 deletions src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ export const defaultState: IMainState = {
fromText: '',
searchType: 'begin',
posFilter: '',
intelligibilityFilter: '',
dictionaryLanguages: langs,
flavorisationType: '3',
alphabetType: 'latin',
Expand Down
1 change: 1 addition & 0 deletions src/middlewares/analyticsMiddleware.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ export function analyticsMiddleware({ getState }) {
switch (action.type) {
case ActionTypes.FROM_TEXT:
case ActionTypes.POS_FILTER:
case ActionTypes.INTELLIGIBILITY_FILTER:
case ActionTypes.SEARCH_TYPE:
case ActionTypes.LANG: {
const state: IMainState = getState();
Expand Down
44 changes: 36 additions & 8 deletions src/reducers/reducers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ export interface IMainState {
fromText: string;
searchType: string;
posFilter: string;
intelligibilityFilter: string;
flavorisationType: string;
dictionaryLanguages: string[];
page: string;
Expand All @@ -74,13 +75,14 @@ export interface IMainState {
export function mainReducer(state: IMainState, { type, data }) {
switch (type) {
case ActionTypes.LANG: {
const { fromText, flavorisationType, searchType, posFilter } = state;
const { fromText, flavorisationType, searchType, intelligibilityFilter, posFilter } = state;
const lang = data;
const [rawResults, translateTime] = Dictionary.translate({
inputText: fromText,
...lang,
searchType,
posFilter,
intelligibilityFilter,
flavorisationType,
});

Expand All @@ -94,13 +96,14 @@ export function mainReducer(state: IMainState, { type, data }) {
};
}
case ActionTypes.SEARCH_TYPE: {
const { flavorisationType, lang, fromText, posFilter } = state;
const { flavorisationType, lang, fromText, posFilter, intelligibilityFilter } = state;
const searchType = data;
const [rawResults, translateTime] = Dictionary.translate({
inputText: fromText,
...lang,
searchType,
posFilter,
intelligibilityFilter,
flavorisationType,
});

Expand All @@ -114,13 +117,14 @@ export function mainReducer(state: IMainState, { type, data }) {
};
}
case ActionTypes.FROM_TEXT: {
const { searchType, flavorisationType, lang, posFilter } = state;
const { searchType, flavorisationType, lang, posFilter, intelligibilityFilter } = state;
const fromText = data;
const [rawResults, translateTime] = Dictionary.translate({
inputText: fromText,
...lang,
searchType,
posFilter,
intelligibilityFilter,
flavorisationType,
});

Expand All @@ -134,12 +138,13 @@ export function mainReducer(state: IMainState, { type, data }) {
};
}
case ActionTypes.RUN_SEARCH: {
const { searchType, flavorisationType, lang, fromText, posFilter } = state;
const { searchType, flavorisationType, lang, fromText, posFilter, intelligibilityFilter } = state;
const [rawResults, translateTime] = Dictionary.translate({
inputText: fromText,
...lang,
searchType,
posFilter,
intelligibilityFilter,
flavorisationType,
});

Expand All @@ -152,13 +157,14 @@ export function mainReducer(state: IMainState, { type, data }) {
};
}
case ActionTypes.CHANGE_ISV_SEARCH_LETTERS: {
const { searchType, flavorisationType, lang, fromText, posFilter } = state;
const { searchType, flavorisationType, lang, fromText, posFilter, intelligibilityFilter } = state;
const isvSearchLetters = Dictionary.changeIsvSearchLetters(data);
const [rawResults, translateTime] = Dictionary.translate({
inputText: fromText,
...lang,
searchType,
posFilter,
intelligibilityFilter,
flavorisationType,
});

Expand All @@ -172,14 +178,15 @@ export function mainReducer(state: IMainState, { type, data }) {
};
}
case ActionTypes.CHANGE_ISV_SEARCH_BY_WORDFORMS: {
const { searchType, flavorisationType, lang, fromText, posFilter } = state;
const { searchType, flavorisationType, lang, fromText, intelligibilityFilter, posFilter } = state;
const isvSearchByWordForms = data;
Dictionary.setIsvSearchByWordForms(data);
const [rawResults, translateTime] = Dictionary.translate({
inputText: fromText,
...lang,
searchType,
posFilter,
intelligibilityFilter,
flavorisationType,
});

Expand All @@ -193,12 +200,13 @@ export function mainReducer(state: IMainState, { type, data }) {
};
}
case ActionTypes.FLAVORISATION_TYPE: {
const { searchType, lang, fromText, posFilter } = state;
const { searchType, lang, fromText, intelligibilityFilter, posFilter } = state;
const [rawResults, translateTime] = Dictionary.translate({
inputText: fromText,
...lang,
searchType,
posFilter,
intelligibilityFilter,
flavorisationType: data,
});

Expand All @@ -210,13 +218,33 @@ export function mainReducer(state: IMainState, { type, data }) {
results: Dictionary.formatTranslate(rawResults, lang.from, lang.to, data, state.alphabets),
};
}
case ActionTypes.INTELLIGIBILITY_FILTER: {
const { searchType, lang, fromText, posFilter, flavorisationType } = state;
const [rawResults, translateTime] = Dictionary.translate({
inputText: fromText,
...lang,
searchType,
flavorisationType,
posFilter,
intelligibilityFilter: data,
});

biReporter.performanceSearch(translateTime);

return {
...state,
intelligibilityFilter: data,
results: Dictionary.formatTranslate(rawResults, lang.from, lang.to, flavorisationType, state.alphabets),
};
}
case ActionTypes.POS_FILTER: {
const { searchType, lang, fromText, flavorisationType } = state;
const { searchType, lang, fromText, flavorisationType, intelligibilityFilter } = state;
const [rawResults, translateTime] = Dictionary.translate({
inputText: fromText,
...lang,
searchType,
flavorisationType,
intelligibilityFilter,
posFilter: data,
});

Expand Down
1 change: 1 addition & 0 deletions src/services/biReporter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ export class BiReporter {
searchLanguageTo: state.lang.to,
searchLanguage: state.lang.from === 'isv' ? state.lang.to : state.lang.from,
searchFilterPos: state.posFilter,
searchFilterLang: state.intelligibilityFilter,
searchFilterPart: state.searchType,
searchByWordForms: state.isvSearchByWordForms,
interfaceLanguage: state.interfaceLang,
Expand Down
Loading