From 1d8e36b46dd0ee0a5178208c32a4f177b2c71026 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 4 Oct 2021 17:07:02 +0200 Subject: [PATCH 01/10] Added search tab to settings --- .../Settings/OtherSettings/OtherSettings.tsx | 55 +------- .../SearchSettings/SearchSettings.tsx | 133 ++++++++++++++++++ client/src/components/Settings/Settings.tsx | 88 +++++------- client/src/components/Settings/settings.json | 28 ++++ client/src/interfaces/Forms.ts | 12 +- client/src/interfaces/Route.ts | 4 + client/src/interfaces/index.ts | 1 + 7 files changed, 216 insertions(+), 105 deletions(-) create mode 100644 client/src/components/Settings/SearchSettings/SearchSettings.tsx create mode 100644 client/src/components/Settings/settings.json create mode 100644 client/src/interfaces/Route.ts diff --git a/client/src/components/Settings/OtherSettings/OtherSettings.tsx b/client/src/components/Settings/OtherSettings/OtherSettings.tsx index afaf072..1ca0d83 100644 --- a/client/src/components/Settings/OtherSettings/OtherSettings.tsx +++ b/client/src/components/Settings/OtherSettings/OtherSettings.tsx @@ -13,7 +13,6 @@ import { import { GlobalState, NewNotification, - Query, SettingsForm, } from '../../../interfaces'; @@ -26,7 +25,6 @@ import classes from './OtherSettings.module.css'; // Utils import { searchConfig } from '../../../utility'; -import { queries } from '../../../utility/searchQueries.json'; interface ComponentProps { createNotification: (notification: NewNotification) => void; @@ -45,15 +43,12 @@ const OtherSettings = (props: ComponentProps): JSX.Element => { hideHeader: 0, hideApps: 0, hideCategories: 0, - hideSearch: 0, - defaultSearchProvider: 'd', useOrdering: 'createdAt', appsSameTab: 0, bookmarksSameTab: 0, - searchSameTab: 0, - dockerApps: 1, - kubernetesApps: 1, - unpinStoppedApps: 1, + dockerApps: 0, + kubernetesApps: 0, + unpinStoppedApps: 0, }); // Get config @@ -65,12 +60,9 @@ const OtherSettings = (props: ComponentProps): JSX.Element => { hideHeader: searchConfig('hideHeader', 0), hideApps: searchConfig('hideApps', 0), hideCategories: searchConfig('hideCategories', 0), - hideSearch: searchConfig('hideSearch', 0), - defaultSearchProvider: searchConfig('defaultSearchProvider', 'd'), useOrdering: searchConfig('useOrdering', 'createdAt'), appsSameTab: searchConfig('appsSameTab', 0), bookmarksSameTab: searchConfig('bookmarksSameTab', 0), - searchSameTab: searchConfig('searchSameTab', 0), dockerApps: searchConfig('dockerApps', 0), kubernetesApps: searchConfig('kubernetesApps', 0), unpinStoppedApps: searchConfig('unpinStoppedApps', 0), @@ -168,35 +160,6 @@ const OtherSettings = (props: ComponentProps): JSX.Element => { - - - - - - - - inputChangeHandler(e, true)} - > - - - - inputChangeHandler(e)} + > + {queries.map((query: Query, idx) => ( + + ))} + + + + + + + + + + + + + ); +}; + +const mapStateToProps = (state: GlobalState) => { + return { + loading: state.config.loading, + }; +}; + +const actions = { + createNotification, + updateConfig, +}; + +export default connect(mapStateToProps, actions)(SearchSettings); diff --git a/client/src/components/Settings/Settings.tsx b/client/src/components/Settings/Settings.tsx index b1eb300..5df8ec6 100644 --- a/client/src/components/Settings/Settings.tsx +++ b/client/src/components/Settings/Settings.tsx @@ -1,73 +1,61 @@ +// import { NavLink, Link, Switch, Route } from 'react-router-dom'; +// Typescript +import { Route as SettingsRoute } from '../../interfaces'; + +// CSS import classes from './Settings.module.css'; -import { Container } from '../UI/Layout/Layout'; -import Headline from '../UI/Headlines/Headline/Headline'; - +// Components import Themer from '../Themer/Themer'; import WeatherSettings from './WeatherSettings/WeatherSettings'; import OtherSettings from './OtherSettings/OtherSettings'; import AppDetails from './AppDetails/AppDetails'; import StyleSettings from './StyleSettings/StyleSettings'; +import SearchSettings from './SearchSettings/SearchSettings'; + +// UI +import { Container } from '../UI/Layout/Layout'; +import Headline from '../UI/Headlines/Headline/Headline'; + +// Data +import { routes } from './settings.json'; const Settings = (): JSX.Element => { return ( - Go back} - /> + Go back} />
+ {/* NAVIGATION MENU */} + + {/* ROUTES */}
- - - - - + + + + + +
- ) -} + ); +}; -export default Settings; \ No newline at end of file +export default Settings; diff --git a/client/src/components/Settings/settings.json b/client/src/components/Settings/settings.json new file mode 100644 index 0000000..3cc24e9 --- /dev/null +++ b/client/src/components/Settings/settings.json @@ -0,0 +1,28 @@ +{ + "routes": [ + { + "name": "Theme", + "dest": "/settings" + }, + { + "name": "Weather", + "dest": "/settings/weather" + }, + { + "name": "Search", + "dest": "/settings/search" + }, + { + "name": "Other", + "dest": "/settings/other" + }, + { + "name": "CSS", + "dest": "/settings/css" + }, + { + "name": "App", + "dest": "/settings/app" + } + ] +} diff --git a/client/src/interfaces/Forms.ts b/client/src/interfaces/Forms.ts index 177821d..22856be 100644 --- a/client/src/interfaces/Forms.ts +++ b/client/src/interfaces/Forms.ts @@ -5,6 +5,12 @@ export interface WeatherForm { isCelsius: number; } +export interface SearchForm { + hideSearch: number; + defaultSearchProvider: string; + searchSameTab: number; +} + export interface SettingsForm { customTitle: string; pinAppsByDefault: number; @@ -12,12 +18,12 @@ export interface SettingsForm { hideHeader: number; hideApps: number; hideCategories: number; - hideSearch: number; - defaultSearchProvider: string; + // hideSearch: number; + // defaultSearchProvider: string; useOrdering: string; appsSameTab: number; bookmarksSameTab: number; - searchSameTab: number; + // searchSameTab: number; dockerApps: number; kubernetesApps: number; unpinStoppedApps: number; diff --git a/client/src/interfaces/Route.ts b/client/src/interfaces/Route.ts new file mode 100644 index 0000000..9d571dd --- /dev/null +++ b/client/src/interfaces/Route.ts @@ -0,0 +1,4 @@ +export interface Route { + name: string; + dest: string; +} diff --git a/client/src/interfaces/index.ts b/client/src/interfaces/index.ts index 6892fb5..b9683dd 100644 --- a/client/src/interfaces/index.ts +++ b/client/src/interfaces/index.ts @@ -10,3 +10,4 @@ export * from './Config'; export * from './Forms'; export * from './Query'; export * from './SearchResult'; +export * from './Route'; From bf1aa9e85cc9e3df825a86e99ab0019ec6c6cefe Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 5 Oct 2021 16:31:56 +0200 Subject: [PATCH 02/10] Clickable notifications with url redirect --- CHANGELOG.md | 3 ++ .../NotificationCenter/NotificationCenter.tsx | 15 +++++----- .../UI/Notification/Notification.tsx | 24 ++++++++++----- client/src/interfaces/Notification.ts | 3 +- client/src/utility/checkVersion.ts | 29 ++++++++++++------- 5 files changed, 48 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a372a7..4d81511 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +### v1.7.0 (TBA) +- URL can now be assigned to notifications. Clicking on "New version is available" popup will now redirect to changelog ([#86](https://github.com/pawelmalak/flame/issues/86)) + ### v1.6.7 (2021-10-04) - Add multiple labels to Docker Compose ([#90](https://github.com/pawelmalak/flame/issues/90)) - Custom icons via Docker Compose labels ([#91](https://github.com/pawelmalak/flame/issues/91)) diff --git a/client/src/components/NotificationCenter/NotificationCenter.tsx b/client/src/components/NotificationCenter/NotificationCenter.tsx index 29c9cb2..733316b 100644 --- a/client/src/components/NotificationCenter/NotificationCenter.tsx +++ b/client/src/components/NotificationCenter/NotificationCenter.tsx @@ -20,19 +20,20 @@ const NotificationCenter = (props: ComponentProps): JSX.Element => { - ) + ); })} - ) -} + ); +}; const mapStateToProps = (state: GlobalState) => { return { - notifications: state.notification.notifications - } -} + notifications: state.notification.notifications, + }; +}; -export default connect(mapStateToProps)(NotificationCenter); \ No newline at end of file +export default connect(mapStateToProps)(NotificationCenter); diff --git a/client/src/components/UI/Notification/Notification.tsx b/client/src/components/UI/Notification/Notification.tsx index 95109e1..2bd5185 100644 --- a/client/src/components/UI/Notification/Notification.tsx +++ b/client/src/components/UI/Notification/Notification.tsx @@ -8,12 +8,16 @@ interface ComponentProps { title: string; message: string; id: number; + url: string | null; clearNotification: (id: number) => void; } const Notification = (props: ComponentProps): JSX.Element => { const [isOpen, setIsOpen] = useState(true); - const elementClasses = [classes.Notification, isOpen ? classes.NotificationOpen : classes.NotificationClose].join(' '); + const elementClasses = [ + classes.Notification, + isOpen ? classes.NotificationOpen : classes.NotificationClose, + ].join(' '); useEffect(() => { const closeNotification = setTimeout(() => { @@ -22,21 +26,27 @@ const Notification = (props: ComponentProps): JSX.Element => { const clearNotification = setTimeout(() => { props.clearNotification(props.id); - }, 3600) + }, 3600); return () => { window.clearTimeout(closeNotification); window.clearTimeout(clearNotification); + }; + }, []); + + const clickHandler = () => { + if (props.url) { + window.open(props.url, '_blank'); } - }, []) + }; return ( -
+

{props.title}

{props.message}

- ) -} + ); +}; -export default connect(null, { clearNotification })(Notification); \ No newline at end of file +export default connect(null, { clearNotification })(Notification); diff --git a/client/src/interfaces/Notification.ts b/client/src/interfaces/Notification.ts index 80a49f2..5054922 100644 --- a/client/src/interfaces/Notification.ts +++ b/client/src/interfaces/Notification.ts @@ -1,8 +1,9 @@ export interface NewNotification { title: string; message: string; + url?: string; } export interface Notification extends NewNotification { id: number; -} \ No newline at end of file +} diff --git a/client/src/utility/checkVersion.ts b/client/src/utility/checkVersion.ts index e1a0508..d4cdb9a 100644 --- a/client/src/utility/checkVersion.ts +++ b/client/src/utility/checkVersion.ts @@ -4,24 +4,31 @@ import { createNotification } from '../store/actions'; export const checkVersion = async (isForced: boolean = false) => { try { - const res = await axios.get('https://raw.githubusercontent.com/pawelmalak/flame/master/client/.env'); + const res = await axios.get( + 'https://raw.githubusercontent.com/pawelmalak/flame/master/client/.env' + ); const githubVersion = res.data .split('\n') - .map(pair => pair.split('='))[0][1]; + .map((pair) => pair.split('='))[0][1]; if (githubVersion !== process.env.REACT_APP_VERSION) { - store.dispatch(createNotification({ - title: 'Info', - message: 'New version is available!' - })) + store.dispatch( + createNotification({ + title: 'Info', + message: 'New version is available!', + url: 'https://github.com/pawelmalak/flame/blob/master/CHANGELOG.md', + }) + ); } else if (isForced) { - store.dispatch(createNotification({ - title: 'Info', - message: 'You are using the latest version!' - })) + store.dispatch( + createNotification({ + title: 'Info', + message: 'You are using the latest version!', + }) + ); } } catch (err) { console.log(err); } -} \ No newline at end of file +}; From 084218027c93976da701493be164e13150dfee8d Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 5 Oct 2021 17:08:37 +0200 Subject: [PATCH 03/10] Bugfix for #83 --- CHANGELOG.md | 1 + .../src/components/Apps/AppForm/AppForm.tsx | 74 ++++----- .../Bookmarks/BookmarkForm/BookmarkForm.tsx | 145 ++++++++++-------- 3 files changed, 117 insertions(+), 103 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d81511..9384559 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,5 @@ ### v1.7.0 (TBA) +- Fixed bug related to creating new apps/bookmarks with custom icon ([#83](https://github.com/pawelmalak/flame/issues/83)) - URL can now be assigned to notifications. Clicking on "New version is available" popup will now redirect to changelog ([#86](https://github.com/pawelmalak/flame/issues/86)) ### v1.6.7 (2021-10-04) diff --git a/client/src/components/Apps/AppForm/AppForm.tsx b/client/src/components/Apps/AppForm/AppForm.tsx index 5d05f0a..d44418e 100644 --- a/client/src/components/Apps/AppForm/AppForm.tsx +++ b/client/src/components/Apps/AppForm/AppForm.tsx @@ -22,7 +22,7 @@ const AppForm = (props: ComponentProps): JSX.Element => { const [formData, setFormData] = useState({ name: '', url: '', - icon: '' + icon: '', }); useEffect(() => { @@ -30,13 +30,13 @@ const AppForm = (props: ComponentProps): JSX.Element => { setFormData({ name: props.app.name, url: props.app.url, - icon: props.app.icon + icon: props.app.icon, }); } else { setFormData({ name: '', url: '', - icon: '' + icon: '', }); } }, [props.app]); @@ -44,7 +44,7 @@ const AppForm = (props: ComponentProps): JSX.Element => { const inputChangeHandler = (e: ChangeEvent): void => { setFormData({ ...formData, - [e.target.name]: e.target.value + [e.target.name]: e.target.value, }); }; @@ -59,6 +59,7 @@ const AppForm = (props: ComponentProps): JSX.Element => { const createFormData = (): FormData => { const data = new FormData(); + if (customIcon) { data.append('icon', customIcon); } @@ -88,10 +89,8 @@ const AppForm = (props: ComponentProps): JSX.Element => { setFormData({ name: '', url: '', - icon: '' + icon: '', }); - - setCustomIcon(null); }; return ( @@ -100,33 +99,33 @@ const AppForm = (props: ComponentProps): JSX.Element => { formHandler={formSubmitHandler} > - + inputChangeHandler(e)} + onChange={(e) => inputChangeHandler(e)} /> - + inputChangeHandler(e)} + onChange={(e) => inputChangeHandler(e)} /> {' '} Check supported URL formats @@ -136,19 +135,19 @@ const AppForm = (props: ComponentProps): JSX.Element => { {!useCustomIcon ? ( // use mdi icon - + inputChangeHandler(e)} + onChange={(e) => inputChangeHandler(e)} /> Use icon name from MDI. - + {' '} Click here for reference @@ -163,17 +162,20 @@ const AppForm = (props: ComponentProps): JSX.Element => { ) : ( // upload custom icon - + fileChangeHandler(e)} - accept='.jpg,.jpeg,.png,.svg' + onChange={(e) => fileChangeHandler(e)} + accept=".jpg,.jpeg,.png,.svg" /> toggleUseCustomIcon(!useCustomIcon)} + onClick={() => { + setCustomIcon(null); + toggleUseCustomIcon(!useCustomIcon); + }} className={classes.Switch} > Switch to MDI diff --git a/client/src/components/Bookmarks/BookmarkForm/BookmarkForm.tsx b/client/src/components/Bookmarks/BookmarkForm/BookmarkForm.tsx index 10d6de2..5162c89 100644 --- a/client/src/components/Bookmarks/BookmarkForm/BookmarkForm.tsx +++ b/client/src/components/Bookmarks/BookmarkForm/BookmarkForm.tsx @@ -1,32 +1,40 @@ +// React import { useState, SyntheticEvent, Fragment, ChangeEvent, - useEffect + useEffect, } from 'react'; -import { connect } from 'react-redux'; -import ModalForm from '../../UI/Forms/ModalForm/ModalForm'; -import InputGroup from '../../UI/Forms/InputGroup/InputGroup'; -import { - Bookmark, - Category, - GlobalState, - NewBookmark, - NewCategory, - NewNotification -} from '../../../interfaces'; -import { ContentType } from '../Bookmarks'; +// Redux +import { connect } from 'react-redux'; import { getCategories, addCategory, addBookmark, updateCategory, updateBookmark, - createNotification + createNotification, } from '../../../store/actions'; + +// Typescript +import { + Bookmark, + Category, + GlobalState, + NewBookmark, + NewCategory, + NewNotification, +} from '../../../interfaces'; +import { ContentType } from '../Bookmarks'; + +// UI +import ModalForm from '../../UI/Forms/ModalForm/ModalForm'; +import InputGroup from '../../UI/Forms/InputGroup/InputGroup'; import Button from '../../UI/Buttons/Button/Button'; + +// CSS import classes from './BookmarkForm.module.css'; interface ComponentProps { @@ -53,14 +61,14 @@ const BookmarkForm = (props: ComponentProps): JSX.Element => { const [useCustomIcon, toggleUseCustomIcon] = useState(false); const [customIcon, setCustomIcon] = useState(null); const [categoryName, setCategoryName] = useState({ - name: '' + name: '', }); const [formData, setFormData] = useState({ name: '', url: '', categoryId: -1, - icon: '' + icon: '', }); // Load category data if provided for editing @@ -79,14 +87,14 @@ const BookmarkForm = (props: ComponentProps): JSX.Element => { name: props.bookmark.name, url: props.bookmark.url, categoryId: props.bookmark.categoryId, - icon: props.bookmark.icon + icon: props.bookmark.icon, }); } else { setFormData({ name: '', url: '', categoryId: -1, - icon: '' + icon: '', }); } }, [props.bookmark]); @@ -117,7 +125,7 @@ const BookmarkForm = (props: ComponentProps): JSX.Element => { if (formData.categoryId === -1) { props.createNotification({ title: 'Error', - message: 'Please select category' + message: 'Please select category', }); return; } @@ -133,10 +141,10 @@ const BookmarkForm = (props: ComponentProps): JSX.Element => { name: '', url: '', categoryId: formData.categoryId, - icon: '' + icon: '', }); - setCustomIcon(null); + // setCustomIcon(null); } } else { // Update @@ -150,12 +158,12 @@ const BookmarkForm = (props: ComponentProps): JSX.Element => { const data = createFormData(); props.updateBookmark(props.bookmark.id, data, { prev: props.bookmark.categoryId, - curr: formData.categoryId + curr: formData.categoryId, }); } else { props.updateBookmark(props.bookmark.id, formData, { prev: props.bookmark.categoryId, - curr: formData.categoryId + curr: formData.categoryId, }); } @@ -163,7 +171,7 @@ const BookmarkForm = (props: ComponentProps): JSX.Element => { name: '', url: '', categoryId: -1, - icon: '' + icon: '', }); setCustomIcon(null); @@ -176,14 +184,14 @@ const BookmarkForm = (props: ComponentProps): JSX.Element => { const inputChangeHandler = (e: ChangeEvent): void => { setFormData({ ...formData, - [e.target.name]: e.target.value + [e.target.name]: e.target.value, }); }; const selectChangeHandler = (e: ChangeEvent): void => { setFormData({ ...formData, - categoryId: parseInt(e.target.value) + categoryId: parseInt(e.target.value), }); }; @@ -215,48 +223,48 @@ const BookmarkForm = (props: ComponentProps): JSX.Element => { {props.contentType === ContentType.category ? ( - + setCategoryName({ name: e.target.value })} + onChange={(e) => setCategoryName({ name: e.target.value })} /> ) : ( - + inputChangeHandler(e)} + onChange={(e) => inputChangeHandler(e)} /> - + inputChangeHandler(e)} + onChange={(e) => inputChangeHandler(e)} /> {' '} Check supported URL formats @@ -264,12 +272,12 @@ const BookmarkForm = (props: ComponentProps): JSX.Element => { - + inputChangeHandler(e)} + onChange={(e) => inputChangeHandler(e)} /> Use icon name from MDI. - + {' '} Click here for reference @@ -311,16 +319,19 @@ const BookmarkForm = (props: ComponentProps): JSX.Element => { ) : ( // custom - + fileChangeHandler(e)} - accept='.jpg,.jpeg,.png,.svg' + type="file" + name="icon" + id="icon" + onChange={(e) => fileChangeHandler(e)} + accept=".jpg,.jpeg,.png,.svg" /> toggleUseCustomIcon(!useCustomIcon)} + onClick={() => { + setCustomIcon(null); + toggleUseCustomIcon(!useCustomIcon); + }} className={classes.Switch} > Switch to MDI @@ -336,7 +347,7 @@ const BookmarkForm = (props: ComponentProps): JSX.Element => { const mapStateToProps = (state: GlobalState) => { return { - categories: state.bookmark.categories + categories: state.bookmark.categories, }; }; @@ -346,7 +357,7 @@ const dispatchMap = { addBookmark, updateCategory, updateBookmark, - createNotification + createNotification, }; export default connect(mapStateToProps, dispatchMap)(BookmarkForm); From a162450568a24cf6c372625ef822968f4021110b Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 6 Oct 2021 11:23:30 +0200 Subject: [PATCH 04/10] Added static fonts --- client/public/index.html | 13 +++-- .../fonts/Roboto/roboto-v29-latin-500.woff | Bin 0 -> 20532 bytes .../fonts/Roboto/roboto-v29-latin-500.woff2 | Bin 0 -> 15920 bytes .../fonts/Roboto/roboto-v29-latin-700.woff | Bin 0 -> 20396 bytes .../fonts/Roboto/roboto-v29-latin-700.woff2 | Bin 0 -> 15828 bytes .../fonts/Roboto/roboto-v29-latin-900.woff | Bin 0 -> 20412 bytes .../fonts/Roboto/roboto-v29-latin-900.woff2 | Bin 0 -> 15724 bytes .../Roboto/roboto-v29-latin-regular.woff | Bin 0 -> 20332 bytes .../Roboto/roboto-v29-latin-regular.woff2 | Bin 0 -> 15688 bytes client/src/index.css | 46 ++++++++++++++++-- 10 files changed, 47 insertions(+), 12 deletions(-) create mode 100644 client/src/assets/fonts/Roboto/roboto-v29-latin-500.woff create mode 100644 client/src/assets/fonts/Roboto/roboto-v29-latin-500.woff2 create mode 100644 client/src/assets/fonts/Roboto/roboto-v29-latin-700.woff create mode 100644 client/src/assets/fonts/Roboto/roboto-v29-latin-700.woff2 create mode 100644 client/src/assets/fonts/Roboto/roboto-v29-latin-900.woff create mode 100644 client/src/assets/fonts/Roboto/roboto-v29-latin-900.woff2 create mode 100644 client/src/assets/fonts/Roboto/roboto-v29-latin-regular.woff create mode 100644 client/src/assets/fonts/Roboto/roboto-v29-latin-regular.woff2 diff --git a/client/public/index.html b/client/public/index.html index 3f43c40..c93d95e 100644 --- a/client/public/index.html +++ b/client/public/index.html @@ -4,16 +4,15 @@ - - - - + + Flame -
- - \ No newline at end of file + diff --git a/client/src/assets/fonts/Roboto/roboto-v29-latin-500.woff b/client/src/assets/fonts/Roboto/roboto-v29-latin-500.woff new file mode 100644 index 0000000000000000000000000000000000000000..c9eb5cabfba7d5ff961fce4c067f0d3fae77db11 GIT binary patch literal 20532 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

