From 9b7b9fb389918e7f03e28a749d36ad4d8214715a Mon Sep 17 00:00:00 2001 From: shaked-hayek <85109951+shaked-hayek@users.noreply.github.com> Date: Sat, 26 Nov 2022 14:11:29 +0200 Subject: [PATCH 01/15] [Feat-885] Add selection for stack bar graphs (#935) * Added stacked bar widgets a checkbox option * Add option to choose colors when changing displayed bars * Changed any to proper type, make number of bar generic and add function createBarWidget * Fix bug of changed values when closing card editor * PR review changes * Remove redundent imports --- public/locales/en/translation.json | 2 + public/locales/he/translation.json | 2 + src/components/molecules/GenericBarChart.tsx | 15 ++++-- .../widgets/CountByYearBarWidget.tsx | 12 +++-- .../widgets/CountInjuredByYearBarWidget.tsx | 12 +++-- .../molecules/widgets/WidgetWrapper.tsx | 8 +-- src/components/organisms/CardEditorDialog.tsx | 49 ++++++++++++++++--- src/components/organisms/WidgetsTemplate.tsx | 1 + src/utils/barChart.utils.ts | 43 ++++++++++++++-- 9 files changed, 117 insertions(+), 27 deletions(-) diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 20093528..2baa3f5c 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -73,6 +73,8 @@ "display": "Display", "landscape": "Portrait", "portrait": "Landscape", + "showAccidents": "Show Accidents", + "showInjured": "Show Injured", "size": "Size", "download": "Download as PNG" }, diff --git a/public/locales/he/translation.json b/public/locales/he/translation.json index 787b4590..14d82074 100644 --- a/public/locales/he/translation.json +++ b/public/locales/he/translation.json @@ -87,6 +87,8 @@ "display": "הצג", "landscape": "לרוחב", "portrait": "לאורך", + "showAccidents": "הצגת תאונות", + "showInjured": "הצגת נפגעים", "size": "גודל", "download": "הורד כתמונה" }, diff --git a/src/components/molecules/GenericBarChart.tsx b/src/components/molecules/GenericBarChart.tsx index 7da9788d..c9cdf9e5 100644 --- a/src/components/molecules/GenericBarChart.tsx +++ b/src/components/molecules/GenericBarChart.tsx @@ -36,6 +36,7 @@ interface ISingleBarChartProps extends IBarChartBaseProps {} interface IMultiBarChartProps extends IBarChartBaseProps { isStacked: boolean; + editorBarOptions?: Record; } const CustomizedLabel = (props: CustomizedLabelProps) => { @@ -89,10 +90,18 @@ const SingleBarChart: FC = ({ data, isPercentage, textLabe ); }; -const MultiBarChart: FC = ({ data, isPercentage, isStacked, textLabel, subtitle }) => { +const MultiBarChart: FC = ({ data, isPercentage, isStacked, textLabel, subtitle, editorBarOptions }) => { const yLabels = data ? Object.keys(data[0]) : []; yLabels.splice(0, 1); const maxBarsNum = yLabels.length; + const filteredColors : Record = (editorBarOptions && Object.keys(editorBarOptions).length !== 0) ? + Object.values(editorBarOptions).map((include: any, i: number) => { + if (include) { + return colors[i]; + } else { + return false; + } + }).filter( Boolean ) : colors; return ( = ({ data, isPercentage, isStacked, > {Array.from({ length: maxBarsNum }, (_, i) => { const barStyle = { - filter: `drop-shadow(0.2em ${isStacked ? '0' : '0.2em'} 0 ${tinycolor(colors[i]).darken().toString()})`, + filter: `drop-shadow(0.2em ${isStacked ? '0' : '0.2em'} 0 ${tinycolor(filteredColors[i]).darken().toString()})`, }; return ( ; } -const CountByYearBarWidget: FC = ({ data }) => { - const { items, text } = data; - const multiBarSeries = convertToBarSeries(items, text.labels_map); - return ; +const CountByYearBarWidget: FC = ({ data, editorBarOptions }) => { + const { text } = data; + const multiBarSeries = createBarWidget(data, editorBarOptions) + return ; }; export default CountByYearBarWidget; diff --git a/src/components/molecules/widgets/CountInjuredByYearBarWidget.tsx b/src/components/molecules/widgets/CountInjuredByYearBarWidget.tsx index 5c5a6286..7f02b3b7 100644 --- a/src/components/molecules/widgets/CountInjuredByYearBarWidget.tsx +++ b/src/components/molecules/widgets/CountInjuredByYearBarWidget.tsx @@ -1,16 +1,18 @@ import React, { FC } from 'react'; import { IWidgetMultiBarData } from 'models/WidgetData'; -import { convertToBarSeries } from 'utils/barChart.utils'; +import { createBarWidget } from 'utils/barChart.utils'; import { MultiBarChart } from '../GenericBarChart'; interface IProps { data: IWidgetMultiBarData; + editorBarOptions: Record; } -const CountInjuredByYearBarWidget: FC = ({ data }) => { - const { items, text } = data; - const multiBarSeries = convertToBarSeries(items, text.labels_map); - return ; +const CountInjuredByYearBarWidget: FC = ({ data, editorBarOptions }) => { + const { text } = data; + const multiBarSeries = createBarWidget(data, editorBarOptions); + return ; }; export default CountInjuredByYearBarWidget; diff --git a/src/components/molecules/widgets/WidgetWrapper.tsx b/src/components/molecules/widgets/WidgetWrapper.tsx index 5db597f8..dc387555 100644 --- a/src/components/molecules/widgets/WidgetWrapper.tsx +++ b/src/components/molecules/widgets/WidgetWrapper.tsx @@ -1,3 +1,4 @@ +/* eslint-disable max-lines*/ import React, { FC } from 'react'; import { IWidgetAccidentCountByRoadLight, @@ -42,11 +43,12 @@ interface IProps { widget: IWidgetBase; locationText: string; sizeOptions: any; + editorBarOptions: Record; segmentText: string; isStreet: boolean; } -const WidgetWrapper: FC = ({ widget, locationText, sizeOptions, segmentText, isStreet }) => { +const WidgetWrapper: FC = ({ widget, locationText, sizeOptions, editorBarOptions, segmentText, isStreet }) => { const { name, data } = widget; let widgetComponent; switch (name) { @@ -136,11 +138,11 @@ const WidgetWrapper: FC = ({ widget, locationText, sizeOptions, segmentT break; } case WidgetName.accident_count_by_accident_year: { - widgetComponent = ; + widgetComponent = ; break; } case WidgetName.injured_count_by_accident_year: { - widgetComponent = ; + widgetComponent = ; break; } case WidgetName.accident_count_by_day_night: { diff --git a/src/components/organisms/CardEditorDialog.tsx b/src/components/organisms/CardEditorDialog.tsx index 0b6fb09f..5382086d 100644 --- a/src/components/organisms/CardEditorDialog.tsx +++ b/src/components/organisms/CardEditorDialog.tsx @@ -2,29 +2,31 @@ import React, { FC, useState } from 'react'; import DialogWithHeader from '../molecules/DialogWithHeader'; import { useStore } from 'store/storeConfig'; import WidgetWrapper from 'components/molecules/widgets/WidgetWrapper'; -import { Box } from '@material-ui/core'; +import { Box, Checkbox, FormControlLabel, FormGroup } from '@material-ui/core'; import AnyWayCard, { CardSizeOptions } from 'components/molecules/card/AnyWayCard'; import { MetaTag, ErrorBoundary, Typography, Button, Slider } from 'components/atoms'; import widgetToImage from 'services/to-image.service'; import { useTranslation } from 'react-i18next'; +import { blueVioletColor } from 'style'; +import {initEditorBarOptions, barsWidgetsLabels, barsWidgetsTitle, NUM_OF_BARS} from 'utils/barChart.utils'; interface IProps { isOpen: boolean; onClose: () => void; widgetName: string; - text: string | undefined; + text?: string; } const CardEditor: FC = ({ isOpen, onClose, widgetName, text }) => { const [cardElement, setCardElement] = useState({}); - const [size, setSize] = useState(1); + const [size, setSize] = useState(1) + const [barValues, setBarValues] = useState(initEditorBarOptions()); const { t } = useTranslation(); const store = useStore(); const { widgetsStore } = store; const widget = widgetsStore.getWidgetsDataByName(widgetName); const roadNumber = widgetsStore.newsFlashWidgetsMetaRoadNumber; const dateComment = widgetsStore.newsFlashWidgetsMetaDateComment; - const getCardRef = (element: HTMLElement) => setCardElement(element); const imgDownloadHandler = () => { if (cardElement && cardElement instanceof HTMLElement) { @@ -32,6 +34,19 @@ const CardEditor: FC = ({ isOpen, onClose, widgetName, text }) => { } }; + /** + * When checkbox is changed, change barValues in place "location" to the + * negated value. When false change to true, when true change to false. + * @param location place in barValues object + * @param event not used + */ + const handleCheckChange = (location: number, event: any) => { + setBarValues((prevState) => ({ + ...prevState, + [location]: !barValues[location] + })); + }; + const handleSizeChange = (event: any, newSize: number | number[]) => { setSize(newSize as number); }; @@ -45,21 +60,41 @@ const CardEditor: FC = ({ isOpen, onClose, widgetName, text }) => { widget={widget} locationText={widgetsStore.newsFlashWidgetsMetaLocation} sizeOptions={sizeOptions.size} + editorBarOptions={barValues} isStreet={widgetsStore.isStreet} /> ); + const onCloseInitValues = () => { + onClose(); + setSize(1); + setBarValues(initEditorBarOptions()); + } + return ( - + + {Object.keys(barsWidgetsLabels).includes(widgetName) ? + + {t(barsWidgetsTitle[widgetName])} + + {Array.from({length: NUM_OF_BARS}, (_,i) => { + return handleCheckChange(i, e)}/> + }/> + })} + + : + } - {t('cardEditor.size')} + {t('cardEditor.size')} - {t('cardEditor.download')} + {t('cardEditor.download')} diff --git a/src/components/organisms/WidgetsTemplate.tsx b/src/components/organisms/WidgetsTemplate.tsx index 8ddee51a..c1dafe9e 100644 --- a/src/components/organisms/WidgetsTemplate.tsx +++ b/src/components/organisms/WidgetsTemplate.tsx @@ -27,6 +27,7 @@ const WidgetsTemplate: FC = () => { locationText={widgetsStore.newsFlashWidgetsMetaLocation} segmentText={widgetsStore.newsFlashWidgetsMetaSegmentName} sizeOptions={sizeOptions} + editorBarOptions={{}} isStreet={widgetsStore.isStreet} /> ); diff --git a/src/utils/barChart.utils.ts b/src/utils/barChart.utils.ts index f2e3479c..3b4ff0a1 100644 --- a/src/utils/barChart.utils.ts +++ b/src/utils/barChart.utils.ts @@ -1,7 +1,22 @@ import { BarDataMap, BAR_CHART_X_LABEL } from 'components/molecules/GenericBarChart'; import { LabelsMap, MultiSeriesDataItems, SeriesDataItem } from 'models/MultiSeriesData'; +import {IWidgetMultiBarData} from "../models/WidgetData"; const getTranslatedLabel = (key: string, labelsMap: LabelsMap): string => labelsMap[key] || key; +export const NUM_OF_BARS = 3 + +export const barsWidgetsLabels: Record> = { + 'accident_count_by_accident_year': + ['textView.fatal.plural', 'textView.severe.plural', 'textView.light.plural'], + 'injured_count_by_accident_year': + ['textView.killed.plural', 'textView.severeInjured.plural', 'textView.lightInjured.plural'], +} + +export const barsWidgetsTitle: Record = { + 'accident_count_by_accident_year': 'cardEditor.showAccidents', + 'injured_count_by_accident_year': 'cardEditor.showInjured', +} + // convert input to data series, for example: // [ // { @@ -24,6 +39,7 @@ const getTranslatedLabel = (key: string, labelsMap: LabelsMap): string => labels export function convertToBarSeries( items: SeriesDataItem[] | MultiSeriesDataItems[], labelsMap?: LabelsMap | string, + excludeList: any = [], ): BarDataMap[] { return items.map((item: any) => { const label: string = item.label_key.toString(); @@ -45,13 +61,32 @@ export function convertToBarSeries( result['value'] = item.value; } else { // multi values per (stacked) bar return type is like: { xLabel: 'year 2017', light: 55, severe: 5 } - const series = item.series; - series.forEach((dataPoint: any) => { - const { label_key, value } = dataPoint; + const series : SeriesDataItem[] = item.series; + series.filter((dataPoint: SeriesDataItem) => !excludeList.includes(dataPoint.label_key)).forEach(({ label_key,value }) =>{ const yLabel = getTranslatedLabel(label_key, labelsMap as LabelsMap); result[yLabel] = Math.round(value); - }); + }) ; } return result; }); } + +export function createBarWidget ( + data: IWidgetMultiBarData, + editorBarOptions: Record +): BarDataMap[] { + const { items, text } = data; + const excludeList = (Object.keys(editorBarOptions).length !== 0) ? + Object.values(editorBarOptions).map((include: any, index: number) => { + if (include) { + return null; + } else { + return items[0].series[index].label_key; + } + }) : [] + return convertToBarSeries(items, text.labels_map, excludeList); +} + +export function initEditorBarOptions () { + return Object.fromEntries(Array.from({length: NUM_OF_BARS}, (_, i) => [i, true])); +} From 15ff26aefce4d01dceff5c436baf877b999eabed Mon Sep 17 00:00:00 2001 From: danielsh28 Date: Sat, 26 Nov 2022 16:32:59 +0200 Subject: [PATCH 02/15] add conditional label, refactor utils (#938) Co-authored-by: Daniel Shely <> --- public/locales/en/translation.json | 5 ++++- public/locales/he/translation.json | 5 +++-- src/components/molecules/LogInLinkGoogle.tsx | 2 +- .../molecules/UserProfileHeader.tsx | 2 +- .../molecules/map/GoogleMapsLayer.tsx | 2 +- src/components/molecules/map/Map.tsx | 4 ++-- .../molecules/widgets/StreetViewWidget.tsx | 2 +- .../molecules/widgets/WidgetWrapper.tsx | 3 ++- src/{utils/utils.ts => const/generalConst.ts} | 22 +------------------ src/services/init.service.ts | 2 +- src/services/signInWindow.ts | 2 +- src/services/user.service.ts | 2 +- src/services/widgets.data.service.ts | 2 +- src/store/user.store.ts | 2 +- src/utils/map.utils.ts | 16 ++++++++++++++ src/utils/text.utils.ts | 6 +++++ 16 files changed, 43 insertions(+), 36 deletions(-) rename src/{utils/utils.ts => const/generalConst.ts} (74%) create mode 100644 src/utils/map.utils.ts create mode 100644 src/utils/text.utils.ts diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 2baa3f5c..33d0bb51 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -49,6 +49,9 @@ "onSegment": "Road segment", "occurred": "occurred", "accidents": "accidents", + "killedAndHurt": "killed and hurt", + "hurt": "hurt", + "injured" : "casualties", "fatal": { "singular": "fatal", "plural": "fatal" @@ -110,7 +113,7 @@ }, "sideBar": "Approximate location:", "UserProfileHeader": { - "hallo": "Hallo", + "hello": "Hello", "logout": "LOGOUT" }, "widgets": { diff --git a/public/locales/he/translation.json b/public/locales/he/translation.json index 14d82074..8dfc2f06 100644 --- a/public/locales/he/translation.json +++ b/public/locales/he/translation.json @@ -48,7 +48,8 @@ "on": "ב", "onSegment": "במקטע", "occurred": "התרחשו", - "hurt": "נהרגו ונפצעו", + "killedAndHurt": "נהרגו ונפצעו", + "hurt": "נפצעו", "accidents": "תאונות", "injured": "נפגעים", "fatal": { @@ -154,4 +155,4 @@ }, "locationIndicator": "(תוצאות חיפוש מקטע)", "cityAndStreetIndicator": "(תוצאות חיפוש עיר ורחוב)" -} \ No newline at end of file +} diff --git a/src/components/molecules/LogInLinkGoogle.tsx b/src/components/molecules/LogInLinkGoogle.tsx index 80eae0e9..9f1d89b8 100644 --- a/src/components/molecules/LogInLinkGoogle.tsx +++ b/src/components/molecules/LogInLinkGoogle.tsx @@ -1,7 +1,7 @@ import { makeStyles } from '@material-ui/core/styles'; import { oceanBlueColor, skyBlueColor } from 'style'; import React from 'react'; -import { AUTH_LOGIN_GOOGLE_URL } from 'utils/utils'; +import { AUTH_LOGIN_GOOGLE_URL } from 'const/generalConst'; import { openSignInWindow } from 'services/signInWindow'; import { useTranslation } from 'react-i18next'; const useStyles = makeStyles((theme) => ({ diff --git a/src/components/molecules/UserProfileHeader.tsx b/src/components/molecules/UserProfileHeader.tsx index b538f8fe..877c7acf 100644 --- a/src/components/molecules/UserProfileHeader.tsx +++ b/src/components/molecules/UserProfileHeader.tsx @@ -8,7 +8,7 @@ import { oceanBlueColor, skyBlueColor } from 'style'; import Box from '@material-ui/core/Box'; import { Avatar } from '@material-ui/core'; import { IAnywayUserDetails } from 'services/user.service'; -import { ROLE_ADMIN_NAME } from 'utils/utils'; +import { ROLE_ADMIN_NAME } from 'const/generalConst'; import RootStore from 'store/root.store'; import { useStore } from 'store/storeConfig'; import { observer } from 'mobx-react-lite'; diff --git a/src/components/molecules/map/GoogleMapsLayer.tsx b/src/components/molecules/map/GoogleMapsLayer.tsx index 3d10c913..c8f1403e 100644 --- a/src/components/molecules/map/GoogleMapsLayer.tsx +++ b/src/components/molecules/map/GoogleMapsLayer.tsx @@ -3,7 +3,7 @@ import React, { FC } from 'react'; import ReactLeafletGoogleLayer from 'react-leaflet-google-layer'; import { useParams } from 'react-router-dom'; import { MAP_STYLE } from 'style/map.style'; -import { mapApiKey } from 'utils/utils'; +import { mapApiKey } from 'const/generalConst'; const GoogleMapsLayer: FC = () => { const { lng } = useParams<{ lng: string }>(); diff --git a/src/components/molecules/map/Map.tsx b/src/components/molecules/map/Map.tsx index 4dd6d9ff..aff07a87 100644 --- a/src/components/molecules/map/Map.tsx +++ b/src/components/molecules/map/Map.tsx @@ -4,8 +4,8 @@ import { makeStyles } from '@material-ui/core/styles'; import { MapContainer } from 'react-leaflet'; import L, { LatLng } from 'leaflet'; import { IPoint } from 'models/Point'; -import { INITIAL_CENTER, INITIAL_ZOOM } from 'utils/utils'; -import { uniquePoints } from 'utils/utils'; +import { INITIAL_CENTER, INITIAL_ZOOM } from 'const/generalConst'; +import { uniquePoints } from 'utils/map.utils'; import MapViewControl from 'services/MapViewControl'; import GoogleMapsLayer from './GoogleMapsLayer'; diff --git a/src/components/molecules/widgets/StreetViewWidget.tsx b/src/components/molecules/widgets/StreetViewWidget.tsx index a6194b59..dac60124 100644 --- a/src/components/molecules/widgets/StreetViewWidget.tsx +++ b/src/components/molecules/widgets/StreetViewWidget.tsx @@ -1,5 +1,5 @@ import React, { FC } from 'react'; -import { mapApiKey } from 'utils/utils'; +import { mapApiKey } from 'const/generalConst'; import ReactStreetview from 'components/molecules/widgets/streetView'; import { makeStyles } from '@material-ui/core'; import { IWidgetStreetViewData } from 'models/WidgetData'; diff --git a/src/components/molecules/widgets/WidgetWrapper.tsx b/src/components/molecules/widgets/WidgetWrapper.tsx index dc387555..8a6d972c 100644 --- a/src/components/molecules/widgets/WidgetWrapper.tsx +++ b/src/components/molecules/widgets/WidgetWrapper.tsx @@ -38,6 +38,7 @@ import InjuredAccidentsWithPedestrians from './InjuredAccidentsWithPedestrians'; import { IPoint } from 'models/Point'; import { WidgetName } from 'models/WidgetName'; import KilledAndInjuredCountPerAgeGroupWidget from './KilledAndInjuredCountPerAgeGroupWidget'; +import { getInjuredBySeverityVerbLabel } from 'utils/text.utils'; interface IProps { widget: IWidgetBase; @@ -119,7 +120,7 @@ const WidgetWrapper: FC = ({ widget, locationText, sizeOptions, editorBa severe: 'severeInjured', light: 'lightInjured', noun: 'injured', - verb: 'hurt', + verb: getInjuredBySeverityVerbLabel(data as IWidgetInjuredBySeverityTextData), }} isStreet={isStreet} largeNumbers={true} diff --git a/src/utils/utils.ts b/src/const/generalConst.ts similarity index 74% rename from src/utils/utils.ts rename to src/const/generalConst.ts index b3539fb0..8bc0eb3e 100644 --- a/src/utils/utils.ts +++ b/src/const/generalConst.ts @@ -1,24 +1,4 @@ -import { IPoint } from 'models/Point'; -import { useLocation } from 'react-router'; - -export function useQuery() { - return new URLSearchParams(useLocation().search); -} -export function uniquePoints(points: IPoint[]) { - const uniquePoints = new Array(); - const uniqueSet = new Set(); - // fill only unique points (not yet included in uniqueSet) - points.forEach((p) => { - const pointKey = `${p.latitude}:${p.longitude}`; // use x:y to create unique key - if (!uniqueSet.has(pointKey)) { - uniquePoints.push(p); - uniqueSet.add(pointKey); - } - }); - - return uniquePoints; -} -// pop up login window dimensions +// pop up login window dimensions export const loginPopUpDim = { width: window.screen.width / 3.5, diff --git a/src/services/init.service.ts b/src/services/init.service.ts index f398c3c5..eca51d48 100644 --- a/src/services/init.service.ts +++ b/src/services/init.service.ts @@ -1,7 +1,7 @@ import axios from 'axios'; import { fetchNews } from './news.data.service'; import L from 'leaflet'; -import { serverUrl } from 'utils/utils'; +import { serverUrl } from 'const/generalConst'; export function initService(): Promise { setAxiosDefaults(); diff --git a/src/services/signInWindow.ts b/src/services/signInWindow.ts index 5486ed6c..4d60e9bb 100644 --- a/src/services/signInWindow.ts +++ b/src/services/signInWindow.ts @@ -1,4 +1,4 @@ -import { loginPopUpDim } from 'utils/utils'; +import { loginPopUpDim } from 'const/generalConst'; let windowObjectReference: Window | null = null; let previousUrl: string; diff --git a/src/services/user.service.ts b/src/services/user.service.ts index 37c81fa0..91795e20 100644 --- a/src/services/user.service.ts +++ b/src/services/user.service.ts @@ -8,7 +8,7 @@ import { GET_USERS_INFO_LIST_URL, LOG_OUT_USER_URL, REMOVE_USER_FROM_ORG_URL, UPDATE_USER_INFO_URL, -} from 'utils/utils'; +} from 'const/generalConst'; import { IFormInput } from 'components/molecules/UserUpdateForm'; import { StatusCodes } from 'utils/HTTPStatuesCodes'; import { IUserInfo } from '../models/user/IUserInfo'; diff --git a/src/services/widgets.data.service.ts b/src/services/widgets.data.service.ts index 2aa4e838..22969cce 100644 --- a/src/services/widgets.data.service.ts +++ b/src/services/widgets.data.service.ts @@ -1,6 +1,6 @@ import { ILocationData, IWidgetBase } from 'models/WidgetData'; import axios from 'axios'; -import { showOnlyOperCards, SHOW_MOCK } from 'utils/utils'; +import { showOnlyOperCards, SHOW_MOCK } from 'const/generalConst'; import { operationalCards } from 'const/cards.const'; import { getVerifiedWidgetsData } from './data.verification/data.verification.service'; diff --git a/src/store/user.store.ts b/src/store/user.store.ts index 6e68b00c..f96e2444 100644 --- a/src/store/user.store.ts +++ b/src/store/user.store.ts @@ -11,7 +11,7 @@ import { updateUserOrganization, } from 'services/user.service'; import { IUserInfo } from 'models/user/IUserInfo'; -import { ROLE_ADMIN_NAME } from 'utils/utils'; +import { ROLE_ADMIN_NAME } from 'const/generalConst'; import { IFormInput } from 'components/molecules/UserUpdateForm'; export default class UserStore { diff --git a/src/utils/map.utils.ts b/src/utils/map.utils.ts new file mode 100644 index 00000000..0f532908 --- /dev/null +++ b/src/utils/map.utils.ts @@ -0,0 +1,16 @@ +import { IPoint } from '../models/Point'; + +export function uniquePoints(points: IPoint[]) { + const uniquePoints = new Array(); + const uniqueSet = new Set(); + // fill only unique points (not yet included in uniqueSet) + points.forEach((p) => { + const pointKey = `${p.latitude}:${p.longitude}`; // use x:y to create unique key + if (!uniqueSet.has(pointKey)) { + uniquePoints.push(p); + uniqueSet.add(pointKey); + } + }); + + return uniquePoints; +}; diff --git a/src/utils/text.utils.ts b/src/utils/text.utils.ts new file mode 100644 index 00000000..7dbfa252 --- /dev/null +++ b/src/utils/text.utils.ts @@ -0,0 +1,6 @@ +import { IWidgetInjuredBySeverityTextData } from '../models/WidgetData'; + + +export const getInjuredBySeverityVerbLabel = (data : IWidgetInjuredBySeverityTextData) : string => { + return data.items.killed_count ? 'killedAndHurt' : 'hurt'; +} From 57e078802a0aeee30eb7a072b0423e2e39ba6858 Mon Sep 17 00:00:00 2001 From: Atalya Alon <20992625+atalyaalon@users.noreply.github.com> Date: Wed, 8 Feb 2023 21:02:49 +0200 Subject: [PATCH 03/15] Update .env.staging (#947) --- .env.staging | 1 + 1 file changed, 1 insertion(+) diff --git a/.env.staging b/.env.staging index 61891e17..ce340941 100644 --- a/.env.staging +++ b/.env.staging @@ -1,6 +1,7 @@ # override .env, .env.production # environment flags REACT_APP_ENV=staging +REACT_APP_BASE_URL=https://dev.anyway.co.il/ # Behaviour REACT_APP_SHOW_META_TAGS=true From 1a372a2db8c8a7c6236e3ae6a059328e0ea1f071 Mon Sep 17 00:00:00 2001 From: carmelp16 <46032304+carmelp16@users.noreply.github.com> Date: Wed, 1 Mar 2023 19:34:30 +0200 Subject: [PATCH 04/15] Add critical indication (#948) * Added image * Added critical icon based on field value * Added critical option to the filter panel * Added enum value * Had to increase width * Added local critical filter * Added field to model --- src/assets/critical.jpg | Bin 0 -> 2475 bytes .../molecules/NewsFlashFilterPanel.tsx | 5 +++ src/components/organisms/News.tsx | 14 +++++--- src/models/NewFlash.ts | 1 + src/models/SourceFilter.ts | 1 + src/pages/HomePage.tsx | 2 +- src/store/news-flash-store.ts | 34 +++++++++++++----- 7 files changed, 43 insertions(+), 14 deletions(-) create mode 100755 src/assets/critical.jpg diff --git a/src/assets/critical.jpg b/src/assets/critical.jpg new file mode 100755 index 0000000000000000000000000000000000000000..b6d2b5024d1b741f481e349f446a6ecf8a372b91 GIT binary patch literal 2475 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 CmwYJz literal 0 HcmV?d00001 diff --git a/src/components/molecules/NewsFlashFilterPanel.tsx b/src/components/molecules/NewsFlashFilterPanel.tsx index d9f6ee3f..abc04c8c 100644 --- a/src/components/molecules/NewsFlashFilterPanel.tsx +++ b/src/components/molecules/NewsFlashFilterPanel.tsx @@ -5,6 +5,7 @@ import { silverSmokeColor, oceanBlueColor } from 'style'; import ynetLogo from 'assets/ynet-website-logo.svg'; import wallaLogo from 'assets/walla-logo.svg'; import madaLogo from 'assets/mada-logo.svg'; +import criticalLogo from 'assets/critical.jpg'; import { AnyWayButton } from 'components/atoms/AnyWayButton'; import RootStore from 'store/root.store'; import { useStore } from 'store/storeConfig'; @@ -16,6 +17,7 @@ const useStyles = makeStyles({ image: { maxWidth: '50px', maxHeight: '35px', + mixBlendMode: "multiply" }, button: { height: '50px', @@ -59,6 +61,9 @@ const NewsFlashFilterPanel: FC = () => { case SourceFilterEnum.mda: { return madaLogo; } + case SourceFilterEnum.critical: { + return criticalLogo; + } } }; diff --git a/src/components/organisms/News.tsx b/src/components/organisms/News.tsx index 2e7035ab..0bc7a73e 100644 --- a/src/components/organisms/News.tsx +++ b/src/components/organisms/News.tsx @@ -10,6 +10,7 @@ import { dateFormat } from 'utils/time.utils'; import { useLocale } from 'hooks/date.hooks'; import LocationSearchIndicator from 'components/molecules/LocationSearchIndicator'; import { IRouteProps } from 'models/Route'; +import CriticalIcon from 'assets/critical.jpg'; const useStyles = makeStyles({ container: {}, @@ -40,11 +41,14 @@ const News: FC = () => { return ( -

- - {date}, {news.display_source} - -

+ +

+ + {date}, {news.display_source} + +

+ {(news.hasOwnProperty('critical') && news.critical) && } +
{news.title}
diff --git a/src/models/NewFlash.ts b/src/models/NewFlash.ts index 3b882243..2a926086 100644 --- a/src/models/NewFlash.ts +++ b/src/models/NewFlash.ts @@ -13,4 +13,5 @@ export interface INewsFlash { location: string; title: string; source: string; + critical?: boolean; } diff --git a/src/models/SourceFilter.ts b/src/models/SourceFilter.ts index c0ef1b6c..666d3d37 100644 --- a/src/models/SourceFilter.ts +++ b/src/models/SourceFilter.ts @@ -3,4 +3,5 @@ export enum SourceFilterEnum { ynet = 'ynet', walla = 'walla', mda = 'twitter', + critical = 'critical' } diff --git a/src/pages/HomePage.tsx b/src/pages/HomePage.tsx index 69bce348..1c151a3a 100644 --- a/src/pages/HomePage.tsx +++ b/src/pages/HomePage.tsx @@ -61,7 +61,7 @@ const HomePage: FC = () => { return ( - + diff --git a/src/store/news-flash-store.ts b/src/store/news-flash-store.ts index c8636655..4269828e 100644 --- a/src/store/news-flash-store.ts +++ b/src/store/news-flash-store.ts @@ -5,8 +5,15 @@ import { INewsFlash } from 'models/NewFlash'; import { IPoint } from 'models/Point'; import RootStore from './root.store'; +function filterByCritical(newsFlashCollection: Array): Array { + return newsFlashCollection.filter(news => news.hasOwnProperty("critical") && news.critical); +} + const DEFAULT_TIME_FILTER = 5; const DEFAULT_LOCATION = { latitude: 32.0853, longitude: 34.7818 }; +const LOCAL_FILTERS: { [key in SourceFilterEnum]?: (newsFlashCollection: Array) => Array } = { + [SourceFilterEnum.critical]: filterByCritical +} export default class NewsFlashStore { rootStore: RootStore; @@ -88,23 +95,34 @@ export default class NewsFlashStore { if (filter !== this.newsFlashActiveFilter) { runInAction(() => { this.newsFlashActiveFilter = filter; - this.newsFlashCollection = []; this.newsFlashFetchOffSet = 0; }); + if (!(filter in LOCAL_FILTERS)) { + runInAction(() => { + this.newsFlashCollection = []; + }); + } this.filterNewsFlashCollection(); } } filterNewsFlashCollection(): void { runInAction(() => (this.newsFlashLoading = true)); - fetchNews(this.newsFlashActiveFilter, this.newsFlashFetchOffSet).then((data: any) => { + if (this.newsFlashActiveFilter in LOCAL_FILTERS) { + const filterMethod = LOCAL_FILTERS[this.newsFlashActiveFilter]; + const filtered = filterMethod && filterMethod(this.newsFlashCollection); + runInAction(() => (this.newsFlashCollection = [...(filtered || [])])); runInAction(() => (this.newsFlashLoading = false)); - if (data) { - runInAction(() => (this.newsFlashCollection = [...this.newsFlashCollection, ...data])); - } else { - console.error(`filterNewsFlashCollection(filter:${this.newsFlashActiveFilter}) invalid data:`, data); - } - }); + } else { + fetchNews(this.newsFlashActiveFilter, this.newsFlashFetchOffSet).then((data: any) => { + runInAction(() => (this.newsFlashLoading = false)); + if (data) { + runInAction(() => (this.newsFlashCollection = [...this.newsFlashCollection, ...data])); + } else { + console.error(`filterNewsFlashCollection(filter:${this.newsFlashActiveFilter}) invalid data:`, data); + } + }); + } } infiniteFetchLimit(fetchSize: number): void { runInAction(() => (this.newsFlashFetchOffSet += fetchSize)); From dcdb07ddc6f95f8a21a65d1d9856a9a9a6a75917 Mon Sep 17 00:00:00 2001 From: EyalIlan <55767736+EyalIlan@users.noreply.github.com> Date: Fri, 3 Mar 2023 11:21:21 +0200 Subject: [PATCH 05/15] add alt attrinbte on image tag (#951) --- src/components/organisms/News.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/organisms/News.tsx b/src/components/organisms/News.tsx index 0bc7a73e..a26cbeb7 100644 --- a/src/components/organisms/News.tsx +++ b/src/components/organisms/News.tsx @@ -21,7 +21,8 @@ const useStyles = makeStyles({ backgroundColor: silverSmokeColor, }, }); - +// + const News: FC = () => { const store: RootStore = useStore(); const classes = useStyles(); @@ -47,7 +48,7 @@ const News: FC = () => { {date}, {news.display_source}

- {(news.hasOwnProperty('critical') && news.critical) && } + {(news.hasOwnProperty('critical') && news.critical) && }
{news.title}
From a3833ea4d6520a48b4feba19b8277c90312cb1c1 Mon Sep 17 00:00:00 2001 From: Atalya Alon <20992625+atalyaalon@users.noreply.github.com> Date: Sun, 5 Mar 2023 18:10:52 +0200 Subject: [PATCH 06/15] Update .env.staging (#952) --- .env.staging | 1 - 1 file changed, 1 deletion(-) diff --git a/.env.staging b/.env.staging index ce340941..61891e17 100644 --- a/.env.staging +++ b/.env.staging @@ -1,7 +1,6 @@ # override .env, .env.production # environment flags REACT_APP_ENV=staging -REACT_APP_BASE_URL=https://dev.anyway.co.il/ # Behaviour REACT_APP_SHOW_META_TAGS=true From 8c0fd687dd35103c971168d0ff7892b7d54a7629 Mon Sep 17 00:00:00 2001 From: carmelp16 <46032304+carmelp16@users.noreply.github.com> Date: Wed, 22 Mar 2023 18:47:30 +0200 Subject: [PATCH 07/15] Make critical filter non local (#958) * sufficient condition * Use object for fetch args * Send params in object format * Make fields optional * don't use "any" type hint --- src/components/organisms/News.tsx | 2 +- src/services/news.data.service.ts | 11 ++++++++++- src/store/news-flash-store.ts | 20 +++++++++++--------- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/components/organisms/News.tsx b/src/components/organisms/News.tsx index a26cbeb7..4865b853 100644 --- a/src/components/organisms/News.tsx +++ b/src/components/organisms/News.tsx @@ -48,7 +48,7 @@ const News: FC = () => { {date}, {news.display_source}

- {(news.hasOwnProperty('critical') && news.critical) && } + {news.critical && }
{news.title}
diff --git a/src/services/news.data.service.ts b/src/services/news.data.service.ts index d2f21ef0..b5353895 100644 --- a/src/services/news.data.service.ts +++ b/src/services/news.data.service.ts @@ -17,8 +17,14 @@ const errorNews: INewsFlash = { }; const NEWS_FLASH_API: string = '/api/news-flash'; +export interface IFetchNewsQueryParams { + source?: string; + offSet?: number; + limit?: number; + critical?: boolean | null; +}; -export function fetchNews(source = '', offSet = 0, limit = 100): Promise { +export function fetchNews({source = '', offSet = 0, limit = 100, critical = null}: IFetchNewsQueryParams = {}): Promise { const query = []; if (source) { query.push(`source=${source}`); @@ -26,6 +32,9 @@ export function fetchNews(source = '', offSet = 0, limit = 100): Promise { if (limit) { query.push(`limit=${limit}`); } + if (critical !== null) { + query.push(`critical=${critical}`); + } query.push(`offset=${offSet}`); query.push('resolution=suburban_road'); diff --git a/src/store/news-flash-store.ts b/src/store/news-flash-store.ts index 4269828e..6f049440 100644 --- a/src/store/news-flash-store.ts +++ b/src/store/news-flash-store.ts @@ -1,19 +1,13 @@ import { runInAction, makeAutoObservable } from 'mobx'; import { SourceFilterEnum } from 'models/SourceFilter'; -import { fetchNews } from 'services/news.data.service'; +import { fetchNews, IFetchNewsQueryParams } from 'services/news.data.service'; import { INewsFlash } from 'models/NewFlash'; import { IPoint } from 'models/Point'; import RootStore from './root.store'; -function filterByCritical(newsFlashCollection: Array): Array { - return newsFlashCollection.filter(news => news.hasOwnProperty("critical") && news.critical); -} - const DEFAULT_TIME_FILTER = 5; const DEFAULT_LOCATION = { latitude: 32.0853, longitude: 34.7818 }; -const LOCAL_FILTERS: { [key in SourceFilterEnum]?: (newsFlashCollection: Array) => Array } = { - [SourceFilterEnum.critical]: filterByCritical -} +const LOCAL_FILTERS: { [key in SourceFilterEnum]?: (newsFlashCollection: Array) => Array } = {}; export default class NewsFlashStore { rootStore: RootStore; @@ -114,7 +108,15 @@ export default class NewsFlashStore { runInAction(() => (this.newsFlashCollection = [...(filtered || [])])); runInAction(() => (this.newsFlashLoading = false)); } else { - fetchNews(this.newsFlashActiveFilter, this.newsFlashFetchOffSet).then((data: any) => { + const queryParams: IFetchNewsQueryParams = { + offSet: this.newsFlashFetchOffSet + }; + if (this.newsFlashActiveFilter == "critical") { + queryParams["critical"] = true; + } else { + queryParams["source"] = this.newsFlashActiveFilter; + } + fetchNews(queryParams).then((data: any) => { runInAction(() => (this.newsFlashLoading = false)); if (data) { runInAction(() => (this.newsFlashCollection = [...this.newsFlashCollection, ...data])); From 4e536abe031513b28d014aba94e828fe2e92dc58 Mon Sep 17 00:00:00 2001 From: Atalya Alon <20992625+atalyaalon@users.noreply.github.com> Date: Tue, 25 Apr 2023 19:04:28 +0300 Subject: [PATCH 08/15] Update News.tsx (#961) --- src/components/organisms/News.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/organisms/News.tsx b/src/components/organisms/News.tsx index 4865b853..4079c06d 100644 --- a/src/components/organisms/News.tsx +++ b/src/components/organisms/News.tsx @@ -48,7 +48,7 @@ const News: FC = () => { {date}, {news.display_source}

- {news.critical && } + {news.critical && critical image} {news.title} From dd9febfa54958fa8e38675025111047024805d73 Mon Sep 17 00:00:00 2001 From: Atalya Alon <20992625+atalyaalon@users.noreply.github.com> Date: Tue, 25 Apr 2023 19:04:51 +0300 Subject: [PATCH 09/15] Update news-flash-store.ts (#962) --- src/store/news-flash-store.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/store/news-flash-store.ts b/src/store/news-flash-store.ts index 6f049440..86e0d62e 100644 --- a/src/store/news-flash-store.ts +++ b/src/store/news-flash-store.ts @@ -111,7 +111,7 @@ export default class NewsFlashStore { const queryParams: IFetchNewsQueryParams = { offSet: this.newsFlashFetchOffSet }; - if (this.newsFlashActiveFilter == "critical") { + if (this.newsFlashActiveFilter === "critical") { queryParams["critical"] = true; } else { queryParams["source"] = this.newsFlashActiveFilter; From 7b67d0753bf582e333b25a18dc4b0996bbe89e62 Mon Sep 17 00:00:00 2001 From: Atalya Alon <20992625+atalyaalon@users.noreply.github.com> Date: Tue, 25 Apr 2023 19:10:22 +0300 Subject: [PATCH 10/15] Update News.tsx --- src/components/organisms/News.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/organisms/News.tsx b/src/components/organisms/News.tsx index 4079c06d..0325e851 100644 --- a/src/components/organisms/News.tsx +++ b/src/components/organisms/News.tsx @@ -48,7 +48,7 @@ const News: FC = () => { {date}, {news.display_source}

- {news.critical && critical image} + {news.critical && critical} {news.title} From a06502e35e4f0c59d83ae842dee61000ffd5a07c Mon Sep 17 00:00:00 2001 From: Atalya Alon <20992625+atalyaalon@users.noreply.github.com> Date: Mon, 29 May 2023 17:58:38 +0300 Subject: [PATCH 11/15] Update thank-you-names.csv --- public/thank-you-names.csv | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/thank-you-names.csv b/public/thank-you-names.csv index 4b857e41..e8b52315 100755 --- a/public/thank-you-names.csv +++ b/public/thank-you-names.csv @@ -96,6 +96,7 @@ Name עינת קדרון עמוס הוכמן ערן גלבוע +פועה בוגרד קוסטיה קלינובסקי רביע עפאן רון פייביש @@ -111,4 +112,5 @@ Name שני וינשטוק שקד זיכלינסקי שקד חייאק -תמר קליר \ No newline at end of file +תהילה נחמיה +תמר קליר From 61a492ed172b7ed66a137fb41b87aaafbe532575 Mon Sep 17 00:00:00 2001 From: Atalya Alon <20992625+atalyaalon@users.noreply.github.com> Date: Sat, 24 Jun 2023 21:43:06 +0300 Subject: [PATCH 12/15] transaction dialog box (#966) Co-authored-by: EyalIlan --- public/locales/he/translation.json | 3 + src/components/molecules/card/AnyWayCard.tsx | 33 +++++++- src/components/organisms/CardEditorDialog.tsx | 1 + src/components/organisms/TextBox.tsx | 76 +++++++++++++++++++ src/components/organisms/WidgetsTemplate.tsx | 3 +- 5 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 src/components/organisms/TextBox.tsx diff --git a/public/locales/he/translation.json b/public/locales/he/translation.json index 8dfc2f06..f8b5519c 100644 --- a/public/locales/he/translation.json +++ b/public/locales/he/translation.json @@ -108,6 +108,9 @@ "filterPanel": { "all": "הכל" }, + "infografic" :{ + "transaction":"תמלול אינפוגרפיקה" + }, "header": { "Search": "חיפוש", "User Greeting": "שלום", diff --git a/src/components/molecules/card/AnyWayCard.tsx b/src/components/molecules/card/AnyWayCard.tsx index d95a9f03..594ab25a 100644 --- a/src/components/molecules/card/AnyWayCard.tsx +++ b/src/components/molecules/card/AnyWayCard.tsx @@ -2,12 +2,14 @@ import React, { FC, useState } from 'react'; import { Card, CardContent, Box } from '@material-ui/core'; import { makeStyles } from '@material-ui/core/styles'; import widgetToImage from 'services/to-image.service'; +// TEXT BOX COMPONENT ADD FEATURE +import TextBox from 'components/organisms/TextBox' import { AnyWayButton } from 'components/atoms/AnyWayButton'; import Tooltip from '@material-ui/core/Tooltip'; import GetAppOutlinedIcon from '@material-ui/icons/GetAppOutlined'; import SettingsOverscanIcon from '@material-ui/icons/SettingsOverscan'; import InfoOutlinedIcon from '@material-ui/icons/InfoOutlined'; - +import TitleIcon from '@material-ui/icons/Title'; import { fontFamilyString } from 'style'; import CardHeader from './CardHeader'; import SocialShare from 'components/atoms/SocialShare'; @@ -35,6 +37,7 @@ interface IProps { information?: string; organizationData?: OrgLogoData; subtitle?: string; + BoxText?:string; } const getSizeFactor = (options: CardSizeOptions | undefined): number => (options?.size ? options.size : DEFAULTE_SIZE); @@ -76,10 +79,17 @@ const AnyWayCard: FC = ({ information, organizationData, subtitle, + BoxText }) => { const [element, setElement] = useState({}); const [isOpen, setOpen] = useState(false); - const handleCardEditorOpen = () => setOpen(true); + const [widgateOpen,SetWidgetOpen] = useState('') + + const handleCardEditorOpen = (name:string) =>{ + SetWidgetOpen(name) + setOpen(true) + }; + const handleCardEditorClose = () => setOpen(false); const variant = getWidgetVariant(widgetName); const factor = getSizeFactor(sizeOptions); @@ -91,12 +101,24 @@ const AnyWayCard: FC = ({ widgetToImage(widgetName, element); } }; + + let Widget; + + switch(widgateOpen){ + + case 'TextBox': + Widget = + break + case 'CardEditor': + Widget = + } + const buttons = !actionButtons ? null : ( <> - + {handleCardEditorOpen('CardEditor')}}> {information && ( @@ -108,6 +130,9 @@ const AnyWayCard: FC = ({ )} + {handleCardEditorOpen('TextBox')}}> + + ); @@ -152,7 +177,7 @@ const AnyWayCard: FC = ({ /> )} - + {Widget} diff --git a/src/components/organisms/CardEditorDialog.tsx b/src/components/organisms/CardEditorDialog.tsx index 5382086d..2a06314d 100644 --- a/src/components/organisms/CardEditorDialog.tsx +++ b/src/components/organisms/CardEditorDialog.tsx @@ -8,6 +8,7 @@ import { MetaTag, ErrorBoundary, Typography, Button, Slider } from 'components/a import widgetToImage from 'services/to-image.service'; import { useTranslation } from 'react-i18next'; import { blueVioletColor } from 'style'; + import {initEditorBarOptions, barsWidgetsLabels, barsWidgetsTitle, NUM_OF_BARS} from 'utils/barChart.utils'; interface IProps { diff --git a/src/components/organisms/TextBox.tsx b/src/components/organisms/TextBox.tsx new file mode 100644 index 00000000..e74ec544 --- /dev/null +++ b/src/components/organisms/TextBox.tsx @@ -0,0 +1,76 @@ +import React from 'react' +import DialogWithHeader from '../molecules/DialogWithHeader'; +import { AnyWayButton } from 'components/atoms/AnyWayButton'; +import { Box, makeStyles} from '@material-ui/core' +import { useTranslation } from 'react-i18next'; +import { Typography } from 'components/atoms'; +import { transparent } from 'style'; + + +interface IProps { + isOpen: boolean; + onClose: () => void; + widgetName: string; + text: string | undefined; +} +const TextBox: React.FC = ({ isOpen,text,onClose}) => { + + console.log('transaction ',text); + + + const useStyles = makeStyles((theme) => ({ + text: { + position: 'relative', // for meta tags + boxSizing: 'border-box', + zIndex: 0, + margin: '20px 0', + textAlign: 'center', + lineHeight: 1.7 + }, + root: { + display: 'flex', + flexDirection:'column', + alignItems:'center', + boxSizing:'border-box', + padding:20 + }, + button: { + margin: '20px 0', + '&:hover': { + backgroundColor: transparent, + }, + }, + img:{ + height:'100px', + width:'100px' + } + + + })); + + const { t } = useTranslation(); + const onCloseInitValues = () => { + onClose(); + } + + const classes = useStyles(); + + return ( + + + + + {text} + + + + {navigator.clipboard.writeText(text?text:'asdsadasd')}} className={classes.button} > + + + + + + ) +} + +export default TextBox \ No newline at end of file diff --git a/src/components/organisms/WidgetsTemplate.tsx b/src/components/organisms/WidgetsTemplate.tsx index c1dafe9e..479dabbc 100644 --- a/src/components/organisms/WidgetsTemplate.tsx +++ b/src/components/organisms/WidgetsTemplate.tsx @@ -31,15 +31,16 @@ const WidgetsTemplate: FC = () => { isStreet={widgetsStore.isStreet} /> ); - console.log(widget.data?.text?.subtitle); if (!widgetComponent) { return null; } + return ( Date: Wed, 12 Jul 2023 19:23:55 +0300 Subject: [PATCH 13/15] [Feat-925] Add location approval feature (#969) * initial feature commit with icon and new field * Added icon choice and display * Move critical icon * Add location change button * Make critical icon transperent * replace critical.gif with svg * Window open pressing button, seperated newsFlash comp to new file * Added user info * Status icon and buttons * Added map choice (need to finish with saving data) * Saving location and qualificaion data * Added manual option for location qualification and added user change * Fix responsibilty issue between the two files * Split Search city to 2 files * Spacing and page look * Changed initialLocation to be a function, and improved onClose location window * Split radio buttons to seperate file * updated put function for news flash --------- Co-authored-by: Daniel Shely <> --- public/locales/en/translation.json | 15 ++ public/locales/he/translation.json | 15 ++ public/thank-you-names.csv | 2 +- src/assets/cancel_red_24dp.svg | 4 + src/assets/check_blue_24dp.svg | 3 + src/assets/critical.jpg | Bin 2475 -> 0 bytes src/assets/critical.svg | 3 + src/cancel_black_24dp.svg | 2 + src/components/atoms/Button.tsx | 9 + .../molecules/ApproveLocationRadioButtons.tsx | 43 ++++ src/components/molecules/LocationSelect.tsx | 12 +- src/components/molecules/MapDialog.tsx | 32 +-- src/components/molecules/NewsFlashComp.tsx | 85 ++++++++ .../molecules/NewsFlashFilterPanel.tsx | 2 +- .../molecules/SearchCityAndStreet.tsx | 75 +++++++ .../molecules/SearchCityAndStreetScreen.tsx | 92 ++++---- .../organisms/LocationApproveWindow.tsx | 202 ++++++++++++++++++ src/components/organisms/News.tsx | 41 +--- src/const/generalConst.ts | 3 +- src/models/NewFlash.ts | 1 + src/models/WidgetData.ts | 5 + src/services/news.data.service.ts | 20 ++ 22 files changed, 542 insertions(+), 124 deletions(-) create mode 100644 src/assets/cancel_red_24dp.svg create mode 100644 src/assets/check_blue_24dp.svg delete mode 100755 src/assets/critical.jpg create mode 100644 src/assets/critical.svg create mode 100644 src/cancel_black_24dp.svg create mode 100644 src/components/molecules/ApproveLocationRadioButtons.tsx create mode 100644 src/components/molecules/NewsFlashComp.tsx create mode 100644 src/components/molecules/SearchCityAndStreet.tsx create mode 100644 src/components/organisms/LocationApproveWindow.tsx diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 33d0bb51..58dc1af6 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -81,6 +81,20 @@ "size": "Size", "download": "Download as PNG" }, + "LocationApprove": { + "title": "Change/Approve location", + "newsFlash": "News flash", + "accident": "Location of accident", + "changeAllowed": "Can choose location on the map or choose city and ", + "updater": "User updating", + "status": "Status", + "pleaseMark": "please choose", + "verifyLocation": "Approve segment", + "rejectLocation": "Reject segment", + "segment": "Segment", + "approveButton": "Approve", + "cancelButton": "Cancel" + }, "labelPosition": "Label Position", "table": { "labels": ["Date", "Hour", "Type", "Killed", "Severe", "Light"] @@ -112,6 +126,7 @@ "edit": "edit" }, "sideBar": "Approximate location:", + "changeLocationButton": "Change/Approve location", "UserProfileHeader": { "hello": "Hello", "logout": "LOGOUT" diff --git a/public/locales/he/translation.json b/public/locales/he/translation.json index f8b5519c..d334f32b 100644 --- a/public/locales/he/translation.json +++ b/public/locales/he/translation.json @@ -93,6 +93,20 @@ "size": "גודל", "download": "הורד כתמונה" }, + "LocationApprove": { + "title": "שינוי/אישור מיקום", + "newsFlash": "המבזק", + "accident": "מיקום התאונה", + "changeAllowed": "ניתן לשנות מיקום על המפה או לבחור יישוב ורחוב", + "updater": "הגורם המעדכן", + "status": "סטטוס", + "pleaseMark": "נא לסמן", + "verifyLocation": "זיהוי מקטע ודאי", + "rejectLocation": "מקטע לא זוהה נכון", + "segment": "המקטע", + "approveButton": "אישור", + "cancelButton": "ביטול" + }, "labelPosition": "מיקום תווית", "table": { "labels": [ @@ -118,6 +132,7 @@ "management": "ניהול" }, "sideBar": "מיקום משוער:", + "changeLocationButton": "שינוי/אישור מיקום", "UserProfileHeader": { "hallo": "שלום", "logout": "התנתקות" diff --git a/public/thank-you-names.csv b/public/thank-you-names.csv index e8b52315..a6710f4e 100755 --- a/public/thank-you-names.csv +++ b/public/thank-you-names.csv @@ -111,6 +111,6 @@ Name שלומי ברוך שני וינשטוק שקד זיכלינסקי -שקד חייאק +שקד חייק תהילה נחמיה תמר קליר diff --git a/src/assets/cancel_red_24dp.svg b/src/assets/cancel_red_24dp.svg new file mode 100644 index 00000000..a0ace1b4 --- /dev/null +++ b/src/assets/cancel_red_24dp.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/check_blue_24dp.svg b/src/assets/check_blue_24dp.svg new file mode 100644 index 00000000..d1b67278 --- /dev/null +++ b/src/assets/check_blue_24dp.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/critical.jpg b/src/assets/critical.jpg deleted file mode 100755 index b6d2b5024d1b741f481e349f446a6ecf8a372b91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2475 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 CmwYJz diff --git a/src/assets/critical.svg b/src/assets/critical.svg new file mode 100644 index 00000000..922da557 --- /dev/null +++ b/src/assets/critical.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/cancel_black_24dp.svg b/src/cancel_black_24dp.svg new file mode 100644 index 00000000..38bd077c --- /dev/null +++ b/src/cancel_black_24dp.svg @@ -0,0 +1,2 @@ + + diff --git a/src/components/atoms/Button.tsx b/src/components/atoms/Button.tsx index a071993e..f7839d7a 100644 --- a/src/components/atoms/Button.tsx +++ b/src/components/atoms/Button.tsx @@ -5,6 +5,7 @@ interface IProps { onClick?: () => void; isSubmit?: boolean; disabled?: boolean; + buttonHeight?: number; } // todo: make standard buttons for entire app @@ -14,6 +15,13 @@ const StandardButton: FC = ({ isSubmit = false, onClick, children, disab ); +const SmallButton: FC = ({ isSubmit = false, onClick, children, buttonHeight, disabled = false }) => ( + + {children} + +); + const OutlinedButton: FC = ({ isSubmit = false, onClick, children }) => ( {children} @@ -33,6 +41,7 @@ const Button = { Icon: IconButton, Outlined: OutlinedButton, Text: TextButton, + Small: SmallButton, }; export default Button; diff --git a/src/components/molecules/ApproveLocationRadioButtons.tsx b/src/components/molecules/ApproveLocationRadioButtons.tsx new file mode 100644 index 00000000..91d1ba81 --- /dev/null +++ b/src/components/molecules/ApproveLocationRadioButtons.tsx @@ -0,0 +1,43 @@ +import {FormControl, FormControlLabel, makeStyles, Radio, RadioGroup} from "@material-ui/core"; +import React, {FC} from "react"; +import {useTranslation} from "react-i18next"; +import {ReactComponent as CheckCircleIcon} from "assets/check_blue_24dp.svg"; +import {oceanBlueColor, roseColor, silverGrayColor} from "style"; +import {ReactComponent as CancelCircleIcon} from "assets/cancel_red_24dp.svg"; + + +interface IProps { + handleApproveStatusChange: (event : React.ChangeEvent) => void; + defaultValue: string; +} + +const useStyles = makeStyles({ + icon: { + height: 23, + width:23, + }, +}); + +const ApproveLocationRadioButtons: FC = ({ handleApproveStatusChange, defaultValue}) => { + const { t } = useTranslation(); + const classes = useStyles(); + + const checkedApproveIcon = + const uncheckedApproveIcon = + const checkedRejectIcon = + const uncheckedRejectIcon = + + return ( + + } + label={t('LocationApprove.verifyLocation')} /> + } + label={t('LocationApprove.rejectLocation')} /> + + + ); +}; + +export default ApproveLocationRadioButtons; diff --git a/src/components/molecules/LocationSelect.tsx b/src/components/molecules/LocationSelect.tsx index 871e5a6c..22a0eb0d 100644 --- a/src/components/molecules/LocationSelect.tsx +++ b/src/components/molecules/LocationSelect.tsx @@ -6,11 +6,12 @@ import Map from './map/Map'; interface ILocation { onLocationChange: (location: IPoint) => void; + initialLocationGetter: (() => IPoint | null) | null; } -const LocationPicker: FC = ({ onLocationChange }) => { - // const [position, setPosition] = useState(null); - const [position, setPosition] = useState(null) +const LocationPicker: FC = ({ onLocationChange, initialLocationGetter }) => { + const initialLocation = initialLocationGetter ? initialLocationGetter() : null; + const [position, setPosition] = useState(initialLocation); console.log(position, 'before the click') useMapEvents( { @@ -27,12 +28,13 @@ const LocationPicker: FC = ({ onLocationChange }) => { interface IProps { onLocationChange: (location: IPoint) => void; + initialLocationGetter?: () => IPoint | null; } -const LocationSelect: FC = ({ onLocationChange }) => { +const LocationSelect: FC = ({ onLocationChange, initialLocationGetter = null }) => { return ( - + ); }; diff --git a/src/components/molecules/MapDialog.tsx b/src/components/molecules/MapDialog.tsx index e5ea59dd..7040c94f 100644 --- a/src/components/molecules/MapDialog.tsx +++ b/src/components/molecules/MapDialog.tsx @@ -1,14 +1,12 @@ -import { ChangeEvent, FC, useEffect, useState } from 'react'; +import { FC, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { createStyles, makeStyles, Theme } from '@material-ui/core/styles'; import { Box } from '@material-ui/core'; import { Dialog , Typography } from 'components/atoms'; import { IPoint } from 'models/Point'; import { useStore } from 'store/storeConfig'; -import { fetchStreetsByCity } from 'services/getCitiesAndStreets.service'; import SearchCityAndStreetScreen from 'components/molecules/SearchCityAndStreetScreen'; import SearchSegmentScreen from 'components/molecules/SearchSegmentScreen'; -import { ICityOption, IStreetOption } from 'models/Map'; interface IProps { section?: string; @@ -70,9 +68,6 @@ const MapDialog: FC = ({ const classes = useStyles(); const { t } = useTranslation(); const [searchScreen, setSearchScreen] = useState<'segment' | 'cityAndStreet'>('segment'); - const [streetsOptions, setStreetsOptions] = useState>([]); - const [cityValue, setCityValue] = useState({}); - const [streetValue, setStreetValue] = useState({}); const store = useStore(); useEffect(() => { @@ -80,28 +75,6 @@ const MapDialog: FC = ({ store.fetchCitiesList(); }, [store]); - async function setCityGetStreets(event: ChangeEvent<{}>, value?: ICityOption | null) { - setStreetsOptions([]); - setStreetValue({}); - if (value) { - setCityValue({ yishuv_name: value.yishuv_name, yishuv_symbol: value.yishuv_symbol }); - const streetsData = await fetchStreetsByCity(value.yishuv_symbol); - setStreetsOptions(streetsData); - } - } - - function setChosenStreet(event: ChangeEvent<{}>, value?:IStreetOption) { - if (value) { - setStreetValue(value); - } - } - - function streetCityResultsPage() { - setCityValue({}); - setStreetValue({}); - onStreetAndCitySearch(cityValue.yishuv_name, streetValue.street_hebrew); - } - // the code I deleted should be here... // SearchCityAndStreetScreen() @@ -123,8 +96,7 @@ const MapDialog: FC = ({ {searchScreen === 'segment' && } - {searchScreen === 'cityAndStreet' && } diff --git a/src/components/molecules/NewsFlashComp.tsx b/src/components/molecules/NewsFlashComp.tsx new file mode 100644 index 00000000..2f1ff251 --- /dev/null +++ b/src/components/molecules/NewsFlashComp.tsx @@ -0,0 +1,85 @@ +import React, {FC, useState} from 'react'; +import { Link, Typography, Button } from 'components/atoms'; +import { Box, makeStyles } from '@material-ui/core'; +import { cherryJamColor, oceanBlueColor, silverSmokeColor } from 'style'; +import { useStore } from 'store/storeConfig'; +import RootStore from 'store/root.store'; +import { dateFormat } from 'utils/time.utils'; +import { useLocale } from 'hooks/date.hooks'; +import { ReactComponent as CheckCircleIcon } from 'assets/check_blue_24dp.svg'; +import { ReactComponent as CancelCircleIcon } from 'assets/cancel_red_24dp.svg'; +import { ReactComponent as CriticalIcon } from 'assets/critical.svg'; +import { useTranslation } from 'react-i18next'; +import LocationApprove from 'components/organisms/LocationApproveWindow'; +import {locationQualificationOptions} from 'components/organisms/LocationApproveWindow'; +import { INewsFlash } from 'models/NewFlash'; + +const ICON_HEIGHT = 18 + +interface IProps { + news: INewsFlash; +} + +const useStyles = makeStyles({ + activeNewsFlash: { + backgroundColor: silverSmokeColor, + }, + icon: { + height: ICON_HEIGHT, + width: 18, + }, +}); + + +const NewsFlashComp: FC = ({ news }) => { + const store: RootStore = useStore(); + const classes = useStyles(); + const locale = useLocale(); + const { userStore, newsFlashStore, settingsStore } = store; + const { t } = useTranslation(); + const userAllowedChange = userStore.isUserAuthenticated && userStore.isAdmin; + + function getVerificationIcon(verificationText: string) { + if (verificationText === locationQualificationOptions.REJECTED) { + return + } else if (verificationText === locationQualificationOptions.VERIFIED || + verificationText === locationQualificationOptions.MANUAL) { + return + } else if (verificationText === locationQualificationOptions.NOT_VERIFIED) { + return + } else { + return + } + } + + const [isOpen, setOpen] = useState(false); + const verificationIcon = getVerificationIcon(news.newsflash_location_qualification); + const criticalIcon = news.critical && ; + const className = news.id === newsFlashStore.activeNewsFlashId ? classes.activeNewsFlash : ''; + const date = news.date == null ? '' : dateFormat(new Date(news.date.replace(/-/g, '/')), locale); + const handleLocationEditorOpen = () => setOpen(true); + const handleLocationEditorClose = () => setOpen(false); + const locationChangeButton = userAllowedChange && + + {t('changeLocationButton')} + + return ( + + + +

+ + {date}, {news.display_source} {verificationIcon}{criticalIcon} + +

+ {locationChangeButton} +
+ {news.title} +
+ + + ); +} + +export default NewsFlashComp; diff --git a/src/components/molecules/NewsFlashFilterPanel.tsx b/src/components/molecules/NewsFlashFilterPanel.tsx index abc04c8c..c27c6c75 100644 --- a/src/components/molecules/NewsFlashFilterPanel.tsx +++ b/src/components/molecules/NewsFlashFilterPanel.tsx @@ -5,7 +5,7 @@ import { silverSmokeColor, oceanBlueColor } from 'style'; import ynetLogo from 'assets/ynet-website-logo.svg'; import wallaLogo from 'assets/walla-logo.svg'; import madaLogo from 'assets/mada-logo.svg'; -import criticalLogo from 'assets/critical.jpg'; +import criticalLogo from 'assets/critical.svg'; import { AnyWayButton } from 'components/atoms/AnyWayButton'; import RootStore from 'store/root.store'; import { useStore } from 'store/storeConfig'; diff --git a/src/components/molecules/SearchCityAndStreet.tsx b/src/components/molecules/SearchCityAndStreet.tsx new file mode 100644 index 00000000..173452c6 --- /dev/null +++ b/src/components/molecules/SearchCityAndStreet.tsx @@ -0,0 +1,75 @@ +import {ChangeEvent, FC, useState} from "react"; +import {useTranslation} from "react-i18next"; +import {ICityOption, IStreetOption} from "models/Map"; +import {useStore} from "store/storeConfig"; +import {createStyles, makeStyles, Theme} from "@material-ui/core/styles"; +import {fetchStreetsByCity} from "services/getCitiesAndStreets.service"; +import {Box, TextField} from "@material-ui/core"; +import Autocomplete from "@material-ui/lab/Autocomplete"; + +interface ISearchCityAndStreet{ + onStreetAndCityChoice: (street: IStreetOption, city: ICityOption) => void; +} + +const SearchCityAndStreet : FC = ({onStreetAndCityChoice}) => { + const { t } = useTranslation(); + const [streetsOptions, setStreetsOptions] = useState>([]); + const [cityValue, setCityValue] = useState({}); + const [streetValue, setStreetValue] = useState({}); + const store = useStore(); + + const useStyles = makeStyles((theme: Theme) => + createStyles({ + inputSpace: { + marginTop: 20, + marginInlineEnd: 20, + }, + }), + ); + + const classes = useStyles(); + + async function setCityGetStreets(event: ChangeEvent<{}>, value?: ICityOption | null) { + setStreetsOptions([]); + setStreetValue({}); + if (value) { + setCityValue({ yishuv_name: value.yishuv_name, yishuv_symbol: value.yishuv_symbol }); + const streetsData = await fetchStreetsByCity(value.yishuv_symbol); + setStreetsOptions(streetsData); + } + } + + function setChosenStreet(event: ChangeEvent<{}>, value?:IStreetOption | null) { + if (value) { + setStreetValue(value); + onStreetAndCityChoice(value, cityValue); + } + } + + return( + + (option.yishuv_name ? option.yishuv_name : '')} + onChange={(event, value) => setCityGetStreets(event, value)} + value={{ yishuv_name: cityValue.yishuv_name, yishuv_symbol: cityValue.yishuv_symbol }} + style={{ minWidth: 300 }} + renderInput={(params) => + } + /> + (option.street_hebrew ? option.street_hebrew : '')} + style={{ minWidth: 300 }} + value={{ street: streetValue.street, street_hebrew: streetValue.street_hebrew }} + onChange={(event, value) => setChosenStreet(event, value)} + disabled={streetsOptions.length === 0} + renderInput={(params) => + } + /> + ) +} + +export default SearchCityAndStreet; diff --git a/src/components/molecules/SearchCityAndStreetScreen.tsx b/src/components/molecules/SearchCityAndStreetScreen.tsx index 6e2318e0..ae8e9620 100644 --- a/src/components/molecules/SearchCityAndStreetScreen.tsx +++ b/src/components/molecules/SearchCityAndStreetScreen.tsx @@ -1,73 +1,55 @@ -import { Box, DialogActions, TextField } from '@material-ui/core'; -import Autocomplete from '@material-ui/lab/Autocomplete'; +import { Box, DialogActions } from '@material-ui/core'; import { Button } from 'components/atoms'; import { createStyles, makeStyles, Theme } from '@material-ui/core/styles'; -import { useStore } from 'store/storeConfig'; import { useTranslation } from 'react-i18next'; -import { ChangeEvent, FC } from 'react'; +import {FC, useState} from 'react'; import { ICityOption, IStreetOption } from 'models/Map'; +import SearchCityAndStreet from "./SearchCityAndStreet"; interface ISearchCityAndStreetScreen{ - streetsOptions:Array; - streetValue:IStreetOption; - setChosenStreet:Function; - streetCityResultsPage:() => void; + onStreetAndCitySearch: (street?: string, city?: string) => void; onClose:() => void; - setCityGetStreets:(event : ChangeEvent<{}> ,value? : ICityOption | null) => void, - cityValue:ICityOption, } -const SearchCityAndStreetScreen : FC = ( -{setCityGetStreets, cityValue, streetsOptions, streetValue, -setChosenStreet, streetCityResultsPage, onClose} -) => { + +const SearchCityAndStreetScreen : FC = ({onStreetAndCitySearch, onClose}) => { const { t } = useTranslation(); -const useStyles = makeStyles((theme: Theme) => -createStyles({ - actions: { - gap: theme.spacing(1), - }, - inputSpace: { - marginTop: 20, - marginInlineEnd: 20, - }, -}), -); + const [cityValue, setCityValue] = useState({}); + const [streetValue, setStreetValue] = useState({}); + const useStyles = makeStyles((theme: Theme) => + createStyles({ + actions: { + gap: theme.spacing(1), + }, + }), + ); const classes = useStyles(); - const store = useStore(); -return(<> - - (option.yishuv_name ? option.yishuv_name : '')} - onChange={(event, value) => setCityGetStreets(event, value)} - value={{ yishuv_name: cityValue.yishuv_name, yishuv_symbol: cityValue.yishuv_symbol }} - style={{ minWidth: 300 }} - renderInput={(params) => } - /> - (option.street_hebrew ? option.street_hebrew : '')} - style={{ minWidth: 300 }} - value={{ street: streetValue.street, street_hebrew: streetValue.street_hebrew }} - onChange={(event, value) => setChosenStreet(event, value)} - disabled={streetsOptions.length === 0} - renderInput={(params) => } - /> - - - - {t('mapDialog.searchButton')} - - {t('mapDialog.cancelButton')} - -) + function onStreetAndCityChoice(street: IStreetOption, city: ICityOption) { + setCityValue(city); + setStreetValue(street); + } + + function streetCityResultsPage() { + setCityValue({}); + setStreetValue({}); + onStreetAndCitySearch(cityValue.yishuv_name, streetValue.street_hebrew); + } + + return(<> + + + + + + {t('mapDialog.searchButton')} + + {t('mapDialog.cancelButton')} + + ) } export default SearchCityAndStreetScreen; diff --git a/src/components/organisms/LocationApproveWindow.tsx b/src/components/organisms/LocationApproveWindow.tsx new file mode 100644 index 00000000..a211b46f --- /dev/null +++ b/src/components/organisms/LocationApproveWindow.tsx @@ -0,0 +1,202 @@ +import React, {FC, useCallback, useState} from 'react'; +import DialogWithHeader from '../molecules/DialogWithHeader'; +import {Box, makeStyles } from '@material-ui/core'; +import { Button, Typography } from 'components/atoms'; +import { useTranslation } from 'react-i18next'; +import { silverSmokeColor } from 'style'; +import { INewsFlash } from "models/NewFlash"; +import { useStore } from "store/storeConfig"; +import {IPoint} from "models/Point"; +import {IGpsData, IStreetData} from "models/WidgetData"; +import LocationSelect from "../molecules/LocationSelect"; +import SearchCityAndStreet from "../molecules/SearchCityAndStreet"; +import {ICityOption, IStreetOption} from "models/Map"; +import ApproveLocationRadioButtons from "../molecules/ApproveLocationRadioButtons"; +import { updateNews } from "services/news.data.service"; + +const APPROVE = "approve"; + +export enum locationQualificationOptions { + VERIFIED = "verified", + NOT_VERIFIED = "not_verified", + REJECTED = "rejected", + MANUAL = "manual", +} + +interface IProps { + isOpen: boolean; + onClose: () => void; + news: INewsFlash; + newFlashTitle: string; +} + +const useStyles = makeStyles({ + newsFlashBox: { + display: 'flex', + backgroundColor: silverSmokeColor + }, + mainWindow: { + display: "flex", + width: 1000, + height: 700, + flexBasis: 200, + minWidth: 200, + alignContent: 'space-around', + flexDirection: 'column' + }, + block: { + display: "flex", + alignContent: 'space-around', + flexDirection: 'column', + }, +}); + +const LocationApprove: FC = ({ isOpen, onClose, news, newFlashTitle }) => { + const { t } = useTranslation(); + const classes = useStyles(); + const store = useStore(); + const { userStore } = store; + const [shouldApprove, setApproveStatus] = useState(true); + const [locationChanged, setLocationChanged] = useState(false); + const [newStreetLoc, setNewStreetLoc] = useState(null); + const [newGpsLoc, setNewGpsLoc] = useState(null); + const [locationToDisplay, setLocationToDisplay] = useState(news.location); + // Unauthorized user shouldn't be able to open the window in the first place + const userInfo = userStore.userInfo && userStore.userInfo.data && userStore.userInfo.data.firstName ? + userStore.userInfo.data.firstName.concat(userStore.userInfo.data.lastName) : null; + + function handleApproveButton () { + if (shouldApprove && locationChanged) { + if (newStreetLoc) { + updateNews(news.id, locationQualificationOptions.MANUAL, newStreetLoc, null); + } else { + updateNews(news.id, locationQualificationOptions.MANUAL, null, newGpsLoc); + } + } else if (shouldApprove) { + updateNews(news.id, locationQualificationOptions.VERIFIED, null, null); + } else { + updateNews(news.id, locationQualificationOptions.REJECTED, null, null); + } + onCloseInitValues(); + window.location.reload(); + } + + const handleCloseButton = () => onCloseInitValues(); + + const handleApproveStatusChange = (event: React.ChangeEvent) => { + if ((event.target as HTMLInputElement).value === APPROVE) { + setApproveStatus(true); + } else { + setLocationToDisplay(news.location); + setApproveStatus(false); + } + }; + + const onMapLocationChange = useCallback( + (location: IPoint) => { + setLocationChanged(true); + store.fetchGpsLocation(location); + if (store.gpsLocationData) { + setNewGpsLoc(store.gpsLocationData); + setLocationToDisplay(t('mapDialog.road') + " " + store.gpsLocationData.road1 + " - " + + store.gpsLocationData.road_segment_name); + } + }, + [t, store], + ); + + const newsGetInitialLocation = useCallback(() => ( + {longitude: news.lon, latitude: news.lat}), + [news.lat, news.lon] + ); + + const onStreetAndCityChoice = (street: IStreetOption, city: ICityOption) => { + setLocationChanged(true); + setLocationToDisplay(t('mapDialog.street') + " " + street.street_hebrew + " " + + t('textView.on') + city.yishuv_name); + setNewStreetLoc({street, city}); + } + + const onCloseInitValues = () => { + setApproveStatus(true); + setLocationChanged(false); + setLocationToDisplay(news.location); + onClose(); + } + + return ( + + + {/*The newsflash*/} + + {t('LocationApprove.newsFlash')}: + + + {newFlashTitle} + + + {news.title} + + {news.description} + + + + {/*Display map and search to choose location*/} + + {t('LocationApprove.accident')}: + ({t('LocationApprove.changeAllowed')}) + + + + + + + + + {/*Display user name */} + + {t('LocationApprove.updater')}: + {userInfo} + + {/*Status chooser*/} + + + {t('LocationApprove.status')}: + ({t('LocationApprove.pleaseMark')}) + + + + + + + + + {/*Segment*/} + + {t('LocationApprove.segment')}: + + {locationToDisplay} + + + {/*Buttons*/} + + + {t('LocationApprove.cancelButton')} + + + {t('LocationApprove.approveButton')} + + + + + + ); + }; + +export default LocationApprove; diff --git a/src/components/organisms/News.tsx b/src/components/organisms/News.tsx index 0325e851..5fb9de73 100644 --- a/src/components/organisms/News.tsx +++ b/src/components/organisms/News.tsx @@ -1,34 +1,29 @@ -import { FC } from 'react'; -import { Link, Typography } from 'components/atoms'; +import React, { FC } from 'react'; +import { Typography } from 'components/atoms'; import { Box, makeStyles } from '@material-ui/core'; -import { silverSmokeColor } from 'style'; import { useStore } from 'store/storeConfig'; import { useParams } from 'react-router-dom'; import RootStore from 'store/root.store'; import { observer } from 'mobx-react-lite'; -import { dateFormat } from 'utils/time.utils'; -import { useLocale } from 'hooks/date.hooks'; import LocationSearchIndicator from 'components/molecules/LocationSearchIndicator'; import { IRouteProps } from 'models/Route'; -import CriticalIcon from 'assets/critical.jpg'; +import NewsFlashComp from "components/molecules/NewsFlashComp"; + const useStyles = makeStyles({ container: {}, newsFeed: { overflow: 'auto', }, - activeNewsFlash: { - backgroundColor: silverSmokeColor, - }, }); -// + const News: FC = () => { const store: RootStore = useStore(); const classes = useStyles(); - const locale = useLocale(); const { gpsId, street, city } = useParams(); - const { newsFlashStore, settingsStore } = store; + const { newsFlashStore } = store; + return ( @@ -36,25 +31,9 @@ const News: FC = () => { {gpsId && } {street && city && } {newsFlashStore.newsFlashCollection.length > 0 ? ( - newsFlashStore.newsFlashCollection.map((news) => { - const className = news.id === newsFlashStore.activeNewsFlashId ? classes.activeNewsFlash : ''; - const date = news.date == null ? '' : dateFormat(new Date(news.date.replace(/-/g, '/')), locale); - return ( - - - -

- - {date}, {news.display_source} - -

- {news.critical && critical} -
- {news.title} -
- - ); - }) + newsFlashStore.newsFlashCollection.map((news) => + + ) ) : ( לא נמצאו תוצאות מהמקור המבוקש diff --git a/src/const/generalConst.ts b/src/const/generalConst.ts index 8bc0eb3e..5f9121f9 100644 --- a/src/const/generalConst.ts +++ b/src/const/generalConst.ts @@ -23,7 +23,8 @@ export const REMOVE_USER_FROM_ORG_URL = `${authServerUrl}/user/remove_user_from_ AUTH_LOGIN_GOOGLE_URL.searchParams.append('redirect_url', `${window.location.origin}${REDIRECT_ROUTE!}`); //function return api key depends on the env it running on -export const mapApiKey = process.env.REACT_APP_GOOGLE_MAP_KEY ? process.env.REACT_APP_GOOGLE_MAP_KEY : ''; +// export const mapApiKey = process.env.REACT_APP_GOOGLE_MAP_KEY ? process.env.REACT_APP_GOOGLE_MAP_KEY : ''; +export const mapApiKey = 'AIzaSyCfluirCgaQ769osh7560kST3Yo0eQIqg8'; export const showDemoCards = process.env.REACT_APP_SHOW_DEMO_CARDS === 'true'; diff --git a/src/models/NewFlash.ts b/src/models/NewFlash.ts index 2a926086..85b31486 100644 --- a/src/models/NewFlash.ts +++ b/src/models/NewFlash.ts @@ -10,6 +10,7 @@ export interface INewsFlash { link: string; lon: number; display_source: string; + newsflash_location_qualification: string; location: string; title: string; source: string; diff --git a/src/models/WidgetData.ts b/src/models/WidgetData.ts index 15e7df39..2f2b119d 100644 --- a/src/models/WidgetData.ts +++ b/src/models/WidgetData.ts @@ -1,6 +1,7 @@ import { LabelsMap, MultiSeriesDataItems, SeriesDataItem } from './MultiSeriesData'; import { IPoint, IPointAccident } from './Point'; import { IWidgetDataType } from './WidgetDataType'; +import {ICityOption, IStreetOption} from "./Map"; export enum Resolution { STREET = "STREET", @@ -19,6 +20,10 @@ export interface IGpsData { road_segment_id: number; resolution: string; } +export interface IStreetData { + street: IStreetOption; + city: ICityOption; +} export interface IWidgetDataBase { text: { title?: string; diff --git a/src/services/news.data.service.ts b/src/services/news.data.service.ts index b5353895..12613a93 100644 --- a/src/services/news.data.service.ts +++ b/src/services/news.data.service.ts @@ -1,5 +1,6 @@ import axios from 'axios'; import { INewsFlash } from 'models/NewFlash'; +import { IGpsData, IStreetData } from "models/WidgetData"; const errorNews: INewsFlash = { lat: -1, @@ -13,6 +14,7 @@ const errorNews: INewsFlash = { link: '', description: '', display_source: '', + newsflash_location_qualification : '', location: '', }; @@ -55,3 +57,21 @@ function onErrorFetchNewsFlash() { errorArr.push(errorNews); return errorArr; } + +export function updateNews(newsId: number, newLocationQualification: any, + streetLocation: IStreetData | null, gpsLocation: IGpsData | null) { + const data = []; + data.push(`newsflash_location_qualification=${newLocationQualification}`) + if (gpsLocation) { + data.push(`road_segment_name=${gpsLocation.road_segment_name}`) + // data.push(`road1=${gpsLocation.road1}`) TODO: uncomment when option added + } else if (streetLocation) { + data.push(`yishuv_name=${streetLocation.street}`) + data.push(`street1_hebrew=${streetLocation.city}`) + } + const url = `${NEWS_FLASH_API}?${newsId}`; + axios + .put(url) + .then((res) => res.data) + .catch(onErrorFetchNewsFlash) +} From 63826f0b07a9d3e59bfdd74a969a0799da20475a Mon Sep 17 00:00:00 2001 From: EyalIlan <55767736+EyalIlan@users.noreply.github.com> Date: Thu, 13 Jul 2023 18:06:24 +0300 Subject: [PATCH 14/15] Feature add transcrption 4 widgets 957 (#968) * transaction dialog box * show transaction icon only widgets that has transaction * add copy image to transaction box --- src/assets/copyImageGrey.jpeg | Bin 0 -> 1299 bytes src/assets/copyImageWhite.jpeg | Bin 0 -> 1294 bytes src/components/molecules/card/AnyWayCard.tsx | 14 +++--- src/components/organisms/CardEditorDialog.tsx | 1 + src/components/organisms/TextBox.tsx | 41 +++++++++++++----- src/components/organisms/WidgetsTemplate.tsx | 2 +- 6 files changed, 38 insertions(+), 20 deletions(-) create mode 100644 src/assets/copyImageGrey.jpeg create mode 100644 src/assets/copyImageWhite.jpeg diff --git a/src/assets/copyImageGrey.jpeg b/src/assets/copyImageGrey.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..a6f41ce0a7764b2156c81f1be0bffbe6fd3b927c GIT binary patch literal 1299 zcmex=+ z$QDV5ur)yJBnaCE#4ax>C;_So0I`cgf}DZu6d+q89f_TU#7-_K0;%r-s5rZ)ISRxP=f? zS-`-+-@?GK?L0yZ5hewRMTubJSb!u`S{ehxr{xR`ypaqH!WS4AxT3*wKmv!`6o67P zKzHQ>VLC$&Ln?y;gC|2CLo$ONkY&VRz+lK=_Ww46GXpad2!KdtAYfr*0Rav+HdZ!H z4lXWE4o*%k9)2D!Za!{KPF_J?K7IiKK>;ovAz>i_VIW%oWC$ZjCo>BNP@@1hCpS=( zMDYIrgCGZkI)f53qY?v?AS1INMNo|d=>~}kqF4kL zy~V)8%m{Q3vmk>#L;3dH)sn|%Cq?|7?5lcv!IPg$AKX$nzr$$x%(fP{D(`dOl3%Ye zIdmv!osj1%R~(at|Q<)C3R97x|{Zusm^7DI>8y*LxSS^<=JI|XP)vxNMvtW|{ zlF6=2pZD?GzF59b_&-C^j%(Rbb$=v6*UKI-l}pJy7rEig%$wW8m0Utv4NiZ185s0x zLjMwJult@s4S}*&r7u=iM!kK1O}U|? zKQ)AB*;i@R3ug~!$*`$xPdcx6<7~UsWW`qF$DVU(4~EwrCsTM^WzPwTcYbsS1Ic)_`WnVRiXK(K*oYurOW2$=Ipr@lY3;! zS}vJZ=6f8rkEZb^T+qD`yV+9QSNK|t+~Gb?uaNH0``k^x9_jaS1-wXDnW4Vo!>+!H zCl_5=l~10o|Ig6jtMSjZ^FM>B|I2qLKUZI?PrI`B@~hWX&Bo%z+cri#h`!8qk@tcl c-#1Q9PlbjGPKF7b&v$icNUzdZ)cpS@06+k2djJ3c literal 0 HcmV?d00001 diff --git a/src/assets/copyImageWhite.jpeg b/src/assets/copyImageWhite.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..4c38615f74c1f775b1720f4cd8364fc9a6763b5b GIT binary patch literal 1294 zcmex=+ z$QDV5ur)yJBnaCE#4ax>C;_So0I`cgf}DZu6d+q89f_TU#7-_K0;%r-s5rZ)ISRxP=f? zS-`-+-@?GK?L0yZ5hewRMTubJSb!u`S{ehxr{xR`ypaqH!WS4AxT3*wKmv!`6o67P zKzHQ>VLC$&Ln?y;gC|2CLo$ONkY&VRz+lK=_Ww46GXpad2!KdtAYfr*0Rav+HdZ!H z4lXWE4o*%k9)2D!Za!{KPF_J?K7IiKK>;ovAz>i_VIW%oWC$ZjCo>BNP@@1hCpS=( zMDYIrgCGZkI)f53qY?v?AS1INbw&A&k$R#@~GDBu83sUF^e^xms<~=a#=0BDC5(nsmvR=wVyJ)F@MJJwQZkKxxH@g z;;41o7EN8WF;7=Zc4fdUN0v&*hHDy1`}^lrr5)O~OiebpZ@0(fsB4RN26bzwOn#_x zkYP=s@_RM;FWtW14)=4h3(ZQ6w77O`?~<3olfT@y`?CCM)_sBmI}fXw3JU|Opdj0VUCxyTp_>m+VQz-?|)e&?LU{@UB1Iq{-)aA6F!?# zulnydtXp1mRVuD@b+PK5FIur{{@mF$GuHRpJ?@BHu2&9Tp6Um8u&-fT^SFQW>G(67 z>@RdE-#Rj7#_}8AzO>wS-TriCP|vRBTT_=#Y2tt4*u<21ZC35pO`kIhw+jVr(a00w z&rtZ*5n;^6bd@#g(~MP#Hm8#>oFc<$m*y!U9r Zlt~=y2@^OO=KfY_V%*ilp (options?.size ? options.size : DEFAULTE_SIZE); @@ -79,7 +79,7 @@ const AnyWayCard: FC = ({ information, organizationData, subtitle, - BoxText + transcription }) => { const [element, setElement] = useState({}); const [isOpen, setOpen] = useState(false); @@ -107,7 +107,7 @@ const AnyWayCard: FC = ({ switch(widgateOpen){ case 'TextBox': - Widget = + Widget = break case 'CardEditor': Widget = @@ -130,12 +130,12 @@ const AnyWayCard: FC = ({ )} - {handleCardEditorOpen('TextBox')}}> - - + {transcription?( + {handleCardEditorOpen('TextBox')}}> + + ):null} ); - const refFn = (element: HTMLDivElement) => { setElement(element); if (getCardRef) { diff --git a/src/components/organisms/CardEditorDialog.tsx b/src/components/organisms/CardEditorDialog.tsx index 5382086d..2a06314d 100644 --- a/src/components/organisms/CardEditorDialog.tsx +++ b/src/components/organisms/CardEditorDialog.tsx @@ -8,6 +8,7 @@ import { MetaTag, ErrorBoundary, Typography, Button, Slider } from 'components/a import widgetToImage from 'services/to-image.service'; import { useTranslation } from 'react-i18next'; import { blueVioletColor } from 'style'; + import {initEditorBarOptions, barsWidgetsLabels, barsWidgetsTitle, NUM_OF_BARS} from 'utils/barChart.utils'; interface IProps { diff --git a/src/components/organisms/TextBox.tsx b/src/components/organisms/TextBox.tsx index e74ec544..be8d0e09 100644 --- a/src/components/organisms/TextBox.tsx +++ b/src/components/organisms/TextBox.tsx @@ -1,12 +1,13 @@ -import React from 'react' +import React, { useState } from 'react' import DialogWithHeader from '../molecules/DialogWithHeader'; import { AnyWayButton } from 'components/atoms/AnyWayButton'; import { Box, makeStyles} from '@material-ui/core' +import CopyImageWhite from 'assets/copyImageWhite.jpeg'; +import CopyImageGrey from 'assets/copyImageGrey.jpeg'; import { useTranslation } from 'react-i18next'; import { Typography } from 'components/atoms'; import { transparent } from 'style'; - interface IProps { isOpen: boolean; onClose: () => void; @@ -15,9 +16,6 @@ interface IProps { } const TextBox: React.FC = ({ isOpen,text,onClose}) => { - console.log('transaction ',text); - - const useStyles = makeStyles((theme) => ({ text: { position: 'relative', // for meta tags @@ -40,19 +38,33 @@ const TextBox: React.FC = ({ isOpen,text,onClose}) => { backgroundColor: transparent, }, }, - img:{ - height:'100px', - width:'100px' - } - + copyImg:{ + height:'70px', + width:'70px', + }, + copyMessage:{ + color:'blue' + } })); const { t } = useTranslation(); + + const [copyToClickBoard,SetCopyToClickBoard] = useState(false) + const [copyMessage,SetCopyMessage] = useState('') + const onCloseInitValues = () => { onClose(); + SetCopyMessage('') + SetCopyToClickBoard(false) } + const copyHandler = () =>{ + navigator.clipboard.writeText(text?text:'') + SetCopyToClickBoard(true) + SetCopyMessage('הטקסט העותק ללוח') + } + const classes = useStyles(); return ( @@ -64,8 +76,13 @@ const TextBox: React.FC = ({ isOpen,text,onClose}) => {
- {navigator.clipboard.writeText(text?text:'asdsadasd')}} className={classes.button} > - + + + + + {copyMessage} + +
diff --git a/src/components/organisms/WidgetsTemplate.tsx b/src/components/organisms/WidgetsTemplate.tsx index 479dabbc..9dd4b9cb 100644 --- a/src/components/organisms/WidgetsTemplate.tsx +++ b/src/components/organisms/WidgetsTemplate.tsx @@ -40,7 +40,7 @@ const WidgetsTemplate: FC = () => { Date: Wed, 2 Aug 2023 19:49:51 +0300 Subject: [PATCH 15/15] add widget vision_10_30_90 (#972) --- src/assets/vision_10_30_90.png | Bin 0 -> 106504 bytes src/components/molecules/ImageView.tsx | 11 ++++++----- .../molecules/widgets/WidgetWrapper.tsx | 9 ++++++++- src/models/WidgetName.ts | 1 + 4 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 src/assets/vision_10_30_90.png diff --git a/src/assets/vision_10_30_90.png b/src/assets/vision_10_30_90.png new file mode 100644 index 0000000000000000000000000000000000000000..c0a1a3ab88d0c5dbcae821f7a360f57d532ebe0e GIT binary patch literal 106504 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 p3|fHo>o=IWGl_@y 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

uqn3m{Gc65;I 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 literal 0 HcmV?d00001 diff --git a/src/components/molecules/ImageView.tsx b/src/components/molecules/ImageView.tsx index 60da00eb..89842b5d 100644 --- a/src/components/molecules/ImageView.tsx +++ b/src/components/molecules/ImageView.tsx @@ -1,6 +1,7 @@ import React, { FC } from 'react'; import { IWidgetVisionZeroImageData } from 'models/WidgetData'; -import visionZeroImage from 'assets/vision_zero_2_plus_1.jpg'; + + import { makeStyles } from '@material-ui/core'; interface IProps { @@ -16,16 +17,16 @@ const useStyles = makeStyles(() => ({ image: { borderRadius: '10px', border: '1px solid gray', - maxWidth: '100%', - maxHeight: '100%', + width: '100%', + height: '100%', }, })); const ImageView: FC = ({ data }) => { - // todo: set image based on data + const classes = useStyles(); return (

- vision zero 2 plus 1 + vision zero 2 plus 1
); }; diff --git a/src/components/molecules/widgets/WidgetWrapper.tsx b/src/components/molecules/widgets/WidgetWrapper.tsx index 8a6d972c..e37787c8 100644 --- a/src/components/molecules/widgets/WidgetWrapper.tsx +++ b/src/components/molecules/widgets/WidgetWrapper.tsx @@ -19,6 +19,8 @@ import { IWidgetInjuredAccidentsWithPedestrians, IWidgetKilledAndInjuredCountPerAgeGroup, } from 'models/WidgetData'; +import visionZeroImage from 'assets/vision_zero_2_plus_1.jpg'; +import vision_10_30_90 from 'assets/vision_10_30_90.png'; import AccidentsCountByHourBarWidget from './AccidentsCountByHourBarWidget'; import MostSevereAccidentsMapWidget from './MostSevereAccidentsMapWidget'; import MostSevereAccidentsTableWidget from './MostSevereAccidentsTableWidget'; @@ -170,9 +172,14 @@ const WidgetWrapper: FC = ({ widget, locationText, sizeOptions, editorBa break; } case WidgetName.vision_zero_2_plus_1: { - widgetComponent = ; + widgetComponent = ; break; } + case WidgetName.vision_zero_10_30_90: { + widgetComponent = ; + break; + } + case WidgetName.top_road_segments_accidents_per_km: { widgetComponent = ( diff --git a/src/models/WidgetName.ts b/src/models/WidgetName.ts index fed185d4..5da6a7c8 100644 --- a/src/models/WidgetName.ts +++ b/src/models/WidgetName.ts @@ -13,6 +13,7 @@ export enum WidgetName { head_on_collisions_comparison = 'head_on_collisions_comparison', head_on_collisions_comparison_percentage = 'head_on_collisions_comparison_percentage', vision_zero_2_plus_1 = 'vision_zero_2_plus_1', + vision_zero_10_30_90 = 'vision_zero_10_30_90', top_road_segments_accidents_per_km = 'top_road_segments_accidents_per_km', accident_count_by_road_light = 'accident_count_by_road_light', accident_count_by_driver_type = 'accident_count_by_driver_type',