{"version":3,"sources":["providers/fetch.js","plugins/ra-language-portuguese-pt/index.js","configuration.js","providers/dataProvider.js","providers/restProvider.js","i18n/en.js","i18n/pt.js","providers/i18nProvider.js","providers/dataFetch.js","components/UI/RaLayout/Notification.js","components/UI/RaLayout/Title.js","components/UI/RaLayout/Error.js","components/UI/RaLayout/index.js","components/UI/AppBar.js","config/theme.js","components/UI/Layout.js","store/actions/user.js","factory/index.js","store/actions/historyMap.js","store/reducers/historyMap.js","store/actions/liveMap.js","store/reducers/liveMap.js","store/actions/page.js","store/reducers/page.js","store/pageHook/Context.js","store/pageHook/Provider.js","store/pageHook/useSetCampaign.js","store/pageHook/useSetPage.js","store/pageHook/usePage.js","containers/dashboard/Welcome.js","containers/dashboard/IconCitizen.js","containers/dashboard/CardIcon.js","containers/dashboard/PublicNextLaunches.js","containers/dashboard/PublicPastLaunches.js","containers/dashboard/PublicActiveLaunches.js","containers/dashboard/index.js","containers/dashboardAll/Welcome.js","components/Link.js","containers/dashboardAll/IconCitizen.js","containers/dashboardAll/CardIcon.js","containers/dashboardAll/PublicNextCampaigns.js","containers/dashboardAll/PublicPastCampaigns.js","containers/dashboardAll/PublicActiveCampaigns.js","containers/dashboardAll/index.js","components/Map/leaflet-extra-markers/js/leaflet.extra-markers.min.js","components/Map/LayersControl.js","components/Map/Controls/LeafletControl/index.js","components/Map/Controls/CenterControl.js","components/Map/Controls/LocationControl.js","components/Map/Controls/MeasureControl/leaflet-measure.js","components/Map/Controls/MeasureControl/index.js","components/Map/Controls/MeasureControl/MeasureControl.js","components/Map/Timeline/timeline-control.js","components/Map/Timeline/timeline.js","components/Map/Timeline/index.js","components/Map/RealtimeControlLine.js","components/Map/Map.js","components/Modal/index.js","containers/LiveMap/OverviewControl.js","containers/LiveMap/index.js","containers/HistoryMap/index.js","Error.js","CatchAll.js","App.js","index.js"],"names":["fetchJson","url","options","requestHeaders","headers","Headers","Accept","has","body","FormData","set","user","authenticated","token","fetch","then","response","text","status","statusText","json","JSON","parse","e","error","code","statusCode","Promise","reject","HttpError","message","resolve","stringify","module","exports","ra","action","add_filter","add","back","bulk_actions","cancel","clear_input_value","clone","confirm","create","delete","edit","export","list","refresh","remove_filter","remove","save","search","show","sort","undo","unselect","expand","close","open_menu","close_menu","boolean","true","false","null","page","dashboard","loading","not_found","empty","invite","input","file","upload_several","upload_single","image","references","all_missing","many_missing","single_missing","password","toggle_visible","toggle_hidden","about","are_you_sure","bulk_delete_content","bulk_delete_title","delete_content","delete_title","details","invalid_form","no","yes","unsaved_changes","navigation","no_results","no_more_results","page_out_of_boundaries","page_out_from_end","page_out_from_begin","page_range_info","page_rows_per_page","next","prev","skip_nav","sort_by","ASC","DESC","auth","auth_check_error","user_menu","username","sign_in","sign_in_error","logout","notification","updated","created","deleted","bad_item","item_doesnt_exist","http_error","data_provider_error","i18n_error","canceled","logged_out","validation","required","minLength","maxLength","minValue","maxValue","number","email","oneOf","regex","URL","MAP_GOOGLE_KEY","API_URL","dataProvider","apiUrl","httpClient","convertDataRequestToHTTP","type","resource","params","specialParams","GET_LIST","query","filter","Object","keys","forEach","key","includes","undefined","GET_ONE","id","GET_MANY","listId","ids","map","length","where","or","GET_MANY_REFERENCE","pagination","perPage","field","order","target","UPDATE","method","data","CREATE","DELETE","Error","convertHTTPResponse","total","UPDATE_MANY","all","responses","DELETE_MANY","restProvider","configuration","fetchUtils","setTimeout","charAt","substr","englishMessages","http","fail_request","resources","launches","name","fields","beginTimestamp","endTimestamp","equipment","state","serialNumber","equipmentmodelId","containers","next_launches","active_launches","past_launches","next_campaigns","active_campaigns","past_campaigns","live","overview","history","complete_interval","all_data","no_data","profile","old_password","new_password","repeat_password","buttons","change_password","notifications","profile_updated","password_updated","wrong_password","on_failure_profile","on_failure_password","different_passwords","language","en","pt","theme","light","dark","settings_updated","on_failure_settings_update","portugueseMessages","institutions","address","phoneNumber","acronym","users","institutionId","active","isAdmin","role","campaigns","description","beginDate","area","zoom","hide","datasets","equipmentId","launchId","campaignId","observationsNumb","equipmentmodels","equipmenttypeId","observedProperty","messages","polyglotI18nProvider","locale","path","append","goCatch","resp","catch","useStyles","makeStyles","success","backgroundColor","palette","main","color","contrastText","warning","props","primary","Notification","classes","className","autoHideDuration","rest","useState","open","setOpen","useSelector","getNotification","dispatch","useDispatch","translate","useTranslate","styles","useEffect","handleRequestClose","useCallback","handleExited","undoable","complete","undoableEventEmitter","emit","isUndo","hideNotification","handleUndo","Snackbar","messageArgs","disableWindowBlurListener","onExited","onClose","ContentProps","classnames","Button","size","onClick","defaultProps","Title","PropTypes","oneOfType","string","element","defaultTitle","record","title","container","document","getElementById","titleElement","_","cloneElement","createPortal","display","flexDirection","alignItems","justifyContent","breakpoints","down","padding","icon","width","height","marginRight","panel","marginTop","maxWidth","panelDetails","whiteSpace","toolbar","advice","goBack","window","go","errorInfo","process","variant","startIcon","LayoutWithoutTheme","hasError","listen","setState","this","appBar","children","ErrorComponent","menu","sidebar","match","location","staticContext","root","SkipNavigationButton","appFrame","createElement","contentWithSidebar","hasDashboard","content","Component","DefaultError","DefaultNotification","EnhancedLayout","compose","connect","admin","ui","sidebarOpen","withRouter","withStyles","createStyles","zIndex","minHeight","background","default","position","minWidth","getContrastText","flexGrow","up","spacing","flexBasis","paddingLeft","Layout","themeOverride","themeProp","useRef","createMuiTheme","setTheme","current","ThemeProvider","defaultTheme","paddingRight","menuButton","marginLeft","link","flex","textOverflow","overflow","AppBar","Container","userMenu","isXSmall","useMediaQuery","Toolbar","disableGutters","to","pathname","classNames","Tooltip","enterDelay","IconButton","Children","count","Typography","LoadingIndicator","HideOnScroll","memo","getTheme","createTheme","secondary","CustomSidebar","CustomLayout","setLocale","useSetLocale","toWavyGeojson","wavy","last_transmission","ObservationToFeature","toWavyGeojsonOld","result","obs","pos","geometry","coordinates","parseFloat","lng","lat","style","properties","timestamp","Date","getTime","push","values","toObservationData","observations","features","i","observation","moment","unix","FETCH_OBSERVATIONS","CLEAR_OBSERVATIONS","STORE_OVERLAYS","SELECT_CAMPAIGN","initialState","overlays","activeCampaign","payload","LIVE_OBSERVATIONS","FETCH_OLD_OBSERVATIONS","index","findIndex","item","copy","slice","UPDATE_PAGE","UPDATE_CAMPAIGN","PageContext","createContext","campaignName","setCampaign","setPage","displayName","Provider","_campaign","_setCampaign","_page","_setPage","p","newState","value","useMemo","only","useSetCampaign","useContext","useSetPage","usePage","img","imgBig","Welcome","Card","CardMedia","CardContent","component","version","xmlns","x","y","viewBox","space","fill","wavyColor","cx","cy","r","handColor","d","card","float","margin","borderRadius","CardIcon","Icon","cardIcon","bgColor","main_mobile","textAlign","inline","border","PublicNextLaunches","mobile","IconCitizen","launch","List","ListItem","ListItemText","Fragment","begintimestamp","toLocaleString","PublicPastLaunches","button","endtimestamp","launch_id","PublicActiveLaunches","flexColumn","leftCol","rightCol","singleCol","marginBottom","welcome","Dashboard","useQueryWithStore","loaded","setLaunches","showNotification","setPastLaunches","setNextLaunches","setActiveLaunches","_next_launches","_past_launches","_active_launches","now","l","Campaign","Responsive","small","medium","textDecoration","Link","href","PublicNextCampaigns","campaign","permlink","begindate","toLocaleDateString","PublicPastCampaigns","PublicActiveCampaigns","setCampaigns","setPastCampaigns","setNextCampaigns","setActiveCampaigns","_next_campaigns","_past_campaigns","_active_campaigns","c","lastDate","firstDate","ExtraMarkers","L","extend","iconSize","shadowSize","iconAnchor","shadowAnchor","popupAnchor","prefix","extraClasses","shape","innerHTML","markerColor","svgBorderColor","svgOpacity","iconColor","svg","initialize","Util","setOptions","createIcon","div","_createInner","_setIconStyles","iconColorStyle","iconNumber","anchor","leafletName","point","divideBy","createShadow","zoomConfig","LayersControl","controlRef","ref","BaseLayer","checked","TileLayer","attribution","maxNativeZoom","maxZoom","minZoom","apiKey","CustomControl","context","useLeafletContext","Control","onAdd","DomUtil","DomEvent","disableClickPropagation","ReactDOM","render","onRemove","control","opts","layerContainer","addControl","removeControl","fontSize","CenterControl","disableRipple","latlngs","eachLayer","layer","Polyline","getLatLngs","fitBounds","locationIcon","borderStyle","borderWidth","borderColor","marker","geoId","locationReducer","LocationControl","useReducer","navigator","geolocation","watchPosition","enableHighAccuracy","clearWatch","removeLayer","locationMarker","coords","latitude","longitude","accuracy","innerCircle","divIcon","circle","opacity","fillOpacity","weight","radius","layerGroup","addTo","setView","LatLng","Marker","setLatLng","Circle","setRadius","MeasureControl","defaultOptions","formatOutput","output","lineColor","lineWeight","lineOpacity","innerHtml","_createButton","azimuth","points","λ1","λ2","φ1","φ2","tmp","Math","sin","PI","cos","tan","B","atan","addEventListener","_toogleMeasure","_measuring","addClass","_container","_startMeasure","removeClass","_stopMeasure","_oldCursor","_map","cursor","on","_mouseClick","_clear","off","latlng","_draw","_start","_end","_path","getLatLng","smoothFactor","distance","distanceTo","_tooltip","_createTooltip","tooltip","clickable","_icon","measureControl","customProps","toFixed","ReactDOMServer","renderToStaticMarkup","transform","TimelineSliderControl","timeline","enablePlayButton","enableStepButtons","showTicks","speeds","legend","speedsUnity","seconds","interval","getIntervalValues","stepSize","speedUnityTime","speedTime","update","getTimelineTime","_createDOM","join","sliderCtrlC","buttonContainer","_makeButtons","_makeOutput","_makeSlider","_buildDataList","_buildLegend","_legend","_makeButton","_makeSpeedButton","speed","slider","min","max","step","_timeSlider","_sliderChanged","_disableMapDragging","_enableMapDragging","_output","_datalist","idNum","floor","random","setAttribute","_rebuildDataList","datalist","firstChild","removeChild","datalistSelect","steps","time","dragging","disable","enable","updateDisplayedLayers","_nearestStep","mode","lastTime","pause","prevTime","setTime","play","fromSynced","clearTimeout","_timer","miliseconds","_playing","classList","syncedControl","nextTime","indexOf","timelineSliderControl","Timeline","GeoJSON","geojson","controlLayers","setCenter","feature","prototype","call","layersKeys","reverse","_getInterval","_buildLayers","getLayers","geometries","times","convertPointTrace","addData","multiLineId","_buildMarker","addOverlay","markerPopup","setPopupContent","mrk","bindPopup","addLayer","currentTime","setLatLngs","elements","polyline","multilineCoordinates","multiLine","multiLineIds","identifier","TimelineControl","useMap","_timeline","geoJSON","timelineOptions","_control","TimeControl","timecontrolOptions","ReallineControl","realtime","controlOptions","groupLayers","layersSerialNumber","setLayersSerialNumber","started","setStarted","_layersSerialNumber","group","marker_id","polyline_id","getLayer","popup","new_layer","createLayerGroup","getLayerId","removeFrom","Map","timelineControlOptions","utc","format","hiddenProperties","date","Default","_getIconUrl","mergeOptions","iconRetinaUrl","marker2x","iconUrl","shadowUrl","markerShadow","MapContainer","center","RealtimeControlLine","ScaleControl","controlCenter","controlLocation","controlMeasure","titleDiv","closeButton","paper","overflowY","SimpleModal","footer","onEntering","scroll","Dialog","fullWidth","DialogTitle","Divider","DialogContent","right","OverviewControl","open2","setTimes","live_map","interval_id","setInterval","updateTimes","clearInterval","_times","ceil","abs","minutes","trunc","hours","final","round","ViewList","Modal","openPopup","divider","bat","LiveMap","useHistory","useParams","setLaunch","setLoaded","fetchStart","dataFetch","fetchOldObservations","err","replace","finally","fetchEnd","socket","io","transports","room","console","log","liveObservations","disconnect","setTimeline","history_map","fetchObservations","fontFamily","Loading","loadingPrimary","loadingSecondary","customRoutes","exact","HistoryMap","Resource","App","createBrowserHistory","toLocaleLowerCase","Admin","disableTelemetry","i18nProvider","layout","customReducers","history_map_reducer","live_map_reducer","page_reducer","DashboardAll","catchAll","CatchAll"],"mappings":"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","file":"static/js/main.5fb9cf7a.chunk.js","sourcesContent":["import { HttpError } from 'react-admin';\nimport { stringify } from 'query-string';\n\nexport const fetchJson = (url, options = {}) => {\n const requestHeaders = (options.headers ||\n new Headers({\n Accept: 'application/json',\n }));\n if (\n !requestHeaders.has('Content-Type') &&\n !(options && options.body && options.body instanceof FormData)\n ) {\n requestHeaders.set('Content-Type', 'application/json');\n }\n if (options.user && options.user.authenticated && options.user.token) {\n requestHeaders.set('Authorization', options.user.token);\n }\n\n return fetch(url, { ...options, headers: requestHeaders })\n .then(response =>\n response.text().then(text => ({\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n body: text,\n }))\n )\n .then(({ status, statusText, headers, body }) => {\n let json;\n try {\n json = JSON.parse(body);\n } catch (e) {\n // not json, no big deal\n }\n if (status < 200 || status >= 300) {\n if(json && json.error && (json.error.code || json.error.statusCode)){\n //This is the translation string location to be used on error notification\n json.code = json.error.code ? 'errors.' + json.error.code : null;\n json.statusCode = json.error.statusCode ? 'errors.' + json.error.statusCode : null;\n }\n // console.log('json', json)\n return Promise.reject(\n new HttpError(\n (json && json.code) || (json && json.statusCode) || (json && json.message) || statusText,\n status,\n json\n )\n );\n }\n return Promise.resolve({ status, headers, body, json });\n });\n};\n\nexport const queryParameters = stringify;\n\nconst isValidObject = value => {\n if (!value) {\n return false;\n }\n\n const isArray = Array.isArray(value);\n const isBuffer = typeof Buffer !== 'undefined' && Buffer.isBuffer(value);\n const isObject =\n Object.prototype.toString.call(value) === '[object Object]';\n const hasKeys = !!Object.keys(value).length;\n\n return !isArray && !isBuffer && isObject && hasKeys;\n};\n\nexport const flattenObject = (value, path = []) => {\n if (isValidObject(value)) {\n return Object.assign(\n {},\n ...Object.keys(value).map(key =>\n flattenObject(value[key], path.concat([key]))\n )\n );\n } else {\n return path.length ? { [path.join('.')]: value } : value;\n }\n};","module.exports = {\n ra: {\n action: {\n add_filter: 'Adicionar Filtro',\n add: 'Adicionar',\n back: 'Voltar',\n bulk_actions: '1 item selecionado |||| %{smart_count} itens selecionados',\n cancel: 'Cancelar',\n clear_input_value: 'Limpar campo',\n clone: 'Duplicar',\n confirm: 'Confirmar',\n create: 'Novo',\n delete: 'Deletar',\n edit: 'Editar',\n export: 'Exportar',\n list: 'Listar',\n refresh: 'Atualizar',\n remove_filter: 'Cancelar filtro',\n remove: 'Excluir',\n save: 'Gravar',\n search: 'Procurar',\n show: 'Exibir',\n sort: 'Ordenar',\n undo: 'Desfazer',\n unselect: 'Desmarcar',\n expand: 'Expandir',\n close: 'Fechar',\n open_menu: 'Abrir menu',\n close_menu: 'Fechar menu',\n },\n boolean: {\n true: 'Sim',\n false: 'Não',\n null: ' ',\n },\n page: {\n create: 'Novo %{name}',\n dashboard: 'Painel de Controle',\n edit: '%{name} #%{id}',\n error: 'Um erro ocorreu',\n list: 'Listar %{name}',\n loading: 'Carregando',\n not_found: 'Não encontrado',\n show: '%{name} #%{id}',\n empty: 'Ainda não há nenhum registro em %{name}',\n invite: 'Gostaria de criar um novo?',\n },\n input: {\n file: {\n upload_several:\n 'Arraste alguns arquivos para fazer o upload, ou clique para selecioná-los.',\n upload_single:\n 'Arraste o arquivo para fazer o upload, ou clique para selecioná-lo.',\n },\n image: {\n upload_several:\n 'Arraste algumas imagens para fazer o upload ou clique para selecioná-las',\n upload_single:\n 'Arraste um arquivo para upload ou clique em selecionar arquivo.',\n },\n references: {\n all_missing: 'Não foi possível encontrar os dados das referencias.',\n many_missing:\n 'Pelo menos uma das referências passadas não está mais disponível.',\n single_missing:\n 'A referência passada aparenta não estar mais disponível.',\n },\n password: {\n toggle_visible: 'Esconder senha',\n toggle_hidden: 'Mostrar senha',\n },\n },\n message: {\n about: 'Sobre',\n are_you_sure: 'Tem certeza?',\n bulk_delete_content:\n 'Você tem certeza que deseja excluir %{name}? |||| Você tem certeza que deseja excluir estes %{smart_count} itens?',\n bulk_delete_title:\n 'Excluir %{name} |||| Excluir %{smart_count} %{name} itens',\n delete_content: 'Você tem certeza que deseja excluir?',\n delete_title: 'Excluir %{name} #%{id}',\n details: 'Detalhes',\n error: 'Um erro ocorreu e a sua requisição não pôde ser completada.',\n invalid_form:\n 'Este formulário não está valido. Certifique-se de corrigir os erros',\n loading: 'A página está carregando. Um momento, por favor',\n no: 'Não',\n not_found:\n 'Foi digitada uma URL inválida, ou o link pode estar quebrado.',\n yes: 'Sim',\n unsaved_changes:\n 'Algumas das suas mudanças não foram salvas, deseja realmente ignorá-las?',\n },\n navigation: {\n no_results: 'Nenhum resultado encontrado',\n no_more_results:\n 'A página numero %{page} está fora dos limites. Tente a página anterior.',\n page_out_of_boundaries: 'Página %{page} fora do limite',\n page_out_from_end: 'Não é possível ir após a última página',\n page_out_from_begin: 'Não é possível ir antes da primeira página',\n page_range_info: '%{offsetBegin}-%{offsetEnd} de %{total}',\n page_rows_per_page: 'Resultados por página:',\n next: 'Próximo',\n prev: 'Anterior',\n skip_nav: 'Pular para o conteúdo',\n },\n sort: {\n sort_by: 'Ordenar por %{field} %{order}',\n ASC: 'crescente',\n DESC: 'decrescente',\n },\n auth: {\n auth_check_error: 'Por favor, faça login para continuar',\n user_menu: 'Perfil',\n username: 'Utilzador',\n password: 'Password',\n sign_in: 'Entrar',\n sign_in_error: 'Erro na autenticação, tente novamente.',\n logout: 'Sair',\n },\n notification: {\n updated: 'Item atualizado com sucesso |||| %{smart_count} itens atualizados com sucesso',\n created: 'Item criado com sucesso',\n deleted: 'Item removido com sucesso! |||| %{smart_count} itens removidos com sucesso',\n bad_item: 'Item incorreto',\n item_doesnt_exist: 'Esse item não existe mais',\n http_error: 'Erro na comunicação com servidor',\n data_provider_error: 'Erro interno do servidor. Entre em contato',\n i18n_error:\n 'Não foi possível carregar as traduções para o idioma especificado',\n canceled: 'Ação cancelada',\n logged_out: 'A sua sessão foi encerrada. Por favor, reconecte',\n },\n validation: {\n required: 'Obrigatório',\n minLength: 'Deve ser ter no mínimo %{min} caracteres',\n maxLength: 'Deve ter no máximo %{max} caracteres',\n minValue: 'Deve ser %{min} ou maior',\n maxValue: 'Deve ser %{max} ou menor',\n number: 'Deve ser um número',\n email: 'Deve ser um email válido',\n oneOf: 'Deve ser uma das seguintes opções: %{options}',\n regex: 'Deve ter o formato específico (regexp): %{pattern}',\n },\n },\n};","// const URL = 'https://meloa-staging.inesctec.pt'\nconst URL = 'https://meloa.inesctec.pt'\n// const URL = 'https://localhost';\n \nexport default {\n MAP_GOOGLE_KEY: 'AIzaSyB7DgboLb_ybkgObTqlSg0w_5Wh5UH_gXk',\n URL,\n API_URL: `${URL}/public`\n}","// import { storage } from 'react-admin-loopback';\nimport configuration from '../configuration';\nimport restProvider from './restProvider';\nimport * as fetchUtils from './fetch'\n\nconst httpClient = (url, options = {}) => {\n // options.user = {\n // authenticated: true,\n // token: storage.load('lbtoken').id\n // }\n return fetchUtils.fetchJson(url, {});\n}\n\nconst dataProvider = restProvider(configuration.API_URL, httpClient);\nexport default (type, resource, params = {}) => \n new Promise(resolve => \n setTimeout(() => {\n const filter = params.filter;\n params.filter && Object.keys(filter).forEach(key => {\n if (key.charAt(0) === '_') {\n params[key.substr(1)] = filter[key];\n delete filter[key];\n } \n });\n return resolve(dataProvider(type, resource, params))\n }, 500) \n );\n","import { stringify } from 'query-string';\nimport {fetchJson} from './fetch';\n\nimport {\n GET_LIST,\n GET_ONE,\n GET_MANY,\n GET_MANY_REFERENCE,\n CREATE,\n UPDATE,\n UPDATE_MANY,\n DELETE,\n DELETE_MANY,\n} from 'react-admin';\n\nexport default (apiUrl, httpClient = fetchJson) => {\n /**\n * @param {String} type One of the constants appearing at the top if this file, e.g. 'UPDATE'\n * @param {String} resource Name of the resource to fetch, e.g. 'posts'\n * @param {Object} params The data request params, depending on the type\n * @returns {Object} { url, options } The HTTP request parameters\n */\n const convertDataRequestToHTTP = (type, resource, params = {}) => {\n let url = '';\n const options = {};\n const specialParams = ['pagination', 'sort', 'filter'];\n switch (type) {\n case GET_LIST: {\n\n // const { page, perPage } = params.pagination;\n // const { field, order } = params.sort;\n const query = {};\n query['where'] = {...params.filter};\n // if (field) query['order'] = [field + ' ' + order];\n // if (perPage >= 0) query['limit'] = perPage;\n // if ((perPage > 0) && (page >= 0)) query['skip'] = (page - 1) * perPage;\n\n Object.keys(params).forEach(key => {\n if (!specialParams.includes(key) && params[key] !== undefined)\n query[key] = params[key];\n });\n url = `${apiUrl}/${resource}?${stringify({filter: JSON.stringify(query)})}`;\n break;\n }\n case GET_ONE:\n url = `${apiUrl}/${resource}/${params.id}`;\n break;\n case GET_MANY: {\n const listId = params.ids.map(id => {\n return {id};\n });\n\n let query = '';\n if (listId.length > 0) {\n const filter = {\n where: {or: listId},\n };\n query = `?${stringify({filter: JSON.stringify(filter)})}`;\n }\n url = `${apiUrl}/${resource}${query}`;\n break;\n }\n case GET_MANY_REFERENCE: {\n const { page, perPage } = params.pagination;\n const { field, order } = params.sort;\n const query = {};\n query['where'] = {...params.filter};\n query['where'][params.target] = params.id;\n if (field) query['order'] = [field + ' ' + order];\n if (perPage >= 0) query['limit'] = perPage;\n if ((perPage > 0) && (page >= 0)) query['skip'] = (page - 1) * perPage;\n\n Object.keys(params).forEach(key => {\n if (!specialParams.includes(key) && params[key] !== undefined)\n query[key] = params[key];\n });\n\n url = `${apiUrl}/${resource}?${stringify({filter: JSON.stringify(query)})}`;\n break;\n }\n case UPDATE:\n url = `${apiUrl}/${resource}/${params.id}`;\n options.method = 'PATCH';\n options.body = JSON.stringify(params.data);\n break;\n case CREATE:\n url = `${apiUrl}/${resource}`;\n options.method = 'POST';\n options.body = JSON.stringify(params.data);\n break;\n case DELETE:\n url = `${apiUrl}/${resource}/${params.id}`;\n options.method = 'DELETE';\n break;\n default:\n throw new Error(`Unsupported fetch action type ${type}`);\n }\n return { url, options };\n };\n\n /**\n * @param {Object} response HTTP response from fetch()\n * @param {String} type One of the constants appearing at the top if this file, e.g. 'UPDATE'\n * @param {String} resource Name of the resource to fetch, e.g. 'posts'\n * @param {Object} params The data request params, depending on the type\n * @returns {Object} Data response\n */\n const convertHTTPResponse = (response, type, resource, params) => {\n const { json } = response;\n switch (type) {\n case GET_LIST:\n case GET_MANY_REFERENCE:\n // if (!headers.has('content-range')) {\n // throw new Error(\n // 'The Content-Range header is missing in the HTTP Response. The simple REST data provider expects responses for lists of resources to contain this header with the total number of results to build the pagination. If you are using CORS, did you declare Content-Range in the Access-Control-Expose-Headers header?'\n // );\n // }\n return {\n data: json,\n total: undefined\n // total: parseInt(\n // headers\n // .get('content-range')\n // .split('/')\n // .pop(),\n // 10\n // ),\n };\n case CREATE:\n return { data: { ...params.data, id: json.id } };\n case DELETE:\n return { data: { ...json, id: params.id } };\n default:\n return { data: json };\n }\n };\n\n /**\n * @param {string} type Request type, e.g GET_LIST\n * @param {string} resource Resource name, e.g. \"posts\"\n * @param {Object} payload Request parameters. Depends on the request type\n * @returns {Promise} the Promise for a data response\n */\n return (type, resource, params) => {\n // simple-rest doesn't handle filters on UPDATE route, so we fallback to calling UPDATE n times instead\n if (type === UPDATE_MANY) {\n return Promise.all(\n params.ids.map(id =>\n httpClient(`${apiUrl}/${resource}/${id}`, {\n method: 'PUT',\n body: JSON.stringify(params.data),\n })\n )\n ).then(responses => ({\n data: responses.map(response => response.json),\n }));\n }\n // simple-rest doesn't handle filters on DELETE route, so we fallback to calling DELETE n times instead\n if (type === DELETE_MANY) {\n return Promise.all(\n params.ids.map(id =>\n httpClient(`${apiUrl}/${resource}/${id}`, {\n method: 'DELETE',\n })\n )\n ).then(responses => ({\n data: responses.map(response => response.json),\n }));\n }\n\n const { url, options } = convertDataRequestToHTTP(\n type,\n resource,\n params\n );\n \n return httpClient(url, options).then(response =>\n convertHTTPResponse(response, type, resource, params)\n );\n };\n};","import englishMessages from 'ra-language-english';\n\nexport default {\n ...englishMessages,\n http: {\n fail_request: 'Load request failed'\n },\n resources: {\n launches: {\n name: 'Launch |||| Launches' ,\n fields: {\n beginTimestamp: 'Begin Date',\n endTimestamp: 'End Date',\n },\n },\n equipment: {\n name: 'Equipment |||| Equipment' ,\n fields: {\n state: \"State\",\n name: 'Name',\n serialNumber: 'Serial Number',\n number: 'Number',\n equipmentmodelId: 'Model',\n },\n }\n },\n\n containers: {\n dashboard: {\n next_launches: 'Next planned Launches',\n active_launches: 'Active Launches',\n past_launches: 'Past Launches',\n next_campaigns: 'Next planned Campaigns',\n active_campaigns: 'Active Campaigns',\n past_campaigns: 'Past Campaigns',\n },\n live: {\n name: 'Live Map',\n overview: 'Last transmission'\n },\n history: {\n name: 'History Map',\n complete_interval: 'Complete interval',\n all_data: 'All data',\n no_data: 'There is no data on this launch'\n },\n profile: {\n name: 'Profile',\n fields: {\n name: 'Name',\n username: 'Username', \n email: 'Email',\n old_password: \"Old password\",\n new_password: \"New password\",\n repeat_password: \"Repeat password\",\n },\n buttons: {\n change_password: 'Change password',\n },\n notifications: {\n profile_updated: 'Profile updated',\n password_updated: 'Password updated',\n wrong_password: 'Old password wrong',\n on_failure_profile: 'Save profile failled',\n on_failure_password: 'Error changing password',\n different_passwords: 'Needed to be iqual',\n }\n },\n configuration: {\n name: 'Configuration',\n language: {\n name: 'Language',\n en: 'English',\n 'en-GB': 'English',\n pt: 'Português'\n },\n theme: {\n name: 'Theme',\n light: 'Light',\n dark: 'Dark',\n },\n notifications: {\n settings_updated: 'Configuration saved',\n on_failure_settings_update: 'Saving configuration failed',\n }\n },\n }\n};\n","import portugueseMessages from 'ra-language-portuguese-pt';\n\nexport default {\n ...portugueseMessages,\n resources: {\n institutions: {\n name: 'Instituição |||| Instituições',\n fields: {\n name: 'Nome',\n address: 'Endereço',\n phoneNumber: 'Contacto',\n acronym: \"Acrónimo\",\n url: \"Sítio internet\"\n }\n },\n users: {\n name: 'Utilizador |||| Utilizadores',\n fields: {\n username: 'Nome de Utilizador',\n name: 'Nome',\n email: 'E-Mail',\n institutionId: 'Instituição',\n active: 'Ativo',\n isAdmin: 'Administrador',\n role: 'Administrador'\n }\n },\n campaigns: {\n name: 'Campanha |||| Campanhas',\n fields: {\n name: 'Nome',\n description: 'Descrição',\n beginDate: 'Início',\n area: 'Área',\n zoom: 'Zoom',\n hide: 'Escondida'\n }\n },\n launches: {\n name: 'Lançamento |||| Lançamentos' ,\n fields: {\n beginTimestamp: 'Data de Início',\n endTimestamp: 'Data de Fim',\n },\n },\n equipment: {\n name: 'Equipamento |||| Equipamentos',\n fields: {\n state: \"Estado\",\n name: 'Nome',\n serialNumber: 'Número de Série',\n number: 'Número',\n equipmentmodelId: 'Modelo',\n }\n },\n datasets: {\n name: 'Dataset |||| Datasets',\n fields: {\n name: 'Nome',\n equipmentId: 'Equipamento',\n launchId: 'Lançamento',\n campaignId: 'Campanha',\n observationsNumb: 'Número de observações'\n },\n },\n equipmentmodels: {\n name: 'Modelo |||| Modelos',\n fields: {\n name: \"Nome\",\n equipmenttypeId: \"Tipo de equipamento\",\n observedProperty: 'Propriedades',\n },\n },\n },\n\n containers: {\n dashboard: {\n next_launches: 'Proximos Lançamentos',\n active_launches: 'Lançamentos ativos',\n past_launches: 'Lançamentos Passados',\n next_campaigns: 'Proximas Campanhas',\n active_campaigns: 'Campanhas Ativas',\n past_campaigns: 'Campanhas Passadas',\n },\n live: {\n name: 'Mapa ao Vivo',\n overview: 'Ultima transmissão'\n },\n history: {\n name: 'Mapa Histórico',\n complete_interval: 'Intervalo completo',\n all_data: 'Todos os dados',\n notifications: {\n no_data: 'Não existem dados'\n }\n },\n profile: {\n name: 'Perfil',\n fields: {\n name: 'Nome',\n username: 'Nome de utilizador', \n email: 'Email',\n old_password: \"Password antiga\",\n new_password: \"Nova password\",\n repeat_password: \"Repetir password\",\n },\n buttons: {\n change_password: 'Mudar password',\n },\n notifications: {\n profile_updated: 'Perfil atualizado',\n password_updated: 'Password atualizada',\n wrong_password: 'Password antiga errada',\n on_failure_password: 'Error a mudar a password',\n on_failure_profile: 'Error a guardar perfil',\n different_passwords: 'Precisam de ser iguais',\n }\n },\n configuration: {\n name: 'Configuração',\n language: {\n name: 'Linguagem',\n 'en-GB': 'English',\n en: 'English',\n pt: 'Português'\n },\n theme: {\n name: 'Tema',\n light: 'Claro',\n dark: 'Escuro',\n },\n notifications: {\n settings_updated: 'Configuração guardada',\n on_failure_settings_update: 'Erro a guardar configuração',\n }\n },\n }\n};\n","import englishMessages from '../i18n/en';\nimport portugueseMessages from '../i18n/pt';\nimport polyglotI18nProvider from 'ra-i18n-polyglot';\n\nconst messages = {\n 'en': englishMessages,\n 'pt': portugueseMessages,\n};\n\nexport default polyglotI18nProvider(locale => {\n switch (locale) {\n case 'pt':\n return messages['pt']\n \n default:\n return messages['en']\n }\n});","// import { storage } from 'react-admin-loopback';\nimport configuration from '../configuration';\n\nexport default (method, path, headers = new Headers(), body) => \n new Promise((resolve, reject) => {\n // headers.append(\"Authorization\",`${storage.load('lbtoken').id}`);\n headers.append(\"Access-Control-Allow-Origin\",`*`);\n \n let goCatch = false;\n fetch(`${configuration.API_URL}${path}`,{\n method,\n headers,\n body\n })\n .then(resp => {\n if (resp.status === 200 || resp.status === 201)\n return resp.json();\n else if(resp.status === 204) \n return undefined;\n else {\n goCatch = true;\n return resp.json();\n }\n })\n .then(data => {\n if (goCatch) {\n return reject(data);\n }\n else\n return resolve(data);\n })\n .catch(error => {\n reject(error);\n });\n });","import * as React from 'react';\nimport { useState, useEffect, useCallback } from 'react';\nimport PropTypes from 'prop-types';\nimport { useSelector, useDispatch } from 'react-redux';\nimport Snackbar from '@material-ui/core/Snackbar';\nimport Button from '@material-ui/core/Button';\nimport { makeStyles } from '@material-ui/core/styles';\nimport classnames from 'classnames';\n\nimport {\n hideNotification,\n getNotification,\n undo,\n complete,\n undoableEventEmitter,\n useTranslate,\n} from 'ra-core';\n\nconst useStyles = makeStyles(\n (theme) => ({\n success: {\n backgroundColor: theme.palette.success.main,\n color: theme.palette.success.contrastText,\n },\n error: {\n backgroundColor: theme.palette.error.dark,\n color: theme.palette.error.contrastText,\n },\n warning: {\n backgroundColor: theme.palette.error.light,\n color: theme.palette.error.contrastText,\n },\n undo: (props) => ({\n color:\n props.type === 'success'\n ? theme.palette.success.contrastText\n : theme.palette.primary.light,\n }),\n }),\n { name: 'RaNotification' }\n);\n\nconst Notification = props => {\n const {\n classes: classesOverride,\n type,\n className,\n autoHideDuration,\n ...rest\n } = props;\n const [open, setOpen] = useState(false);\n const notification = useSelector(getNotification);\n const dispatch = useDispatch();\n const translate = useTranslate();\n const styles = useStyles(props);\n\n useEffect(() => {\n setOpen(!!notification);\n }, [notification]);\n\n const handleRequestClose = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n const handleExited = useCallback(() => {\n if (notification && notification.undoable) {\n dispatch(complete());\n undoableEventEmitter.emit('end', { isUndo: false });\n }\n dispatch(hideNotification());\n }, [dispatch, notification]);\n\n const handleUndo = useCallback(() => {\n dispatch(undo());\n undoableEventEmitter.emit('end', { isUndo: true });\n }, [dispatch]);\n\n return (\n \n {translate('ra.action.undo')}\n \n ) : null\n }\n {...rest}\n />\n );\n};\n\nNotification.propTypes = {\n type: PropTypes.string,\n};\n\nNotification.defaultProps = {\n type: 'info',\n autoHideDuration: 4000,\n};\n\nexport default Notification;","import * as React from 'react';\nimport { cloneElement } from 'react';\nimport { createPortal } from 'react-dom';\nimport PropTypes from 'prop-types';\nimport { useTranslate, warning } from 'ra-core';\n\nconst Title = ({\n className,\n defaultTitle,\n record,\n title,\n ...rest\n}) => {\n const translate = useTranslate();\n const container =\n typeof document !== 'undefined'\n ? document.getElementById('react-admin-title')\n : null;\n\n if (!container) return null;\n\n warning(!defaultTitle && !title, 'Missing title prop in element');\n\n const titleElement = !title ? (\n <span className={className} {...rest}>\n {defaultTitle}\n </span>\n ) : typeof title === 'string' ? (\n <span className={className} {...rest}>\n {translate(title, { _: title })}\n </span>\n ) : (\n cloneElement(title, { className, record, ...rest })\n );\n return createPortal(titleElement, container);\n};\n\nexport const TitlePropType = PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.element,\n]);\n\nTitle.propTypes = {\n defaultTitle: PropTypes.string,\n className: PropTypes.string,\n record: PropTypes.any,\n title: TitlePropType,\n};\n\nexport default Title;","import * as React from 'react';\nimport { Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport classnames from 'classnames';\nimport {\n Button,\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Typography,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport ErrorIcon from '@material-ui/icons/Report';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport History from '@material-ui/icons/History';\nimport { useTranslate } from 'ra-core';\n\nimport Title, { TitlePropType } from './Title';\n\nconst useStyles = makeStyles(\n theme => ({\n container: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n [theme.breakpoints.down('sm')]: {\n padding: '1em',\n },\n fontFamily: 'Roboto, sans-serif',\n opacity: 0.5,\n },\n title: {\n display: 'flex',\n alignItems: 'center',\n },\n icon: {\n width: '2em',\n height: '2em',\n marginRight: '0.5em',\n },\n panel: {\n marginTop: '1em',\n maxWidth: '60em',\n },\n panelDetails: {\n whiteSpace: 'pre-wrap',\n },\n toolbar: {\n marginTop: '2em',\n },\n advice: {\n marginTop: '2em',\n },\n }),\n { name: 'RaError' }\n);\n\nfunction goBack() {\n window.history.go(-1);\n}\n\nconst Error = (props) => {\n const {\n error,\n errorInfo,\n classes: classesOverride,\n className,\n title,\n ...rest\n } = props;\n const classes = useStyles(props);\n const translate = useTranslate();\n\n return (\n <Fragment>\n {title && <Title defaultTitle={title} />}\n <div className={classnames(classes.container, className)} {...rest}>\n <h1 className={classes.title} role=\"alert\">\n <ErrorIcon className={classes.icon} />\n {translate('ra.page.error')}\n </h1>\n <div>{translate('ra.message.error')}</div>\n {process.env.NODE_ENV !== 'production' && (\n <>\n <Accordion className={classes.panel}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n {translate(error.toString(), {\n _: error.toString(),\n })}\n </AccordionSummary>\n {errorInfo && (\n <AccordionDetails\n className={classes.panelDetails}\n >\n {errorInfo.componentStack}\n </AccordionDetails>\n )}\n </Accordion>\n\n <div className={classes.advice}>\n <Typography align=\"center\">\n Need help with this error? Try the following:\n </Typography>\n <Typography component=\"div\">\n <ul>\n <li>\n Check the{' '}\n <a href=\"https://marmelab.com/react-admin/Readme.html\">\n react-admin documentation\n </a>\n </li>\n <li>\n Search on{' '}\n <a href=\"https://stackoverflow.com/questions/tagged/react-admin\">\n StackOverflow\n </a>{' '}\n for community answers\n </li>\n <li>\n Get help from the core team via{' '}\n <a href=\"https://marmelab.com/ra-enterprise/#fromsww\">\n react-admin Enterprise Edition\n </a>\n </li>\n </ul>\n </Typography>\n </div>\n </>\n )}\n <div className={classes.toolbar}>\n <Button\n variant=\"contained\"\n startIcon={<History />}\n onClick={goBack}\n >\n {translate('ra.action.back')}\n </Button>\n </div>\n </div>\n </Fragment>\n );\n};\n\nError.propTypes = {\n classes: PropTypes.object,\n className: PropTypes.string,\n error: PropTypes.object.isRequired,\n errorInfo: PropTypes.object,\n title: TitlePropType,\n};\n\nexport default Error;","import React, {\n Component,\n createElement,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport classnames from 'classnames';\nimport { withRouter } from 'react-router-dom';\nimport { withStyles, createStyles } from '@material-ui/core/styles';\nimport { ThemeProvider } from '@material-ui/styles';\nimport { ComponentPropType } from 'ra-core';\nimport compose from 'lodash/flowRight';\n\nimport {\n SkipNavigationButton,\n createMuiTheme,\n defaultTheme\n} from 'react-admin';\n\nimport DefaultNotification from './Notification';\nimport DefaultError from './Error';\n// import defaultTheme from '../defaultTheme';\n\nconst styles = theme =>\n createStyles({\n root: {\n display: 'flex',\n flexDirection: 'column',\n zIndex: 1,\n minHeight: '100vh',\n backgroundColor: theme.palette.background.default,\n position: 'relative',\n minWidth: 'fit-content',\n width: '100%',\n color: theme.palette.getContrastText(\n theme.palette.background.default\n ),\n },\n appFrame: {\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\n [theme.breakpoints.up('xs')]: {\n marginTop: theme.spacing(6),\n },\n [theme.breakpoints.down('xs')]: {\n marginTop: theme.spacing(7),\n },\n },\n contentWithSidebar: {\n display: 'flex',\n flexGrow: 1,\n },\n content: {\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\n flexBasis: 0,\n // padding: theme.spacing(3),\n // paddingTop: theme.spacing(1),\n paddingLeft: 0,\n // [theme.breakpoints.up('xs')]: {\n // paddingLeft: theme.spacing(1),\n // paddingLeft: 5,\n // },\n [theme.breakpoints.down('sm')]: {\n padding: 0,\n },\n },\n });\n\nclass LayoutWithoutTheme extends Component{\n state = { hasError: false, error: null, errorInfo: null };\n\n constructor(props) {\n super(props);\n /**\n * Reset the error state upon navigation\n *\n * @see https://stackoverflow.com/questions/48121750/browser-navigation-broken-by-use-of-react-error-boundaries\n */\n props.history.listen(() => {\n if (this.state.hasError) {\n this.setState({ hasError: false });\n }\n });\n }\n\n componentDidCatch(error, errorInfo) {\n this.setState({ hasError: true, error, errorInfo });\n }\n\n render() {\n const {\n appBar,\n children,\n classes,\n className,\n error: ErrorComponent,\n dashboard,\n logout,\n menu,\n notification,\n open,\n sidebar,\n title,\n // sanitize react-router props\n match,\n location,\n history,\n staticContext,\n ...props\n } = this.props;\n const { hasError, error, errorInfo } = this.state;\n return (\n <>\n <div\n className={classnames('layout', classes.root, className)}\n {...props}\n >\n <SkipNavigationButton />\n <div className={classes.appFrame}>\n {createElement(appBar, { title, open, logout })}\n <main className={classes.contentWithSidebar}>\n {createElement(sidebar, {\n children: createElement(menu, {\n logout,\n hasDashboard: !!dashboard,\n }),\n })}\n <div id=\"main-content\" className={classes.content}>\n {hasError ? (\n <ErrorComponent\n error={error}\n errorInfo={errorInfo}\n title={title}\n />\n ) : (\n children\n )}\n </div>\n </main>\n </div>\n </div>\n {createElement(notification)}\n </>\n );\n }\n\n static propTypes = {\n appBar: ComponentPropType,\n children: PropTypes.oneOfType([PropTypes.func, PropTypes.node]),\n classes: PropTypes.object,\n className: PropTypes.string,\n dashboard: ComponentPropType,\n error: ComponentPropType,\n history: PropTypes.object.isRequired,\n logout: PropTypes.element,\n menu: ComponentPropType,\n notification: ComponentPropType,\n open: PropTypes.bool,\n sidebar: ComponentPropType,\n title: PropTypes.node.isRequired,\n };\n\n static defaultProps = {\n // appBar: DefaultAppBar,\n error: DefaultError,\n // menu: DefaultMenu,\n notification: DefaultNotification,\n // sidebar: DefaultSidebar,\n };\n}\n\nconst mapStateToProps = state => ({\n open: state.admin.ui.sidebarOpen,\n});\n\nconst EnhancedLayout = compose(\n connect(\n mapStateToProps,\n {} // Avoid connect passing dispatch in props\n ),\n withRouter,\n withStyles(styles, { name: 'RaLayout' })\n)(LayoutWithoutTheme);\n\nconst Layout = ({\n theme: themeOverride,\n ...props\n}) => {\n const themeProp = useRef(themeOverride);\n const [theme, setTheme] = useState(() => createMuiTheme(themeOverride));\n\n useEffect(() => {\n if (themeProp.current !== themeOverride) {\n themeProp.current = themeOverride;\n setTheme(createMuiTheme(themeOverride));\n }\n }, [themeOverride, themeProp, theme, setTheme]);\n\n return (\n <ThemeProvider theme={theme}>\n <EnhancedLayout {...props} />\n </ThemeProvider>\n );\n};\n\nLayout.propTypes = {\n theme: PropTypes.object,\n};\n\nLayout.defaultProps = {\n theme: defaultTheme,\n};\n\nexport default Layout;","import { Children, memo } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport {\n AppBar as MuiAppBar,\n IconButton,\n Toolbar,\n Tooltip,\n Typography,\n useMediaQuery,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport HomeIcon from '@material-ui/icons/Home';\nimport { ComponentPropType } from 'ra-core';\n\nimport { HideOnScroll, LoadingIndicator, Link } from 'react-admin';\n\nconst useStyles = makeStyles(\n theme => ({\n toolbar: {\n paddingRight: 24,\n },\n menuButton: {\n marginLeft: '0.2em',\n marginRight: '0.2em',\n },\n link: {\n color: \"inherit\"\n },\n title: {\n flex: 1,\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n },\n }),\n { name: 'RaAppBar' }\n);\n\nconst AppBar = (props) => {\n const {\n children,\n classes: classesOverride,\n className,\n color = 'secondary',\n logout,\n open,\n title,\n userMenu,\n container: Container,\n ...rest\n } = props;\n const classes = useStyles(props);\n const isXSmall = useMediaQuery(theme =>\n theme.breakpoints.down('xs')\n );\n\n return (\n <Container>\n <MuiAppBar className={className} color={color} {...rest}>\n <Toolbar\n disableGutters\n variant={isXSmall ? 'regular' : 'dense'}\n className={classes.toolbar}\n >\n <Link to={{\n pathname: `/`,\n }}\n className={classNames(classes.link)}\n >\n <Tooltip\n title='Home'\n enterDelay={500}\n >\n <IconButton\n className={classNames(classes.menuButton)}\n color=\"inherit\"\n >\n <HomeIcon />\n </IconButton>\n </Tooltip>\n </Link>\n {Children.count(children) === 0 ? (\n <Typography\n variant=\"h6\"\n color=\"inherit\"\n className={classes.title}\n id=\"react-admin-title\"\n />\n ) : (\n children\n )}\n <LoadingIndicator />\n </Toolbar>\n </MuiAppBar>\n </Container>\n );\n};\n\nAppBar.propTypes = {\n children: PropTypes.node,\n // @ts-ignore\n classes: PropTypes.object,\n className: PropTypes.string,\n color: PropTypes.oneOf([\n 'default',\n 'inherit',\n 'primary',\n 'secondary',\n 'transparent',\n ]),\n container: ComponentPropType,\n logout: PropTypes.element,\n open: PropTypes.bool,\n userMenu: PropTypes.oneOfType([PropTypes.element, PropTypes.bool]),\n};\n\nAppBar.defaultProps = {\n container: HideOnScroll,\n};\n\n\nexport default memo(AppBar);","import { defaultTheme } from 'react-admin';\nimport { createTheme } from '@material-ui/core/styles';\n\nconst getTheme = (type) => createTheme({\n ...defaultTheme,\n palette: {\n type: type,\n secondary: {\n light: '#5f5fc4',\n main: '#283593',\n dark: '#001064',\n contrastText: '#fff',\n }\n }\n});\n\nexport default getTheme;","import { useEffect } from 'react';\n\nimport Layout from './RaLayout/';\nimport { \n // Layout, \n useSetLocale \n} from 'react-admin';\n\nimport { useDispatch } from 'react-redux';\n// import Menu from './Menu';\nimport AppBar from './AppBar';\n// import Notification from './Notification';\nimport getTheme from '../../config/theme';\nimport { loadProfile } from '../../store/actions/user';\n\nconst CustomSidebar = props => null;\n\nconst CustomLayout = (props) => {\n const setLocale = useSetLocale();\n const dispatch = useDispatch();\n\n // const theme = useSelector((state) =>\n // getTheme(state.user.settings.theme)\n // );\n // const dark = () => window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n // const theme = getTheme(dark() ? 'dark' : 'light');\n const theme = getTheme('light');\n\n // const language = useSelector((state) => state.user.settings.language);\n const language = 'en';\n\n useEffect(() => {\n setLocale(language);\n }, [setLocale, language]);\n\n useEffect(() => {\n dispatch(loadProfile());\n }, []);\n\n return (\n <Layout\n {...props}\n sidebar={CustomSidebar}\n appBar={AppBar}\n menu={() => null}\n theme={theme}\n // notification={Notification}\n />\n );\n}\n\nexport default CustomLayout;","export const CHANGE_SETTINGS = 'CHANGE_SETTINGS';\nexport const LOAD_SETTINGS = 'LOAD_SETTINGS';\nexport const UPDATE_SETTINGS = 'UPDATE_SETTINGS';\nexport const UPDATE_SETTINGS_SUCCESS = 'UPDATE_SETTINGS_SUCCESS';\nexport const UPDATE_SETTINGS_FAILURE = 'UPDATE_SETTINGS_FAILURE';\n\nexport const changeSettings = ({theme, language}) => {\n return ({\n type: CHANGE_SETTINGS,\n theme,\n language\n });\n};\n\nexport const loadSettings = () => {\n return ({\n type: LOAD_SETTINGS\n });\n};\n\nexport const saveSettings = () => {\n return ({\n type: UPDATE_SETTINGS\n });\n};\n\nexport const saveSettingsSuccess = ({theme, language}) => {\n return ({\n type: UPDATE_SETTINGS_SUCCESS,\n theme,\n language\n });\n};\n\nexport const saveSettingsFailure = error => {\n return ({\n type: UPDATE_SETTINGS_FAILURE,\n error\n });\n};\n\n\nexport const CHANGE_PROFILE = 'CHANGE_PROFILE';\nexport const LOAD_PROFILE = 'LOAD_PROFILE';\nexport const UPDATE_PROFILE = 'UPDATE_PROFILE';\nexport const UPDATE_PROFILE_SUCCESS = 'UPDATE_PROFILE_SUCCESS';\nexport const UPDATE_PROFILE_FAILURE = 'UPDATE_PROFILE_FAILURE';\n\nexport const loadProfile = () => {\n return ({\n type: LOAD_PROFILE\n });\n};\n\nexport const saveProfile = ({id, name, username, email}) => {\n return ({\n type: UPDATE_PROFILE,\n id,\n username, \n name, \n email\n });\n};\n\nexport const saveProfileSuccess = ({id, name, username, email}) => {\n return ({\n type: UPDATE_PROFILE_SUCCESS,\n id,\n username, \n name, \n email\n });\n};\n\nexport const saveProfileFailure = error => {\n return ({\n type: UPDATE_PROFILE_FAILURE,\n error\n });\n};","import moment from 'moment';\n\nexport const toWavyGeojson = (data) => {\n return {\n wavy: {\n id: data.serialNumber,\n name: data.serialNumber,\n last_transmission: {...data}\n },\n position: [ObservationToFeature(data)]\n };\n}\n\nexport const toWavyGeojsonOld = (data) => {\n\n let result = {};\n\n data.forEach(obs => {\n const { serialNumber } = obs;\n if (!result[serialNumber]) {\n result[serialNumber] = {\n wavy: {\n id: serialNumber,\n name: serialNumber,\n last_transmission: {}\n },\n position: []\n };\n } \n result[serialNumber].wavy.last_transmission = obs;\n\n const pos = {\n type: \"Feature\",\n geometry: {\n type: \"Point\",\n coordinates: [parseFloat(obs.position.lng), parseFloat(obs.position.lat)]\n },\n style: {\n color: obs.properties ? obs.properties.color : \"rgb(51, 136, 255)\"\n },\n properties: {\n id: serialNumber,\n key: serialNumber,\n timestamp: new Date(obs.timestamp).getTime()\n }\n };\n\n result[serialNumber].position.push(pos);\n });\n\n return Object.values(result);\n}\n\n\n// For now it will use the Observation keys\n// The objective is to transform the array of objects in a GeoJson (Feature Collection)\nexport const toObservationData = (observations) => {\n let features = [];\n for (let i = 0; i < observations.length; i++) {\n features.push(ObservationToFeature(observations[i]));\n }\n\n return {\n type: \"FeatureCollection\",\n features: features\n }\n};\n\nexport const toObservationDataSingleWAVY = (data) => {\n const { observations, observedProperties } = data;\n\n let features = [];\n for (let i = 0; i < observations.length; i++) {\n features.push(ObservationToFeature(observations[i], observedProperties));\n }\n\n return {\n type: \"FeatureCollection\",\n features: features\n }\n};\n\nconst ObservationToFeature = (observation) => {\n // NOT observedProperties but equipmentModelProperties!!!\n const properties = {\n id: observation['serialNumber'],\n key: observation['serialNumber'],\n timestamp: moment(observation['timestamp']).unix() * 1000,\n };\n\n delete observation.timestamp;\n\n Object.keys(observation).forEach(key => {\n properties[key] = observation[key];\n });\n\n\n const color = observation.properties ? observation.properties.color : \"rgb(51, 136, 255)\";\n return {\n type: \"Feature\",\n geometry: {\n type: \"Point\",\n coordinates: [parseFloat(observation.position.lng), parseFloat(observation.position.lat)]\n },\n style: {\n color: color\n },\n properties: properties\n };\n};","import { toObservationData } from '../../factory'; \n\nexport const FETCH_OBSERVATIONS = 'FETCH_OBSERVATIONS';\nexport const CLEAR_OBSERVATIONS = 'CLEAR_OBSERVATIONS';\nexport const STORE_OVERLAYS = 'STORE_OVERLAYS';\nexport const SELECT_CAMPAIGN = 'SELECT_CAMPAIGN';\n\nexport const fetchObservations = (data) => {\n return ({\n type: FETCH_OBSERVATIONS,\n payload: toObservationData(data)\n });\n};\n\nexport const clearObservations = () => {\n return ({\n type: CLEAR_OBSERVATIONS\n });\n}\n\nexport const storeOverlays = (overlays) => {\n return ({\n type: STORE_OVERLAYS,\n payload: overlays\n });\n};\n\nexport const selectCampaign = (campaigns) => {\n return ({\n type: SELECT_CAMPAIGN,\n payload: campaigns\n });\n};\n","import {\n FETCH_OBSERVATIONS,\n CLEAR_OBSERVATIONS,\n STORE_OVERLAYS,\n SELECT_CAMPAIGN,\n} from '../actions/historyMap';\n\nconst initialState = {\n observations: undefined,\n overlays: undefined,\n activeCampaign: undefined,\n};\n\nexport default (state = initialState, action) => {\n\n switch (action.type) {\n\n case FETCH_OBSERVATIONS:\n return { ...state, observations: action.payload };\n \n case CLEAR_OBSERVATIONS:\n return { ...state, observations: undefined };\n\n case STORE_OVERLAYS:\n return { ...state, overlays: action.payload };\n\n case SELECT_CAMPAIGN:\n return { ...state, activeCampaign: action.payload };\n\n default:\n return state;\n }\n};\n","import { toWavyGeojson, toWavyGeojsonOld } from '../../factory'; \n\nexport const LIVE_OBSERVATIONS = 'LIVE_OBSERVATIONS';\nexport const FETCH_OLD_OBSERVATIONS = 'FETCH_OLD_OBSERVATIONS';\nexport const CLEAR_OBSERVATIONS = 'CLEAR_OBSERVATIONS';\n\nexport const liveObservations = (data) => {\n return ({\n type: LIVE_OBSERVATIONS,\n payload: toWavyGeojson(data)\n });\n};\n\nexport const fetchOldObservations = (data) => {\n return ({\n type: FETCH_OLD_OBSERVATIONS,\n payload: toWavyGeojsonOld(data)\n });\n};\n\nexport const clearObservations = () => {\n return ({\n type: CLEAR_OBSERVATIONS\n });\n}\n","import {\n FETCH_OLD_OBSERVATIONS,\n LIVE_OBSERVATIONS,\n CLEAR_OBSERVATIONS,\n} from '../actions/liveMap';\n\nexport default (state = [], action) => {\n switch (action.type) {\n\n case FETCH_OLD_OBSERVATIONS:\n return action.payload;\n\n case LIVE_OBSERVATIONS:\n let index = state.findIndex(item => item.wavy.id === action.payload.wavy.id);\n let copy = state.slice();\n\n if (index >= 0) {\n if (new Date(action.payload.wavy.last_transmission.timestamp) > new Date(copy[index].wavy.last_transmission.timestamp)) {\n copy[index].position.push(action.payload.position[0]);\n copy[index].wavy.last_transmission = action.payload.wavy.last_transmission;\n }\n } else {\n copy.push(action.payload);\n }\n\n return copy;\n case CLEAR_OBSERVATIONS:\n return [];\n default:\n return state;\n }\n};\n","export const UPDATE_PAGE = 'UPDATE_PAGE';\nexport const UPDATE_CAMPAIGN = 'UPDATE_CAMPAIGN';\n\nexport const updatePage = ({ page }) => {\n return ({\n type: UPDATE_PAGE,\n payload: page\n });\n};\n\nexport const loadPage = ({ campaignId }) => {\n return ({\n type: UPDATE_CAMPAIGN,\n payload: campaignId\n });\n};\n","import {\n UPDATE_PAGE,\n UPDATE_CAMPAIGN\n} from '../actions/page';\n\nconst initialState = {\n page: undefined,\n campaignId: undefined\n};\n\nexport default (state = initialState, action) => {\n switch (action.type) {\n\n case UPDATE_PAGE:\n return { ...state, page: action.payload };\n \n case UPDATE_CAMPAIGN:\n return { ...state, campaignId: action.payload };\n\n default:\n return state;\n }\n};\n","import { createContext } from 'react';\n\nconst PageContext = createContext({\n campaignId: undefined,\n campaignName: undefined,\n page: undefined,\n setCampaign: () => { },\n setPage: () => { }\n});\n\nPageContext.displayName = 'PageContext';\n\nexport { PageContext };","import React, {\n useCallback,\n useMemo,\n Children,\n useState\n} from 'react';\n\nimport { PageContext } from './Context';\n\nconst Provider = props => {\n const { children, campaignId, campaignName, page } = props;\n\n const [_campaign, _setCampaign] = useState({\n campaignId,\n campaignName\n });\n const [_page, _setPage] = useState(page);\n\n const setCampaign = useCallback(\n (p) => _setCampaign(_ => ({\n campaignId: p && p.id ? p.id : undefined,\n campaignName: p && p.name ? p.name : undefined\n })),\n [_setCampaign]\n );\n \n const setPage = useCallback(\n (newState) =>\n _setPage(_ => (newState)),\n [_setPage]\n );\n\n const value = useMemo(\n () => ({\n campaignId: _campaign.campaignId,\n campaignName: _campaign.campaignName,\n setCampaign,\n page: _page,\n setPage,\n }),\n [_campaign, setCampaign, _page, setPage]\n );\n\n return (\n <PageContext.Provider value={value}>\n {Children.only(children)}\n </PageContext.Provider>\n );\n};\n\nexport default Provider;","import { useContext, useCallback } from 'react';\nimport { PageContext } from './Context';\n\nconst useSetCampaign = () => {\n const { setCampaign } = useContext(PageContext);\n return useCallback(\n (newState) =>\n setCampaign(newState),\n [setCampaign]\n );\n};\n\nexport default useSetCampaign;","import { useContext, useCallback } from 'react';\nimport { PageContext } from './Context';\n\nconst useSetPage = () => {\n const { setPage } = useContext(PageContext);\n return useCallback(\n (newState) =>\n setPage(newState),\n [setPage]\n );\n};\n\nexport default useSetPage;","import { useContext } from 'react';\nimport { PageContext } from './Context';\n\nconst usePage = () => {\n const { campaignName, campaignId, page } = useContext(PageContext);\n return { campaignName, campaignId, page };\n};\n\nexport default usePage;","import React from 'react';\r\nimport Card from '@material-ui/core/Card';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport CardMedia from '@material-ui/core/CardMedia';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\nimport { usePage } from '../../store/pageHook';\r\n\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n img: {\r\n // height: '10em',\r\n maxWidth: '100%',\r\n height: '12em'\r\n },\r\n imgBig: {\r\n // height: '10em',\r\n maxWidth: '100%',\r\n height: '18em'\r\n },\r\n })\r\n);\r\n\r\nconst mediaUrl = `https://www.ec-meloa.eu/img/banner/banner_3_imagem_1520698050.png`;\r\n\r\nconst Welcome = (props) => {\r\n const classes = useStyles(props);\r\n\r\n const { campaignName } = usePage();\r\n\r\n const isXSmall = useMediaQuery(theme =>\r\n theme.breakpoints.down('sm')\r\n );\r\n\r\n return (\r\n <Card>\r\n <CardMedia image={mediaUrl} className={isXSmall ? classes.img : classes.imgBig} />\r\n <CardContent>\r\n <Typography variant='body2' component='p'>\r\n A citizen science experiment by <b>MELOA Consortium</b>. \r\n <br />\r\n Data from the sensors is not yet validated.\r\n <br />\r\n <br />\r\n Campaign <b>{campaignName}</b>\r\n </Typography>\r\n </CardContent>\r\n </Card>\r\n )\r\n};\r\n\r\nexport default Welcome;","import React from 'react';\n\nexport default (props) =>{\n return (\n <svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\"\n width={props.width ? props.width : 78} height={props.height ? props.height : 78} viewBox=\"0 0 300 300\" space=\"preserve\">\n \n <circle fill={props.wavyColor ? props.wavyColor : \"#E40000\"} cx=\"150\" cy=\"91\" r=\"74.4\"/>\n <path fill={props.handColor ? props.handColor : \"#F8BA95\"} d=\"M62.3,289c3.2,3.2,8.4,3.2,11.6,0c0,0,0,0,0,0l10.5-10.5c0,0,8.3-8.3,22.8-9.1c12.8-0.6,63.5-11.7,75.4-14.3\n\tc1.7-0.4,3.2-1.2,4.4-2.4l83.4-83.4c0,0,8-8-1.8-17.8s-17.8-1.1-17.8-1.1l-62,62c-1.4,1.4-3.3,2.3-5.2,2.4l-50.6,3.4\n\tc0,0-6.2,0.6-6.7-7.4c-0.4-6.2,6.9-6.9,6.9-6.9l38.7-3.6c0,0,12.8-0.4,11.2-14c-1.4-12.2-14.6-12.1-14.6-12.1l-73.1,1\n\tc0,0-16.7-2.5-35,15.8l-42.3,42.3c-3.2,3.2-3.2,8.3,0,11.5l0,0L62.3,289z\"/>\n </svg>\n\n )\n}","import React from 'react';\r\nimport Card from '@material-ui/core/Card';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n card: {\r\n float: 'left',\r\n margin: '-20px 20px 0 15px',\r\n zIndex: 100,\r\n borderRadius: 3,\r\n },\r\n icon: {\r\n float: 'right',\r\n width: 54,\r\n height: 54,\r\n padding: 14,\r\n color: '#fff',\r\n }\r\n })\r\n);\r\n\r\n// style={{\r\n// width: 30,\r\n// height: 30,\r\n// handColor: '#f200dc',\r\n// wavyColor: '#f200dc'\r\n// }}\r\n\r\nconst CardIcon = ({ Icon, cardIcon, bgColor, style, ...rest }) => {\r\n const classes = useStyles(rest);\r\n \r\n return (\r\n <Card className={cardIcon ? cardIcon : classes.card} style={{ backgroundColor: bgColor }}>\r\n <Icon {...style}/>\r\n </Card>\r\n)};\r\n\r\nexport default CardIcon;\r\n","import React from 'react';\nimport Card from '@material-ui/core/Card';\n// import BoatIcon from '@material-ui/icons/DirectionsBoat';\nimport Typography from '@material-ui/core/Typography';\nimport { useTranslate } from 'react-admin';\nimport { ListItem, ListItemText, List } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n// import moment from 'moment';\n\nimport IconCitizen from './IconCitizen'\nimport CardIcon from './CardIcon';\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n width: '100%',\n maxWidth: 360,\n },\n main: {\n flex: '1',\n // marginRight: '1em',\n marginTop: 20,\n },\n main_mobile: {\n flex: '1',\n // marginRight: '1em',\n marginTop: 20,\n },\n card: {\n overflow: 'inherit',\n textAlign: 'right',\n padding: 16,\n minHeight: 52,\n },\n inline: {\n display: 'inline',\n },\n cardIcon: {\n float: 'left',\n margin: '-20px 20px 0 15px',\n zIndex: 100,\n borderRadius: 3,\n border: '2px solid #003bb0'\n }\n })\n);\n\nconst PublicNextLaunches = ({ value, mobile, ...rest }) => {\n const classes = useStyles(rest);\n const translate = useTranslate();\n return (\n <div className={mobile ? classes.main_mobile : classes.main}>\n <CardIcon style={{\n // width: 30,\n // height: 30,\n // handColor: '#000',\n // wavyColor: '#000'\n }}\n Icon={IconCitizen}\n bgColor=\"#c2cbe3\"\n cardIcon={classes.cardIcon}\n />\n <Card className={classes.card}>\n\n <Typography className={classes.title} color=\"textSecondary\">\n {translate('containers.dashboard.next_launches')}\n </Typography>\n\n <Typography type=\"headline\" component=\"h2\">\n {(value && value.length) || 0}\n </Typography>\n\n {value && value.map((launch, index) => (\n <List className={classes.root} key={index}>\n <ListItem\n className={classes.content}\n >\n <ListItemText\n primary={`${launch.name} - ${launch.description}`}\n secondary={\n <React.Fragment>\n <Typography\n component=\"span\"\n variant=\"body2\"\n className={classes.inline}\n color=\"textPrimary\"\n >\n {'Started: '}\n </Typography>\n {/* {moment(launch.begintimestamp).utc().format('DD-MM-YYYY, HH:mm:ss') + ' GMT'} */}\n {new Date(launch.begintimestamp).toLocaleString()}\n </React.Fragment>\n }\n />\n </ListItem>\n </List>\n ))}\n\n </Card>\n </div>\n )\n};\n\nexport default PublicNextLaunches;","import React from 'react';\nimport Card from '@material-ui/core/Card';\n// import BoatIcon from '@material-ui/icons/DirectionsBoat';\nimport Typography from '@material-ui/core/Typography';\n// import { Link } from 'react-router-dom';\nimport { useTranslate, Link } from 'react-admin';\nimport { ListItem, ListItemText, List/*, ListItemSecondaryAction*/ } from '@material-ui/core';\n// import moment from 'moment';\nimport IconCitizen from './IconCitizen'\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport CardIcon from './CardIcon';\n\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n width: '100%',\n maxWidth: 360,\n //backgroundColor: theme.palette.background.paper,\n },\n main: {\n flex: '1',\n marginRight: '1em',\n marginTop: 20,\n },\n main_mobile: {\n flex: '1',\n // marginRight: '1em',\n marginTop: 20,\n },\n card: {\n overflow: 'inherit',\n textAlign: 'right',\n padding: 16,\n minHeight: 52,\n },\n inline: {\n display: 'inline',\n },\n cardIcon: {\n float: 'left',\n margin: '-20px 20px 0 15px',\n zIndex: 100,\n borderRadius: 3,\n border: '2px solid #ff8400'\n }\n })\n);\n\nconst PublicPastLaunches = ({ value, mobile, ...rest }) => {\n\n const classes = useStyles(rest);\n const translate = useTranslate();\n\n return (\n <div className={mobile ? classes.main_mobile : classes.main}>\n <CardIcon style={{\n // width: 30,\n // height: 30,\n // handColor: '#000',\n // wavyColor: '#000'\n }}\n cardIcon={classes.cardIcon}\n Icon={IconCitizen}\n bgColor=\"#f0e499\"\n />\n <Card className={classes.card}>\n <Typography className={classes.title} color=\"textSecondary\">\n {translate('containers.dashboard.past_launches')}\n </Typography>\n\n <Typography type=\"headline\" component=\"h2\">\n {(value && value.length) || 0}\n </Typography>\n\n {value && value.map(launch => (\n <Link to={{\n pathname: `/history/${launch.id}`,\n launch: launch\n }}\n // params= { {launch} }\n key={`${launch.launch_id}`}\n >\n <List className={classes.root}>\n <ListItem button\n className={classes.content}\n >\n <ListItemText\n primary={`${launch.name} - ${launch.description}`}\n secondary={\n <React.Fragment>\n <Typography\n component=\"span\"\n variant=\"body2\"\n className={classes.inline}\n color=\"textPrimary\"\n >\n {'Started: '}\n </Typography>\n {/* {moment(launch.begintimestamp).utc().format('DD-MM-YYYY, HH:mm:ss') + ' GMT'} */}\n {new Date(launch.begintimestamp).toLocaleString()}\n <br />\n <Typography\n component=\"span\"\n variant=\"body2\"\n className={classes.inline}\n color=\"textPrimary\"\n >\n {'Ended: '}\n </Typography>\n {/* {moment(launch.endtimestamp).utc().format('DD-MM-YYYY, HH:mm:ss') + ' GMT'} */}\n {new Date(launch.endtimestamp).toLocaleString()}\n </React.Fragment>\n }\n />\n </ListItem>\n </List>\n </Link>\n ))}\n </Card>\n </div>\n )\n};\n\nexport default PublicPastLaunches;","import React from 'react';\nimport Card from '@material-ui/core/Card';\n// import BoatIcon from '@material-ui/icons/DirectionsBoat';\nimport Typography from '@material-ui/core/Typography';\nimport { useTranslate, Link } from 'react-admin';\nimport { ListItem, ListItemText, List } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n// import moment from 'moment';\nimport IconCitizen from './IconCitizen'\n\nimport CardIcon from './CardIcon';\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n width: '100%',\n maxWidth: 360,\n },\n main: {\n flex: '1',\n marginRight: '1em',\n marginTop: 20,\n },\n main_mobile: {\n flex: '1',\n // marginRight: '1em',\n marginTop: 20,\n },\n card: {\n overflow: 'inherit',\n textAlign: 'right',\n padding: 16,\n minHeight: 52,\n },\n inline: {\n display: 'inline',\n },\n cardIcon: {\n float: 'left',\n margin: '-20px 20px 0 15px',\n zIndex: 100,\n borderRadius: 3,\n border: '2px solid #17b000'\n }\n })\n);\n\nconst PublicActiveLaunches = ({ value, mobile, ...rest }) => {\n const classes = useStyles(rest);\n const translate = useTranslate();\n return (\n <div className={mobile ? classes.main_mobile : classes.main}>\n <CardIcon style={{\n // width: 30,\n // height: 30,\n // handColor: '#000',\n // wavyColor: '#000'\n }}\n Icon={IconCitizen}\n bgColor=\"#cce3c2\"\n cardIcon={classes.cardIcon}\n />\n <Card className={classes.card}>\n\n <Typography className={classes.title} color=\"textSecondary\">\n {translate('containers.dashboard.active_launches')}\n </Typography>\n\n <Typography type=\"headline\" component=\"h2\">\n {(value && value.length) || 0}\n </Typography>\n\n {value && value.map(launch => (\n <Link to={{\n pathname: `/live/${launch.launch_id}`,\n }} key={`${launch.launch_id}`}\n >\n <List className={classes.root}>\n <ListItem button\n className={classes.content}\n >\n <ListItemText\n primary={`${launch.name} - ${launch.description}`}\n secondary={\n <React.Fragment>\n <Typography\n component=\"span\"\n variant=\"body2\"\n className={classes.inline}\n color=\"textPrimary\"\n >\n {'Started: '}\n </Typography>\n {/* {moment(launch.begintimestamp).utc().format('DD-MM-YYYY, HH:mm:ss') + ' GMT'} */}\n {new Date(launch.begintimestamp).toLocaleString()}\n </React.Fragment>\n }\n />\n </ListItem>\n </List>\n </Link>\n ))}\n\n </Card>\n </div>\n )\n};\n\nexport default PublicActiveLaunches;","import { useState, useEffect, Fragment } from 'react';\r\nimport {\r\n Responsive,\r\n Title,\r\n showNotification,\r\n useQueryWithStore\r\n} from 'react-admin';\r\nimport { useDispatch } from 'react-redux'\r\n\r\nimport Welcome from './Welcome';\r\nimport PublicNextLaunches from './PublicNextLaunches';\r\nimport PublicPastLaunches from './PublicPastLaunches';\r\nimport PublicActiveLaunches from './PublicActiveLaunches';\r\n// import configuration from '../../configuration';\r\n\r\nimport { usePage } from '../../store/pageHook';\r\n\r\n\r\nconst styles = {\r\n flex: { display: 'flex', marginTop: '1em' },\r\n flexColumn: { display: 'flex', flexDirection: 'column' },\r\n leftCol: { flex: 1/*, marginRight: '1em'*/ },\r\n rightCol: { flex: 1, marginLeft: '1em' },\r\n singleCol: { marginTop: '2em', marginBottom: '2em' },\r\n welcome: { width: '100%' }\r\n};\r\n\r\nconst Dashboard = (props) => {\r\n const dispatch = useDispatch();\r\n\r\n const {campaignId} = usePage();\r\n\r\n const { loaded, error, data } = useQueryWithStore({\r\n type: 'getList',\r\n resource: `launches/campaign/${campaignId}`,\r\n });\r\n\r\n useEffect(() => {\r\n\r\n if (loaded && !error) {\r\n setLaunches(data);\r\n }\r\n else if (error) {\r\n dispatch(showNotification(\"http.fail_request\", 'warning'));\r\n }\r\n }, [loaded, error, data])\r\n\r\n const [past_launches, setPastLaunches] = useState([]);\r\n const [next_launches, setNextLaunches] = useState([]);\r\n const [active_launches, setActiveLaunches] = useState([]);\r\n\r\n const setLaunches = (payload) => {\r\n const _next_launches = [];\r\n const _past_launches = [];\r\n const _active_launches = [];\r\n const now = new Date().getTime();\r\n\r\n payload.forEach(l => {\r\n const endtimestamp = new Date(l.endtimestamp).getTime();\r\n const begintimestamp = new Date(l.begintimestamp).getTime();\r\n\r\n const launch = l;\r\n\r\n launch.key = l.id;\r\n launch.launch_id = l.id;\r\n launch.campaignId = l.Campaign.id;\r\n launch.campaignName = l.Campaign.name;\r\n\r\n if(begintimestamp > now) {\r\n _next_launches.push(launch);\r\n }\r\n else if (!endtimestamp || endtimestamp === null || endtimestamp > now) {\r\n _active_launches.push(launch);\r\n }\r\n else {\r\n _past_launches.push(launch);\r\n }\r\n })\r\n\r\n setNextLaunches(_next_launches);\r\n setActiveLaunches(_active_launches);\r\n setPastLaunches(_past_launches);\r\n }\r\n\r\n return (\r\n <Fragment>\r\n <Title title={process.env.REACT_APP_TITLE} />\r\n <Responsive\r\n small={\r\n <div>\r\n <div style={styles.flexColumn}>\r\n <div style={{ marginBottom: '2em' }}>\r\n <Welcome />\r\n </div>\r\n\r\n <div style={styles.flex}>\r\n <PublicActiveLaunches mobile={true} value={active_launches} />\r\n </div>\r\n \r\n <div style={styles.flex}>\r\n <PublicPastLaunches mobile={true} value={past_launches} />\r\n </div>\r\n\r\n <div style={styles.flex}>\r\n <PublicNextLaunches mobile={true} value={next_launches} />\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n medium={\r\n <div>\r\n <div style={styles.welcome}>\r\n <Welcome />\r\n </div>\r\n <div style={styles.flex}>\r\n <div style={styles.leftCol}>\r\n <div style={styles.flex}>\r\n <PublicActiveLaunches value={active_launches} />\r\n <PublicPastLaunches value={past_launches} />\r\n <PublicNextLaunches value={next_launches} />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n />\r\n </Fragment>\r\n );\r\n}\r\n\r\nexport default Dashboard;","import React from 'react';\r\nimport Card from '@material-ui/core/Card';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport CardMedia from '@material-ui/core/CardMedia';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n img: {\r\n // height: '10em',\r\n maxWidth: '100%',\r\n height: '12em'\r\n },\r\n imgBig: {\r\n // height: '10em',\r\n maxWidth: '100%',\r\n height: '18em'\r\n },\r\n })\r\n);\r\n\r\nconst mediaUrl = `https://www.ec-meloa.eu/img/banner/banner_3_imagem_1520698050.png`;\r\n\r\nconst Welcome = (props) => {\r\n const classes = useStyles(props);\r\n const isXSmall = useMediaQuery(theme =>\r\n theme.breakpoints.down('sm')\r\n );\r\n\r\n return (\r\n <Card>\r\n <CardMedia image={mediaUrl} className={isXSmall ? classes.img : classes.imgBig} />\r\n <CardContent>\r\n <Typography variant='body2' component='p'>\r\n A citizen science experiment by <b>MELOA Consortium</b>.\r\n <br />\r\n Select a public campaign from the list below:\r\n </Typography>\r\n </CardContent>\r\n </Card>\r\n )\r\n};\r\n\r\nexport default Welcome;","import * as React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { makeStyles } from '@material-ui/core/styles';\n\nconst useStyles = makeStyles(\n theme => ({\n link: {\n textDecoration: 'none',\n color: theme.palette.primary.main,\n },\n }),\n { name: 'CLink' }\n);\n\nconst Link = props => {\n const {\n to,\n children,\n classes: classesOverride,\n className,\n ...rest\n } = props;\n const classes = useStyles(props);\n return (\n <a\n href={to}\n className={classNames(classes.link, className)}\n {...rest}\n >\n {children}\n </a>\n );\n};\n\nLink.propTypes = {\n className: PropTypes.string,\n children: PropTypes.node,\n to: PropTypes.string,\n};\n\nexport default Link;","import React from 'react';\n\nexport default (props) =>{\n return (\n <svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" x=\"0px\" y=\"0px\"\n width={props.width ? props.width : 78} height={props.height ? props.height : 78} viewBox=\"0 0 300 300\" space=\"preserve\">\n \n <circle fill={props.wavyColor ? props.wavyColor : \"#E40000\"} cx=\"150\" cy=\"91\" r=\"74.4\"/>\n <path fill={props.handColor ? props.handColor : \"#F8BA95\"} d=\"M62.3,289c3.2,3.2,8.4,3.2,11.6,0c0,0,0,0,0,0l10.5-10.5c0,0,8.3-8.3,22.8-9.1c12.8-0.6,63.5-11.7,75.4-14.3\n\tc1.7-0.4,3.2-1.2,4.4-2.4l83.4-83.4c0,0,8-8-1.8-17.8s-17.8-1.1-17.8-1.1l-62,62c-1.4,1.4-3.3,2.3-5.2,2.4l-50.6,3.4\n\tc0,0-6.2,0.6-6.7-7.4c-0.4-6.2,6.9-6.9,6.9-6.9l38.7-3.6c0,0,12.8-0.4,11.2-14c-1.4-12.2-14.6-12.1-14.6-12.1l-73.1,1\n\tc0,0-16.7-2.5-35,15.8l-42.3,42.3c-3.2,3.2-3.2,8.3,0,11.5l0,0L62.3,289z\"/>\n </svg>\n\n )\n}","import React from 'react';\r\nimport Card from '@material-ui/core/Card';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\nconst useStyles = makeStyles(\r\n theme => ({\r\n card: {\r\n float: 'left',\r\n margin: '-20px 20px 0 15px',\r\n zIndex: 100,\r\n borderRadius: 3,\r\n },\r\n icon: {\r\n float: 'right',\r\n width: 54,\r\n height: 54,\r\n padding: 14,\r\n color: '#fff',\r\n }\r\n })\r\n);\r\n\r\n// style={{\r\n// width: 30,\r\n// height: 30,\r\n// handColor: '#f200dc',\r\n// wavyColor: '#f200dc'\r\n// }}\r\n\r\nconst CardIcon = ({ Icon, cardIcon, bgColor, style, ...rest }) => {\r\n const classes = useStyles(rest);\r\n \r\n return (\r\n <Card className={cardIcon ? cardIcon : classes.card} style={{ backgroundColor: bgColor }}>\r\n <Icon {...style}/>\r\n </Card>\r\n)};\r\n\r\nexport default CardIcon;\r\n","import React from 'react';\nimport Card from '@material-ui/core/Card';\n// import BoatIcon from '@material-ui/icons/DirectionsBoat';\nimport Typography from '@material-ui/core/Typography';\nimport { useTranslate } from 'react-admin';\nimport { ListItem, ListItemText, List } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n// import moment from 'moment';\nimport Link from '../../components/Link';\n\nimport IconCitizen from './IconCitizen'\nimport CardIcon from './CardIcon';\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n width: '100%',\n maxWidth: 360,\n },\n main: {\n flex: '1',\n // marginRight: '1em',\n marginTop: 20,\n },\n main_mobile: {\n flex: '1',\n // marginRight: '1em',\n marginTop: 20,\n },\n card: {\n overflow: 'inherit',\n textAlign: 'right',\n padding: 16,\n minHeight: 52,\n },\n inline: {\n display: 'inline',\n },\n cardIcon: {\n float: 'left',\n margin: '-20px 20px 0 15px',\n zIndex: 100,\n borderRadius: 3,\n border: '2px solid #003bb0'\n }\n })\n);\n\nconst PublicNextCampaigns = ({ value, mobile, ...rest }) => {\n const classes = useStyles(rest);\n const translate = useTranslate();\n return (\n <div className={mobile ? classes.main_mobile : classes.main}>\n <CardIcon style={{\n // width: 30,\n // height: 30,\n // handColor: '#000',\n // wavyColor: '#000'\n }}\n Icon={IconCitizen}\n bgColor=\"#c2cbe3\"\n cardIcon={classes.cardIcon}\n />\n <Card className={classes.card}>\n\n <Typography className={classes.title} color=\"textSecondary\">\n {translate('containers.dashboard.next_campaigns')}\n </Typography>\n\n <Typography type=\"headline\" component=\"h2\">\n {(value && value.length) || 0}\n </Typography>\n\n {value && value.map((campaign, index) => (\n <Link\n to={`${campaign.permlink}`}\n key={index}\n >\n <List className={classes.root} key={index}>\n <ListItem\n className={classes.content}\n >\n <ListItemText\n primary={`${campaign.name}`}\n secondary={\n <React.Fragment>\n <Typography\n component=\"span\"\n variant=\"body2\"\n className={classes.inline}\n color=\"textPrimary\"\n >\n {'Start date: '}\n </Typography>\n {/* {moment(campaign.begintimestamp).utc().format('DD-MM-YYYY, HH:mm:ss') + ' GMT'} */}\n {new Date(campaign.begindate).toLocaleDateString()}\n </React.Fragment>\n }\n />\n </ListItem>\n </List>\n </Link>\n ))}\n\n </Card>\n </div>\n )\n};\n\nexport default PublicNextCampaigns;","import React from 'react';\nimport Card from '@material-ui/core/Card';\n// import BoatIcon from '@material-ui/icons/DirectionsBoat';\nimport Typography from '@material-ui/core/Typography';\n// import { Link } from 'react-router-dom';\nimport { useTranslate } from 'react-admin';\nimport { ListItem, ListItemText, List/*, ListItemSecondaryAction*/ } from '@material-ui/core';\n// import moment from 'moment';\nimport IconCitizen from './IconCitizen'\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport CardIcon from './CardIcon';\n\nimport Link from '../../components/Link';\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n width: '100%',\n maxWidth: 360,\n //backgroundColor: theme.palette.background.paper,\n },\n main: {\n flex: '1',\n marginRight: '1em',\n marginTop: 20,\n },\n main_mobile: {\n flex: '1',\n // marginRight: '1em',\n marginTop: 20,\n },\n card: {\n overflow: 'inherit',\n textAlign: 'right',\n padding: 16,\n minHeight: 52,\n },\n inline: {\n display: 'inline',\n },\n cardIcon: {\n float: 'left',\n margin: '-20px 20px 0 15px',\n zIndex: 100,\n borderRadius: 3,\n border: '2px solid #ff8400'\n }\n })\n);\n\nconst PublicPastCampaigns = ({ value, mobile, ...rest }) => {\n\n const classes = useStyles(rest);\n const translate = useTranslate();\n\n return (\n <div className={mobile ? classes.main_mobile : classes.main}>\n <CardIcon style={{\n // width: 30,\n // height: 30,\n // handColor: '#000',\n // wavyColor: '#000'\n }}\n cardIcon={classes.cardIcon}\n Icon={IconCitizen}\n bgColor=\"#f0e499\"\n />\n <Card className={classes.card}>\n <Typography className={classes.title} color=\"textSecondary\">\n {translate('containers.dashboard.past_campaigns')}\n </Typography>\n\n <Typography type=\"headline\" component=\"h2\">\n {(value && value.length) || 0}\n </Typography>\n\n {value && value.map((campaign, index) => (\n <Link\n to={`${campaign.permlink}`}\n key={index}\n >\n <List className={classes.root}>\n <ListItem button\n className={classes.content}\n >\n <ListItemText\n primary={`${campaign.name}`}\n secondary={\n <React.Fragment>\n <Typography\n component=\"span\"\n variant=\"body2\"\n className={classes.inline}\n color=\"textPrimary\"\n >\n {'Start Date: '}\n </Typography>\n {/* {moment(campaign.begintimestamp).utc().format('DD-MM-YYYY, HH:mm:ss') + ' GMT'} */}\n {new Date(campaign.beginDate).toLocaleDateString()}\n </React.Fragment>\n }\n />\n </ListItem>\n </List>\n </Link>\n ))}\n </Card>\n </div>\n )\n};\n\nexport default PublicPastCampaigns;","import React from 'react';\nimport Card from '@material-ui/core/Card';\n// import BoatIcon from '@material-ui/icons/DirectionsBoat';\nimport Typography from '@material-ui/core/Typography';\nimport { useTranslate } from 'react-admin';\nimport { ListItem, ListItemText, List } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n// import moment from 'moment';\nimport IconCitizen from './IconCitizen'\nimport Link from '../../components/Link';\n\nimport CardIcon from './CardIcon';\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n width: '100%',\n maxWidth: 360,\n },\n main: {\n flex: '1',\n marginRight: '1em',\n marginTop: 20,\n },\n main_mobile: {\n flex: '1',\n // marginRight: '1em',\n marginTop: 20,\n },\n card: {\n overflow: 'inherit',\n textAlign: 'right',\n padding: 16,\n minHeight: 52,\n },\n inline: {\n display: 'inline',\n },\n cardIcon: {\n float: 'left',\n margin: '-20px 20px 0 15px',\n zIndex: 100,\n borderRadius: 3,\n border: '2px solid #17b000'\n }\n })\n);\n\nconst PublicActiveCampaigns = ({ value, mobile, ...rest }) => {\n const classes = useStyles(rest);\n const translate = useTranslate();\n return (\n <div className={mobile ? classes.main_mobile : classes.main}>\n <CardIcon style={{\n // width: 30,\n // height: 30,\n // handColor: '#000',\n // wavyColor: '#000'\n }}\n Icon={IconCitizen}\n bgColor=\"#cce3c2\"\n cardIcon={classes.cardIcon}\n />\n <Card className={classes.card}>\n\n <Typography className={classes.title} color=\"textSecondary\">\n {translate('containers.dashboard.active_campaigns')}\n </Typography>\n\n <Typography type=\"headline\" component=\"h2\">\n {(value && value.length) || 0}\n </Typography>\n\n {value && value.map((campaign, index) => (\n <Link\n to={`${campaign.permlink}`}\n key={index}\n >\n <List className={classes.root}>\n <ListItem button\n className={classes.content}\n >\n <ListItemText\n primary={`${campaign.name}`}\n secondary={\n <React.Fragment>\n <Typography\n component=\"span\"\n variant=\"body2\"\n className={classes.inline}\n color=\"textPrimary\"\n >\n {'Start date: '}\n </Typography>\n {/* {moment(campaign.begintimestamp).utc().format('DD-MM-YYYY, HH:mm:ss') + ' GMT'} */}\n {new Date(campaign.begindate).toLocaleDateString()}\n </React.Fragment>\n }\n />\n </ListItem>\n </List>\n </Link>\n ))}\n\n </Card>\n </div>\n )\n};\n\nexport default PublicActiveCampaigns;","import { useState, useEffect, Fragment } from 'react';\r\nimport {\r\n Responsive,\r\n Title,\r\n showNotification,\r\n useQueryWithStore\r\n} from 'react-admin';\r\nimport { useDispatch } from 'react-redux'\r\n\r\nimport Welcome from './Welcome';\r\nimport PublicNextCampaigns from './PublicNextCampaigns';\r\nimport PublicPastCampaigns from './PublicPastCampaigns';\r\nimport PublicActiveCampaigns from './PublicActiveCampaigns';\r\n\r\nconst styles = {\r\n flex: { display: 'flex', marginTop: '1em' },\r\n flexColumn: { display: 'flex', flexDirection: 'column' },\r\n leftCol: { flex: 1/*, marginRight: '1em'*/ },\r\n rightCol: { flex: 1, marginLeft: '1em' },\r\n singleCol: { marginTop: '2em', marginBottom: '2em' },\r\n welcome: { width: '100%' }\r\n};\r\n\r\nconst Dashboard = (props) => {\r\n const dispatch = useDispatch();\r\n\r\n const { loaded, error, data } = useQueryWithStore({\r\n type: 'getList',\r\n resource: `campaigns`,\r\n });\r\n\r\n useEffect(() => {\r\n\r\n if (loaded && !error) {\r\n setCampaigns(data);\r\n }\r\n else if (error) {\r\n dispatch(showNotification(\"http.fail_request\", 'warning'));\r\n }\r\n }, [loaded, error, data])\r\n\r\n const [past_campaigns, setPastCampaigns] = useState([]);\r\n const [next_campaigns, setNextCampaigns] = useState([]);\r\n const [active_campaigns, setActiveCampaigns] = useState([]);\r\n\r\n const setCampaigns = (payload) => {\r\n const _next_campaigns = [];\r\n const _past_campaigns = [];\r\n const _active_campaigns = [];\r\n const now = new Date().getTime();\r\n\r\n payload.forEach(c => {\r\n const endtimestamp = new Date(c.lastDate).getTime();\r\n const begintimestamp = new Date(c.firstDate).getTime();\r\n\r\n const campaign = c;\r\n\r\n campaign.key = c.id;\r\n campaign.campaignId = c.id;\r\n campaign.id = c.id;\r\n campaign.campaignName = c.name;\r\n campaign.beginDate = c.begindate;\r\n campaign.permlink = c.permlink;\r\n\r\n if (begintimestamp > now) {\r\n _next_campaigns.push(campaign);\r\n }\r\n else if (!endtimestamp || endtimestamp === null || endtimestamp > now) {\r\n _active_campaigns.push(campaign);\r\n }\r\n else {\r\n _past_campaigns.push(campaign);\r\n }\r\n })\r\n\r\n setNextCampaigns(_next_campaigns);\r\n setActiveCampaigns(_active_campaigns);\r\n setPastCampaigns(_past_campaigns);\r\n }\r\n\r\n return (\r\n <Fragment>\r\n <Title title={process.env.REACT_APP_TITLE} />\r\n <Responsive\r\n small={\r\n <div>\r\n <div style={styles.flexColumn}>\r\n <div style={{ marginBottom: '2em' }}>\r\n <Welcome />\r\n </div>\r\n\r\n <div style={styles.flex}>\r\n <PublicActiveCampaigns mobile={true} value={active_campaigns} />\r\n </div>\r\n\r\n <div style={styles.flex}>\r\n <PublicPastCampaigns mobile={true} value={past_campaigns} />\r\n </div>\r\n\r\n <div style={styles.flex}>\r\n <PublicNextCampaigns mobile={true} value={next_campaigns} />\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n medium={\r\n <div>\r\n <div style={styles.welcome}>\r\n <Welcome />\r\n </div>\r\n <div style={styles.flex}>\r\n <div style={styles.leftCol}>\r\n <div style={styles.flex}>\r\n <PublicActiveCampaigns value={active_campaigns} />\r\n <PublicPastCampaigns value={past_campaigns} />\r\n <PublicNextCampaigns value={next_campaigns} />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n />\r\n </Fragment>\r\n );\r\n}\r\n\r\nexport default Dashboard;","import L from 'leaflet'\nexport var ExtraMarkers = L.ExtraMarkers = {};\nExtraMarkers.version = L.ExtraMarkers.version = \"1.0.8\";\nExtraMarkers.Icon = L.ExtraMarkers.Icon = L.Icon.extend({\n options: {\n iconSize: [37, 49], // size of the icon\n shadowSize: [35, 16], // size of the shadow\n iconAnchor: [18, 45], // point of the icon which will correspond to marker's location\n shadowAnchor: [11, 12], // the same for the shadow\n popupAnchor: [0, -38], // point from which the popup should open relative to the iconAnchor\n \n \n // marker2.png\n // iconSize: [33, 44], // size of the icon\n // shadowSize: [35, 16], // size of the shadow\n // iconAnchor: [16, 41], // point of the icon which will correspond to marker's location\n // shadowAnchor: [11, 12], // the same for the shadow\n // popupAnchor: [0, -31], // point from which the popup should open relative to the iconAnchor\n \n \n // _marker.png\n // iconSize: [30, 44], // size of the icon\n // shadowSize: [35, 16], // size of the shadow\n // iconAnchor: [15, 41], // point of the icon which will correspond to marker's location\n // shadowAnchor: [11, 12], // the same for the shadow\n // popupAnchor: [0, -32], // point from which the popup should open relative to the iconAnchor\n \n \n className: \"\",\n prefix: \"\",\n extraClasses: \"\",\n shape: \"circle\",\n icon: \"\",\n innerHTML: \"\",\n markerColor: \"red\",\n svgBorderColor: \"#fff\",\n svgOpacity: 1,\n iconColor: \"#fff\",\n number: \"\",\n svg: false\n },\n initialize: function(options) {\n options = L.Util.setOptions(this, options);\n },\n createIcon: function() {\n var div = document.createElement(\"div\"),\n options = this.options;\n if (options.icon) {\n div.innerHTML = this._createInner();\n }\n if (options.innerHTML) {\n div.innerHTML = options.innerHTML;\n }\n // if (options.bgPos) {\n // div.style.backgroundPosition = -options.bgPos.x + \"px \" + -options.bgPos.y + \"px\";\n // }\n if (!options.svg) {\n this._setIconStyles(div, options.shape + \"-\" + options.markerColor);\n } else {\n this._setIconStyles(div, \"svg\");\n }\n return div;\n },\n _createInner: function() {\n var iconColorStyle = \"\",\n iconNumber = \"\",\n options = this.options;\n if (options.iconColor) {\n iconColorStyle = \"style='color: \" + options.iconColor + \"' \";\n }\n if (options.number) {\n iconNumber = \"number='\" + options.number + \"' \";\n }\n // if (options.svg) {\n // var svg = '<svg xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 69.529271 95.44922\" style=\"fill:' + options.markerColor + \";stroke:\" + options.svgBorderColor + \";fill-opacity:\" + options.svgOpacity + ';\" height=\"100%\" width=\"100%\" version=\"1.1\" xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"><g transform=\"translate(-139.52 -173.21)\"><path d=\"m174.28 173.21c-19.199 0.00035-34.764 15.355-34.764 34.297 0.007 6.7035 1.5591 12.813 5.7461 18.854l0.0234 0.0371 28.979 42.262 28.754-42.107c3.1982-5.8558 5.9163-11.544 6.0275-19.045-0.0001-18.942-15.565-34.298-34.766-34.297z\"/></g></svg>';\n // if (options.shape === \"square\") {\n // svg = '<svg xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 69.457038 96.523441\" style=\"fill:' + options.markerColor + \";stroke:\" + options.svgBorderColor + \";fill-opacity:\" + options.svgOpacity + ';\" height=\"100%\" width=\"100%\" version=\"1.1\" xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"><g transform=\"translate(-545.27 -658.39)\"><path d=\"m545.27 658.39v65.301h22.248l12.48 31.223 12.676-31.223h22.053v-65.301h-69.457z\"/></g></svg>';\n // }\n // if (options.shape === \"star\") {\n // svg = '<svg style=\"top:0; fill:' + options.markerColor + \";stroke:\" + options.svgBorderColor + \";fill-opacity:\" + options.svgOpacity + ';\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns=\"http://www.w3.org/2000/svg\" height=\"100%\" width=\"100%\" version=\"1.1\" xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" viewBox=\"0 0 77.690999 101.4702\"><g transform=\"translate(-101.15 -162.97)\"><g transform=\"matrix(1 0 0 1.0165 -65.712 -150.28)\"><path d=\"m205.97 308.16-11.561 11.561h-16.346v16.346l-11.197 11.197 11.197 11.197v15.83h15.744l11.615 33.693 11.467-33.568 0.125-0.125h16.346v-16.346l11.197-11.197-11.197-11.197v-15.83h-15.83l-11.561-11.561z\"/></g></g></svg>';\n // }\n // if (options.shape === \"penta\") {\n // svg = '<svg style=\"fill:' + options.markerColor + \";stroke:\" + options.svgBorderColor + \";fill-opacity:\" + options.svgOpacity + ';\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 71.550368 96.362438\" height=\"100%\" width=\"100%\" version=\"1.1\" xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"><g transform=\"translate(-367.08 -289.9)\"><path d=\"m367.08 322.5 17.236-32.604h36.151l18.164 32.25-35.665 64.112z\"/></g></svg>';\n // }\n // return svg + \"<i \" + iconNumber + iconColorStyle + \"class='\" + options.extraClasses + \" \" + options.prefix + \" \" + options.icon + \"'></i>\";\n // }\n return \"<i \" + iconNumber + iconColorStyle + \"class='\" + options.extraClasses + \" \" + options.prefix + \" \" + options.icon + \"'></i>\";\n },\n _setIconStyles: function(img, name) {\n var options = this.options,\n size = L.point(options[name === \"shadow\" ? \"shadowSize\" : \"iconSize\"]),\n anchor, leafletName;\n if (name === \"shadow\") {\n anchor = L.point(options.shadowAnchor || options.iconAnchor);\n leafletName = \"shadow\";\n } else {\n anchor = L.point(options.iconAnchor);\n leafletName = \"icon\";\n }\n if (!anchor && size) {\n anchor = size.divideBy(2, true);\n }\n img.className = \"leaflet-marker-\" + leafletName + \" extra-marker extra-marker-\" + name + \" \" + options.className;\n if (anchor) {\n img.style.marginLeft = -anchor.x + \"px\";\n img.style.marginTop = -anchor.y + \"px\";\n }\n if (size) {\n img.style.width = size.x + \"px\";\n img.style.height = size.y + \"px\";\n }\n },\n createShadow: function() {\n var div = document.createElement(\"div\");\n this._setIconStyles(div, \"shadow\");\n return div;\n }\n});\nExtraMarkers.icon = L.ExtraMarkers.icon = function(options) {\n return new L.ExtraMarkers.Icon(options);\n};","import {\n LayersControl as RLayersControl,\n TileLayer\n} from 'react-leaflet';\nimport { useRef, Fragment, cloneElement } from 'react';\n\nimport GoogleLayer from 'react-leaflet-google-layer';\nimport configuration from '../../configuration';\n\nconst zoomConfig = {\n maxNativeZoom: 19,\n maxZoom: 23,\n minZoom: 3\n}\n\nconst LayersControl = (props) => {\n const controlRef = useRef();\n\n let children;\n if (props.children) {\n children = cloneElement(props.children, { controlRef });\n }\n\n return (\n <Fragment>\n <RLayersControl position='topright' ref={controlRef}>\n <RLayersControl.BaseLayer checked name=\"Open Street Map\">\n <TileLayer\n attribution='© <a href=\"http://osm.org/copyright\">OpenStreetMap</a> contributors'\n url='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'\n maxNativeZoom={zoomConfig.maxNativeZoom}\n maxZoom={zoomConfig.maxZoom}\n minZoom={zoomConfig.minZoom}\n />\n </RLayersControl.BaseLayer>\n <RLayersControl.BaseLayer name=\"Open Street Map Black/White\">\n <TileLayer\n attribution='© <a href=\"http://osm.org/copyright\">OpenStreetMap</a> contributors'\n url='https://{s}.tiles.wmflabs.org/bw-mapnik/{z}/{x}/{y}.png'\n maxNativeZoom={zoomConfig.maxNativeZoom}\n maxZoom={zoomConfig.maxZoom}\n minZoom={zoomConfig.minZoom}\n />\n </RLayersControl.BaseLayer>\n <RLayersControl.BaseLayer name=\"ESRI Satellite\">\n <TileLayer\n attribution='Tiles © Esri — Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community'\n url='http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}'\n maxNativeZoom={zoomConfig.maxNativeZoom}\n maxZoom={zoomConfig.maxZoom}\n minZoom={zoomConfig.minZoom}\n />\n </RLayersControl.BaseLayer>\n <RLayersControl.BaseLayer name=\"Google Maps Satellite\">\n <GoogleLayer\n apiKey={configuration.MAP_GOOGLE_KEY}\n type='satellite'\n maxNativeZoom={zoomConfig.maxNativeZoom}\n maxZoom={zoomConfig.maxZoom}\n minZoom={zoomConfig.minZoom}\n />\n </RLayersControl.BaseLayer>\n\n\n {/* <RLayersControl.BaseLayer name=\"Google Maps Hybrid\">\n <GoogleLayer\n apiKey={configuration.MAP_GOOGLE_KEY}\n type='hybrid'\n maxNativeZoom={zoomConfig.maxNativeZoom}\n maxZoom={zoomConfig.maxZoom}\n minZoom={zoomConfig.minZoom}\n />\n </RLayersControl.BaseLayer> */}\n </RLayersControl>\n\n {children}\n </Fragment>\n );\n};\n\nexport default LayersControl;","import ReactDOM from 'react-dom';\nimport { useLeafletContext } from '@react-leaflet/core';\nimport L from 'leaflet';\nimport {useEffect} from 'react';\n\nconst CustomControl = (props) => {\n const context = useLeafletContext();\n\n L.Control.Button = L.Control.extend({\n onAdd: function (map) {\n const container = L.DomUtil.create('div', this.options.className);\n L.DomEvent.disableClickPropagation(container);\n ReactDOM.render(this.options.children, container);\n return container;\n },\n onRemove: function (map) {}\n });\n\n L.control.button = function (opts) {\n return new L.Control.Button(opts);\n }\n\n useEffect(() => {\n const container = context.layerContainer || context.map\n\n const control = L.control.button({...props});\n container.addControl(control)\n\n return () => {\n container.removeControl(control)\n }\n });\n\n return null;\n};\n\nexport default CustomControl;","import Button from '@material-ui/core/Button';\nimport CenterIcon from '@material-ui/icons/FilterCenterFocus';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { useLeafletContext } from '@react-leaflet/core';\nimport L from 'leaflet';\nimport Control from './LeafletControl';\n\nconst useStyles = makeStyles(theme => ({\n div: {\n background:'white',\n borderRadius: '4px'\n },\n button: {\n padding: 0,\n minHeight: 0,\n minWidth: 0,\n width: '34px',\n height: '34px',\n border: '2px solid rgba(0,0,0,0.4)',\n borderRadius: '4px'\n },\n icon: {\n fontSize: '18px',\n padding: '8px',\n color: 'black'\n }\n}));\n\nconst CenterControl = (props) => {\n const classes = useStyles();\n const context = useLeafletContext();\n\n const centerMapHandler = () => {\n const { map } = context;\n let latlngs = [];\n\n map.eachLayer(layer => {\n if ((layer instanceof L.Polyline) && (layer.getLatLngs().length > 0)) {\n latlngs = [...latlngs, ...layer.getLatLngs()];\n }\n });\n\n if (latlngs.length > 0) {\n map.fitBounds(latlngs);\n }\n };\n\n return (\n <Control position='topleft'>\n <div className={classes.div}>\n <Button \n disableRipple\n {...props}\n className={classes.button}\n onClick={centerMapHandler}\n >\n <CenterIcon className={classes.icon}/>\n </Button>\n </div>\n </Control>\n );\n};\n\nexport default CenterControl;","import { useReducer, useEffect } from 'react';\nimport Button from '@material-ui/core/Button';\nimport { makeStyles } from '@material-ui/core/styles';\nimport GpsOn from '@material-ui/icons/GpsFixed';\nimport GpsOff from '@material-ui/icons/GpsNotFixed';\nimport GpsOut from '@material-ui/icons/GpsOff';\nimport { useLeafletContext } from '@react-leaflet/core';\nimport L from 'leaflet';\nimport Control from './LeafletControl';\n\nconst useStyles = makeStyles(theme => ({\n div: {\n background:'white',\n borderRadius: '4px'\n },\n button: {\n padding: 0,\n minHeight: 0,\n minWidth: 0,\n width: '34px',\n height: '34px',\n border: '2px solid rgba(0,0,0,0.4)',\n borderRadius: '4px'\n },\n icon: {\n fontSize: '18px',\n padding: '8px',\n color: 'black'\n },\n locationIcon: {\n backgroundColor: '#4285F4',\n borderRadius: '50%',\n borderStyle: 'solid',\n borderWidth: '2px',\n borderColor: 'white',\n marginLeft: '-10px !important',\n marginTop: '-10px !important',\n width: '16px !important',\n height: '16px !important',\n\n }\n}));\n\nconst initialState = {\n marker: null,\n geoId: null,\n position: null,\n status: 0\n};\n\nconst locationReducer = (state, action) => {\n switch(action.type) {\n case 'LOCATION_UPDATE':\n return {\n ...state,\n position: action.payload.position,\n geoId: action.payload.geoId\n };\n case 'LOCATION_ON':\n return {\n ...state,\n status: 1\n };\n case 'LOCATION_MARKER':\n return {\n ...state,\n marker: action.payload.marker,\n };\n case 'LOCATION_OFF':\n return {\n ...state,\n status: 0\n };\n case 'LOCATION_CLEAN':\n return {\n ...state,\n marker: null,\n geoId: null,\n position: null,\n };\n case 'LOCATION_ERROR':\n return {\n ...state,\n marker: null,\n geoId: null,\n position: null,\n status: -1\n };\n default:\n throw new Error();\n }\n};\n\nconst LocationControl = (props) => {\n const classes = useStyles();\n const context = useLeafletContext();\n const [state, dispatch] = useReducer(locationReducer, initialState);\n const { map } = context;\n\n useEffect(() => {\n if (state.status === 1) {\n const geoId = navigator.geolocation.watchPosition(position => {\n dispatch({type: 'LOCATION_UPDATE', payload: {\n position: position,\n geoId: geoId\n }});\n }, _ => {\n dispatch({type: 'LOCATION_ERROR'});\n }, {\n enableHighAccuracy: false\n });\n } else {\n if (state.marker && state.geoId) {\n navigator.geolocation.clearWatch(state.geoId);\n map.removeLayer(state.marker);\n dispatch({type: 'LOCATION_CLEAN'});\n }\n }\n }, [state.status]);\n\n useEffect(() => {\n if (state.position !== null) {\n const { latitude, longitude, accuracy } = state.position.coords;\n let locationMarker;\n if(state.marker === null) {\n const innerCircle = L.marker([latitude, longitude], {\n icon: L.divIcon({className: classes.locationIcon})\n });\n const circle = L.circle([latitude, longitude], {\n opacity: 0.4,\n fillOpacity: .1,\n weight: 1,\n radius: accuracy\n });\n \n locationMarker = L.layerGroup([innerCircle, circle]).addTo(map);\n map.setView(new L.LatLng(latitude, longitude), 18);\n } else {\n locationMarker = state.marker;\n locationMarker.eachLayer((layer) => {\n if (layer instanceof L.Marker) {\n layer.setLatLng([latitude, longitude]);\n } else if (layer instanceof L.Circle) {\n layer.setLatLng([latitude, longitude]);\n layer.setRadius(accuracy);\n }\n });\n }\n dispatch({type: 'LOCATION_MARKER', payload: {marker: locationMarker}})\n }\n }, [state.position])\n\n const toggleLocation = () => {\n if (state.status === 0) {\n dispatch({type: 'LOCATION_ON'});\n } else {\n dispatch({type: 'LOCATION_OFF'});\n }\n };\n\n let icon;\n switch (state.status) {\n case 0:\n icon = <GpsOn className={classes.icon} />;\n break;\n case 1:\n icon = <GpsOff className={classes.icon} />;\n break;\n default:\n icon = <GpsOut className={classes.icon} />\n break;\n }\n\n return (\n <Control position='topleft'>\n <div className={classes.div}>\n <Button \n disableRipple\n {...props}\n className={classes.button}\n onClick={toggleLocation}\n >\n {icon}\n </Button>\n </div>\n </Control>\n );\n};\n\nexport default LocationControl;","import L from 'leaflet';\nL.MeasureControl = L.Control.extend({\n initialize(options = {}) {\n const defaultOptions = {\n position: 'topleft',\n formatOutput: output => `${output || ''}`,\n lineColor: 'black',\n lineWeight: 3,\n lineOpacity: 0.9,\n innerHtml: '⇢'\n };\n L.Util.setOptions(this, defaultOptions);\n L.Util.setOptions(this, options);\n },\n\n onAdd(map) {\n const className = 'leaflet-control-zoom leaflet-bar leaflet-control',\n container = L.DomUtil.create('div', className);\n this._createButton('leaflet-control-measure leaflet-bar-part leaflet-bar-part-top-and-bottom', container);\n return container;\n },\n\n azimuth(points) {\n\n const λ1 = points[0].lng, \n λ2 = points[1].lng, \n φ1 = points[0].lat,\n φ2 = points[1].lat;\n \n const tmp = Math.sin((λ2-λ1)*Math.PI/180) / ((Math.cos(φ1*Math.PI/180) * Math.tan(φ2*Math.PI/180)) - (Math.sin(φ1*Math.PI/180) * Math.cos((λ2-λ1)*Math.PI/180)))\n const B = Math.atan(tmp)*(180/Math.PI);\n \n let result = B;\n \n result = B < 0 ? B + 360 : B + 180;\n \n if(points[0].lng < points[1].lng) \n result = result < 180 ? result + 180 : result - 180; \n else if(points[0].lng === points[1].lng && points[0].lat <= points[1].lat) \n result = 0;\n \n return result;\n },\n \n\n _createButton: function (className, container) {\n const button = L.DomUtil.create('a', className, container);\n button.innerHTML = this.options.innerHtml;\n button.addEventListener('click', () => this._toogleMeasure());\n L.DomEvent.disableClickPropagation(button);\n },\n\n _toogleMeasure: function () {\n this._measuring = !this._measuring;\n if (this._measuring) {\n L.DomUtil.addClass(this._container, 'leaflet-control-measure-on');\n this._startMeasure();\n } else {\n L.DomUtil.removeClass(this._container, 'leaflet-control-measure-on');\n this._stopMeasure();\n }\n },\n\n _startMeasure: function () {\n this._oldCursor = this._map._container.style.cursor;\n this._map._container.style.cursor = 'crosshair';\n\n L.DomEvent.on(this._map, 'click', this._mouseClick, this);\n },\n\n _stopMeasure: function () {\n this._map._container.style.cursor = this._oldCursor;\n\n this._clear();\n\n L.DomEvent.off(this._map, 'click', this._mouseClick, this);\n },\n\n _mouseClick: function (e) {\n if (!e.latlng) {\n return;\n }\n\n this._draw(e);\n },\n\n _draw(e) {\n if (!this._start) {\n this._start = new L.marker(e.latlng).addTo(this._map);\n } else if (!this._end) {\n this._end = new L.marker(e.latlng).addTo(this._map);\n\n this._path = new L.Polyline([this._start.getLatLng(), this._end.getLatLng()], {\n color: this.options.lineColor,\n weight: this.options.lineWeight,\n opacity: this.options.lineOpacity,\n smoothFactor: 1\n }).addTo(this._map);\n \n let distance = e.latlng.distanceTo(this._start.getLatLng());\n let azimuth = this.azimuth([this._start.getLatLng(), this._end.getLatLng()])\n this._tooltip = this._createTooltip(e.latlng, this.options.formatOutput(distance, azimuth));\n } else {\n this._clear();\n this._draw(e);\n }\n },\n\n _clear() {\n if (this._start) {\n this._map.removeLayer(this._start);\n this._start = undefined;\n }\n\n if (this._end) {\n this._map.removeLayer(this._end);\n this._end = undefined;\n }\n\n if (this._path) {\n this._map.removeLayer(this._path);\n this._path = undefined;\n }\n\n if (this._tooltip) {\n this._map.removeLayer(this._tooltip);\n this._tooltip = undefined;\n }\n },\n\n _createTooltip: function (position, text) {\n var icon = L.divIcon({\n className: 'leaflet-measure-tooltip',\n iconAnchor: [-5, -5]\n });\n\n this.tooltip = L.marker(position, {\n icon: icon,\n clickable: false\n }).addTo(this._map);\n\n this.tooltip._icon.innerHTML = text;\n\n return this.tooltip;\n }\n});\n\nL.measureControl = options => new L.MeasureControl(options);\n","import MeasureControl from './MeasureControl';\n\nexport default MeasureControl;","import {useEffect} from 'react';\nimport ReactDOMServer from 'react-dom/server';\nimport { useLeafletContext } from '@react-leaflet/core';\nimport L from 'leaflet';\nimport MeasureIcon from '@material-ui/icons/Straighten';\n\nimport './leaflet-measure';\nimport './leaflet-measure.css';\n\nconst MeasureControl = (props) => {\n const context = useLeafletContext();\n\n const customProps = {\n ...props,\n lineColor: 'red', \n formatOutput: (distance, azimuth) => {\n let result = distance.toFixed(2) + ' m<br>' + (distance / 1852).toFixed(2) + ' M <br>' + azimuth.toFixed(2) + 'º'\n \n return result;\n },\n innerHtml: ReactDOMServer.renderToStaticMarkup(<div style={{display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100%'}}>\n <MeasureIcon style={{\n transform: 'rotate(-45deg)',\n fontSize: '18px'\n }}/>\n </div>)\n }\n\n useEffect(() => {\n const container = context.layerContainer || context.map\n\n const control = L.measureControl(customProps);\n container.addControl(control);\n\n return () => {\n container.removeControl(control)\n }\n });\n\n return null;\n};\n\nexport default MeasureControl;","import L from 'leaflet'\nL.TimelineSliderControl = L.Control.extend({\n initialize(timeline, options = {}) {\n const defaultOptions = {\n enablePlayButton: true,\n enableStepButtons: true,\n formatOutput: output => `${output || ''} UTC`,\n showTicks: true,\n position: 'bottomleft',\n speeds: [1, 2, 4, 8, 16],\n legend: '',\n speedsUnity: [{\n seconds: 1,\n text: '1s'\n }, {\n seconds: 5,\n text: '5s'\n }, {\n seconds: 10,\n text: '10s'\n }, {\n seconds: 30,\n text: '30s'\n }, {\n seconds: 60,\n text: '1m'\n }, {\n seconds: 300,\n text: '5m'\n }, {\n seconds: 600,\n text: '10m'\n }, {\n seconds: 1800,\n text: '30m'\n }, {\n seconds: 3600,\n text: '1h'\n }, {\n seconds: 7200,\n text: '2h'\n }\n ]\n };\n\n this.timeline = timeline;\n this.interval = timeline.getIntervalValues();\n this.stepSize = 1000;\n this.speedUnityTime = defaultOptions['speedsUnity'][0];\n this.speedTime = defaultOptions['speeds'][0];\n L.Util.setOptions(this, defaultOptions);\n L.Util.setOptions(this, options);\n },\n update(timeline, options = {}) {\n this.timeline = timeline;\n this.interval = timeline.getIntervalValues();\n\n L.Util.setOptions(this, options);\n },\n \n getTimelineTime() {\n return this.data;\n },\n _createDOM() {\n const classes = [\n 'leaflet-control-layers',\n 'leaflet-control-layers-expanded',\n 'leaflet-timeline-control',\n ];\n const container = L.DomUtil.create('div', classes.join(' '));\n this.container = container;\n\n L.DomEvent.disableClickPropagation(this.container);\n\n const sliderCtrlC = L.DomUtil.create(\n 'div',\n 'sldr-ctrl-container',\n container,\n );\n\n if ((this.options.enablePlayButton) || (this.options.enableStepButtons)) {\n const buttonContainer = L.DomUtil.create(\n 'div',\n 'button-container',\n sliderCtrlC,\n );\n this._makeButtons(buttonContainer);\n }\n\n this._makeOutput(sliderCtrlC);\n this._makeSlider(container);\n\n if (this.options.showTicks) {\n this._buildDataList(container);\n } else {\n this._buildLegend(container);\n }\n\n },\n _buildLegend(container) {\n\n this._legend = L.DomUtil.create('legend', '', container);\n this._legend.innerHTML = this.options.legend;\n },\n _makeButton(container, name) {\n const button = L.DomUtil.create('button', name, container);\n button.addEventListener('click', () => this[name]());\n L.DomEvent.disableClickPropagation(button);\n },\n _makeSpeedButton(container) {\n const button = L.DomUtil.create('button', 'speed', container);\n button.innerHTML = this.speedUnityTime.text;\n\n button.addEventListener('click', () => this.speed(button));\n L.DomEvent.disableClickPropagation(button);\n },\n _makeButtons(container) {\n if (this.options.enableStepButtons)\n this._makeButton(container, 'prev');\n\n if (this.options.enablePlayButton) {\n this._makeButton(container, 'play');\n this._makeButton(container, 'pause');\n }\n\n if (this.options.enableStepButtons)\n this._makeButton(container, 'next');\n // Speed button\n this._makeSpeedButton(container);\n },\n _makeSlider(container) {\n const slider = L.DomUtil.create('input', 'time-slider', container);\n slider.type = 'range';\n slider.min = this.interval.min || 0;\n slider.max = this.interval.max || 0;\n slider.value = this.interval.min || 0;\n slider.step = 1000;\n this._timeSlider = slider;\n // register events using leaflet for easy removal\n L.DomEvent.on(this._timeSlider, 'change input', this._sliderChanged, this);\n L.DomEvent.on(this._timeSlider, 'pointerdown mousedown touchstart', this._disableMapDragging, this);\n L.DomEvent.on(document, 'pointerup mouseup touchend', this._enableMapDragging, this);\n },\n _makeOutput(container) {\n this._output = L.DomUtil.create('output', 'time-text', container);\n this._output.innerHTML = this.options.formatOutput(this.interval.min);\n },\n _buildDataList(container) {\n this._datalist = L.DomUtil.create('datalist', '', container);\n const idNum = Math.floor(Math.random() * 1000000);\n this._datalist.id = `timeline-datalist-${idNum}`;\n this._timeSlider.setAttribute('list', this._datalist.id);\n this._rebuildDataList();\n },\n _rebuildDataList() {\n const datalist = this._datalist;\n while (datalist.firstChild) {\n datalist.removeChild(datalist.firstChild);\n }\n const datalistSelect = L.DomUtil.create('select', '', this._datalist);\n this.interval.steps.forEach((time) => {\n L.DomUtil.create('option', '', datalistSelect).value = time;\n });\n },\n _disableMapDragging() {\n this.map.dragging.disable();\n },\n _enableMapDragging() {\n this.map.dragging.enable();\n },\n _sliderChanged(e) {\n const time = parseFloat(+e.target.value, 10);\n this.time = time;\n this.map.time = time;\n\n if (this._output) {\n this._output.innerHTML = this.options.formatOutput(time);\n }\n\n this.timeline.updateDisplayedLayers(time);\n },\n _nearestStep(time, mode) {\n let lastTime = this.interval.steps[0];\n for (let i = 0; i < this.interval.steps.length; i++) {\n if (this.interval.steps[i] >= time) {\n if (mode === -1)\n return lastTime;\n\n if (this.interval.steps[i] !== time)\n return this.interval.steps[i];\n }\n lastTime = this.interval.steps[i];\n }\n return lastTime;\n },\n prev() {\n this.pause();\n const prevTime = this._nearestStep(this.time, -1);\n this._timeSlider.value = prevTime;\n this.setTime(prevTime);\n },\n play(fromSynced) {\n clearTimeout(this._timer);\n \n let miliseconds = 0;\n if(this.speedUnityTime.seconds > 10) {\n this._timeSlider.value = parseFloat(this._timeSlider.value, 10) + (this.speedUnityTime.seconds * 0.05 * this.stepSize);\n this.setTime(this._timeSlider.value);\n miliseconds = 50;\n } else {\n this._timeSlider.value = parseFloat(this._timeSlider.value, 10) + this.stepSize;\n this.setTime(this._timeSlider.value);\n miliseconds = 1000 / this.speedUnityTime.seconds;\n }\n \n if (parseFloat(this._timeSlider.value, 10) === this.interval.max) {\n this._playing = false;\n this.container.classList.remove('playing');\n } else {\n this._playing = true;\n this.container.classList.add('playing');\n this._timer = setTimeout(() => this.play(true), miliseconds);\n }\n if (this.syncedControl && !fromSynced) {\n this.syncedControl.map(function (control) {\n return control.play(true);\n });\n }\n },\n pause(fromSynced) {\n clearTimeout(this._timer);\n this._playing = false;\n this.container.classList.remove('playing');\n\n if (this.syncedControl && !fromSynced) {\n this.syncedControl.map(function (control) {\n return control.pause(true);\n })\n }\n },\n next(pause = true) {\n pause && this.pause();\n const nextTime = this._nearestStep(this.time, 1);\n this._timeSlider.value = nextTime;\n this.setTime(nextTime)\n },\n speed(button) {\n const speeds = this.options.speedsUnity;\n let i = speeds.indexOf(this.speedUnityTime);\n if (i >= speeds.length - 1) {\n i = 0;\n } else {\n i++;\n }\n this.speedUnityTime = speeds[i];\n button.innerHTML = this.speedUnityTime.text;\n\n if (this._playing) {\n this.pause();\n this.play();\n }\n },\n setTime(time) {\n this.map.time = time;\n if (this._timeSlider) this._timeSlider.value = +time;\n this._sliderChanged({\n type: 'change',\n target: { value: time },\n });\n },\n onAdd(map) {\n this.map = map;\n this._createDOM();\n this.setTime(this.interval.min);\n return this.container;\n },\n onRemove() {\n L.DomEvent.off(this._timeSlider, 'change input', this._sliderChanged, this);\n L.DomEvent.off(this._timeSlider, 'pointerdown mousedown touchstart', this._disableMapDragging, this);\n L.DomEvent.off(document, 'pointerup mouseup touchend', this._enableMapDragging, this);\n },\n\n});\n\nexport default L.timelineSliderControl = (timeline, options) =>\n new L.TimelineSliderControl(timeline, options);\n","import L from 'leaflet';\n\nL.Timeline = L.GeoJSON.extend({\n interval: null,\n initialize(geojson, controlLayers, options = {}, setCenter) {\n\n const defaultOptions = {\n marker: false,\n style: function (feature) {\n return feature.style\n }\n };\n L.GeoJSON.prototype.initialize.call(this, null, options);\n\n L.Util.setOptions(this, defaultOptions);\n L.Util.setOptions(this, options);\n\n // this.data = geojson;\n this.data = {\n features: [],\n type: \"FeatureCollection\"\n };\n\n this.layersKeys = [];\n\n let data = JSON.parse(JSON.stringify(geojson));\n\n this.data.features = data.features.map(feature => {\n feature.geometry.coordinates.reverse();\n return feature;\n });\n\n this.controlLayers = controlLayers;\n //Get min, max and keys from geojson\n this.interval = this._getInterval();\n this.marker = L.marker;\n\n this._buildLayers();\n\n let latlngs = [];\n\n this.getLayers().forEach(layer => {\n if (layer.feature &&\n layer.feature.type === 'Feature' &&\n layer.feature.geometry &&\n layer.feature.geometry.type === 'GeometryCollection' &&\n layer.feature.geometry.geometries &&\n layer.feature.geometry.geometries.length > 0 &&\n layer.feature.geometry.geometries[0].type === 'LineString' &&\n layer.feature.geometry.geometries[0].coordinates &&\n layer.feature.geometry.geometries[0].coordinates.length > 0\n ) {\n latlngs.push(layer.feature.geometry.geometries[0].coordinates[0]);\n return;\n }\n })\n\n this.setCenter = setCenter;\n\n if(latlngs.length > 0) {\n setCenter(latlngs);\n }\n\n },\n // update(geojson, controlLayers, options = {}) {\n // console.log(\"Timeline update\")\n // this.data = {\n // features: [],\n // type: \"FeatureCollection\"\n // };\n // let data = JSON.parse(JSON.stringify(geojson));\n\n // this.data.features = data.features.map(feature => {\n // feature.geometry.coordinates.reverse();\n // return feature;\n // });\n\n // let geojson2 = this.convertPointTrace(this.data, this.interval.min);\n\n // geojson2.features = geojson2.features.filter(({ properties }) => !this.layersKeys.includes(properties.key))\n // if (geojson2.features.length > 0)\n // this.addData(geojson2)\n\n // this.eachLayer(layer => {\n // if (!this.layersKeys.includes(layer.feature.properties.key)) {\n // if (!layer.feature.properties.multiLineId) {\n // this._buildMarker(layer);\n // }\n\n // this.controlLayers.addOverlay(layer, layer.feature.properties.key);\n // this.layersKeys.push(layer.feature.properties.key);\n // }\n // });\n\n // this.updateDisplayedLayers(this.currentTime);\n // },\n // get interval from each feature->properties.timestamp\n _getInterval() {\n let times = [];\n const features = this.data.features;\n for (var i in features) {\n if (times.indexOf(features[i].properties.timestamp) < 0)\n times.push(features[i].properties.timestamp);\n }\n times = times.sort();\n\n return {\n 'steps': times,\n 'min': times[0],\n 'max': times[times.length - 1],\n };\n },\n _buildLayers() {\n let geojson = this.convertPointTrace(this.data, this.interval.min);\n if (geojson) {\n this.addData(geojson)\n }\n\n this.eachLayer(layer => {\n if (!layer.feature.properties.multiLineId) {\n this._buildMarker(layer);\n }\n this.controlLayers.addOverlay(layer, layer.feature.properties.key);\n this.layersKeys.push(layer.feature.properties.key);\n });\n },\n _buildMarker(layer) {\n let marker;\n let coordinates;\n layer.getLayers().forEach(l => {\n if (l instanceof L.Marker) {\n marker = l;\n } else {\n coordinates = l.getLatLngs();\n }\n });\n\n if ((this.options.marker !== false) && (coordinates.length > 0)/* && !layer.feature.properties.id.includes(\"invalid\")*/) {\n if (marker) {\n marker.setLatLng(coordinates[coordinates.length - 1]);\n if (this.options.markerPopup)\n marker.setPopupContent(this.options.markerPopup(layer.feature.properties));\n } else {\n if (typeof (this.options.marker) !== \"boolean\")\n this.marker = this.options.marker;\n\n let mrk = this.marker(coordinates[coordinates.length - 1], layer.feature.properties);\n if (this.options.markerPopup)\n mrk.bindPopup(this.options.markerPopup(layer.feature.properties));\n layer.addLayer(mrk);\n }\n } else {\n if (marker) {\n layer.removeLayer(marker);\n }\n }\n },\n getIntervalValues() {\n return this.interval;\n },\n // This function must be improved\n updateDisplayedLayers(time) {\n this.currentTime = time;\n let geometries = {};\n let properties = {};\n let geojson = this.convertPointTrace(this.data, time);\n if (geojson) {\n geojson.features.forEach(feature => {\n geometries[feature.properties.id] = feature.geometry.geometries[0];\n properties[feature.properties.id] = feature.properties;\n });\n }\n\n this.eachLayer(layer => {\n layer.getLayers().forEach(l => {\n if (!(l instanceof L.Marker)) {\n // Clone coordinates\n let geometry = geometries[layer.feature.properties.id].coordinates;\n // Update properties\n layer.feature.properties = properties[layer.feature.properties.id];\n // Update Geometry\n l.setLatLngs(geometry);\n // Rebuild Marker\n if (!layer.feature.properties.multiLineId) {\n this._buildMarker(layer);\n }\n }\n });\n });\n },\n // Must be a GeometryCollection in order to build a LayerGroup, otherwise it will create a layer and will not allow to add the Marker\n convertPointTrace(geojson, time) {\n let elements = {};\n //TODO: CHANGE\n if (geojson.features) {\n geojson.features.forEach(feature => {\n if (!elements[feature.properties.id]) {\n elements[feature.properties.id] = {\n properties: {\n id: feature.properties.id,\n key: feature.properties.key,\n },\n polyline: [],\n multilineCoordinates: {},\n };\n\n if (feature.style)\n elements[feature.properties.id]['style'] = feature.style;\n if (feature.properties.multiLineId)\n elements[feature.properties.id].properties.multiLine = true;\n }\n\n if (feature.properties.timestamp <= time) {\n if (feature.properties.multiLineId) {\n if (!elements[feature.properties.id].multilineCoordinates[feature.properties.multiLineId])\n elements[feature.properties.id].multilineCoordinates[feature.properties.multiLineId] = [];\n\n elements[feature.properties.id].multilineCoordinates[feature.properties.multiLineId].push(feature.geometry.coordinates);\n }\n else {\n elements[feature.properties.id]['polyline'].push(feature.geometry.coordinates);\n }\n\n elements[feature.properties.id]['properties'] = feature.properties;\n }\n });\n\n let features = [];\n Object.keys(elements).forEach((i) => {\n let feature = {\n type: \"Feature\",\n geometry: {\n \"type\": \"GeometryCollection\",\n geometries: [] //[{ type: \"LineString\", coordinates: elements[i].polyline }]\n },\n properties: elements[i].properties\n };\n\n\n // if(Object.keys(elements[i].multiline).length > 0) {\n if (feature.properties.multiLineId) {\n let coordinates = [];\n feature.properties.multiLineIds = Object.keys(elements[i].multilineCoordinates);\n Object.keys(elements[i].multilineCoordinates).forEach(identifier => coordinates.push(elements[i].multilineCoordinates[identifier]));\n feature.geometry.geometries.push({\n type: \"MultiLineString\", coordinates: coordinates\n });\n }\n else {\n feature.geometry.geometries.push({ type: \"LineString\", coordinates: elements[i].polyline });\n }\n\n if (elements[i])\n feature['style'] = elements[i].style;\n\n features.push(feature);\n });\n\n return {\n type: \"FeatureCollection\",\n features: features\n };\n } else {\n return null;\n }\n },\n onRemove(map) {\n this.eachLayer(layer => {\n map.removeLayer(layer);\n this.controlLayers.removeLayer(layer);\n })\n }\n});\n\nexport default L.timeline = (geojson, controlLayers, options, setCenter) => new L.Timeline(geojson, controlLayers, options, setCenter);\n","import { useEffect } from 'react';\nimport { useLeafletContext } from '@react-leaflet/core';\nimport { useMap } from 'react-leaflet';\n\nimport TimeControl from './timeline-control';\nimport Timeline from './timeline';\nimport './timeline.css';\n\n/*\n Interested links\n http://danielmontague.com/projects/easyButton.js/v1/examples/\n https://stackoverflow.com/questions/62947152/react-leaflet-v3-custom-control\n\n\n*/\n\n\n// https://stackoverflow.com/questions/62947152/react-leaflet-v3-custom-control\n// TODO: update layers!\n\nconst TimelineControl = (props) => {\n const context = useLeafletContext();\n const map = useMap();\n\n // const [container, setContainer] = useState(undefined);\n // const [control, setControl] = useState(undefined);\n // const [timeline, setTimeline] = useState(undefined);\n\n\n // useEffect(() => {\n // let _container;\n // const controlLayers = props.controlRef && props.controlRef.current;\n // if (!container) {\n // _container = context.layerContainer || context.map;\n\n // let _timeline;\n // let _control;\n\n // if (controlLayers) {\n // _timeline = Timeline(props.geoJSON, controlLayers, {...props.timelineOptions}, (...a) => map.setView(...a));\n // _control = TimeControl(_timeline, props.timecontrolOptions);\n\n // _container.addControl(_timeline);\n // _container.addControl(_control);\n // }\n\n // setContainer(_container);\n // setTimeline(_timeline);\n // setControl(_control);\n // }\n // else {\n // container.removeControl(timeline);\n // container.removeControl(control);\n\n // timeline.update(props.geoJSON, controlLayers, props.timelineOptions);\n // control.update(timeline, props.timecontrolOptions);\n // }\n // }, [props]);\n\n // useEffect(() => () => {\n // console.log(\"TimeLine Effect\", timeline, control)\n // if (timeline) {\n // container.removeControl(timeline);\n // // timeline.removeFrom(map);\n // } \n // if (control)\n // container.removeControl(control);\n // });\n\n\n // useEffect(() => {\n // console.log(\"TimeLine Update\")\n // // let _container;\n // // const controlLayers = props.controlRef && props.controlRef.current;\n // // if (!container) {\n // // _container = context.layerContainer || context.map;\n\n // // let _timeline;\n // // let _control;\n\n // // if (controlLayers) {\n // // _timeline = Timeline(props.geoJSON, controlLayers, {...props.timelineOptions}, (...a) => map.setView(...a));\n // // _control = TimeControl(_timeline, props.timecontrolOptions);\n\n // // _container.addControl(_timeline);\n // // _container.addControl(_control);\n // // }\n\n // // setContainer(_container);\n // // setTimeline(_timeline);\n // // setControl(_control);\n // // }\n // // else {\n // // container.removeControl(timeline);\n // // container.removeControl(control);\n\n // // timeline.update(props.geoJSON, controlLayers, props.timelineOptions);\n // // control.update(timeline, props.timecontrolOptions);\n // // }\n // }, [props]);\n\n\n useEffect(() => {\n const container = context.layerContainer || context.map;\n const controlLayers = props.controlRef && props.controlRef.current;\n\n const _timeline = Timeline(props.geoJSON, controlLayers, {...props.timelineOptions}, (latlngs) => map.fitBounds(latlngs, { padding: [100, 100], maxZoom: 15 }));\n const _control = TimeControl(_timeline, props.timecontrolOptions);\n\n container.addControl(_control);\n container.addControl(_timeline);\n\n return () => {\n container.removeControl(_control);\n container.removeControl(_timeline);\n };\n });\n\n return null;\n};\n\nexport default TimelineControl;","import { useEffect, useState, useRef } from 'react';\nimport { useMap } from 'react-leaflet';\nimport L from 'leaflet';\n\nconst ReallineControl = ({ realtime, controlOptions, controlRef }) => {\n const map = useMap();\n const groupLayers = useRef(); // arry of group layers => reaname to groupLayers\n\n const [layersSerialNumber, setLayersSerialNumber] = useState({});\n const [started, setStarted] = useState(false); // Zoom\n \n const controlLayers = controlRef && controlRef.current;\n // console.log(\"ZOOM\", map.getZoom())\n /*\n layersSerialNumber = {\n [serialNumber]: {\n marker_id,\n polyline_id,\n group\n }\n }\n */\n useEffect(() => {\n\n const _layersSerialNumber = {};\n groupLayers.current = realtime.map((equipment) => {\n const serialNumber = equipment.wavy.id;\n\n if (!layersSerialNumber[serialNumber]) { // create layer group\n const new_layer = createLayerGroup(serialNumber, equipment);\n _layersSerialNumber[serialNumber] = new_layer;\n return new_layer.group;\n }\n else {\n const { group, marker_id, polyline_id } = layersSerialNumber[serialNumber];\n\n if (equipment.position.length !== group.getLayer(polyline_id).getLatLngs().length) { // update layer group\n const path = equipment.position.map((pos) => pos.geometry.coordinates.slice().reverse());\n const popup = controlOptions.markerPopup({ id: serialNumber, ...equipment.wavy.last_transmission });\n\n group.getLayer(marker_id).setLatLng(path[path.length - 1]).bindPopup(popup);\n group.getLayer(polyline_id).setLatLngs(path);\n\n _layersSerialNumber[serialNumber] = { ...layersSerialNumber[serialNumber], ...group };\n }\n\n return group;\n }\n });\n\n setLayersSerialNumber({ ...layersSerialNumber, ..._layersSerialNumber });\n\n if (!started)\n setStarted(true);\n\n }, [realtime]);\n\n useEffect(() => {\n if (started) { // Zoom\n let latlngs = [];\n map.eachLayer(layer => {\n if ((layer instanceof L.Polyline) && (layer.getLatLngs().length > 0)) {\n latlngs = [...latlngs, ...layer.getLatLngs()];\n }\n });\n \n if (latlngs.length > 0) {\n map.fitBounds(latlngs, { padding: [100, 100], maxZoom: 15 });\n }\n }\n }, [started]);\n\n const createLayerGroup = (serialNumber, equipment) => {\n const path = equipment.position.map((pos) => pos.geometry.coordinates.slice().reverse());\n const popup = controlOptions.markerPopup({ id: serialNumber, ...equipment.wavy.last_transmission });\n const marker = controlOptions.marker(path[path.length - 1], equipment.wavy).bindPopup(popup);\n const polyline = L.polyline(path, { color: equipment.position[0].style.color });\n\n // const multiPoint = L.geoJSON(); // TODO: multipoint\n\n const group = L.layerGroup([marker]).addLayer(polyline);\n controlLayers.addOverlay(group, serialNumber).addTo(map);\n group.addTo(map);\n\n return { group, marker_id: group.getLayerId(marker), polyline_id: group.getLayerId(polyline) };\n }\n\n useEffect(() => {\n groupLayers.current = [];\n\n return () => {\n groupLayers.current.forEach((group) => {\n controlLayers.removeLayer(group);\n group.removeFrom(map);\n })\n }\n }, []);\n\n return null;\n};\n\nexport default ReallineControl;\n","import { useEffect } from 'react';\nimport { MapContainer, ScaleControl } from 'react-leaflet';\nimport moment from 'moment';\n\nimport './leaflet-extra-markers/js/leaflet.extra-markers.min.js';\nimport './leaflet-extra-markers/css/leaflet.extra-markers.min.css';\nimport L from 'leaflet';\n\nimport LayersControl from './LayersControl';\nimport CenterControl from './Controls/CenterControl';\nimport LocationControl from './Controls/LocationControl';\nimport MeasureControl from './Controls/MeasureControl';\nimport Timeline from './Timeline';\n\nimport 'leaflet/dist/leaflet.css';\nimport marker from 'leaflet/dist/images/marker-icon.png';\nimport marker2x from 'leaflet/dist/images/marker-icon-2x.png';\nimport markerShadow from 'leaflet/dist/images/marker-shadow.png';\n// import RealtimeControl from './RealtimeControl.js';\nimport RealtimeControlLine from './RealtimeControlLine.js';\n// import MarkerCluster from './MarkerCluster.js';\n\nconst Map = (props) => {\n\n const timelineControlOptions = {\n timelineOptions: {\n\n // marker: (coordinates, properties) => {\n // console.log(\"properties\", properties)\n // let marker = L.marker(coordinates, {\n // icon: L.icon({\n // iconUrl: my_marker,\n // shadowUrl: my_marker_shadow,\n\n // iconSize: [30, 44], // size of the icon\n // shadowSize: [35, 16], // size of the shadow\n // iconAnchor: [15, 41], // point of the icon which will correspond to marker's location\n // shadowAnchor: [11, 12], // the same for the shadow\n // popupAnchor: [0, -32], // point from which the popup should open relative to the iconAnchor\n // number: properties.id,\n // })\n // });\n // return marker;\n // },\n // marker: (coordinates, properties) => {\n // // properties.id = 'WO200';\n // // console.log(\"properties\", properties)\n // let marker = L.marker(coordinates, {\n // icon: L.ExtraMarkers.icon({\n // icon: properties.id.length > 4 ? 'fb-number' : 'fa-number',\n // markerColor: 'blue',\n // prefix: 'fa',\n // number: properties.id.length > 4 ? `${properties.id.substr(0, 2)}\\n${properties.id.substr(2, properties.id.length)}` : properties.id,\n // })\n // });\n // return marker;\n // },\n\n marker: (coordinates, properties) => {\n // properties.id = 'WO200';\n let marker = L.marker(coordinates, {\n icon: L.ExtraMarkers.icon({\n icon: properties.id.length > 4 ? 'fb-number' : 'fa-number',\n markerColor: 'blue',\n prefix: 'fa',\n number: `${properties.id.substr(0, 2)}\\n${properties.id.substr(2, properties.id.length)}`,\n }),\n id: properties.id\n });\n return marker;\n },\n markerPopup: function (properties) {\n let popup = `<h3>${properties.id}</h3>`;\n if (properties.timestamp) {\n popup += `<div>time: ${moment(properties.timestamp).utc().format('DD-MM-YYYY HH:mm:ss')} UTC</div>`\n }\n const hiddenProperties = ['gpstime', 'timestamp', 'position', 'properties', 'serialNumber', 'id', 'key'];\n Object.keys(properties).map((key) => {\n if (!hiddenProperties.includes(key) && properties[key]) {\n return popup += `<div>${key}: ${properties[key]}</div>`;\n }\n return null;\n });\n\n return popup;\n },\n },\n timecontrolOptions: {\n legend: props.launch ? props.launch.description : '',\n showTicks: false,\n speeds: [1, 2, 4, 8, 16, 32, 64],\n formatOutput: (date) => {\n return `${moment(date).utc().format('DD-MM-YYYY HH:mm:ss')} UTC`;\n }\n }\n };\n\n useEffect(() => {\n delete L.Icon.Default.prototype._getIconUrl;\n\n L.Icon.Default.mergeOptions({\n iconRetinaUrl: marker2x,\n iconUrl: marker,\n shadowUrl: markerShadow\n });\n }, []);\n\n return (\n <MapContainer\n style={{ width: '100%', height: '100vh - 48px' }}\n center={[15, 0]}\n zoom={3}\n >\n <LayersControl>\n {\n (props.timeline && props.geoJSON && <Timeline geoJSON={props.geoJSON} {...timelineControlOptions} />) ||\n (props.realtime && props.realtime.length > 0 && <RealtimeControlLine realtime={props.realtime} controlOptions={timelineControlOptions.timelineOptions} />)\n // (props.realtime && props.realtime.length > 0 && <MarkerCluster markers={props.realtime} controlOptions={timelineControlOptions.timelineOptions}/>)\n }\n </LayersControl>\n <ScaleControl />\n {props.controlCenter && <CenterControl />}\n {props.controlLocation && <LocationControl />}\n {props.controlMeasure && <MeasureControl />}\n\n {props.children}\n\n </MapContainer>\n );\n};\n\nMap.defaultProps = {\n controlCenter: true,\n controlLocation: false,\n controlMeasure: true,\n timeline: false,\n}\n\nexport default Map;","import {\n Dialog,\n DialogContent,\n DialogTitle,\n Divider,\n IconButton,\n makeStyles\n} from '@material-ui/core'\n\nimport CloseIcon from '@material-ui/icons/Close'\n\nconst useStyles = makeStyles(theme => ({\n titleDiv: {\n display: 'flex',\n justifyContent: 'space-between'\n },\n closeButton: {\n marginTop: '0.5em',\n marginRight: '0.5em'\n },\n paper: {\n overflowY: 'hidden',\n }\n}));\n\nconst SimpleModal = ({ children, footer, maxWidth, onClose, onEntering, open, title, scroll }) => {\n const classes = useStyles();\n\n return (\n <Dialog\n classes={{ paper: classes.paper }}\n paper={classes.paper}\n onClose={() => onClose()}\n onEntering={onEntering}\n fullWidth\n scroll={scroll || 'paper'}\n maxWidth={maxWidth || false}\n open={open}\n >\n <div className={classes.titleDiv}>\n <DialogTitle>{title}</DialogTitle>\n <IconButton classes={{ root: classes.closeButton }} onClick={() => onClose()}>\n <CloseIcon />\n </IconButton>\n </div>\n <Divider />\n <DialogContent>\n {children}\n </DialogContent>\n {footer}\n </Dialog>\n );\n};\n\nexport default SimpleModal;","import { useState, useEffect } from 'react';\nimport Button from '@material-ui/core/Button';\nimport { ViewList } from '@material-ui/icons';\nimport {\n ListItem,\n ListItemText,\n List,\n makeStyles,\n Typography\n} from '@material-ui/core';\n\nimport { useMap } from 'react-leaflet';\nimport { useSelector } from 'react-redux';\nimport L from 'leaflet';\n\nimport {\n useTranslate\n} from 'react-admin';\nimport Modal from '../../components/Modal';\nimport Control from '../../components/Map/Controls/LeafletControl';\n\n// import moment from 'moment';\n\nconst useStyles = makeStyles(theme => ({\n content: { padding: 0 },\n titleDiv: {\n display: 'flex',\n justifyContent: 'space-between'\n },\n closeButton: {\n marginTop: '0.5em',\n marginRight: '0.5em'\n },\n inline: {\n display: 'inline',\n },\n right: {\n float: 'right',\n }\n}));\n\nconst OverviewControl = (props) => {\n const classes = useStyles();\n const translate = useTranslate();\n const map = useMap();\n\n const [open2, setOpen] = useState(false);\n const [times, setTimes] = useState({});\n\n const observations = useSelector((state) => state.live_map);\n\n const selectdEquipment = (id) => {\n map.eachLayer(l => {\n if (l instanceof L.Marker && l.options.id === id) {\n l.openPopup();\n map.setView(l.getLatLng(), 20)\n setOpen(false);\n }\n });\n }\n\n useEffect(() => {\n const interval_id = setInterval(() => {\n updateTimes();\n }, 1000);\n\n return () => {\n clearInterval(interval_id);\n }\n }, []);\n\n useEffect(() => {\n updateTimes();\n }, [observations]);\n\n const updateTimes = () => {\n const _times = {};\n const now = new Date();\n\n observations.forEach((equipment) => {\n const serialNumber = equipment.wavy.id;\n const { timestamp } = equipment.wavy.last_transmission;\n const seconds = Math.ceil(Math.abs(now - new Date(timestamp)) / 1000);\n \n const minutes = Math.trunc(seconds / 60);\n const hours = Math.trunc(seconds / 3600);\n\n \n _times[serialNumber] = {\n seconds,\n final: hours > 0 ? `${Math.round(seconds / 3600)}h` : minutes > 0 ? `${Math.round(seconds / 60)}m` : `${seconds}s`\n }\n\n // _times[serialNumber].seconds = seconds;\n // _times[serialNumber].final = hours > 0 ? `${hours}h` : minutes > 0 ? `${minutes}m` : `${seconds}s`;\n });\n\n setTimes({ ...times, ..._times });\n }\n\n // TODO: translation withou results and title\n return <>\n <Control position=\"topright\" className=\"leaflet-bar\">\n <div>\n <Button\n style={{\n padding: 0,\n minHeight: 0,\n minWidth: 0,\n background: 'white'\n }}\n onClick={() => setOpen(true)}\n >\n <ViewList style={{ fontSize: '15px', padding: '8px', color: 'black' }} />\n </Button>\n </div>\n </Control>\n <Modal\n classes={classes}\n open={open2}\n onClose={() => setOpen(false)}\n maxWidth='xs'\n title={translate('containers.live.overview')}\n >\n <List>\n {observations.length > 0 ? observations.map(({ wavy }) => {\n // const { properties } = position[position.length-1];\n return times[wavy.id] ? <ListItem button onClick={() => selectdEquipment(wavy.id)} key={wavy.id} divider>\n <ListItemText\n primary={wavy.id}\n secondary={\n <>\n <Typography component=\"span\" className={classes.inline} color=\"textSecondary\">\n {wavy.last_transmission.bat}\n </Typography>\n <Typography component=\"span\" className={classes.right} color=\"textSecondary\">\n {times[wavy.id].final}\n </Typography>\n </>\n }\n />\n </ListItem> : null;\n\n })\n : <Typography>{translate('ra.navigation.no_results')}</Typography>}\n </List>\n </Modal>\n </>\n}\n\nexport default OverviewControl;","import { useEffect, useState } from 'react';\nimport {\n Title,\n // useTranslate,\n fetchStart,\n fetchEnd,\n showNotification\n} from 'react-admin';\nimport io from 'socket.io-client';\nimport { useParams, useHistory } from 'react-router-dom';\nimport { useSelector, useDispatch } from 'react-redux';\n// import MapIcon from '@material-ui/icons/Map';\nimport dataFetch from '../../providers/dataFetch';\nimport LeafletMap from '../../components/Map/Map';\nimport configuration from '../../configuration';\nimport { fetchOldObservations, liveObservations } from '../../store/actions/liveMap';\nimport OverviewControl from './OverviewControl';\n\n\nconst LiveMap = (props) => {\n const dispatch = useDispatch();\n const history = useHistory();\n \n const { id } = useParams();\n \n const [launch, setLaunch] = useState(false);\n const [loaded, setLoaded] = useState(false);\n \n const observations = useSelector((state) => state.live_map);\n useEffect(() => {\n\n dispatch(fetchStart());\n dataFetch('GET', `/launches/${id}`)\n .then(data => {\n setLaunch(data);\n return dataFetch('GET', `/realtime/launch/${id}`)\n })\n .then(data => {\n dispatch(fetchOldObservations(data));\n setLoaded(true);\n })\n .catch(err => {\n // if (err.code === 'MODEL_NOT_FOUND') {\n // history.replace('/');\n // } \n // else {\n dispatch(showNotification('ra.page.error', 'warning'));\n setTimeout(() => history.replace('/'), 1500);\n // }\n })\n .finally(_ => dispatch(fetchEnd()));\n\n const socket = io(configuration.URL, {\n transports: ['websocket'/*, 'polling', 'flashsocket'*/],\n path: '/publicws'\n });\n\n socket.on('connect', () => {\n socket.emit('enter', { room: 'launch', id });\n });\n\n socket.on('error', (error) => {\n console.log(\"Socket error\", error);\n });\n\n socket.on(`launch_${id}`, (data) => {\n dispatch(liveObservations(data));\n });\n\n return () => {\n socket.disconnect();\n }\n }, []);\n\n return (\n <div style={{ display: 'flex', flex: '1' }}>\n <Title title={(launch && launch.name) || ' '/* 'Wrong launch'*/} />\n <LeafletMap controlLocation={true} controlMeasure={true} realtime={loaded && observations} >\n {loaded && <OverviewControl /> }\n </LeafletMap>\n </div>\n );\n};\n\nexport default LiveMap;","import { useEffect, useState } from 'react';\nimport {\n Title,\n // useTranslate,\n fetchStart,\n fetchEnd,\n showNotification\n} from 'react-admin';\nimport { useParams, useHistory } from 'react-router-dom';\nimport { useSelector, useDispatch } from 'react-redux';\n\nimport LeafletMap from '../../components/Map/Map';\nimport dataFetch from '../../providers/dataFetch';\nimport { fetchObservations } from '../../store/actions/historyMap';\n\nconst Map = (props) => {\n // const translate = useTranslate();\n const history = useHistory();\n const dispatch = useDispatch();\n\n const { id } = useParams();\n\n const [timeline, setTimeline] = useState(false);\n const [launch, setLaunch] = useState(false);\n\n const observations = useSelector((state) => state.history_map.observations);\n\n useEffect(() => {\n dispatch(fetchStart());\n dataFetch('GET', `/launches/${id}`)\n .then(data => {\n setLaunch(data);\n return dataFetch('GET', `/observations/launch/${id}`)\n })\n\n .then(data => {\n dispatch(fetchObservations(data));\n data.length === 0 ?\n dispatch(showNotification('containers.history.no_data')) :\n setTimeline(true);\n })\n .catch(err => {\n // if (err.code === 'MODEL_NOT_FOUND') {\n // history.replace('/');\n // }\n // else {\n dispatch(showNotification('ra.page.error', 'warning'));\n setTimeout(() => history.replace('/'), 1500);\n // }\n })\n .finally(_ => dispatch(fetchEnd()));\n }, []);\n\n\n return (\n <div style={{ display: 'flex', flex: '1' }}>\n <Title title={(launch && launch.name) || ' '/* 'Wrong launch'*/} />\n <LeafletMap controlLocation={true} controlMeasure={true} timeline={timeline} launch={launch} geoJSON={observations} />\n </div>\n );\n};\n\nexport default Map;","import * as React from 'react';\nimport PropTypes from 'prop-types';\nimport { makeStyles } from '@material-ui/core/styles';\nimport classnames from 'classnames';\n// import CircularProgress from '@material-ui/core/CircularProgress';\n\nconst useStyles = makeStyles(\n theme => ({\n container: {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n [theme.breakpoints.up('md')]: {\n height: '100%',\n },\n [theme.breakpoints.down('lg')]: {\n height: '100vh',\n marginTop: '-3em',\n },\n },\n icon: {\n width: '9em',\n height: '9em',\n },\n message: {\n textAlign: 'center',\n fontFamily: 'Roboto, sans-serif',\n opacity: 0.5,\n margin: '0 1em',\n },\n }),\n { name: 'RaLoading' }\n);\n\nconst Loading = props => {\n const {\n className,\n loadingPrimary = 'Error',\n loadingSecondary = 'Campaign not Found',\n } = props;\n const classes = useStyles(props);\n return (\n <div className={classnames(classes.container, className)}>\n <div className={classes.message}>\n {/* <CircularProgress className={classes.icon} color=\"primary\" /> */}\n <h1>{loadingPrimary}</h1>\n <div>{loadingSecondary}</div>\n </div>\n </div>\n );\n};\n\nLoading.propTypes = {\n classes: PropTypes.object,\n className: PropTypes.string,\n loadingPrimary: PropTypes.string,\n loadingSecondary: PropTypes.string,\n};\n\nLoading.defaultProps = {\n loadingPrimary: 'Error',\n loadingSecondary: 'Campaign not Found',\n};\n\nexport default Loading;","import { useEffect } from 'react';\nimport { useHistory } from 'react-router-dom';\n\nexport default (props) => {\n const history = useHistory();\n\n useEffect(() => {\n history.push('/');\n }, []);\n\n return null;\n};\n\n","import React, { useEffect } from 'react';\nimport { Admin, Resource, Loading } from 'react-admin';\nimport { Route } from 'react-router-dom';\nimport { createBrowserHistory } from \"history\";\n\nimport {\n // authProvider, \n dataProvider,\n i18nProvider,\n dataFetch\n} from './providers';\n\nimport Layout from './components/UI/Layout';\nimport history_map_reducer from './store/reducers/historyMap';\nimport live_map_reducer from './store/reducers/liveMap';\nimport page_reducer from './store/reducers/page';\nimport Dashboard from './containers/dashboard';\nimport DashboardAll from './containers/dashboardAll';\nimport {\n HistoryMap,\n LiveMap\n} from './containers';\n\nimport Error from './Error';\nimport CatchAll from './CatchAll';\n\nimport './App.css';\n\nimport { usePage, useSetCampaign, useSetPage } from './store/pageHook';\n\nconst customRoutes = [\n <Route exact path=\"/live/:id\" component={LiveMap} />,\n <Route exact path=\"/history/:id\" component={HistoryMap} />,\n];\n\nconst resources = [\n <Resource key={'launches'} name={'launches'} />\n];\n\nconst App = () => {\n const history = createBrowserHistory();\n\n const { page, campaignId } = usePage();\n\n const setPage = useSetPage();\n const setCampaign = useSetCampaign();\n\n useEffect(() => {\n if (page) {\n dataFetch('GET', `/campaign/id/${page}`)\n .then(data => {\n if (!data || !data.id ) {\n setCampaign({id: -1});\n } else {\n // dispatch(showNotification('ra.page.error', 'warning'));\n setCampaign(data);\n }\n })\n .catch(error => {\n console.log(error)\n setCampaign({id: -1});\n })\n } else if (typeof page === 'string') {\n setCampaign({id: -2});\n } else if (page !== undefined) {\n setCampaign({id: -1});\n }\n }, [page]);\n\n useEffect(() => {\n if (campaignId === -1) {\n setTimeout(() => {\n history.replace('/');\n setCampaign({id: undefined});\n setPage(undefined);\n }, 1500);\n }\n }, [campaignId]);\n\n useEffect(() => {\n const _page = history.location.pathname.replace(/ /g, '').replace(/\\//g, '').toLocaleLowerCase();\n setPage(_page);\n }, [history]);\n\n\n return (\n campaignId === -1 ?\n <Error />\n :\n campaignId === undefined ?\n <Loading loadingPrimary='Loading' loadingSecondary='We are validating the campaign' />\n :\n <Admin\n disableTelemetry\n dataProvider={dataProvider}\n i18nProvider={i18nProvider}\n layout={Layout}\n customReducers={{ history_map: history_map_reducer, live_map: live_map_reducer, page: page_reducer }}\n customRoutes={customRoutes}\n dashboard={campaignId === -2 ? DashboardAll : Dashboard}\n catchAll={CatchAll}\n >\n {resources}\n </Admin>\n\n );\n}\n\nexport default App;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\n// import reportWebVitals from './reportWebVitals';\nimport { PageProvider } from './store/pageHook';\n\nReactDOM.render(\n // <React.StrictMode>\n\n <PageProvider>\n <App />\n </PageProvider>,\n // </React.StrictMode>,\n document.getElementById('root')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\n// reportWebVitals();\n"],"sourceRoot":""}