_ 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 SYT_{{QN5GB$em6A0000dHT^mO literal 0 HcmV?d00001 diff --git a/client/src/assets/fonts/Roboto/roboto-v29-latin-700.woff b/client/src/assets/fonts/Roboto/roboto-v29-latin-700.woff new file mode 100644 index 0000000000000000000000000000000000000000..a5d98fc6202f5cf5fd8b556ca834e8e9dbaafac1 GIT binary patch literal 20396 zcmYg#V{|566YY~^Vsm2K#>BR5+twtR*tTs=Y}>YzCz#mA&HLT^L!~ zJ@~D|{6-$s2|bCin+qWT0P`IWAn_k)e19~VIhfl50I;Or8kTQ#>fd5lnj1QQ`@(5_ zYvBF|C;+Otji=eSX#xQ75CQ-;y^q3rx)vt39^YYtzBS)5K#&+&NH{D^4Zk%K_um}* ze|TS+*Rl8}0RTzbZ=3KNq_E@=vlg~4-@cME-)o2k0Dd45k4hcd*c*TAq`&6}^8C%i zlmeRfCxD%`8H zz{Z5m0$W#AS5sH*Sms#c==xKhU}{C)N|?Y{@bnfD6&Y3u;IST^0v1Q6i5lEfp>E6D zw9;&Ae|DT^eb!>T(cA_#;$*Y2fM^?KPONts9u-q}8P0HZQKg;kGoy?QIMnI06?xiR zVag~G=lk?GxAfWvi{%wwXh8Hi@yrMVO#ZgNo-`)#$Wdx^A{IhAoI8ek4!*L5rjOkI z*~QRG-pas^i_9jnBq*+dS5g@Amx_m?ljL!DKXnM4sRSj&T%e;M|DAdv$^j)b6jP$Z3Y!&fQ{L%mXo@ zX|axA=d8R^mbJS>x^5qQQQHc;L(ju3v6g5DCfRUUU5aUdE6d!i4DycJ<#GF$`aXwI z#;MFtmO&XN=}8P673acLQuatXqso)T53G1}uK1rHMgnjVL`<~J<;QMy!slomi{33z zX(sj_S>lwCl`p>y$wYrWh}qT4*){9gH9b`QjIW1Hx==PlJ`<&i-^8-6{r5S0XZc-u|6S%?=v~Q$Iu%(n9@Vo>{H4n%7wS3vBMN5ey!ihr ze`~u$M2$vdjYfvC&pVw_lgD4%kww+hX|c`Ldj8+#M1*amN<`#F>WA+@WotCqp;ZoH z*Qr&ZQeC#>&i$`krdP&MM~=&RIq1K&&*b9μ@r2h2zTF5D3Lz~+tNz*d0Io>VN^ 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

2Y_o* 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 literal 0 HcmV?d00001 diff --git a/client/src/assets/fonts/Roboto/roboto-v29-latin-700.woff2 b/client/src/assets/fonts/Roboto/roboto-v29-latin-700.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..01d05fa509b7f91526cabe90c9bafa130e4c118a GIT binary patch literal 15828 zcmV;_JuAX@Pew8T0RR9106o+I5&!@I0FAH!06lR40RR9100000000000000000000 z0000QWE+|u9EDy6U;u+42uKNoJP`~Ef!iE`!Z-_r3IGy<5CJv1eg_~7 zf+-saeiiK4qk!`OK_YwJBZ^?-00<(VI*O7_I=$lmZwGXUtYxOa{8dzmQcxhgqwYbY zSbSR3!}OxQi~-+Nxlb=Qqm9iw6_iP|Z9QY{h%&1+21U&k9`&QtFC(nQt*K^99FF1W z`VR|BKJ>s@D8t7djw0;oD`NaLfnAH*-nPC*9Y=GDAEB{NatR{4;J>D^d-p^|GBbZE z1{_PFn1LB_J3K$P-rq*_U`XT!+K7WOVpMD+Y79rl#()teh~x;V5|j!R7-@qDtzuy$ ziV`hg-C_KttKQe$uhpnlOKQPrK$_9g&CYEf(5``DUAe0O!+)W9&+*5|fa?q}0#<1F z96594c%M4I83}=z-9>PhyAV@()pffo(zhVn=7%i7G?IUZaM4@}ZHPq`lK_Y6?05B1 z1-E$!%mTs$BDzgj7+Jsnwf$v7B8tsI_6GSu7MnpWY4yZ;DSw%5-*Vj#VYe?DGfqpg zmX#3qlWTiv7Ah7xN5s2L9!Mk-N7Nb#$z^j)65OmGzVG)#9|RFqgrSnKt*#ZjXYTy? zPuKdhk-?W5r2+f|CRY9Y|F>n9{#(CGX!<5D14bQWGA`lCDc|_ltCFgI{jP2vt6QUi zl0l_5G#Pp%gCv8dM_#4~I0NcdFSQpDgM=c?DcU^qnaF1&Z;*!0_WxAX^?y=SH6L~7 zzGWH@l;pZO+X8)({t!UWGC;W%(!Ea69VkEIAiXCdrL-}9bD2`=uy~l0F;nI&d!`}& z*qfDy45{rcA`;^4{k!}7Wlgkoug*MoEoLZUK!k`WYTe`aJY*aH#*6wXCQ<`db+-^& z4KTt!{@`B@hTkCuAm%(l5+s16N(D)m4#LI;$&mwcUOq^x4ltvBfk0q@tpMAB00Sfe z1lR(W0mQlITRQ=nd!~_0AoIY*fDj<_Xg4|x$Up#WM@t^LFER}90$2fp+6w&jvaZ&c zzi_A)>+@kB8p9%Y3m|qY;c;mQ$4(^`GI1~nVI5(SQVLNLRYi;5M5aV}ZtebQmd?e< zXmxaMv9j65K~lL(q~SI&yxaZ?MI#~)z%W=h;~*pm+yn?hIpm0=jydiWEF2AZnzRw< z(r3UBnI&s>95|wIM&rtj2QQVXRI4HIqsEMzFloxP8TUQ#(5yMnz3|d2?=4!gY{jN6 z+rHYd>!)A-^S^x%?ZzMwh|_hLJ_+whfS}@qh1?dzRQsWfsD`DTZa41(V(Ul%8CIZx z+S|D$F0FBGg~z7y5ntFAE&{dISVqP%fk{kZ+WOE3^Z1BQSiooNOY0V~gk`K?3)}dL z9qd|rt@(!U_+kBQ#jh&Ft&!%t`v44$u++T-7wzT|`a-u2`n~ra3K3yeZTfip;eCu3 zqA|`5bL)xFn34*UnkjZy<9d60*GxOZ6L!6 zROI6e7O{k7tn^2)B#uU%8&R7v4@wKREM=>x?Sik^!S2bqAj=?z3%H0{@*5l2zy>xX z@b2U&#Hx@$hE+_7g<9HAC&i6`d`EpDEMf`ESh2QZ*~VAwVE4_3Q?47WZEnqj6KaWZ z-}v}3jAdJ4yatk*sS4w7f$bUL9x<*g6R~rz&J7_`l%n995l7rEVL~=r)k0j z@8O+y)jZ18>GZ5l*M(wq-TmBWsZVn*whHTgr7qloc(~8K(r?}C7>%@1JyBv!w9r>V zw|JFk(t!$2#K5+`D1}`clpU=ufP}2SG2x(pACV1mUporOsCnILFXi-7QQ0Kq&2{x! zFKg*_ICGyKpU9tP{hzJes0}t(Pg4D^dh83tDkC3?l%$~M^VPQRM2h_%_HL}+JtbZD zwDs`tZZa~|3ox^la9b^M^@BB)RKEq|o{!dYV0N>6*?fn-CElH8Q=2_+9y&)UFal$% z)ReHhnwEttf}Ue2e%hA?^m@J%sbhEMcO9z^74sO-gE(#oU`qi(3K+4$aEBa&ph5#5 zZ3aQTIU;Ff2szft@*Fr(;4GB5CM$F2>7d-?BPv~VRP9@K3>kNg?_Lp!{m{G$!~^~t02KC7vP3{xBp~hGE$A=D+vx@K9jzU-&EnW{=W? ze1L6}JN5Q{G%O|*1V0+?#{^-6C=x_JiRaHeTj&%*azLkb&4&V}OK=bmq;M_{I3I_< z?FjrN9A_(Dm#-%_4iEbg39@1nxB+b~fskk;7!1QrSUWgNHd?{t8j2I;c!#jprtK*+ zmUjNUz$g$L>8{`Y`0HN)_{xArkRb;KMw~q0ONQ|4I+A{}4v-*8inN}Rml=p4vePg% zRS!OrrXma>BX#0~1fpHe053QIg_}qq76!7aS8j?14fpve1E6|6{JM088+GI8(W_6t zqE|uYZ60(+lxWvncf(D$+y(>j{dH%3G;ZSp`W=k}#=gS2`F(-YJXL?5UIq>YTmsk+ z;DRgchyV>N{sjI4_s`V<(4hAM)EUizh6e8msdw^_1c4ZD{?F<{M!4_-wwA2kRh@=S zcx1`8Nef;l?{NN{UpvaVPz-7?Lm0YYHEf21;pT8QypqoJwoYw|X8!;C=l2hQ0j*wx zPF?Pr^w_emR~U|T$L>fWirw=fm0t1aM_*vN=RhMq$k0}UTqDfzDSzO8g&%X|4!UzIQN|JN{aPqFh+M#*j%UbQt!K9W(oyCmE7 z)l0S;Uaf5Z)eTMy*}=YUVTUShrVGV=!JhY6+V|z?65hdEeff8?t1p#kOXE_coVmo_ zILb4UO0?^T?`%GapTT!;c+=RyTe;49-$eDLMxyR|c$NNYlGR_y<=pp4MiWPE6FhR+ zhFk_QpKQ4)X}ouc_fkFu@3UXTPNdz-`*JpFM|rLCtJnMyfve-CCzS2KYLD;N-U}0yUR_bfWh$|yZhl`;PYft5Bq*8&^=!gUay^B zhYkDZUZOfSS%=q;f{>7}C(_;JOKsSZpO#!=oFGgr0ZK95fx%4{HIkkQY{Q)(94wVt zD_rUtz~E*v`-e}B5|=vEL96F3z%i9rV{?c{I77r%IJ0kX5ws|^thDehckTuD zW8T`?n6&*JoK(g%Q*lNiAv9+x=Q??!`|bQC(%lxJs-&ok2_Q3*rA;p)PFd~a;=lj} zESDftMsorQ1(9yoK$!B?xR1y}Zs9d$gQYw$ z+zYx*QSX~hLpSS|l_NjQWy){l$hRdrCzmSd2Sae2tTn`fcZFT7n(j5dCmTJ}1?~9y zdV-oPckrCJzKY{D_mas;l5Kk6vt2=IJc%{`5rnU|Hy=}nSO7WFtyosE@*WDq8dT~_ zkTjg>l~t=#eZGLgeGHTnt@O%&E~fe)dUF zl(*H)8Rvp@U`JIB);c){UvKAZ_Bi^<`D0)2f7Pg)`IXS(b=W%6C)oTvh#$iKFl+Wg8tENJjeQ37M4(!T^N(C`BOh~LBUh7`0Q(2jX3qnFL|pQ-B2Jp^ zTycD;at(}hN(EU3dAtgTmhKMso;zTa=(F^?)Tx5+DP`oYixcC;xDsjSp~hgWE>C6O zkW27-ToI7Ub}mhg7gMTQIC}@tI-dfS|q_n=D8Ze@7&BRH`k6H&mt6O2HSF;1!fRV z=PAnYlrUG2WtKDJ;W`Xp+t--nv-r8cm$xzHIpGk_>6yuqJ%yM`H%O$J`kvbPoQ*%j z1$)fOvV9?CworQG%WjSUDkMXZCD0Cwsz)f?b81IhPZbg$cjs=%OJPFU*hZUe!ZD{p z5w*sebyCug@l<^}<4*>Ob(2+`NUXtyV;fTkGdy$hCQts2z|w%F84?S#$RoTmF+OtA z2bKcnhW!pZN<{&zA5M4{LNS%hK23u=liVFHP_x550I!(~qR1p*hWldu=`EqK0f~$P z9`>}h0kSF9PW&VSy~9ZqW{F{%61vK-#i7~~AVIQpJ+=6#rwiHqT$Y zus@Z-aaJc2lrgUn2mjw)pIyz`WD4@v9oJej>m<)E7)Ed>${Md1`>8sn`D1@q{=4@+ znq`*B3^g0Q5n7@U*Whp-oCNmjZ{R_soIuhiw}Q2>hn<Hw71Di)cU?xNuZvFLaZ2w>-V zM63oXD6~3>ShV@F$oby?apJb3rXhPy=R*HBlDy5FYzrdtH1|$j}-e6MG46n z(QYcap_|6RAEWd*$*Np!%KCoumNgW}hCfrAt??)rj?G}GM}s4QW)UOjIHMaARVz;5 zBx-YKQnY3FTz15AKdd81^3Vz7^L(phnH5>RwOM*0m_yF??>Kxgn9k8knK$1{&0e^M znS^|(`BiqQS0}naIXA{Bcpbd3~tNB5gas%e<;?y`l&T#4MM#fh0jbh&^&yk*w zFBr&b!m(hND?xHhqM6hDu)-><)i)_<*vfSIb%GVxWDn`**`6@%)4FkgdpaL7Iy4ZP zREj1I8d-g%Ll{u28CW(f_oK*J{OmDQM<~{RRsEI!z6J^;D6Uh}Ax|_~qCg{Z$R$)< z#oErr*PB-C8u+YvSVk&7_WD#Fbe$E&i!DpC$g-?DIDK{CFPELhvuQfGepcS5#fN8R z$99ktFa)BVS2ML9e?_PKC8sZiDYUsu*~631V>f!d;@`i=$Z;_F8P9P-G9 zJmB_aLtkOaI~sh=g=8Al)I^PtNrN(I&U(m}*dx`Ahi1%j4tM^v%wHHGUbrURK3|2@ zWLLU)NOgl7yT`6gzwP>eQvP`LZ))1rd_-X&gIp^r={o3J@JuBEC-?!uC%U;nJ z^{+Wnlix-$@xHMXM;CWT>(g#qUKgC`46SUp%g>(O5Sy%+J2EGkXt$VfY11HAU#q4#q-j)D@l?ZjX}DHZmfo61Vk!JB(p!5WwPDXN zS68blpV4#&hQXg`oGgxb+zL(jiqEKly+abSfBnS)rq*(tyZWSkXHs9QxYC&|T znwz;fk%(?i%F{_NG3=8sQKpfus{a}8Z0+m74hpLM)_u3H4LgXI9`J3Z2YO$GwfgpY zUkzb+v_O|h7>p~8vF`d(kw9LWc=6qv?tY2r;}hoQ%VLKqWhTE}PAdKM>*Y8zd_Jqp z(mm2ms+3k8Mh|tP1^c*D!d=Oj$TR)#0y3Am-re(0X!BJ$b0WSw{+`V0>KpOJI~d0^ zL9Rj3OxHJGFBI!G9&A}{(Z%Re1qTl84Iey=%QJzYE%WbFK4W)Gm9+ykqaUwBEBUb> z-k+(=_{2yXfhQ{Px-$J~zVy7*q=a-<(DxgmTKM5Dxl!2GxMX)!OwZ7~$cKV6iyzMw zEXf!O1aI~-Y$x7<)mIh~q${-Ih{hm~$dZ`2sA5mE1H#I9VKrs5iMcfd&N$;FgWlwh zrK>0QCfwusIKlU6Bq6acSj`<9+{C!~^WF2gUvH2&bFa_{5BE@(w?{~Xwud z(9yxgk9OLH-b|yXU?VM9VU;7xyq^k_w&pYPislOwg+ONrlU`>fWC3=*#v>bsEc}Tj zai!r6o~OfWSDN|ur^@?A^bNWRqN$Ze+CjD%)H==$~<2$Pg> z9m+Fp>95!I*Y3DzNppqll%S#Amrv(bAKao^Rd~ADTU(L%ee~qiOp4)u5_N7PH zU?I+k-MsS{aB*h$8r_U&4Gru<_2IB2E z;mSW`)(@hRvZLZJ)GdMqkHyZ__6{O(U-Z3xlp_{A#3HkZnpJGcwkkFwU*21JmFFCl zujkLq%}3=gLu)TpLtFxUoC9J)v1DRRTfO32P?p{w`5^+q#+V)puC#rZuoYoNxMGUD>b!7D$}{BKiA`cJr^e z%y;=O4*r01?+V5xg$IY6O%H=mc8>S1JxEuHcHOx%)QulU#gS zo-&a}AUFz}py9l`5s8rjLD4Y@JAPUY$<#PkEq_<+&&+^H1)eL*kqRt()%*-BG!7eXsG94Hsv4`}hI) zzY_|!KBF>Hn4OmJ2hKOGUlT0eOte)T;OHopb8NKjpk_fc!4u+mj;ipp*+!`j-oz7v zPW&PW{=eQw`)(q?yR<#&eeWUp=jwYH=?rk897#v37Lw#Y*CW-C`lCr!8~*xXhsrsL z5PGy{cGW^DbGQI-;|k_EfMInur*m%@T|-ye%`39o83miy z)@ZtL`sLiqzyPy@|81O_?)6O&2;i0|NO`gvdMWOcr;g>h?vVKEsB>o`2!5=l(XZIw zXx`G8)}Rb+-$@3MAZPM)5DJDaZcL@!hj;cSk@~Ml+-1Soheq9 zrzyrJG)f7LVkjd{i0QjC(Pw3fT+}|2em+h@ZBvEwrOE1NPf(C$Ket*?w20znZtQ#Q zvDW7GN}vdoIdE7Z6#5$p0NsnUgpHL-SNe zH8SZj^*xm_Eg_7kW^>c0sQ(vKMwo4GXqx8p*)i|=O13k`VOK)haD+afwJGfAs3_Rq@&G>K3-H_9JW{kCX>m==pNTip8;|7Vb0kI02)hs3MeX!&qGVq8c=r=;{vQJ- zc$}!w5zV`lVTu;-rqx9?DX^-^dQDl4g?R60^M*!ZZ#j6f95UUlqlWs!YfP1JL zg&D8J!`J5)22T&3UVZ{!snpi0?^Wwt0M}l^C%PW>K6%aK;pKbMnj(Gk#&W4;vUW?Y z1%c>i`vSVz|Ea?EoNi;asjem68rPA$14Dhqp#~0_x>57osO;mmsP3@tzV(n$(cP!j za%)qoH|3uxE=at2g1N2uaq3f}-1YZRBNC$e1v&%SL#v9!S-y16`<;>(O7z-u~Ue|E2gs4SJaQ& z0eOEg|9A1m)uGZ+y0SAnnZ?qd#fCL=n^queM(VANO>8b@W?On1YFJnh+(CW`zJ;f^ ztyh}o3n#LnAuP1EeyR3iD6{FJ2ru5u0F2#0i4HDB%Qp}J5S9H`{%`TzQ0SyfyX&<{<^svwZNU4>)~WUa&?xbad(u< zl!OhQYvpcbIUF}putX>nU`47Q9K3zBHYOfr%;WD67T?k+I zP&^_sBQK<7>NnMvY7^ziDwnElTwNf03^cs+;_37CncH<$Ro?D$ zhkYQLvf8TrkT^#dfm9*up;l{(+9A%b4QFBB9~&DYISd=fMN3jA(I{G7`%}}=c1jbg zsa@pKSo|rxHpTJTs&8|exl_^Yf}OE@!8)g)w|1~Q*MXdPD|4ZDoI*&^y^3WGeIx0G zJQ3ZtE*?>NDEQj4xvEEH;|5ru$^>u(mKwlT*trMn8S%Ys#I7O+cpUUz|9nhp%vf?< zIONifv3d7%b76RC;tG?|X>&-=_Owk!W?9eT*h_~?igEZaKDY!s3dvB_%-O-XJg&k! zwBOEx=4e)jm~*xHDE>3I#L(=4&DopJdm1kNys``0b*$~FHjbVa8fdX{#O=q=qC(Gx zPeOA$+$)zZ@<-(+#Mq=MI;&XUCTYDe)L_l2MXC7SY4!wR6n$-b6E*c_S7xLjGg;2l zIp72Sfb?H3kY#x_Lv*vEv}iFose!-0J1?WtkN(pcmhv zjoJbcR$5XJH52WiVtbRM^V%qG^?X@Q*;Dc3a5PU1tC7iwsPDZH)x@AjG!Zz>Ha-y| zjBptrcb{Ud=oP`G3q==-7LZ3!?K(U$C!JGcJ>1ixY1DI3UOs1IA{|v~{cBZJyL`Kj zYX*FaNU!obTpy(MPF5LGZQ~11tMO8>jnjE6t&CPR5nWQsvZZFh&bKXAcm~g51eJH( zu54Ig$5M@}-xJI<}d-r8RUX1?8PYxeOk48J_))s*WV}8NGts*OTC;rzt4!dMLWd%Ajqk z?2_zC4KsGbyhvf*J}C;d(cx#q%N0^KdQ!U!y0e*;VTMXhUK?Iw11HIkj5>7x$GcBi zcL~R~eB?rq1~Yvs&*z>8W+@SrGBwQ6R6fhGHuCv0P}2D=IzhLVXXYv$6@m9%$@5t> z<=^i(``!@K{+1WtKhXX$P$DRebYA2DhSp}D6}iy201r*&voi1KH`W@n9d-8}ee!^>UQ)kxLNdfIj7@{DC4LdxKHt$svk z1Gzkn%%6WR)9k@l*SD6I*R?<;oi$Az#U)KwF5Ks>VEDn=<4&4J>H)AE67u=Bf7_|L zAahz9t?pr+s{q@7Yc_1QaqhXLa}vJtXQRD1d(Au}C;d!fN7eb%z6{8J7H%F89D%#4 zuYPKVP*P{_tsWwZrEWDCq|z%)>rcj?rE@W zcx4sV-g*vKXBZi#m7<%%Y>Y21YK>>6rV&^=tl&#={IxMRZaFZ59FFE;Pvwb)kWW*| zHm9jY?^I22_KD}y(&Kwt(~Fv0L6z>Scdu4On;0JQcq7V1LoS;bx(dNuD{3&f@zx&|HrJnm;EtE{ zx*4n`{h>OS4^c%M zHw;C*W5$Ut;B~}zM``K9sKw)IBBkTwuEj}f;HJ8%Mhy!se*o)m8-cj+N`dzq*&C}| zMU}$~HdeLGepQ1$A~sux5*r`c93=;EVLK4-H0Z+HOpe)O_L_ZWzcEmk++_X>0K{2jQP>g#+7ZP4+x^U}+OL!han#P@>hbos!dC1vOQjZDX+`NiQa7ix3 zq?s|9ow(eXJSFZ3(yhxyWZHVde&CzW2BUw{`-SEE7%O)=o6_quzK#E7pY?eWRZ{k3 zjR2q@@5`Kk{#J8%0@GIg1y$ix&1obwocd`RVU<*JO$Q+5PAp6Syk_~{G2<9~)WqH9 zAVz-l_I3EE64A+A^$;xL(Y^y0vR+R)HjTXKqEmY<8)ezUe@e7^Odt@y=w4xCKN{i- z9-wcXHD64e$^W}k$a!ZPBj|cYz_UujgBj|M#lg;(~QMO3ib zj{)Q3y@QRBc+2Q=32#SD@3;0iI#Ap8h6x@I(+R+y{a4HhzBfcBcFKZpE-AgRV?~c+0PcMJcP)yz{bKpVK>dWqJ_uSsK`8W7f4N6>Yb z7fiRL6S-d79?gLm^yy<_*ShxFn>f<;*NF+o4PEE%>6J9N>pr>0?y_}FoRZsdw2K%C z>|=i)F)z#0=;)l9d~)X9v2D5K={V2$^s2Ogj2x>^7?p#Nu z;#HMSqUbu$@zO^bCkB0V_w-WUCjk(ITkec8xjo%a6vI&(h3M%>*Et}^wrP?BaYD*4 zMM|=>qql&JDoKP*vQ*lq&}Hy6K9EGiG#ThxWms*K92FR;+f;^Zne7+1nag>t8E1m%E4 zFgC7yu4*r3I#^)QrB+!Gz*^((I}7jfCMe62GC^kOgDg@BLzhmX&(4b|Hsw|u`U6n~ zS?j3};K{r(xifMio*!T311zJbU>woRvnDqtepMJ^3BmoC=Z1 z3wbv$OLViS(|`vV+<3>0=*1h<61LuUri^5qeJ?rbwl~>FV^T=Q6%I&I(v48pmLl7J z0osU8m(Q0^Cdal;Hjr;@Vm#AqkK2>U=At=A-((@!%x8_`m2UE5%|i#lMY!78!qX!4w=t}m%Y{hXdmO5etRAU z&U*s-K68BE^Mb`{tcAr*>E5O#vk0|avs!1~QKd;8mqSh1GzcxxON5UI2)djPI;Dw# z)Fn|HWwz89GzC+Hn55CWz@Epj4umwkZd4zGqhPKP0g?bVMWd)GE}PIk+sNcKAs`rd zf0%OWxz?bRpxiHD;5nE{wO9ZRn4Ys)m}-oSF*8j|kRa(|8B?!aL_@mlwJBXSNbJpN z2UBgpdzeI4Hr)>Rl>m}GoObh9dui}LPr1d-NH&7gHCM38jtj5{uG?|`Kk>wST zGJfnp@&8Kp4UAWilX!PPFxrZGk}N5RS!go(LV~OWnPbTkK-lc^E_fOxjh$@Absgqm zU8y&UI@x}s&enQ`qA3O}U^6*O2FV*z3H6M^DR?M;PivXz0toygC1BFek4F`^huVvg zjdt9@DAm!q*m&TP+M+{qu*^z?Xf(yn1QGP4VL~1ZH9pYEWqdc64qhZ946ti<0CaaJ zY@W9XY)2@7q*xy@P4bK1$%P?M<30aqVF)5ZK@?DW3grW%T$Lynvyn75EG@XrSQ$E%zqy-3zf04oKAG-x6?tsoGA zcij2`qO$~Q7CTm(-lL!)IV|~&j1HUysF+EdLxIA)3?8p`3rj3b`HC^&$M8muM5^Go za`OgkF+4c}f*u$aX?i`@LP2VvST4}Cm1{Cn&^Y@6=eFFatIe{nVwvE)SO|Qyx)9su z(ifs!qAhDSlR~pHV?HRildfok;7E<7xFLZq?n_kBhc}x{+F+rhE0fm{^Mmz_)Scx( z(s_q8vIkko6dBK{YNBre^TNn84Z&%#irIqkl7QM|Li*%U`*DPHnyf`IU%1#oFkAJ3 zleG$c(PPT4qF3PM2-U;1xLFW@uSOm^0a>C^O^?R5 zQiv%-btlQjB9BZg%_s4UqD0B9f!7zstH} zQ7qWJsp2zMw9c|Vf}Y2u@h?hFg4$1Dt2-CnL|sI9VNtH(i3Q#5l7Z(8lP@Mt_YdF& z{NRx^ryVpC_SUnF8zKbp7v&VU=c1wn`R72CnF3BPU{D4`R4gByqEYhV?ZQ*6&aM$% zN2gO7jj%ucq_##3*$tI|j7+eWZf zx`?QZ)xPq*%ScU^;jPetyYjBZTfr@7+`hF_1$shcbS@guJEA>3-VEAz$y94Ck10ru zt>)IDJBo2fwX5`+C^2xL&w=v`WD4PuD6FEY{iw3$VDu1x*RS+~(r^ri2>qN$`=lyw z*Q%ZC$L^&v=z2<4*CSK0PEVAKs#Ggnq;=|2>2&v%(M8jZ3{2V{Kg57xV4;AUtA*R| zycxZGZ|%YI*d@5S=a`A_9=u;bBLT?CCA>icCAjf<)lhj<@vHrrI(BOl z&Wey$FtO5vFbaOawTQ;+Bw0pr=1F8VABXHn$Y_L(tNk@hhf{2@=|Y-b90}xiF%byO z6XcToD#Lm6QevOI`@KAv-Wb=&JHy0Ewn?Z^DI-nZGpcA@jMhQS$8kzp(<`d&PKSw6 zb1(piVb%Hnqz{Wm@9VDK>aV)hkeXP}vxnJt*iYFX>f5?r_u>9$%bEVY_20pD(sG1B z$skupV(2tZuQm#Eoe`m=Cg?GfcnSjYjblRlDwq~%CFFoGNIYt1NEp1=9zkPi1sx?| z3z<6=4l9seL9I^pA~BVc%k$FjB_F7>(MKgUUf3*W8*$Ohi~@VV_p|B(+B@0^%NiM0 z$wbzSxBYs-uJ;W1M4mYFJjoa#d|WVnp3pUOZIMu|RzIPvr|h^^U68o~SkOi~c@v)y z=)Fo_nL3*@tvpxJ`IeZm0s6G&lYE6H(ruu~6@D(1z8(i(q6l^f%7TEQ+*9DMsr+hD zc`m1Wjdr^&LypdfDLWXRdyH*nMD%4VMJkp<@KJuzU37K2e7<{A_6z6R&w~z&YH3R$ zNjp!MY~;cg!c;$A+BUNeL#KEOr~g9qr~8+MbAC#=`(lkc$^)1Ou51Y{rcZ#r}aCV|G zB<`;PLI;?+Ny^drjsvp6NcI>7J+K8-x=0gU(#n>*!R!Mv{_Gv857`;pUNb>t9qW4z zfRsA4PTPB(Cr?h%V(430I#zK2mRHY|)}bsZ87bd5j>hRS^C}-0ce2qCgJdG>;G}Vb zP9hg4GVVTd_DT`5O4FRZ7pw)S9=5j=Y`Z{)4A|naB1R_Wb`5X@$@ff(#|e?iAo0-# z#jxj8Qros34;2D9$4eN4M=-zsLfxHG(sGTAO(ti3utP_wM_08nL|Xil4z>A6jmf=+ zR9>)#t_xRWw6^#fVgV&6RDjmZd-$X-hC#>t$;Xh+sfOCokA^n}meP5B;76!1V|cm? zAeo>NqsPXrI)2*o+QqoS`^(HbP2{HT{PZRo#P$vg7AC=Z8;!1kLryeVIgfuhT*2cd zf&CCrt8*w}3I6%}$LXw#WgtMu{E(Jsyf)wvPe=%)3 zYf5_o5}PGt#4%6jIcszHVD|QqE3e|9#IQIi$BxPz{PiZgPm_PZR&tIo0Fd}Q-a*HjFQ_}5? z6{K)VgHXo2^&BlK9it(6L-9a7v0v>nj&RXP4BE7AwLCf(;kLr^YCdJ7^-_VhW%oHM zl(VMKjR(mS35CMsogV}OC{dZwWH~~Ll%m*v9AN=CO_~D!fq=>;wuD%V?6Vj}@(_)Y zIA-vYc2e-MgPi}{ZwoulEElMnD^y)*wH&W6jHAW3!HyOfx9e%M+B0LTKD=6sQvX`& zJ6!zGUE^SfPr_UKKPxjOW#NRkN6luoX3&CBwnCUZGn9?79Ji_xcLvUfD87?{9k_h zWQ*afRX5)|JgFxBpdO45rf?%3X@Md)740&Twnf?HQB_mN1i|n?FOg-e+h&X>+?bT8 zSsY&{s%(LkDWe{k)0rk}+r*s-Ew@fuv~Hg|H=ooUN>XyQuzK=T9P|{zvY|&tpxP8+ zBmiqIMc3+@xG<$HtyPQSzMe(16g0+=QMN5sA)($=a_E2ojMaKwKtyEsJdMoi$jrvp zlNl{)HPJ{T#ZS@Q<^Wsyy|y{4E-d|!VyqCNrF(hD)HroaHJ5}HOI35f#Ggs6j_9dt z6zf&FF+Xt6@n*GPp zzw=730Khl@lph1|mgeWee#bC@_A(sW9UW|heF*{p(XESTT8w>wMD2pr&yhn%e0l?MI-z`t zN|u1)!!*j0S)~du6(*I&q$o)7fqWG+uQP%}QD}%S4P_xb6eUla!YdKI*i5upW-ivL zQJ!}6rTZk?YQrN&}}iIl45S0ns7mqS_NkCM_n-19ci z$%1p{%gKMLCG> zB&R8kXYMnfGr{Ui#+}ZiKFDlAS+G2yxQbH1-hzJj`Jc;w0KM5vgc2pq+C96Q2?} zYKLVb0aq<4A)RFO3WEG{vy?Qtbf-HLaYdjcTm}S`XsZ_~m84q+2Z!3yK7u{ETuRp@ z+=@WSwhRaeX!X*nriiS(I_s~9uVGQfaQ-}ifKdubu*C%euniDkC*TGFRsz96wFcY{ zAjd-lc`8`aWE>ACA#yDOj^}b%w&I4__3jFDGR9OmmIRULf&`0(rVdN(W1$g+%TO={ zoSZC-A5~@SgPC#E)lrxVFmZrLu~PP@>X*a$-VqHG#f+9!88m2T?Q#@4beJPhy#z;# zu3I~65e%OsC+efI5S;q(xLB1BmQsG1pPv})u8NnRZRhk(Atg&~3-}}_Y zHOC~EzGZLSS8<AOuV%y2Y_7&UuazF2%uj{NjwN|ZNy}Ngv zI^EUnr6ef{00DeArA`3qfA3iTZ~i~!KlcAODRBu&001QATa)^RIYbgfuavTq+PAg= z06;t@v&fjrL-!S%!2U#(5F!|;% zz283UZxlcS8Oh8%-H8DJ*p+XO?tg$pU=*-)wsHUf;Ml)CY~Sb%eIu)~GI9Hkg}46p z!2b`>05mImAIop*4gl~Y0|55&DAna**5(f00DyGZx5x227MY!kn$Oz8#Qa;k|JFGF z!w15=s`a-B0LajPbK-B1!x=yxT06LZ$I8fmk0B8N07s_Z5oxt|GW+()eUBI9{ac4k z6m=_hF!BD*Md81k|BEFCV+TEOG;y%_)}Ful!nfBS51gmj*~#rYH^s?s4edYQmjl4u z+127ZR&nQ>uYdcvGY8Sdyw?!=SU^COu_1fkwjh;75wbPF1?&OB@QGqH#b1i-V!iqc z94r`Ya1GTBwGA~c6)v?d9#~35Q_D)WVnk*lr?*IGC~&F(@3puzutW+Sw4XhdS`Gru z%PkI0XU7?KXRQwFEp5;vuJ-E-NDi@9q=uJKvGEO;QA}4C)q0r$GioS+L;XGn@u!Vt zmaH-gGMWnO|%8JA5Y51u+Y0jbZk%X{vF+Yjlb=U>{Suhh8CDcl#%$^2^ zC6z`5$-7aym>$c40jgs5&%x?-zTyaP9=hy-;*||XN^(~*=M2pwAS9y0mF*vMN!vSkk0 zA2FxMUZp!7iG9d`+SZ^bKnx(mY_pdGfft1*y zR9~cXR!KF-&dWK|pbw#>ZJE=#=V6vqSE2)(VmPuP%_78uZSGbcWn1&|xcy6OkIOXc zR33|MP@Y9@5))6|t$2l;Gls#m3i$5>CkcZm3G2gD7(SYWg}&wYv1fzWIeN!GzgFlB zb0_Z{DQc*y7k?893El@u$3KdWEryQG57k&nf8bIs)GSfXBxsU0aO~<%K8N_NW^QTx z@@CdI{f9n>mM@;f)sv1CQP-M(Mo9aVNoLAg_@?}Ryu^tBN+2%PyB_iuPoYtl->UdRNlrO&(zPQ+>>mbQj@de&{~Jzp={vw}o^cxB*;QfJ=@6c2d?pwkzN~%lb&Wd#H3D;u z)>WTwJQ9rVo&|kbihSS!H+Q+bfI5XMGmRYP)87c5Od9Nes5Q*U|q^&8l&|l=!8dPcpg8cG(zgpR%S^@r`bO zMwZ=+G@`36Z2Sg%9~|Wqn{Zl&Ab*1@mxgiBK9$s(1T`zV{Jeb5id*)>-W$BI$Zq+< z2#m@S{o!pg%Lth9wW(pxgiZ$HDQa@oqcx&oP9P2i}!m@`vf@!fdsqPo4QxSH`G zY)w44M!{OC7}!FJepFl+nIdUE@*^m?rVnn;5&t5PGB@Cjp$w@v5BUrNCe$el~#>*VZ=gpfmv1_M%XCZ=-N;stC^>9moC30 zlyt*2D{ai6&YdzZb4A=voIWmpkA{1WbH{N?I(B`0|Saf7rC1}km)i10VZ>)xW0~tBq z8qEZHeq|-WMLWrWEMzE*;?wl$V=51_YSQ#%d89NNR*KJ9pfAuY{vuJL2~ZUm8W?;Z z`x7g0+Ys230CP}msxO)7V^r`lq_)2!OgSMOcr@tKROAGq7 zS)gccN2W8^!lh;ZraT!J#&*hgPo`dM?nGiw4U+-Y&O~xRa-|)_;f=mXhx3xr0D2E1 zG$*i)5NV_DAB*>zL6U^$rZBRE6U@{kKg>S=ohXA!*3fn)M0hX?YF=5z)QHze>V%<)Z>cX>hYW6UkoHd&S54owi&nA?}UC3Yfsi8 znefh)9_D#z*&U*r9ue&H>r+^KtDG^5I^w=E8`EMzwOkceqa`L#_z?&xZne(KMZk`S zU(=3QwNqJCX=twz0WZ5Uqp*f;E&*%ax{(G6&Te##ED*F8cHX23mw?~i&^C_1+YlR0 zSV@{k_^?q1H&H>Xk3gmUFOhm@%AT%2=$;Cjz|zlzn-wL8+~9l+H0mT>C4EN zaU#e-1h!?E$}qMS>0SkKs0^=lNfb?4rb!ylk;nFZRV$z^(MbA#wV)U(1d$L10A`P; zKZL^VAZN)HknK$n`_Q8?$o;UPL$va=30;z;?QE$lue`HBL4z}K!C3G2SI)d^^RrKS zAaxo;1|AYn;J`@TxxZ!=KvGBI(m_yXYD3)pa}zPyfWr|-?}$@mMS_tO+P(F9rOKRu*SDRG$^*6PWySK(UQlW-T>XE)%`vA<5wp%REJietP z*IV|-ks23$?koFY{2;DWpm7(DABGZ}f}D79HETOYX$ zIolAsCB1e-k|^yRef=ovM0KJhZ`J?mYF_UF;GFke2hf6m1L{Fw0g3=)5LrO$_bTiZ z5CDP*=mYEk3cd@0{%H(A2h9c`fAIhiKGOlHU?c!Ia9#j9cpLy3q8@+_i4DL2DFdKD z_5zSW^#G_);DGNH?tkt3dx{5<0vEv!w^}=EuObzW&1k6oo9zMs$83~BYSn^ZFsM6FB`5^>2f)D#YhFK#-6rBd;jGE&5KW^5qHY+-EU?@Dkx~8mocs zwN$78f}lENQW~0g=vYmRjPFU^v7zF@!~%Y&miP6p+-73-Kq0G(AkId9=q-eTygxj{ABX$#%L`M>7=eW}%3a z)hGcfh~(ClZnd&ElfS%!(bols)tAUE9x-kS2h*P;)j?T%k!n*6%wHV9Gn>nKW|gGA z!eMF-?)h1gcn^;;xf8cmS?vgcWdY6Ujp(?dDLj}#5ypwvl;+rwJ#jJ`yRl3C(o77x zvf?<3J23si$g}UIEdUe%4FLW60w8&>Rd+&pqiZ}t`A_F&ZrYzZa%L+)(@d0!fP%~u z-*1uJX9)wlLW7~9L6b;{3#hx~wqv0~phKk9m}OOvF~GqCP$W=N&7Hdat{g|@cOE{1 zW}XDbF3%?~Cv*I!+sZ#LgF(SSO2mgCP_cW#Kas&#cS0-$^vNlTg2k7wXgq^2gq1(? zD&>1o_4PFP@rteX$v7Fe&nkP4g@ca)EFGYAT6Me5+W5a9=0bjfEzFTnw4eP-#<>R( zi2ZDh5~o3J)pHS8EyCVpO2Ue!H;?8^KR8O(2Y`yn67IByhz3vzit;2TNtpN<8d^rxJ1%=TU8r>U^94=U3TKFt~>J3||=nhroeCLEXQ zDP6W)u6s#rcMB8i^UAp*K(p@4bke@P-uR7MrXzKfrxc+Y$;2`ZSi|3{X}Q}PJKP+e>UPYvK_Q$L2cG+D;Z$A;qfT9>(;o50RrZ`3=WoN<3FS5hRgm7lbM=L|DMhXh zxtL#9%3jF}2wap-gRLjV{%^#u_=5;dL_q{4K}02?GE(;-!a#jgCNK8tuu5h_h03)4 z;T@bFCcF%%lSBghkv=II{BF_K$=YDi#l5rZbM!Fd)q=>jf)LAP6VD;c%BVg57PUn6 zM*=)OT@D@r1~N8*MNC{p$0&R$P=77aqAg#Olr!$&B!t_Oo|lj3nMY+<`08HM(9` zvmOWYA|2g`f_~GNpZ@P~1R&@@4Ob%{wHI*E0#I^M-hbh9JLA$Wi?S$YsVmy0^FKx! za=AI3Yc;!n#?nAw#=Vof{V-_68-X~AmNg-Q{lzg-JPE-Om!+b&z^ZB&zP3V~o4U7f z;U9K#lGm``Xk=j-T^B10y5`rW+1cQA6@7SRI3-Jde>Ye#c(d$hF}taMR0z2A&mV*w%*>G3vTZ2Cp8c{MLSYwS&biR6VJ>uLaBR*f z5t(pB6XMmHs8Wlx?_3*-=>KNN@?}=o_K=I`vXU;D@h;-Q!SMX)wczZgx!r6M;OKj(|VW%PyH*4=RKQ(}W23k=g^=CoT!UJEyrE5ow6 zBU!gKvCwxzLPlLp9r3F>FYaLtM>drog>EU!mJzkIcCOEjHM$&PIfG#M)3p zLlL`4$EcR1TFTvF$|0)?`dA!+XA*i%hrwKoB5*yG7kYJ-6o3EfjQF-!qch?=*F$N> z-z5;gT}s=@sCNjq1BKGdI9z+dnh6JAktwk;%0sX8HL7wh>ounYR6Gy&D4~B9$c?_6 z`?2uT9f-aGiY|{_lNCk<5M;oJ3pHs4OuvT7Tk7CThVI@@%T7_ii|0s}n{(v~yo@cv zAU!v0?uy+e@xHhXkz-X3c#vh4Zl$WY1gD{6%%mZcg{f86N~T3x%-jHuy<}JBeB31bw5)MMM&=HK z3*nh5iYKR*jhz-# zKrZ9j`_XN4a6N*s?YN|6Fg-$0UYw3F$|YZ^@car4=}j>yuL`}(Z&kJS^h+wX;=?BX zFei{g#Ndr2opNVjO%|QFbK9AI<0U18$(mefz0xloaS= z8GPf{8I+-Y*6yPOF#*@}d5Rb755<1R0@{H+CA;rj@rl06H=k5!Zf`RuLRU-GcKIIb z@0WO5AS6G>;?(pqeKf>UOUnO2vVwvYPmCa9YybE#ZHHUUf%~U`xER)7S=2_X;>J#n z@-hc|6e62dJQtNZNX*<^<_O)N8~*3V=(KDpqXztZRLpYFN|jnNi2HW6-b;`%Fl-LZ zs4$(7;l&NolW?{0_rO7Xx^sp^m2@Q6?X@26?%LF_@8dl{NY=2QX=f6~EgcQjdqhPz^0^DqNtyXITy zY&OA+GsI(`GBWlQxFMY}?#l9is{xZJe7~0#^9^5jFSLRtq|Qt3Z5kV$T`_sYF6XH3 z{q*1&+FF52O)mNJGt&&8zZqJ=b62gyS>pbLqCx&PX>jRZO&h8beUOu)_$SY8+qhKm zTM~Jr+XGJ}VpgB{3mV657^*SMX|0&ShY&s~d zIxs~ket*aAlCn!Qp&75gqBN+h)rGz*$ZWTZCuXkR?o$E(Hj}R+a8cy`Go+C0$PF(C zlDHL3lT5>jW88cQst7m)X6W`~6r-P{)or`LE^=T~7co61#@vT%oLB_QQ2=6wmPLqN zr8(+($%3uJ6!xWKVS*2@Bc|p)t-r*TpvImpN=Ju>qMBIL&FS|aWG`iLi?*z4D98e4RIk(aVdCm(+^L*(3UWE;_z{$#)y12XTVxKQ_oA_RppW|BO>24 zV-CG&K_=zPO`FvIZCO???jL-xTk%qUIrTYXCl{2ZAXt(e_=jUqa9>JmX3BA{PDth= z;gbvVqs1EM!)|5*>7>0FI}+2s=c-8JPBRW)h)7n}nDwqlXd;xDFa%{5x-VE2JtGVY z!8D5DOF@kn!l{0nT-bTc=v)shW1uZfBXn$@k|+Bj!nTP%#HEnET8)16%M#VC&*RZCCG*#D2YkM zlS?d9jUAFwW_yf)TOw;PQ>_G@_0)Tkf|^urgR6vPXkxTiOgp)@DB*;*8V0;bj!@=U z#~c|F5m=5($1^m@*+GjbII=KUpNoBoMK&HGQ%Noln*S~t7ykws;vBOlmsh@MHGg>2 zt8$7KCwYW9ar;CVr`42g(8^KhH@3~y{nhAF1;eoiBcPr&-P3LMn)vGUXzh0N1}DXL z+=`vVTEM{IpS8VQ=mGDQx|#@!V2u5@vb>&$3ixQ^{uX&(rHpXQqrEa4j+9-BmhGux)k3o)uSZibjJY^%hh-KgQFp;H9iAT=7E+2L6B~wmB|bN^ zJ44$P0Wm%AWu6ET#60ggHAdzfP>D~6zLr=`awG;kFpi8h(=n)M8ExF`SY_9B{4T`{W(Hz}A ztdUR1Vz#DBPwVw5qJ09HP+67Jf`Yq?=ud|zj_%%87EH10E~B0THDLd$TSwCfo8Vh; z%3qKatPBE<5T>TZk-Hg9264@i@-7+5{>ah_0{ILzfG!5Ik%R25NMT z37Quj$Z!i=?bv~{-_j&Ot>~v+^@7|@q0si{ zG;bp-R%IdxA{eYJ(GEkUoIrg04=L)cSh_T$jz%hNw;RTe%+%at{RC8e;$EW zh3jTwD2;nAO0RB{frW~A{xLRq-o~!y+mo1eyaT_8PPjpMb!O_4L8>0Cf0_%66FZ^w z8J=(}lSxjK&!yOBstU~dncQGELAPQ}^l>uNhNcwAaZt{-Uk-*$(m*5uZWYS=MT$Qy z8x+@N7KU}ZN>xbJjdpUURWZYUUUfQjY zWqvG5RVGv@A5>&ga7tx~kbzneIbc0px$Ew9oibNPKa`4R=x`h9zO`+~ zeq>sMV`Ne+@b%8&0F3J=T<-q;G$4lbl!8t&rRZyO`Uf;O!&UK*> zrRbL^S4Rv`@>~vmlH_9p4?X>j+6Er_4shKv+D!IU8hzP@&q@~4c0Lk}JW)i+_GTS^ zN~^{x8O}Jov_2aW?COfy=W1`0C80hU@N#K~1l(S!(;3kuK-Y44?zdA5>=3M9uJ|+* zEdAs6BBqBS&S6kzZxL9Zb96#?P7Cc;gDYFpqT)=2Mi7bkt1;!y3fHnwR_t2vLaJzK zPA6804RKfJ>3&bH^wls|rAYWNXzmHrTeIedA4gfA=*^TkUueq?#}Lb~pghlmmjwu3 z>-KCBu4W!X9P=4&wGWq9JuCh^RRa{KTmQwo0-wDH(O!tU>6}noC(gyH`6d%2I5y09 z@KGe?8r%V4!MQPUXKQNNs-f~P(fxNs-mx#n;*>~HaDf~R17X1qr8qE0BNT<7-nl`ree$eD@?i&)8|)A>y9JoK~Fo33S5erY1a!5S3hiHC(Ez7 zGa}sT;_Z2f`(a5RhT#BbXgUY+cHdS1S1;u57VAq@@(8AdCpb@&54hY~W4J{Lq33z$ z2g+RTz3~Jg{afEiKU2mCVW`C!Oj>%RD-dBEvGH>I%APP&d*1 zei@4pw3&stl2y;ap?kO2=i!71#7P12A^uH%IP!CEUp(Jt&@|3gMrw_ zd0lrxpYhe7G1z9u3?{JxQcRD6?|}^_T%7dwPZ*p`7MEUHS^gdoEXxB15|5JdVCqAR zw1=>DHy?G(jKLS+k;eUK!*qwdtQOV0Lu!nISiH`zN#46(#L&52{p>Db7w%th{b5ZoM>lxCvzoAlywxdWPObwE#D0yaWZvs%-I(Xeq?A zv3mL2*-%l}i4yw!JvoT3SLQ!_D^cwOmL`CIJPi7HgsGI|BApLm&NcfFwGYEl){z}IO{JOXS=L8IB>~6pQmK84eB%En(o{95vXI%F4(zvnrm$PYz zCjZ&hfSTiP!S`60KaW8~R7`imGr1ZFS(RvQvzl!GJMac(IEiJRRX7m@y`$bC_aW@# z>9ll(LabB_(GDvwJl7mb(5H;lo+K}Rx@`WggBOPv z#rsd)F|Px;I(2^>2|;BssidQB-)Pw=*!Czih~S70O~AtYNTp5;5~3%8_8*Sw)99d6Ba;by4czS=&@6O!yMK7R4c*Ulrt z%FIpUc#>iTLEm+J0DXrZW+a56OR{gG|GI@d3zYqhbi`()$NJv(IBQSwAkWO|GIbiS zyeta^;nKqD3D?S^4aLgLPGiSG(W}pmE+%bD(x88c%1clMwoJsyd>ON*F3<5E(0N%1 z2ct@4A@SQGLUgtG>1jukZIVne<BdbLxgR zrey-0l>Z!In%DO-8WpUhv|(t_qoy3g2dtmOm(y%%2`0b3@-cPWf;Z zd7DO?dmhKf?3D7{R7S=T)6Q^GAFHc0vl9dp;<^#`4UxrrjTd!UR8x3(7(=-zCqn8X zgE$1Ddqm)k?8RSeksSN)b2&9lWtm;6de4A)mf1;qCzJ4PQx9x4Q7|)Zp$ZI z)0@LoR0_T%!}6jTC!Z$M*kFI1;tICsf(|&`Iu;Z+DVL5OZhyVaZ_9^c6z1aM;tX-r zS0|wqaw)#j(Bp)1A1)CWw??2;Qlz@@^!4GT8{aIs2yAKGZ_Aj*JVtuRO>dR=D0Fol z?QP$ims`4t#$5#2Ez5VsMOi~{sIq?@vl;k0D9x<$g9SVD9$F7y2t%8xC|G+#1THAE z-Np1~=nU^f2F1N&j7d4`*~8NNYMudGvqE(sl-#4d8F;5Bz3q4J%LBZ8R{`hZJ@xRL z&hJp?&(kZXi^H`r#4eE;+p5K7c6qa%HAyc1usAYl3vJ}!!&P4W{b8LGL zQon!ACFP+gg@1_&`Q3b$tpoQjiTD|u#Ohk{Ha44!NIgk5MeA=vqt}6=z9RzVPqPhB z?MO+kN}9lxHYlJywG@jEoDV@H zNh)~tfTI;?{i>>i;zWG2U0uNZA3VwOE{~g{ln=L7vHaCf&aU~FV^gf=jkQ0@Q-+^vWSx-QL1sW&!cie-DF2gn0utGxwIa zH!zu?1!TPVveFe=b?}*FGgIqx%S3k53|o)=Pac@Z-2r4yL%*d~q9`6Y>|)P3G6o%J z0zLe{_jPiN@n?&-|1yZ^;(F0-vpU)_@*KO8a`~W%S%~Kud|iE&rV>@ zF!vz6OsPT;wRJyi;i2yz(S&2p{3NNQX{x7;XVb0NXS>ndnX&_&kTy9}J|=XmomR_d z<^=0dcbRzb53AZ8D}T z<;mq$4lAq!$ZtC{i;l~n?L+Skgl81N*Q0j8M2kmP(HnM?j1t3dO!%7`*fh-QuE1M&1KfwDi0?mY08w`s4@VtnW zH^sKvlr|YgYZWinIxHkpmh+p<)geT=|IOo32>j#FcG5kc$-=B(5#pC<2r|a*dRsT}ok41Jdpl1@x`HN$$=-OmC-r#iIMK3xqj-#yu&xT5CMBGi4Rpnm zR6#DbuEwQjW~nvaHEHgPrA+v@iYE7xqIi?e-@UYrw+jA+7fu}}#i>7ZkvBSgj$mKy znyojY^=Ni#IKt($nRx~5_9`Q%RNAUQ)??}7j>b*311q1cN}28okB$xuA4~F=(6~M#Ue~wZb&)CM21HJ5{51t9XOU+D zcv(d(5O~H=DQ@aSpZE{dMgI~tC@?CU;1PEevx{JtEVI=YiECQ@=!W@{=c0C;Q%{ia5a5?vfl}{i@Ck_O z^d~Qf1E@Azt*kI6Uv+pE=^%wD%Lqo_EK-)68SIl+JPz_eUs&d!NNj0mX9%k?rH2110?4XP_@ zhF(Y?TjL4?qlCy=TycZ2-IE}nTh<>K^M9n5OionYyPMT>P;ce{#dVVnKpulXbGkC$BRy5$+e=iQP}hpcnWk z8~{`~s(_ne=0RM-gcFEcOGrh)mJs@>XIpA*H0Puf$0l(0?LK;6(d$Nj3==t z3wvoHQW>8^Yc{5DAa1(j~7$MJ_54e3Y%+Uo=%Pnj;1R`%P*bXLB z0keNKTw^%3rD@}8X1p+d(DchgGG-DCzJySl`7O4-74T9;&XwJ~&U+KO61$ zhIK;fPu==-fSbi3?rgAdv-CSL_u@G-zcqIB)HrKmz>o0gN>mOt0B*#`Sjt@9r3Cd- z0*B?2ICZtL6g1bBtv2+sW{Vo~O%83ecBiN|EfIZM z3s9D3Q=H~-u$^tBr_FP3atVpOG=(Fb?$f`HRB{`x`^R+j_I7M%+nJ37gb8$Tr{oKE z5s8vohhG^NvE7^QPumpJ2VsCaPo0ondH)@Kx&{($D`}x|{0AC?XM)ypKQqJ##DONW8rXU`vG-LVESSvO% zk_EHSFIs{MOHn@-st2{-B+T(ikJXfcL@E(z+V#xu9LUAvGyN z0=^^Qs0vX$&f9JU3Y%5upZi6QeE$}gmw5{`${Ov*qgS_)WqLzN!yJFly}`z0BW}LH zcO6C~wBTN>h<qG&^w*9HZgVC9=-5NL(Zwb2-YT~^hh6iOL_5U3yZj$<1Al;&uMlOkOoVfH+}dj*v6r#MU_vEd1vdjf zq{es{rgt+~#? zG=I`-SK^-idzemfuj40MZ6@`Yg1Zc1B^|mSn=RB*N6qQ;Ik19%e2oyEBClpt+{Nx0 z&r<8J)H*8XCVd&k(5X!cC6PoC8us4Bmd7yNZ>#lI`I`l4iXIiCw3C1CS<7;Jxd;c$ z?KvTP1@pvZ-+cyuef%M4hhYZ2;-2%YENI+c2&Xm&;+H{cE!9C~@$-jA5RRqP1rG$6Z~W zK6Q<9?GGevVpwmzFzGCe5K*W>bz@iR8uP)_K;U|Srq`oVY+lVgM`OU-+{L<;FDLQM z1KGF&WiG5Tj%}Zwt@{Q26|a;UNf1-2DhFkTZK0B7ZS()t# zq5O0pbEd+%aB$SMa{qai6m0rMB?iCqp1Y>o!g~d--PP-<$vn$sqfd3L+Pale0vt@5 zn%yvDwoG;M0P6xca&qycx0m5%V?yBlZi7emQ}xM0@eDEkM!6M}*Q_l3RyzcPQ>O@# zy`fT&0ow(beQ0C-6qM9SpV`PsA6dynr9%2s!n&W&*?3^?ae|-A{CoVzv16&w`D&cX z3MQGCLm`)E-hg4b(t^XWV6mQ3Zl9sPuG?70uc#X~&^_ZOT0*?d8Vw0O=pSp-f9Zy^F1=|wBK4{KkKAX&M?KqGN+gz=<0rXA1J^F`7K9Q+e&UPg2b)Y zWG{Lu$K(th*z(l8HRWgumc5lI#*`)0;<0(!sdco?hqovkaY#EELV@fGNF+&8(@O8C zi)jAMaaXYc0fr4qu=j6f;VY*I2=7pwAp8;Ip-~p(7;onIfa8fDL9eJP)&|Wt_(xkL z`jbqS7DrUnXiYHi{3vdp%5muWzDyya)t2lktI1-bBnpq~wF!T%W$GH!U(o|3<&p-( z6hg&qD|*3dlhW-ZOQgtv4G25i0Yx!O>>m-r?5|nK0tW|h|=mPAks+nB6exy*EK&tVdt(;>EovLxxU`ccotbRc6xYuP)p))MyasH z?Wdca9?o^x2CgHk$jobI@(ULOYvzQ0Uxy}_w944M(i(}{z@UurkYFD`z@(uD@J-8T z%PC!wMDUEZrs$_ZMdce%K4X{iR%Q5*tUFjx>x!8`&9OdXp>D2Z+aI2OZ+)Woej7ct zfM`7}S*+xx)yn%vLs={OypwK-&s!>axE$WyY3y$eh+Rsy4+kf%bIMSsb@zds1HSt;K@3latw{?s8QY^w+O>pUjhGu?lnEJPx8xwak1a1woh zl9Hvi|A?xyhS>b0y*d7`%wEG*s)bkMbU3Z_&wFJ4dK@LHIXZ+e0%!K$@n}T{W7q_7 zFjemmOaDsZPY}skV&K)Tc#aeZ>R&^0^F8uyF2%N30o&3L-$ulUAw^by#v5 zH~}=&z;8mDr+&O9mgX?T%rW)PP#cV}pI}@1yPIFM7r(jwS$`VNLA-D~=tLmOUs-bf z7@^{#`;bbQoS4QFuw}k0yD$!M*YqXWGXVp|UVY;Qc>3c9&l{}5z|@x?K>dk!;4-DS z79m@BN(C4%HH0M%OrMNR^Hf&6w_bz$54IhTLV8X+%AgzrXHEBVY60QWhmn6jm-q0~ z|KSDaHX{8RJDqnMTqAZtM7EZ&l1(^71SOeQxa)GPy*B3`e&1*ox4c5tOSWuz&i?7p zl-+ftR84RjLQMeaB%hp_IT!4_D1Rs`8^36`%3Utwo6HH$Hxab?{F%@a(B8sEQ}stG zcJz|n9y{}Wc-Z&B_rY$i!tSkcJK)pg_;7QL>vGFgaN(e{)JJ$_rB^#*s*V^sTqkS( zq(^L;0rL8v(WeCjNaNAg1C;5>k3fmAEeZ%cS(iT4xBb9TTEh%loHO(p_>xAgIhzAN zp3x5lKwg-& zE{iCrwNg4eif&LXj`8k2DgItl+qjGQIJQ0JOYW|)v5^z5dpv)b%s6go zCbM}F-yea2$W^m+8>n9Ns})U}guw)+1*}c844q4ji4%f`YQd2V?i$E04kbs#G48oP z31?YnwsJFXOikcsHr3(^;mMPOMS1o_&w)Po5_XWrf}J*=BQsd}N8Ibpjb|8&0#aI1 z^HClhY#B8j%%E8RF8(?vVU2BA&*hi9DAPu)bK(cyzz3{*ISP42R0`>{PEJw0{p#)j z1*ZfZmC6hU7p7*O{UtD2+{UQtC{QC9BXxae+@aq1JovZZOsZHBOdN_h`r1Ph-z^67 zs@;x1AW&vvJNbl?KY(y?=A-VH_0?T5*#;dcE^#X zCBxd1@fK?~T>B=M#I{b9%P(dN0jMJ@*qY<3^4Yecm>a==A|;lKqGz#MWiQ}W&PkUV z>GCp1!O$BaLo6TmJtO<3t1)WEmfAHT`S|PwtSo$l|8h%A1w*R@8oP0aig~g+zkdQ_ zQ{YJjkI}`?lK2!6zV>qG3_mq!I>_o2G#7FPUX6eI>MMmT&kk9Z`MzL}yg1C%FT*qb ze08o?(pPXIjqq=vU=r7VaZuS$HdERb{(aC~7N^@%`ZoKu?v`ws^Y?z`!*!>rkL~u< z%igv8S$F3A=LMA91Fy%^!2K}E9WIx^UzbhC>ZQL5x#VZrL=V#>_ct|NA9tu^j3pc$ z%e_At8YO>?`G9dtM?$kd0mM+%!^D9lxDa{k7U(_>IQ7FS-M>+=heH8`B-pF)%S;qr zSxpPUt(`E(05g!Q*5SJ%0xc%ZTCr}`NxkqSR~4Q2Cp|jC$(M`qNf8doii=&Uz{h-~Qx#SM^ct7=krGhbuyO!EP{?@+js5~{+ggYdGB9ZH7j~G2>a5IJg$&sN=VS^fhi$2FBrJU>%`Zmq{%E0i8 zr3~(3g+L5|Y-sL;bx`eE)lZt&LwgR&HA@ICo&W1?SZ7@320VO`c6ivQu?)67l~0%C z^X!yFtAG&I`hkA1g*DsUf|6RCNGt49D~0CRuw*MG#)IwzGeL<#kNOy*wjo5N!bS3C z@Inn~9`9_~Wby}At6bd;MxsB5xk|c70OawcQ5WX{Leu#$t{=0v1+)>WObl>|I_Si> zx5W$i(`#$DeIs1wW_>bRils^g!Sl>R2Z^0|6h(<>ZTNva#Oy6&NGtgQR6KK1IAx4x zYy&`L7Vk@sGejj2Id2$m1}gqLTx!&Qz@b(QsVho~K)2!6O*rsyifMr@RQM=E?gx)c z>R%j3w!6<)J2)en&dbPvH5n6H+ zIhD_QoUl(fC$H(96(HP+g4I-iB2>dYU(;|=V+GLsXD&VysZsJHHo%{sn~g(y7(cz= zRqtnU+bZU&=3`O&3lte0WTR>|%i1V^Cb{2wDW?=@F|t~z!2QkZLlbs3e)<*U!Li=# zaI@#1jSzEMt)bH`THIKJNMQlLc4S*H7@q6UbRTeE5u@pb7zokMJT@Oi$LXB(w@1Gh z%ZJIyQw~}?OT_2aB`CS=TXQgy}LR$h_U@|;E!JgDMQC(gCuR&-g>jIVdXbGDLPnF-m+S$VkC ziIVHOO?P&N$I0hGZ`=u0-LrG~Fo^q@(9FxzXT;7<97$ zf{cZM6n!Dryux-8)bZ0T4+((5cFl+MmwO?yP?wUwcN-?oBGusW%21Qw$Re4~towf4 zbvo%;^)%miOnh`7q0n!UG08oV0M0AxD(Inyt{FTUN>44HBy;aD<8teR=`)xeNk}Bf zj;06=Ee3PaBW_hDXjOMM&RK4YWj#{Y6Q=D16HwCB8w+26EBy!uBkAV|C`z&NgbR+2D4APZV4YY1d}e z0M2{~N?eunMfzkcU`R!O>x(^uB({nqmhU4P$EJR-nL`7CToJ$-Qws%es>?T2Oqp9W z>}Vl5h&$D9Vt_)PVsW3fP`zgoZn>3V!GEnSUG;;BZ6E0PI1Z3f=peskn~N~_=P8~H zuoLbmX=^;Wy3d$ds?pnSF!h5c6eRl{FauEsWy~uO+FbvfilcI$Kn?$9H_-GDWM<9& zA@Ewtb5`!+ki*E3yd1e`O2Vw0-+G2!b{14+&F0<6%3N46P{d7)RVhfV9mWrKgi#%= znv2FlSY?;`qnW(i+@!{_Divg9&c-C@1aUQGnaAnnb2oWQM^UW2n+=a^LZ}|l3Ad?G zbh6I95`gA4m-jb-lz5UVu5?88?CX=A=fvfP)dt=sRxl6tXXmDIsB#6sO~;_Jh)V@& zL2&h=4ft-{f~Mb&HtpH}&=Aw|`G&vIErWC*@uQ$cVCcfi+_i_Af?wkDj@f!cm#teiSR+l1L+!-ItL`lRjFm>wDPKQyWNv$_qx!1Ki<;J5q_fX9&SBl1H~Dd zQqpe{*iB1Vu(6*4$_JBkSBFEBgGza+Gya=w`|1)T&AJdzzf?Ej)5xPkq*`}LyCnaU zJ9s=w`45i}1H8b|RP!I)qzbT79T-jLJ|yJS_H&W+TMrY{TsqbRK3b(gJKBV&>DLo&igEy9 zwBv0>23JZ71MU#4!r3x!omxI`Qi($&y?6wS*23knbQ z@Tvx09swxO$9>uOmCpo_pd!RTEaOxM)nb;CRJkI1^R-J!JfMrb?yAVlEc3LE6jxk| zS}}?pk1Iu)I!YJx1$gjs0V!&9l=u|Qe2hs_(lVYt6xEoT;cdjQ+JW6^OO@D2_)89x zjukg5ZYl>w#kTIVedW>(p>$5zuyxmOn@N-=&%@gr>kq-%M(B4O|kPo)Lv2q*Pxor8)8#&#i zDmA*xSmTXto0cC~y>P0DKL{`1KqO{e*UA_`Jisq)t4URiJRcLw)rfYvnq4He zc5CSaC2bC)V5OIh2Jgcp+twn4z8lg$ZC?KFC9iyNi{$nm(J~gN<6AplsxW)n)OGoT z>J1qd%Q@G8QGG#51S>>AFHM3Iu3tJKiVditAy82`^vjj5S)slEjq#DX|S=$@l~Qu@z&JW2KyOFo0MtIRDsCFMusV z!zv4dGU`}WHZKGqjdM+6QuXl4^C`6^**Rv`);Ct{czMi*R~K&lJf~-BVwD=!)-7AN zBn>8H)SWqU+O&}`XJw5UI&BJV)v{%5<;vK+nxnMgU@PFsksTWSl`dEf}$u*8VU@;PTZ!(b+qJqQvnHE264 z|NU2%Zzp%|1`qF?+Bh|`YD$$FSf%>>nNxObU)lKT*L%b3Zj0%26dpOT%Wb&K%*@Qp%*@QpOq-Osy_K1nnR_hLHTSQO#2r7Wj+ONm zZ#&NKC)#Lj!4n-NGPY858mo~A?zH7w)>h-Dd4##+;C$Y)z}05GGvH2ui_jNtV)nE? zGf&Oy%$!tO`kLDqrB$BOJO`~);CyCpRsJt9a~e!e-I~U+{Ex(o78DyAtBebv] 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 GP1dP2ZbstT&cf$d=w*b> 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 literal 0 HcmV?d00001 diff --git a/client/src/assets/fonts/Roboto/roboto-v29-latin-regular.woff b/client/src/assets/fonts/Roboto/roboto-v29-latin-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..86b386372664a278c839b4a6fedbf6a05b396b70 GIT binary patch literal 20332 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 Z@IjO83?{s=KqX^`zGvsj4^tdfk^ttt3T6NR literal 0 HcmV?d00001 diff --git a/client/src/assets/fonts/Roboto/roboto-v29-latin-regular.woff2 b/client/src/assets/fonts/Roboto/roboto-v29-latin-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ebe1795f85a661c205e4a4612eaf47d56273e68e GIT binary patch literal 15688 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 Date: Wed, 6 Oct 2021 12:01:07 +0200 Subject: [PATCH 05/10] Added redirect function to search bar --- CHANGELOG.md | 2 ++ client/src/components/SearchBar/SearchBar.tsx | 28 +++++++++---------- client/src/interfaces/SearchResult.ts | 1 + client/src/utility/index.ts | 3 +- client/src/utility/redirectUrl.ts | 7 +++++ client/src/utility/searchParser.ts | 9 ++++++ 6 files changed, 35 insertions(+), 15 deletions(-) create mode 100644 client/src/utility/redirectUrl.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 9384559..3b6ccfb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ ### v1.7.0 (TBA) +- Search bar will now redirect if valid URL or IP is provided ([#67](https://github.com/pawelmalak/flame/issues/67)) - Fixed bug related to creating new apps/bookmarks with custom icon ([#83](https://github.com/pawelmalak/flame/issues/83)) - URL can now be assigned to notifications. Clicking on "New version is available" popup will now redirect to changelog ([#86](https://github.com/pawelmalak/flame/issues/86)) +- Added static fonts ([#94](https://github.com/pawelmalak/flame/issues/94)) ### v1.6.7 (2021-10-04) - Add multiple labels to Docker Compose ([#90](https://github.com/pawelmalak/flame/issues/90)) diff --git a/client/src/components/SearchBar/SearchBar.tsx b/client/src/components/SearchBar/SearchBar.tsx index f2ccdec..887a2ef 100644 --- a/client/src/components/SearchBar/SearchBar.tsx +++ b/client/src/components/SearchBar/SearchBar.tsx @@ -11,7 +11,7 @@ import { NewNotification } from '../../interfaces'; import classes from './SearchBar.module.css'; // Utils -import { searchParser } from '../../utility'; +import { searchParser, urlParser, redirectUrl } from '../../utility'; interface ComponentProps { createNotification: (notification: NewNotification) => void; @@ -28,28 +28,28 @@ const SearchBar = (props: ComponentProps): JSX.Element => { }, []); const searchHandler = (e: KeyboardEvent) => { - const searchResult = searchParser(inputRef.current.value); + const { isLocal, search, query, isURL, sameTab } = searchParser( + inputRef.current.value + ); - if (searchResult.isLocal) { - setLocalSearch(searchResult.search); + if (isLocal) { + setLocalSearch(search); } if (e.code === 'Enter') { - if (!searchResult.query.prefix) { + if (!query.prefix) { createNotification({ title: 'Error', message: 'Prefix not found', }); - } else if (searchResult.isLocal) { - setLocalSearch(searchResult.search); + } else if (isURL) { + const url = urlParser(inputRef.current.value)[1]; + redirectUrl(url, sameTab); + } else if (isLocal) { + setLocalSearch(search); } else { - if (searchResult.sameTab) { - document.location.replace( - `${searchResult.query.template}${searchResult.search}` - ); - } else { - window.open(`${searchResult.query.template}${searchResult.search}`); - } + const url = `${query.template}${search}`; + redirectUrl(url, sameTab); } } }; diff --git a/client/src/interfaces/SearchResult.ts b/client/src/interfaces/SearchResult.ts index 271bdc2..3d6c8ae 100644 --- a/client/src/interfaces/SearchResult.ts +++ b/client/src/interfaces/SearchResult.ts @@ -2,6 +2,7 @@ import { Query } from './Query'; export interface SearchResult { isLocal: boolean; + isURL: boolean; sameTab: boolean; search: string; query: Query; diff --git a/client/src/utility/index.ts b/client/src/utility/index.ts index 99f8d69..caff9c3 100644 --- a/client/src/utility/index.ts +++ b/client/src/utility/index.ts @@ -3,4 +3,5 @@ export * from './urlParser'; export * from './searchConfig'; export * from './checkVersion'; export * from './sortData'; -export * from './searchParser'; \ No newline at end of file +export * from './searchParser'; +export * from './redirectUrl'; diff --git a/client/src/utility/redirectUrl.ts b/client/src/utility/redirectUrl.ts new file mode 100644 index 0000000..81eca10 --- /dev/null +++ b/client/src/utility/redirectUrl.ts @@ -0,0 +1,7 @@ +export const redirectUrl = (url: string, sameTab: boolean) => { + if (sameTab) { + document.location.replace(url); + } else { + window.open(url); + } +}; diff --git a/client/src/utility/searchParser.ts b/client/src/utility/searchParser.ts index c477d66..a1c3787 100644 --- a/client/src/utility/searchParser.ts +++ b/client/src/utility/searchParser.ts @@ -6,6 +6,7 @@ import { searchConfig } from '.'; export const searchParser = (searchQuery: string): SearchResult => { const result: SearchResult = { isLocal: false, + isURL: false, sameTab: false, search: '', query: { @@ -15,6 +16,13 @@ export const searchParser = (searchQuery: string): SearchResult => { }, }; + // Check if url or ip was passed + const urlRegex = + /^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?|^((http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/; + + result.isURL = urlRegex.test(searchQuery); + + // Match prefix and query const splitQuery = searchQuery.match(/^\/([a-z]+)[ ](.+)$/i); const prefix = splitQuery @@ -27,6 +35,7 @@ export const searchParser = (searchQuery: string): SearchResult => { const query = queries.find((q: Query) => q.prefix === prefix); + // If search provider was found if (query) { result.query = query; result.search = search; From 591824dd0c39af3b206d1b24311a595db50575ea Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 6 Oct 2021 14:15:05 +0200 Subject: [PATCH 06/10] Fetch and use custom search queries --- client/src/App.tsx | 13 +++-- .../SearchSettings/SearchSettings.tsx | 4 +- client/src/store/actions/actionTypes.ts | 53 ++++++++++--------- client/src/store/actions/config.ts | 46 +++++++++++----- client/src/store/reducers/config.ts | 44 +++++++++------ client/src/utility/searchParser.ts | 8 ++- controllers/config.js | 15 +++++- routes/config.js | 22 +++----- utils/File.js | 11 ++-- 9 files changed, 136 insertions(+), 80 deletions(-) diff --git a/client/src/App.tsx b/client/src/App.tsx index 05db805..9311b4b 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -1,5 +1,5 @@ import { BrowserRouter, Route, Switch } from 'react-router-dom'; -import { getConfig, setTheme } from './store/actions'; +import { fetchQueries, getConfig, setTheme } from './store/actions'; import 'external-svg-loader'; // Redux @@ -27,15 +27,18 @@ if (localStorage.theme) { // Check for updates checkVersion(); +// fetch queries +store.dispatch(fetchQueries()); + const App = (): JSX.Element => { return ( - - - - + + + + diff --git a/client/src/components/Settings/SearchSettings/SearchSettings.tsx b/client/src/components/Settings/SearchSettings/SearchSettings.tsx index dc3a4af..a3fec29 100644 --- a/client/src/components/Settings/SearchSettings/SearchSettings.tsx +++ b/client/src/components/Settings/SearchSettings/SearchSettings.tsx @@ -27,6 +27,7 @@ interface Props { createNotification: (notification: NewNotification) => void; updateConfig: (formData: SearchForm) => void; loading: boolean; + customQueries: Query[]; } const SearchSettings = (props: Props): JSX.Element => { @@ -81,7 +82,7 @@ const SearchSettings = (props: Props): JSX.Element => { value={formData.defaultSearchProvider} onChange={(e) => inputChangeHandler(e)} > - {queries.map((query: Query, idx) => ( + {[...queries, ...props.customQueries].map((query: Query, idx) => ( @@ -122,6 +123,7 @@ const SearchSettings = (props: Props): JSX.Element => { const mapStateToProps = (state: GlobalState) => { return { loading: state.config.loading, + customQueries: state.config.customQueries, }; }; diff --git a/client/src/store/actions/actionTypes.ts b/client/src/store/actions/actionTypes.ts index 4324834..0c1cc87 100644 --- a/client/src/store/actions/actionTypes.ts +++ b/client/src/store/actions/actionTypes.ts @@ -26,8 +26,9 @@ import { ClearNotificationAction, // Config GetConfigAction, - UpdateConfigAction + UpdateConfigAction, } from './'; +import { FetchQueriesAction } from './config'; export enum ActionTypes { // Theme @@ -62,35 +63,37 @@ export enum ActionTypes { clearNotification = 'CLEAR_NOTIFICATION', // Config getConfig = 'GET_CONFIG', - updateConfig = 'UPDATE_CONFIG' + updateConfig = 'UPDATE_CONFIG', + fetchQueries = 'FETCH_QUERIES', } -export type Action = +export type Action = // Theme - SetThemeAction | + | SetThemeAction // Apps - GetAppsAction | - PinAppAction | - AddAppAction | - DeleteAppAction | - UpdateAppAction | - ReorderAppsAction | - SortAppsAction | + | GetAppsAction + | PinAppAction + | AddAppAction + | DeleteAppAction + | UpdateAppAction + | ReorderAppsAction + | SortAppsAction // Categories - GetCategoriesAction | - AddCategoryAction | - PinCategoryAction | - DeleteCategoryAction | - UpdateCategoryAction | - SortCategoriesAction | - ReorderCategoriesAction | + | GetCategoriesAction + | AddCategoryAction + | PinCategoryAction + | DeleteCategoryAction + | UpdateCategoryAction + | SortCategoriesAction + | ReorderCategoriesAction // Bookmarks - AddBookmarkAction | - DeleteBookmarkAction | - UpdateBookmarkAction | + | AddBookmarkAction + | DeleteBookmarkAction + | UpdateBookmarkAction // Notifications - CreateNotificationAction | - ClearNotificationAction | + | CreateNotificationAction + | ClearNotificationAction // Config - GetConfigAction | - UpdateConfigAction; \ No newline at end of file + | GetConfigAction + | UpdateConfigAction + | FetchQueriesAction; diff --git a/client/src/store/actions/config.ts b/client/src/store/actions/config.ts index a14e21e..baddbe5 100644 --- a/client/src/store/actions/config.ts +++ b/client/src/store/actions/config.ts @@ -1,7 +1,7 @@ import axios from 'axios'; import { Dispatch } from 'redux'; import { ActionTypes } from './actionTypes'; -import { Config, ApiResponse } from '../../interfaces'; +import { Config, ApiResponse, Query } from '../../interfaces'; import { CreateNotificationAction } from './notification'; import { searchConfig } from '../../utility'; @@ -13,18 +13,18 @@ export interface GetConfigAction { export const getConfig = () => async (dispatch: Dispatch) => { try { const res = await axios.get>('/api/config'); - + dispatch({ type: ActionTypes.getConfig, - payload: res.data.data - }) + payload: res.data.data, + }); // Set custom page title if set document.title = searchConfig('customTitle', 'Flame'); } catch (err) { - console.log(err) + console.log(err); } -} +}; export interface UpdateConfigAction { type: ActionTypes.updateConfig; @@ -34,19 +34,41 @@ export interface UpdateConfigAction { export const updateConfig = (formData: any) => async (dispatch: Dispatch) => { try { const res = await axios.put>('/api/config', formData); + dispatch({ type: ActionTypes.createNotification, payload: { title: 'Success', - message: 'Settings updated' - } - }) + message: 'Settings updated', + }, + }); dispatch({ type: ActionTypes.updateConfig, - payload: res.data.data - }) + payload: res.data.data, + }); } catch (err) { console.log(err); } -} \ No newline at end of file +}; + +export interface FetchQueriesAction { + type: ActionTypes.fetchQueries; + payload: Query[]; +} + +export const fetchQueries = + () => async (dispatch: Dispatch) => { + try { + const res = await axios.get>( + '/api/config/0/queries' + ); + + dispatch({ + type: ActionTypes.fetchQueries, + payload: res.data.data, + }); + } catch (err) { + console.log(err); + } + }; diff --git a/client/src/store/reducers/config.ts b/client/src/store/reducers/config.ts index 071f461..93150e2 100644 --- a/client/src/store/reducers/config.ts +++ b/client/src/store/reducers/config.ts @@ -1,36 +1,50 @@ import { ActionTypes, Action } from '../actions'; -import { Config } from '../../interfaces'; +import { Config, Query } from '../../interfaces'; export interface State { loading: boolean; config: Config[]; + customQueries: Query[]; } const initialState: State = { loading: true, - config: [] -} + config: [], + customQueries: [], +}; const getConfig = (state: State, action: Action): State => { return { + ...state, loading: false, - config: action.payload - } -} + }; +}; const updateConfig = (state: State, action: Action): State => { return { ...state, - config: action.payload - } -} + config: action.payload, + }; +}; + +const fetchQueries = (state: State, action: Action): State => { + return { + ...state, + customQueries: action.payload, + }; +}; const configReducer = (state: State = initialState, action: Action) => { - switch(action.type) { - case ActionTypes.getConfig: return getConfig(state, action); - case ActionTypes.updateConfig: return updateConfig(state, action); - default: return state; + switch (action.type) { + case ActionTypes.getConfig: + return getConfig(state, action); + case ActionTypes.updateConfig: + return updateConfig(state, action); + case ActionTypes.fetchQueries: + return fetchQueries(state, action); + default: + return state; } -} +}; -export default configReducer; \ No newline at end of file +export default configReducer; diff --git a/client/src/utility/searchParser.ts b/client/src/utility/searchParser.ts index a1c3787..2befdd2 100644 --- a/client/src/utility/searchParser.ts +++ b/client/src/utility/searchParser.ts @@ -1,6 +1,6 @@ import { queries } from './searchQueries.json'; import { Query, SearchResult } from '../interfaces'; - +import { store } from '../store/store'; import { searchConfig } from '.'; export const searchParser = (searchQuery: string): SearchResult => { @@ -16,6 +16,8 @@ export const searchParser = (searchQuery: string): SearchResult => { }, }; + const customQueries = store.getState().config.customQueries; + // Check if url or ip was passed const urlRegex = /^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?|^((http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/; @@ -33,7 +35,9 @@ export const searchParser = (searchQuery: string): SearchResult => { ? encodeURIComponent(splitQuery[2]) : encodeURIComponent(searchQuery); - const query = queries.find((q: Query) => q.prefix === prefix); + const query = [...queries, ...customQueries].find( + (q: Query) => q.prefix === prefix + ); // If search provider was found if (query) { diff --git a/controllers/config.js b/controllers/config.js index a9768d2..85b209a 100644 --- a/controllers/config.js +++ b/controllers/config.js @@ -162,7 +162,7 @@ exports.getCss = asyncWrapper(async (req, res, next) => { // @access Public exports.updateCss = asyncWrapper(async (req, res, next) => { const file = new File(join(__dirname, '../public/flame.css')); - file.write(req.body.styles); + file.write(req.body.styles, false); // Copy file to docker volume fs.copyFileSync( @@ -175,3 +175,16 @@ exports.updateCss = asyncWrapper(async (req, res, next) => { data: {}, }); }); + +// @desc Get custom queries file +// @route GET /api/config/0/queries +// @access Public +exports.getQueries = asyncWrapper(async (req, res, next) => { + const file = new File(join(__dirname, '../data/customQueries.json')); + const content = JSON.parse(file.read()); + + res.status(200).json({ + success: true, + data: content.queries, + }); +}); diff --git a/routes/config.js b/routes/config.js index eebf5dd..6abea15 100644 --- a/routes/config.js +++ b/routes/config.js @@ -10,23 +10,15 @@ const { deletePair, updateCss, getCss, + getQueries, } = require('../controllers/config'); -router - .route('/') - .post(createPair) - .get(getAllPairs) - .put(updateValues); +router.route('/').post(createPair).get(getAllPairs).put(updateValues); -router - .route('/:key') - .get(getSinglePair) - .put(updateValue) - .delete(deletePair); +router.route('/:key').get(getSinglePair).put(updateValue).delete(deletePair); -router - .route('/0/css') - .get(getCss) - .put(updateCss); +router.route('/0/css').get(getCss).put(updateCss); -module.exports = router; \ No newline at end of file +router.route('/0/queries').get(getQueries); + +module.exports = router; diff --git a/utils/File.js b/utils/File.js index 0b2fbdc..f135da8 100644 --- a/utils/File.js +++ b/utils/File.js @@ -3,7 +3,7 @@ const fs = require('fs'); class File { constructor(path) { this.path = path; - this.content = ''; + this.content = null; } read() { @@ -16,10 +16,13 @@ class File { } } - write(data) { + write(data, isJSON) { this.content = data; - fs.writeFileSync(this.path, this.content); + fs.writeFileSync( + this.path, + isJSON ? JSON.stringify(this.content) : this.content + ); } } -module.exports = File; \ No newline at end of file +module.exports = File; From 459523dfd256a6869e04f71c4b02edbeb3562390 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 6 Oct 2021 14:17:31 +0200 Subject: [PATCH 07/10] Changed initial files creation process --- package.json | 7 ++++--- server.js | 27 +++++++++++++++--------- utils/findCss.js | 22 -------------------- utils/init/createFile.js | 32 +++++++++++++++++++++++++++++ utils/init/index.js | 9 ++++++++ utils/{ => init}/initConfig.js | 10 ++++++--- utils/init/initFiles.js | 8 ++++++++ utils/{ => init}/initialConfig.json | 0 utils/init/initialFiles.json | 32 +++++++++++++++++++++++++++++ 9 files changed, 109 insertions(+), 38 deletions(-) delete mode 100644 utils/findCss.js create mode 100644 utils/init/createFile.js create mode 100644 utils/init/index.js rename utils/{ => init}/initConfig.js (78%) create mode 100644 utils/init/initFiles.js rename utils/{ => init}/initialConfig.json (100%) create mode 100644 utils/init/initialFiles.json diff --git a/package.json b/package.json index 40f1646..e2a2501 100644 --- a/package.json +++ b/package.json @@ -5,10 +5,11 @@ "main": "index.js", "scripts": { "start": "node server.js", - "init-server": "echo Instaling server dependencies && npm install && mkdir public && touch public/flame.css", + "init-server": "echo Instaling server dependencies && npm install", "init-client": "cd client && echo Instaling client dependencies && npm install", - "dev-init": "npm run init-server && npm run init-client", - "dev-server": "nodemon server.js", + "dir-init": "npx mkdirp data public && touch public/flame.css public/customQueries.json", + "dev-init": "npm run dir-init && npm run init-server && npm run init-client", + "dev-server": "nodemon server.js -e js", "dev-client": "npm start --prefix client", "dev": "concurrently \"npm run dev-server\" \"npm run dev-client\"", "skaffold": "concurrently \"npm run init-client\" \"npm run dev-server\"" diff --git a/server.js b/server.js index 8b09803..5c1d0fa 100644 --- a/server.js +++ b/server.js @@ -1,23 +1,28 @@ require('dotenv').config(); const http = require('http'); + +// Database const { connectDB } = require('./db'); +const associateModels = require('./models/associateModels'); + +// Server const api = require('./api'); const jobs = require('./utils/jobs'); const Socket = require('./Socket'); const Sockets = require('./Sockets'); -const associateModels = require('./models/associateModels'); -const initConfig = require('./utils/initConfig'); -const findCss = require('./utils/findCss'); + +// Utils +const initApp = require('./utils/init'); const Logger = require('./utils/Logger'); const logger = new Logger(); -const PORT = process.env.PORT || 5005; - (async () => { + const PORT = process.env.PORT || 5005; + + // Init app await connectDB(); await associateModels(); - await initConfig(); - findCss(); + await initApp(); // Create server for Express API and WebSockets const server = http.createServer(); @@ -28,6 +33,8 @@ const PORT = process.env.PORT || 5005; Sockets.registerSocket('weather', weatherSocket); server.listen(PORT, () => { - logger.log(`Server is running on port ${PORT} in ${process.env.NODE_ENV} mode`); - }) -})(); \ No newline at end of file + logger.log( + `Server is running on port ${PORT} in ${process.env.NODE_ENV} mode` + ); + }); +})(); diff --git a/utils/findCss.js b/utils/findCss.js deleted file mode 100644 index af85a0a..0000000 --- a/utils/findCss.js +++ /dev/null @@ -1,22 +0,0 @@ -const fs = require('fs'); -const { join } = require('path'); -const Logger = require('./Logger'); -const logger = new Logger(); - -// Check if flame.css exists in mounted docker volume. Create new file if not -const findCss = () => { - const srcPath = join(__dirname, '../data/flame.css'); - const destPath = join(__dirname, '../public/flame.css'); - - if (fs.existsSync(srcPath)) { - fs.copyFileSync(srcPath, destPath); - logger.log('Custom CSS file found'); - return; - } - - logger.log('Creating empty CSS file'); - fs.writeFileSync(destPath, ''); - -} - -module.exports = findCss; \ No newline at end of file diff --git a/utils/init/createFile.js b/utils/init/createFile.js new file mode 100644 index 0000000..b46b4f6 --- /dev/null +++ b/utils/init/createFile.js @@ -0,0 +1,32 @@ +const fs = require('fs'); +const { join } = require('path'); + +const Logger = require('../Logger'); +const logger = new Logger(); + +const createFile = async (file) => { + const { name, msg, template, isJSON, paths } = file; + + const srcPath = join(__dirname, paths.src, name); + const destPath = join(__dirname, paths.dest, name); + + // Check if file exists + if (fs.existsSync(srcPath)) { + fs.copyFileSync(srcPath, destPath); + + if (process.env.NODE_ENV == 'development') { + logger.log(msg.found); + } + + return; + } + + // Create file if not + fs.writeFileSync(destPath, isJSON ? JSON.stringify(template) : template); + + if (process.env.NODE_ENV == 'development') { + logger.log(msg.created); + } +}; + +module.exports = createFile; diff --git a/utils/init/index.js b/utils/init/index.js new file mode 100644 index 0000000..a0e11a1 --- /dev/null +++ b/utils/init/index.js @@ -0,0 +1,9 @@ +const initConfig = require('./initConfig'); +const initFiles = require('./initFiles'); + +const initApp = async () => { + await initConfig(); + await initFiles(); +}; + +module.exports = initApp; diff --git a/utils/initConfig.js b/utils/init/initConfig.js similarity index 78% rename from utils/initConfig.js rename to utils/init/initConfig.js index b6a5a18..83ce4ea 100644 --- a/utils/initConfig.js +++ b/utils/init/initConfig.js @@ -1,7 +1,8 @@ const { Op } = require('sequelize'); -const Config = require('../models/Config'); +const Config = require('../../models/Config'); const { config } = require('./initialConfig.json'); -const Logger = require('./Logger'); + +const Logger = require('../Logger'); const logger = new Logger(); const initConfig = async () => { @@ -28,7 +29,10 @@ const initConfig = async () => { } }); - logger.log('Initial config created'); + if (process.env.NODE_ENV == 'development') { + logger.log('Initial config created'); + } + return; }; diff --git a/utils/init/initFiles.js b/utils/init/initFiles.js new file mode 100644 index 0000000..cee54ca --- /dev/null +++ b/utils/init/initFiles.js @@ -0,0 +1,8 @@ +const createFile = require('./createFile'); +const { files } = require('./initialFiles.json'); + +const initFiles = async () => { + files.forEach(async (file) => await createFile(file)); +}; + +module.exports = initFiles; diff --git a/utils/initialConfig.json b/utils/init/initialConfig.json similarity index 100% rename from utils/initialConfig.json rename to utils/init/initialConfig.json diff --git a/utils/init/initialFiles.json b/utils/init/initialFiles.json new file mode 100644 index 0000000..42354d7 --- /dev/null +++ b/utils/init/initialFiles.json @@ -0,0 +1,32 @@ +{ + "files": [ + { + "name": "flame.css", + "msg": { + "created": "Created empty CSS file", + "found": "Custom CSS file found" + }, + "paths": { + "src": "../../data", + "dest": "../../public" + }, + "template": "", + "isJSON": false + }, + { + "name": "customQueries.json", + "msg": { + "created": "Created empty queries file", + "found": "Custom queries file found" + }, + "paths": { + "src": "../../data", + "dest": "../../data" + }, + "template": { + "queries": [] + }, + "isJSON": true + } + ] +} From a885440fef46c38b7413c6499b5c6c1a145a81d1 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 11 Oct 2021 13:03:31 +0200 Subject: [PATCH 08/10] Add and delete custom search provider actions and controllers --- api.js | 1 + .../Settings/OtherSettings/OtherSettings.tsx | 14 +- .../CustomQueries/CustomQueries.module.css | 26 ++++ .../CustomQueries/CustomQueries.tsx | 82 ++++++++++++ .../CustomQueries/QueriesForm.tsx | 59 +++++++++ .../SearchSettings/SearchSettings.tsx | 121 ++++++++++-------- .../SettingsHeadline.module.css} | 4 +- .../SettingsHeadline/SettingsHeadline.tsx | 11 ++ client/src/store/actions/actionTypes.ts | 12 +- client/src/store/actions/config.ts | 44 ++++++- client/src/store/reducers/config.ts | 18 +++ controllers/config.js | 13 -- controllers/queries/index.js | 53 ++++++++ routes/config.js | 3 - routes/queries.js | 13 ++ 15 files changed, 392 insertions(+), 82 deletions(-) create mode 100644 client/src/components/Settings/SearchSettings/CustomQueries/CustomQueries.module.css create mode 100644 client/src/components/Settings/SearchSettings/CustomQueries/CustomQueries.tsx create mode 100644 client/src/components/Settings/SearchSettings/CustomQueries/QueriesForm.tsx rename client/src/components/{Settings/OtherSettings/OtherSettings.module.css => UI/Headlines/SettingsHeadline/SettingsHeadline.module.css} (89%) create mode 100644 client/src/components/UI/Headlines/SettingsHeadline/SettingsHeadline.tsx create mode 100644 controllers/queries/index.js create mode 100644 routes/queries.js diff --git a/api.js b/api.js index 1c2d863..9eb9b9f 100644 --- a/api.js +++ b/api.js @@ -20,6 +20,7 @@ api.use('/api/config', require('./routes/config')); api.use('/api/weather', require('./routes/weather')); api.use('/api/categories', require('./routes/category')); api.use('/api/bookmarks', require('./routes/bookmark')); +api.use('/api/queries', require('./routes/queries')); // Custom error handler api.use(errorHandler); diff --git a/client/src/components/Settings/OtherSettings/OtherSettings.tsx b/client/src/components/Settings/OtherSettings/OtherSettings.tsx index 1ca0d83..0672d64 100644 --- a/client/src/components/Settings/OtherSettings/OtherSettings.tsx +++ b/client/src/components/Settings/OtherSettings/OtherSettings.tsx @@ -19,9 +19,7 @@ import { // UI import InputGroup from '../../UI/Forms/InputGroup/InputGroup'; import Button from '../../UI/Buttons/Button/Button'; - -// CSS -import classes from './OtherSettings.module.css'; +import SettingsHeadline from '../../UI/Headlines/SettingsHeadline/SettingsHeadline'; // Utils import { searchConfig } from '../../../utility'; @@ -104,7 +102,7 @@ const OtherSettings = (props: ComponentProps): JSX.Element => { return (

formSubmitHandler(e)}> {/* OTHER OPTIONS */} -

Miscellaneous

+ { {/* BEAHVIOR OPTIONS */} -

App Behavior

+ {/* MODULES OPTIONS */} -

Modules

+ { {/* KUBERNETES SETTINGS */} -

Kubernetes

+ inputChangeHandler(e)} + /> + + + + inputChangeHandler(e)} + /> + + + + inputChangeHandler(e)} + /> + + + + ); +}; + +export default QueriesForm; diff --git a/client/src/components/Settings/SearchSettings/SearchSettings.tsx b/client/src/components/Settings/SearchSettings/SearchSettings.tsx index a3fec29..5b40f71 100644 --- a/client/src/components/Settings/SearchSettings/SearchSettings.tsx +++ b/client/src/components/Settings/SearchSettings/SearchSettings.tsx @@ -1,5 +1,5 @@ // React -import { useState, useEffect, FormEvent, ChangeEvent } from 'react'; +import { useState, useEffect, FormEvent, ChangeEvent, Fragment } from 'react'; import { connect } from 'react-redux'; // State @@ -13,15 +13,19 @@ import { SearchForm, } from '../../../interfaces'; -// Utils -import { searchConfig } from '../../../utility'; -import InputGroup from '../../UI/Forms/InputGroup/InputGroup'; - -// Data -import { queries } from '../../../utility/searchQueries.json'; +// Components +import CustomQueries from './CustomQueries/CustomQueries'; // UI import Button from '../../UI/Buttons/Button/Button'; +import SettingsHeadline from '../../UI/Headlines/SettingsHeadline/SettingsHeadline'; +import InputGroup from '../../UI/Forms/InputGroup/InputGroup'; + +// Utils +import { searchConfig } from '../../../utility'; + +// Data +import { queries } from '../../../utility/searchQueries.json'; interface Props { createNotification: (notification: NewNotification) => void; @@ -73,50 +77,65 @@ const SearchSettings = (props: Props): JSX.Element => { }; return ( - formSubmitHandler(e)}> - - - - - - - - - - - - - - + + {/* GENERAL SETTINGS */} +
formSubmitHandler(e)} + style={{ marginBottom: '30px' }} + > + + + + + + + + + + + + + + + + + {/* CUSTOM QUERIES */} + + +
); }; diff --git a/client/src/components/Settings/OtherSettings/OtherSettings.module.css b/client/src/components/UI/Headlines/SettingsHeadline/SettingsHeadline.module.css similarity index 89% rename from client/src/components/Settings/OtherSettings/OtherSettings.module.css rename to client/src/components/UI/Headlines/SettingsHeadline/SettingsHeadline.module.css index 36e4deb..137667c 100644 --- a/client/src/components/Settings/OtherSettings/OtherSettings.module.css +++ b/client/src/components/UI/Headlines/SettingsHeadline/SettingsHeadline.module.css @@ -1,4 +1,4 @@ -.SettingsSection { +.SettingsHeadline { color: var(--color-primary); padding-bottom: 3px; margin-bottom: 10px; @@ -6,4 +6,4 @@ font-weight: 500; border-bottom: 2px solid var(--color-accent); display: inline-block; -} \ No newline at end of file +} diff --git a/client/src/components/UI/Headlines/SettingsHeadline/SettingsHeadline.tsx b/client/src/components/UI/Headlines/SettingsHeadline/SettingsHeadline.tsx new file mode 100644 index 0000000..5d14949 --- /dev/null +++ b/client/src/components/UI/Headlines/SettingsHeadline/SettingsHeadline.tsx @@ -0,0 +1,11 @@ +const classes = require('./SettingsHeadline.module.css'); + +interface Props { + text: string; +} + +const SettingsHeadline = (props: Props): JSX.Element => { + return

{props.text}

; +}; + +export default SettingsHeadline; diff --git a/client/src/store/actions/actionTypes.ts b/client/src/store/actions/actionTypes.ts index 0c1cc87..f040016 100644 --- a/client/src/store/actions/actionTypes.ts +++ b/client/src/store/actions/actionTypes.ts @@ -28,7 +28,11 @@ import { GetConfigAction, UpdateConfigAction, } from './'; -import { FetchQueriesAction } from './config'; +import { + AddQueryAction, + DeleteQueryAction, + FetchQueriesAction, +} from './config'; export enum ActionTypes { // Theme @@ -65,6 +69,8 @@ export enum ActionTypes { getConfig = 'GET_CONFIG', updateConfig = 'UPDATE_CONFIG', fetchQueries = 'FETCH_QUERIES', + addQuery = 'ADD_QUERY', + deleteQuery = 'DELETE_QUERY', } export type Action = @@ -96,4 +102,6 @@ export type Action = // Config | GetConfigAction | UpdateConfigAction - | FetchQueriesAction; + | FetchQueriesAction + | AddQueryAction + | DeleteQueryAction; diff --git a/client/src/store/actions/config.ts b/client/src/store/actions/config.ts index baddbe5..d0c8a42 100644 --- a/client/src/store/actions/config.ts +++ b/client/src/store/actions/config.ts @@ -60,9 +60,7 @@ export interface FetchQueriesAction { export const fetchQueries = () => async (dispatch: Dispatch) => { try { - const res = await axios.get>( - '/api/config/0/queries' - ); + const res = await axios.get>('/api/queries'); dispatch({ type: ActionTypes.fetchQueries, @@ -72,3 +70,43 @@ export const fetchQueries = console.log(err); } }; + +export interface AddQueryAction { + type: ActionTypes.addQuery; + payload: Query; +} + +export const addQuery = + (query: Query) => async (dispatch: Dispatch) => { + try { + const res = await axios.post>('/api/queries', query); + + dispatch({ + type: ActionTypes.addQuery, + payload: res.data.data, + }); + } catch (err) { + console.log(err); + } + }; + +export interface DeleteQueryAction { + type: ActionTypes.deleteQuery; + payload: Query[]; +} + +export const deleteQuery = + (prefix: string) => async (dispatch: Dispatch) => { + try { + const res = await axios.delete>( + `/api/queries/${prefix}` + ); + + dispatch({ + type: ActionTypes.deleteQuery, + payload: res.data.data, + }); + } catch (err) { + console.log(err); + } + }; diff --git a/client/src/store/reducers/config.ts b/client/src/store/reducers/config.ts index 93150e2..08b68e6 100644 --- a/client/src/store/reducers/config.ts +++ b/client/src/store/reducers/config.ts @@ -34,6 +34,20 @@ const fetchQueries = (state: State, action: Action): State => { }; }; +const addQuery = (state: State, action: Action): State => { + return { + ...state, + customQueries: [...state.customQueries, action.payload], + }; +}; + +const deleteQuery = (state: State, action: Action): State => { + return { + ...state, + customQueries: action.payload, + }; +}; + const configReducer = (state: State = initialState, action: Action) => { switch (action.type) { case ActionTypes.getConfig: @@ -42,6 +56,10 @@ const configReducer = (state: State = initialState, action: Action) => { return updateConfig(state, action); case ActionTypes.fetchQueries: return fetchQueries(state, action); + case ActionTypes.addQuery: + return addQuery(state, action); + case ActionTypes.deleteQuery: + return deleteQuery(state, action); default: return state; } diff --git a/controllers/config.js b/controllers/config.js index 85b209a..e5290aa 100644 --- a/controllers/config.js +++ b/controllers/config.js @@ -175,16 +175,3 @@ exports.updateCss = asyncWrapper(async (req, res, next) => { data: {}, }); }); - -// @desc Get custom queries file -// @route GET /api/config/0/queries -// @access Public -exports.getQueries = asyncWrapper(async (req, res, next) => { - const file = new File(join(__dirname, '../data/customQueries.json')); - const content = JSON.parse(file.read()); - - res.status(200).json({ - success: true, - data: content.queries, - }); -}); diff --git a/controllers/queries/index.js b/controllers/queries/index.js new file mode 100644 index 0000000..b68f145 --- /dev/null +++ b/controllers/queries/index.js @@ -0,0 +1,53 @@ +const asyncWrapper = require('../../middleware/asyncWrapper'); +const File = require('../../utils/File'); +const { join } = require('path'); + +const QUERIES_PATH = join(__dirname, '../../data/customQueries.json'); + +// @desc Add custom search query +// @route POST /api/queries +// @access Public +exports.addQuery = asyncWrapper(async (req, res, next) => { + const file = new File(QUERIES_PATH); + let content = JSON.parse(file.read()); + + // Add new query + content.queries.push(req.body); + file.write(content, true); + + res.status(201).json({ + success: true, + data: req.body, + }); +}); + +// @desc Get custom queries file +// @route GET /api/queries +// @access Public +exports.getQueries = asyncWrapper(async (req, res, next) => { + const file = new File(QUERIES_PATH); + const content = JSON.parse(file.read()); + + res.status(200).json({ + success: true, + data: content.queries, + }); +}); + +// @desc Delete query +// @route DELETE /api/queries/:prefix +// @access Public +exports.deleteQuery = asyncWrapper(async (req, res, next) => { + const file = new File(QUERIES_PATH); + let content = JSON.parse(file.read()); + + content.queries = content.queries.filter( + (q) => q.prefix != req.params.prefix + ); + file.write(content, true); + + res.status(200).json({ + success: true, + data: content.queries, + }); +}); diff --git a/routes/config.js b/routes/config.js index 6abea15..8c9ac15 100644 --- a/routes/config.js +++ b/routes/config.js @@ -10,7 +10,6 @@ const { deletePair, updateCss, getCss, - getQueries, } = require('../controllers/config'); router.route('/').post(createPair).get(getAllPairs).put(updateValues); @@ -19,6 +18,4 @@ router.route('/:key').get(getSinglePair).put(updateValue).delete(deletePair); router.route('/0/css').get(getCss).put(updateCss); -router.route('/0/queries').get(getQueries); - module.exports = router; diff --git a/routes/queries.js b/routes/queries.js new file mode 100644 index 0000000..0e17bc0 --- /dev/null +++ b/routes/queries.js @@ -0,0 +1,13 @@ +const express = require('express'); +const router = express.Router(); + +const { + getQueries, + addQuery, + deleteQuery, +} = require('../controllers/queries/'); + +router.route('/').post(addQuery).get(getQueries); +router.route('/:prefix').delete(deleteQuery); + +module.exports = router; From 38ffdf1bff3c9c00fde9439c0e93f14a820042eb Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 11 Oct 2021 13:55:53 +0200 Subject: [PATCH 09/10] Add and update custom queries --- .../CustomQueries/CustomQueries.module.css | 4 + .../CustomQueries/CustomQueries.tsx | 26 ++++-- .../CustomQueries/QueriesForm.tsx | 86 +++++++++++++++---- client/src/store/actions/actionTypes.ts | 5 +- client/src/store/actions/config.ts | 23 +++++ client/src/store/reducers/config.ts | 9 ++ controllers/queries/index.js | 28 ++++++ routes/queries.js | 3 +- 8 files changed, 159 insertions(+), 25 deletions(-) diff --git a/client/src/components/Settings/SearchSettings/CustomQueries/CustomQueries.module.css b/client/src/components/Settings/SearchSettings/CustomQueries/CustomQueries.module.css index 36313bf..73297cc 100644 --- a/client/src/components/Settings/SearchSettings/CustomQueries/CustomQueries.module.css +++ b/client/src/components/Settings/SearchSettings/CustomQueries/CustomQueries.module.css @@ -7,6 +7,10 @@ color: var(--color-primary); } +.QueriesGrid span:last-child { + margin-bottom: 10px; +} + .ActionIcons { display: flex; } diff --git a/client/src/components/Settings/SearchSettings/CustomQueries/CustomQueries.tsx b/client/src/components/Settings/SearchSettings/CustomQueries/CustomQueries.tsx index bc50cf4..de9d226 100644 --- a/client/src/components/Settings/SearchSettings/CustomQueries/CustomQueries.tsx +++ b/client/src/components/Settings/SearchSettings/CustomQueries/CustomQueries.tsx @@ -3,11 +3,9 @@ import { connect } from 'react-redux'; import classes from './CustomQueries.module.css'; -import ModalForm from '../../../UI/Forms/ModalForm/ModalForm'; import Modal from '../../../UI/Modal/Modal'; import Icon from '../../../UI/Icons/Icon/Icon'; import { GlobalState, Query } from '../../../../interfaces'; -import InputGroup from '../../../UI/Forms/InputGroup/InputGroup'; import QueriesForm from './QueriesForm'; import { deleteQuery } from '../../../../store/actions'; import Button from '../../../UI/Buttons/Button/Button'; @@ -21,6 +19,12 @@ const CustomQueries = (props: Props): JSX.Element => { const { customQueries, deleteQuery } = props; const [modalIsOpen, setModalIsOpen] = useState(false); + const [editableQuery, setEditableQuery] = useState(null); + + const updateHandler = (query: Query) => { + setEditableQuery(query); + setModalIsOpen(true); + }; const deleteHandler = (query: Query) => { if (window.confirm(`Are you sure you want to delete this provider?`)) { @@ -34,7 +38,14 @@ const CustomQueries = (props: Props): JSX.Element => { isOpen={modalIsOpen} setIsOpen={() => setModalIsOpen(!modalIsOpen)} > - setModalIsOpen(!modalIsOpen)} /> + {editableQuery ? ( + setModalIsOpen(!modalIsOpen)} + query={editableQuery} + /> + ) : ( + setModalIsOpen(!modalIsOpen)} /> + )}
@@ -54,7 +65,7 @@ const CustomQueries = (props: Props): JSX.Element => { {q.name} {q.prefix} - + updateHandler(q)}> deleteHandler(q)}> @@ -65,7 +76,12 @@ const CustomQueries = (props: Props): JSX.Element => { ))}
-
diff --git a/client/src/components/Settings/SearchSettings/CustomQueries/QueriesForm.tsx b/client/src/components/Settings/SearchSettings/CustomQueries/QueriesForm.tsx index 8a20e05..42ad654 100644 --- a/client/src/components/Settings/SearchSettings/CustomQueries/QueriesForm.tsx +++ b/client/src/components/Settings/SearchSettings/CustomQueries/QueriesForm.tsx @@ -1,20 +1,70 @@ -import { useState } from 'react'; +import { ChangeEvent, FormEvent, useState, useEffect } from 'react'; +import { Query } from '../../../../interfaces'; import Button from '../../../UI/Buttons/Button/Button'; import InputGroup from '../../../UI/Forms/InputGroup/InputGroup'; import ModalForm from '../../../UI/Forms/ModalForm/ModalForm'; +import { connect } from 'react-redux'; +import { addQuery, updateQuery } from '../../../../store/actions'; interface Props { modalHandler: () => void; - // addApp: (formData: NewApp | FormData) => any; - // updateApp: (id: number, formData: NewApp | FormData) => any; - // app?: App; + addQuery: (query: Query) => {}; + updateQuery: (query: Query, Oldprefix: string) => {}; + query?: Query; } const QueriesForm = (props: Props): JSX.Element => { - const [formData, setFormData] = useState(); + const { modalHandler, addQuery, updateQuery, query } = props; + + const [formData, setFormData] = useState({ + name: '', + prefix: '', + template: '', + }); + + const inputChangeHandler = (e: ChangeEvent) => { + const { name, value } = e.target; + + setFormData({ + ...formData, + [name]: value, + }); + }; + + const formHandler = (e: FormEvent) => { + e.preventDefault(); + + if (query) { + updateQuery(formData, query.prefix); + } else { + addQuery(formData); + } + + // close modal + modalHandler(); + + // clear form + setFormData({ + name: '', + prefix: '', + template: '', + }); + }; + + useEffect(() => { + if (query) { + setFormData(query); + } else { + setFormData({ + name: '', + prefix: '', + template: '', + }); + } + }, [query]); return ( - {}}> + { id="name" placeholder="Google" required - // value={formData.name} - // onChange={(e) => inputChangeHandler(e)} + value={formData.name} + onChange={(e) => inputChangeHandler(e)} /> inputChangeHandler(e)} + value={formData.prefix} + onChange={(e) => inputChangeHandler(e)} /> inputChangeHandler(e)} + value={formData.template} + onChange={(e) => inputChangeHandler(e)} /> - + {query ? : } ); }; -export default QueriesForm; +export default connect(null, { addQuery, updateQuery })(QueriesForm); diff --git a/client/src/store/actions/actionTypes.ts b/client/src/store/actions/actionTypes.ts index f040016..c670b2f 100644 --- a/client/src/store/actions/actionTypes.ts +++ b/client/src/store/actions/actionTypes.ts @@ -32,6 +32,7 @@ import { AddQueryAction, DeleteQueryAction, FetchQueriesAction, + UpdateQueryAction, } from './config'; export enum ActionTypes { @@ -71,6 +72,7 @@ export enum ActionTypes { fetchQueries = 'FETCH_QUERIES', addQuery = 'ADD_QUERY', deleteQuery = 'DELETE_QUERY', + updateQuery = 'UPDATE_QUERY', } export type Action = @@ -104,4 +106,5 @@ export type Action = | UpdateConfigAction | FetchQueriesAction | AddQueryAction - | DeleteQueryAction; + | DeleteQueryAction + | UpdateQueryAction; diff --git a/client/src/store/actions/config.ts b/client/src/store/actions/config.ts index d0c8a42..29c5186 100644 --- a/client/src/store/actions/config.ts +++ b/client/src/store/actions/config.ts @@ -110,3 +110,26 @@ export const deleteQuery = console.log(err); } }; + +export interface UpdateQueryAction { + type: ActionTypes.updateQuery; + payload: Query[]; +} + +export const updateQuery = + (query: Query, oldPrefix: string) => + async (dispatch: Dispatch) => { + try { + const res = await axios.put>( + `/api/queries/${oldPrefix}`, + query + ); + + dispatch({ + type: ActionTypes.updateQuery, + payload: res.data.data, + }); + } catch (err) { + console.log(err); + } + }; diff --git a/client/src/store/reducers/config.ts b/client/src/store/reducers/config.ts index 08b68e6..ac81aeb 100644 --- a/client/src/store/reducers/config.ts +++ b/client/src/store/reducers/config.ts @@ -48,6 +48,13 @@ const deleteQuery = (state: State, action: Action): State => { }; }; +const updateQuery = (state: State, action: Action): State => { + return { + ...state, + customQueries: action.payload, + }; +}; + const configReducer = (state: State = initialState, action: Action) => { switch (action.type) { case ActionTypes.getConfig: @@ -60,6 +67,8 @@ const configReducer = (state: State = initialState, action: Action) => { return addQuery(state, action); case ActionTypes.deleteQuery: return deleteQuery(state, action); + case ActionTypes.updateQuery: + return updateQuery(state, action); default: return state; } diff --git a/controllers/queries/index.js b/controllers/queries/index.js index b68f145..ae1ccec 100644 --- a/controllers/queries/index.js +++ b/controllers/queries/index.js @@ -34,6 +34,34 @@ exports.getQueries = asyncWrapper(async (req, res, next) => { }); }); +// @desc Update query +// @route PUT /api/queries/:prefix +// @access Public +exports.updateQuery = asyncWrapper(async (req, res, next) => { + const file = new File(QUERIES_PATH); + let content = JSON.parse(file.read()); + + let queryIdx = content.queries.findIndex( + (q) => q.prefix == req.params.prefix + ); + + // query found + if (queryIdx > -1) { + content.queries = [ + ...content.queries.slice(0, queryIdx), + req.body, + ...content.queries.slice(queryIdx + 1), + ]; + } + + file.write(content, true); + + res.status(200).json({ + success: true, + data: content.queries, + }); +}); + // @desc Delete query // @route DELETE /api/queries/:prefix // @access Public diff --git a/routes/queries.js b/routes/queries.js index 0e17bc0..afacffd 100644 --- a/routes/queries.js +++ b/routes/queries.js @@ -5,9 +5,10 @@ const { getQueries, addQuery, deleteQuery, + updateQuery, } = require('../controllers/queries/'); router.route('/').post(addQuery).get(getQueries); -router.route('/:prefix').delete(deleteQuery); +router.route('/:prefix').delete(deleteQuery).put(updateQuery); module.exports = router; From edb04c375f841d0fa8d9559f430193b8e15ee416 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 11 Oct 2021 14:05:53 +0200 Subject: [PATCH 10/10] Prevent deleting active search provider --- .../CustomQueries/CustomQueries.tsx | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/client/src/components/Settings/SearchSettings/CustomQueries/CustomQueries.tsx b/client/src/components/Settings/SearchSettings/CustomQueries/CustomQueries.tsx index de9d226..c5dac62 100644 --- a/client/src/components/Settings/SearchSettings/CustomQueries/CustomQueries.tsx +++ b/client/src/components/Settings/SearchSettings/CustomQueries/CustomQueries.tsx @@ -5,18 +5,20 @@ import classes from './CustomQueries.module.css'; import Modal from '../../../UI/Modal/Modal'; import Icon from '../../../UI/Icons/Icon/Icon'; -import { GlobalState, Query } from '../../../../interfaces'; +import { GlobalState, NewNotification, Query } from '../../../../interfaces'; import QueriesForm from './QueriesForm'; -import { deleteQuery } from '../../../../store/actions'; +import { deleteQuery, createNotification } from '../../../../store/actions'; import Button from '../../../UI/Buttons/Button/Button'; +import { searchConfig } from '../../../../utility'; interface Props { customQueries: Query[]; deleteQuery: (prefix: string) => {}; + createNotification: (notification: NewNotification) => void; } const CustomQueries = (props: Props): JSX.Element => { - const { customQueries, deleteQuery } = props; + const { customQueries, deleteQuery, createNotification } = props; const [modalIsOpen, setModalIsOpen] = useState(false); const [editableQuery, setEditableQuery] = useState(null); @@ -27,7 +29,17 @@ const CustomQueries = (props: Props): JSX.Element => { }; const deleteHandler = (query: Query) => { - if (window.confirm(`Are you sure you want to delete this provider?`)) { + const currentProvider = searchConfig('defaultSearchProvider', 'l'); + const isCurrent = currentProvider === query.prefix; + + if (isCurrent) { + createNotification({ + title: 'Error', + message: 'Cannot delete active provider', + }); + } else if ( + window.confirm(`Are you sure you want to delete this provider?`) + ) { deleteQuery(query.prefix); } }; @@ -95,4 +107,6 @@ const mapStateToProps = (state: GlobalState) => { }; }; -export default connect(mapStateToProps, { deleteQuery })(CustomQueries); +export default connect(mapStateToProps, { deleteQuery, createNotification })( + CustomQueries +);