diff --git a/account/.env b/account/.not-env
similarity index 100%
rename from account/.env
rename to account/.not-env
diff --git a/account/server/index.js b/account/server/index.js
index 0a2e732..9e785bd 100644
--- a/account/server/index.js
+++ b/account/server/index.js
@@ -36,17 +36,9 @@ const isDev = process.env.NODE_ENV === "development"
-var backend_server = process.env['BACKEND_SERVER'] != null ? process.env['BACKEND_SERVER'] : 'https://api.openmhz.com';
-var frontend_server = process.env['FRONTEND_SERVER'] != null ? process.env['FRONTEND_SERVER'] : 'https://openmhz.com';
-var media_server = process.env['MEDIA_SERVER'] != null ? process.env['MEDIA_SERVER'] : 'https://media.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
-var socket_server = process.env['SOCKET_SERVER'] != null ? process.env['SOCKET_SERVER'] : 'wss://api.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
-var admin_server = process.env['ADMIN_SERVER'] != null ? process.env['ADMIN_SERVER'] : 'https://admin.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
-var account_server = process.env['ACCOUNT_SERVER'] != null ? process.env['ACCOUNT_SERVER'] : 'https://account.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
-var site_name = process.env['SITE_NAME'] != null ? process.env['SITE_NAME'] : "OpenMHz";
-const proPlanValue = process.env['PRO_PLAN'] != null ? process.env['PRO_PLAN'] : 10;
-const freePlanValue = process.env['FREE_PLAN'] != null ? process.env['FREE_PLAN'] : 0;
-const proPlanPrice = process.env['PRO_PLAN_PRICE'] != null ? process.env['PRO_PLAN_PRICE'] : 15;
-const freePlanPrice = process.env['FREE_PLAN_PRICE'] != null ? process.env['FREE_PLAN_PRICE'] : 0;
+var frontend_server = process.env['REACT_APP_FRONTEND_SERVER'] != null ? process.env['REACT_APP_FRONTEND_SERVER'] : 'https://openmhz.com';
+var account_server = process.env['REACT_APP_ACCOUNT_SERVER'] != null ? process.env['REACT_APP_ACCOUNT_SERVER'] : 'https://account.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
+var admin_server = process.env['REACT_APP_ADMIN_SERVER'] != null ? process.env['REACT_APP_ADMIN_SERVER'] : 'https://admin.openmhz.com'; //'https://s3.amazonaws.com/robotastic';
// -------------------------------------------
diff --git a/admin/.env b/admin/.not-env
similarity index 100%
rename from admin/.env
rename to admin/.not-env
diff --git a/frontend/.eslintcache b/frontend/.eslintcache
index 7da1b68..ef89f2a 100644
--- a/frontend/.eslintcache
+++ b/frontend/.eslintcache
@@ -1 +1 @@
-[{"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/ListCalls.js":"1","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/call-actions.js":"2","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/System/ListSystemsContainer.js":"3","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/CallPlayer.js":"4","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Group/group-constants.js":"5","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/SupportModal.js":"6","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/FilterModal.js":"7","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/query-string.js":"8","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/CalendarModal.js":"9","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/redux-router/configureStore.js":"10","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Talkgroups/talkgroup-actions.js":"11","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Group/group-reducer.js":"12","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/MediaPlayer.js":"13","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/GroupModal.js":"14","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Group/group-actions.js":"15","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/redux-router/reducers.js":"16","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/System/SystemCard.js":"17","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/CalendarModalContainer.js":"18"},{"size":1249,"mtime":1609596364896,"results":"19","hashOfConfig":"20"},{"size":9179,"mtime":1609597700043,"results":"21","hashOfConfig":"20"},{"size":277,"mtime":1545362103911,"results":"22","hashOfConfig":"20"},{"size":18156,"mtime":1609597871834,"results":"23","hashOfConfig":"20"},{"size":151,"mtime":1545362103908,"results":"24","hashOfConfig":"20"},{"size":1325,"mtime":1591209153088,"results":"25","hashOfConfig":"20"},{"size":4437,"mtime":1560856294173,"results":"26","hashOfConfig":"20"},{"size":362,"mtime":1609596675259,"results":"27","hashOfConfig":"20"},{"size":1778,"mtime":1609597248589,"results":"28","hashOfConfig":"20"},{"size":759,"mtime":1609425817988,"results":"29","hashOfConfig":"20"},{"size":2433,"mtime":1609597717050,"results":"30","hashOfConfig":"20"},{"size":1395,"mtime":1545362103908,"results":"31","hashOfConfig":"20"},{"size":4251,"mtime":1609599087987,"results":"32","hashOfConfig":"20"},{"size":2023,"mtime":1551754660116,"results":"33","hashOfConfig":"20"},{"size":1747,"mtime":1609597708479,"results":"34","hashOfConfig":"20"},{"size":595,"mtime":1609596047661,"results":"35","hashOfConfig":"20"},{"size":2045,"mtime":1609520570000,"results":"36","hashOfConfig":"20"},{"size":763,"mtime":1545362103896,"results":"37","hashOfConfig":"20"},{"filePath":"38","messages":"39","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},"1du4mf8",{"filePath":"40","messages":"41","errorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"42"},{"filePath":"43","messages":"44","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"45"},{"filePath":"46","messages":"47","errorCount":6,"warningCount":13,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"48","messages":"49","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"50","messages":"51","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"52","messages":"53","errorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"54","messages":"55","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"56","messages":"57","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"58"},{"filePath":"59","messages":"60","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"61","messages":"62","errorCount":0,"warningCount":7,"fixableErrorCount":0,"fixableWarningCount":0,"source":"63","usedDeprecatedRules":"45"},{"filePath":"64","messages":"65","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"66","messages":"67","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"68","messages":"69","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"70","messages":"71","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"45"},{"filePath":"72","messages":"73","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"74","messages":"75","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"76","messages":"77","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/ListCalls.js",["78","79"],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/call-actions.js",["80","81","82"],"import axios from \"axios\";\n\nimport * as types from \"./call-constants\";\nimport { push } from 'connected-react-router';\n\nconst FETCH_SUCCESS_STATISTIC = \"FETCH_SUCCESS_STATISTIC\"\n\nfunction beginFetchCallInfo() {\n return { type: types.FETCH_CALL_INFO };\n}\n\nfunction fetchCallInfoSuccess(data) {\n return { type: types.FETCH_SUCCESS_CALL_INFO,\n data };\n}\n\nfunction fetchCallInfoError(data) {\n return { type: types.FETCH_ERROR_CALL_INFO,\n data };\n}\n\nfunction prependCall() {\n return { type: types.PREPEND_CALL };\n}\n\nfunction beginAddStar() {\n return { type: types.ADD_STAR };\n}\n\nfunction addStarSuccess(data) {\n return { type: types.ADD_STAR_SUCCESS, data };\n}\n\nfunction addStarError(data) {\n return { type: types.ADD_STAR_ERROR, data };\n}\n\nfunction beginFetchCall() {\n return { type: types.FETCH_CALL };\n}\n\nfunction fetchCallSuccess(data) {\n return { type: types.FETCH_SUCCESS_CALL,\n data };\n}\n\n\n\nfunction fetchOlderCallSuccess(data) {\n return { type: types.FETCH_SUCCESS_OLDER_CALL,\n data };\n}\n\nfunction fetchNewerCallSuccess(data) {\n return { type: types.FETCH_SUCCESS_NEWER_CALL,\n data };\n}\n\nfunction fetchCallError(data) {\n return { type: types.FETCH_ERROR_CALL,\n data };\n}\n\n\nexport function changeUrl(url) {\n return dispatch => {\n dispatch(push(url));\n };\n}\n\n// Example of an Async Action Creator\n// http://redux.js.org/docs/advanced/AsyncActions.html\n\nfunction shouldFetchCalls(state, subreddit) {\n return true;\n if ((!state.call.items) || (state.call.items.length <1)) {\n return true\n } else if (state.call.isWaiting) {\n return false\n } else {\n return false\n }\n}\n\n\n\n\nfunction buildUrlParams(a) {\n return Object.keys(a).map(function(k) {\n return encodeURIComponent(k) + '=' + encodeURIComponent(a[k])\n }).join('&')\n}\n\nfunction buildCallUrl(state, date, direction) {\n var params = {};\n var url = \"\";\n\n\n if ((typeof direction === 'string') && (typeof date === 'number')) {\n url = url + '/' + direction;\n params[\"time\"] = date;\n } else {\n if (state.call.filterDate){\n url = url + '/older'\n params[\"time\"] = state.call.filterDate;\n }\n }\n if (state.call.filterStarred) {\n params[\"filter-starred\"] = true;\n }\n switch(state.call.filterType) {\n case 1:\n params[\"filter-type\"] = \"group\";\n params[\"filter-code\"] = state.call.filterGroupId;\n break;\n case 2:\n params[\"filter-type\"] = \"talkgroup\";\n params[\"filter-code\"] = state.call.filterTalkgroups;\n break;\n default:\n case 0:\n }\n/*\n\n if (this.filterCode != \"\") {\n params[\"filter-code\"] = this.filterCode;\n }\n\n if (this.filterType == this.FilterType.Group) {\n params[\"filter-type\"] = \"group\";\n params[\"filter-name\"] = this.filterName;\n }\n\n if (this.filterType == this.FilterType.Talkgroup) {\n params[\"filter-type\"] = \"talkgroup\";\n }\n\n if (this.filterType == this.FilterType.Unit) {\n params[\"filter-type\"] = \"unit\";\n }\n\n*/\n // url = startUp.backend_server + \"/\" + startUp.shortName.toLowerCase() + \"/calls\" + url + '?' + buildUrlParams(params);\n url = process.env.REACT_APP_BACKEND_SERVER + \"/\" + state.call.shortName + \"/calls\" + url + '?' + buildUrlParams(params);\n console.log(\"Trying to fetch data from this url: \" + url);\n return url;\n}\n\nexport function fetchNewerCalls( timestamp) {\n return (dispatch, getState) => {\n const state = getState();\n if (shouldFetchCalls(state)) {\n dispatch(beginFetchCall());\n const url = buildCallUrl(state, timestamp, \"newer\")\n return axios\n .get(url)\n .then(response => {\n if ((response.data) && (response.data.calls.length >0)) {\n var data = {shortName: state.call.shortName, calls: response.data.calls}\n dispatch(fetchNewerCallSuccess(data));\n } else {\n dispatch(fetchCallError());\n let registerMessage = response.data.message;\n return registerMessage;\n }\n })\n .catch(response => {\n if (response instanceof Error) {\n // Something happened in setting up the request that triggered an Error\n console.log(\"Error\", response.message);\n }\n });\n };\n};\n}\n\n\nexport function fetchOlderCalls( timestamp) {\n return (dispatch, getState) => {\n const state = getState();\n if (shouldFetchCalls(state)) {\n dispatch(beginFetchCall());\n const url = buildCallUrl(state, timestamp, \"older\")\n return axios\n .get(url)\n .then(response => {\n if (response.data) {\n var data = {shortName: state.call.shortName, calls: response.data.calls}\n dispatch(fetchOlderCallSuccess(data));\n } else {\n dispatch(fetchCallError());\n let registerMessage = response.data.message;\n return registerMessage;\n }\n })\n .catch(response => {\n if (response instanceof Error) {\n // Something happened in setting up the request that triggered an Error\n console.log(\"Error\", response.message);\n }\n });\n };\n};\n}\n\n\nexport function addStar( callId) {\n return (dispatch, getState) => {\n const state = getState();\n dispatch(beginAddStar());\n\n const url = process.env.REACT_APP_BACKEND_SERVER + \"/\" + state.call.shortName.toLowerCase() + \"/star/\" + callId\n return axios\n .post(url,{}, {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n }).then(response => {\n if (response.data.success) {\n dispatch(addStarSuccess(response.data.call));\n } else {\n dispatch(addStarError());\n let registerMessage = response.data.message;\n return registerMessage;\n }\n })\n .catch(response => {\n if (response instanceof Error) {\n // Something happened in setting up the request that triggered an Error\n console.log(\"Error\", response.message);\n }\n });\n };\n};\n\n\n\nexport function fetchCallInfo( callId) {\n return (dispatch, getState) => {\n const state = getState();\n dispatch(beginFetchCallInfo());\n\n const url = process.env.REACT_APP_BACKEND_SERVER + \"/\" + state.call.shortName.toLowerCase() + \"/call/\" + callId\n return axios\n .get(url)\n .then(response => {\n if (response.data.success) {\n dispatch(fetchCallInfoSuccess(response.data.call));\n } else {\n dispatch(fetchCallInfoError());\n let registerMessage = response.data.message;\n return registerMessage;\n }\n })\n .catch(response => {\n if (response instanceof Error) {\n // Something happened in setting up the request that triggered an Error\n console.log(\"Error\", response.message);\n }\n });\n };\n};\n\nexport function fetchCalls() {\n return (dispatch, getState) => {\n const state = getState();\n if (shouldFetchCalls(state)) {\n dispatch(beginFetchCall());\n const url=buildCallUrl(state);\n return axios\n .get(url)\n .then(response => {\n if (response.data) {\n // check to make sure you actually got some calls back.\n if (response.data.calls.length > 0) {\n var data = {shortName: state.call.shortName, calls: response.data.calls}\n dispatch(fetchCallSuccess(data));\n } else {\n dispatch(fetchCallError());\n }\n } else {\n dispatch(fetchCallError());\n let registerMessage = response.data.message;\n return registerMessage;\n }\n })\n .catch(response => {\n if (response instanceof Error) {\n // Something happened in setting up the request that triggered an Error\n console.log(\"Error\", response.message);\n }\n });\n };\n};\n}\n\nexport function addCall(call) {\n return (dispatch, getState) => {\n dispatch({ type: types.UPSERT_CALL, data: call});\n };\n}\n\nexport function setStarred(starred) {\n return (dispatch, getState) => {\n dispatch({ type: types.SET_STARRED_FILTER, data: starred});\n };\n}\n\nexport function setLive(live) {\n return (dispatch, getState) => {\n dispatch({ type: types.SET_LIVE, data: live});\n };\n}\n\nexport function setCurrentCallId(callId) {\n return (dispatch, getState) => {\n dispatch({ type: types.SET_CURRENT_CALL_ID, data: callId});\n };\n}\n\n// should be as a unix timestamp\nexport function setDateFilter(date) {\n return (dispatch, getState) => {\n dispatch({ type: types.SET_DATE_FILTER, date: date});\n };\n}\n\nexport function setAllFilter() {\n return (dispatch, getState) => {\n dispatch({ type: types.SET_ALL_FILTER});\n };\n}\n\nexport function setTalkgroupFilter(tgs) {\n return (dispatch, getState) => {\n dispatch({ type: types.SET_TALKGROUP_FILTER, talkgroups: tgs});\n };\n}\n\nexport function setGroupFilter(groupId) {\n return (dispatch, getState) => {\n dispatch({ type: types.SET_GROUP_FILTER, groupId: groupId});\n };\n}\n\nexport function setShortName(shortName) {\n return (dispatch, getState) => {\n dispatch({ type: types.SET_SHORT_NAME, data: shortName});\n };\n}\n\nexport function setFilter(filter) {\n return (dispatch, getState) => {\n dispatch({ type: types.SET_FILTER, data: filter});\n };\n}\n","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/System/ListSystemsContainer.js",[],["83","84"],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/CallPlayer.js",["85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100","101","102","103"],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Group/group-constants.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/SupportModal.js",["104"],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/FilterModal.js",["105","106","107"],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/query-string.js",["108"],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/CalendarModal.js",["109"],"import React, { Component } from \"react\";\nimport {\n Modal,\n Button,\n Icon,\n Header\n} from \"semantic-ui-react\";\nimport \"./CalendarModal.css\";\nimport DatePicker from 'react-datepicker';\nimport { subDays } from 'date-fns'\nimport 'react-datepicker/dist/react-datepicker.css';\n\nclass CalendarModal extends Component {\n constructor(props) {\n super(props)\n this.handleDateChange = this.handleDateChange.bind(this);\n this.handleDone = this.handleDone.bind(this);\n this.handleClose = this.handleClose.bind(this);\n\n this.state = {\n open: false,\n startDate: new Date()\n }\n}\n\nhandleDateChange = (date) => {\n this.setState({\n startDate: date\n });\n }\n\nhandleClose = () => this.props.onClose(false);\nhandleDone(event) {\n this.props.callActions.setDateFilter(this.state.startDate.getTime());\n this.props.onClose(true);\n}\n\n\n render() {\n \n return (\n\n \n Select a Date & Time\n \n \n \n \n \n \n \n \n \n\n )\n }\n}\n\nexport default CalendarModal;\n","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/redux-router/configureStore.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Talkgroups/talkgroup-actions.js",["110","111","112","113","114","115","116"],"import axios from 'axios';\n//import { browserHistory } from \"react-router\"\nimport * as types from \"./talkgroup-constants\";\nimport { push } from 'connected-react-router';\n\n// \"Log In\" action creators\nfunction beginImportTalkgroup() {\n return { type: types.IMPORT_TALKGROUP };\n}\n\nfunction importTalkgroupSuccess(data) {\n return {\n type: types.IMPORT_SUCCESS_TALKGROUP,\n data\n };\n}\n\nfunction importTalkgroupError(data) {\n return {\n type: types.IMPORT_ERROR_TALKGROUP,\n data\n };\n}\n\nfunction beginExportTalkgroup() {\n return { type: types.EXPORT_TALKGROUP };\n}\n\nfunction exportTalkgroupSuccess() {\n return { type: types.EXPORT_SUCCESS_TALKGROUP };\n}\n\nfunction exportTalkgroupError() {\n return { type: types.EXPORT_ERROR_TALKGROUP };\n}\n\n\nfunction beginFetchTalkgroup() {\n return { type: types.FETCH_TALKGROUP };\n}\n\nfunction fetchTalkgroupSuccess(data) {\n return { type: types.FETCH_SUCCESS_TALKGROUP,\n data };\n}\n\nfunction fetchTalkgroupError(data) {\n return { type: types.FETCH_ERROR_TALKGROUP,\n data };\n}\n\n\nfunction makeUserRequest(method, data, api) {\n // returns a Promise\n return axios({\n method: method,\n url: api,\n data: data\n });\n}\n\nexport function changeUrl(url) {\n return dispatch => {\n dispatch(push(url));\n };\n}\n\n\n// https://stackoverflow.com/questions/41878838/how-do-i-set-multipart-in-axios-with-react\n\n\n\nfunction shouldFetchTalkgroups(state, shortName) {\n if (!state.talkgroup.items.hasOwnProperty(shortName)) {\n return true\n } else if (state.talkgroup.isWaiting) {\n return false\n } else {\n return false\n }\n}\n\nexport function fetchTalkgroups(shortName) {\n return (dispatch, getState) => {\n if (shouldFetchTalkgroups(getState(), shortName)) {\n dispatch(beginFetchTalkgroup());\n\n return axios\n .get(process.env.REACT_APP_BACKEND_SERVER + \"/\" + shortName + \"/talkgroups\")\n .then(response => {\n if (response.data) {\n var data = {shortName: shortName, talkgroups: response.data.talkgroups}\n dispatch(fetchTalkgroupSuccess( data));\n } else {\n dispatch(fetchTalkgroupError());\n let registerMessage = response.data.message;\n return registerMessage;\n }\n })\n .catch(response => {\n if (response instanceof Error) {\n // Something happened in setting up the request that triggered an Error\n console.log(\"Error\", response.message);\n }\n });\n };\n};\n}\n","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Group/group-reducer.js",["117","118"],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/MediaPlayer.js",["119","120"],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/GroupModal.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Group/group-actions.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/redux-router/reducers.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/System/SystemCard.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/CalendarModalContainer.js",[],{"ruleId":"121","severity":1,"message":"122","line":12,"column":3,"nodeType":"123","messageId":"124","endLine":15,"endColumn":4},{"ruleId":"125","severity":1,"message":"126","line":33,"column":89,"nodeType":"127","messageId":"128","endLine":33,"endColumn":91},{"ruleId":"129","severity":1,"message":"130","line":6,"column":7,"nodeType":"131","messageId":"132","endLine":6,"endColumn":30},{"ruleId":"129","severity":1,"message":"133","line":22,"column":10,"nodeType":"131","messageId":"132","endLine":22,"endColumn":21},{"ruleId":"134","severity":1,"message":"135","line":76,"column":3,"nodeType":"136","messageId":"137","endLine":82,"endColumn":4},{"ruleId":"138","replacedBy":"139"},{"ruleId":"140","replacedBy":"141"},{"ruleId":"129","severity":1,"message":"142","line":3,"column":8,"nodeType":"131","messageId":"132","endLine":3,"endColumn":16},{"ruleId":"129","severity":1,"message":"143","line":18,"column":3,"nodeType":"131","messageId":"132","endLine":18,"endColumn":8},{"ruleId":"144","severity":1,"message":"145","line":123,"column":5,"nodeType":"146","messageId":"147","endLine":132,"endColumn":6},{"ruleId":"148","severity":2,"message":"149","line":137,"column":5,"nodeType":"131","messageId":"150","endLine":137,"endColumn":11},{"ruleId":"148","severity":2,"message":"149","line":138,"column":5,"nodeType":"131","messageId":"150","endLine":138,"endColumn":11},{"ruleId":"148","severity":2,"message":"149","line":141,"column":5,"nodeType":"131","messageId":"150","endLine":141,"endColumn":11},{"ruleId":"148","severity":2,"message":"149","line":142,"column":5,"nodeType":"131","messageId":"150","endLine":142,"endColumn":11},{"ruleId":"148","severity":2,"message":"149","line":151,"column":5,"nodeType":"131","messageId":"150","endLine":151,"endColumn":11},{"ruleId":"148","severity":2,"message":"149","line":160,"column":5,"nodeType":"131","messageId":"150","endLine":160,"endColumn":11},{"ruleId":"144","severity":1,"message":"145","line":177,"column":5,"nodeType":"146","messageId":"147","endLine":185,"endColumn":6},{"ruleId":"125","severity":1,"message":"151","line":187,"column":24,"nodeType":"127","messageId":"128","endLine":187,"endColumn":26},{"ruleId":"125","severity":1,"message":"151","line":194,"column":24,"nodeType":"127","messageId":"128","endLine":194,"endColumn":26},{"ruleId":"129","severity":1,"message":"152","line":276,"column":15,"nodeType":"131","messageId":"132","endLine":276,"endColumn":19},{"ruleId":"125","severity":1,"message":"126","line":307,"column":38,"nodeType":"127","messageId":"128","endLine":307,"endColumn":40},{"ruleId":"125","severity":1,"message":"126","line":341,"column":30,"nodeType":"127","messageId":"128","endLine":341,"endColumn":32},{"ruleId":"125","severity":1,"message":"126","line":349,"column":30,"nodeType":"127","messageId":"128","endLine":349,"endColumn":32},{"ruleId":"144","severity":1,"message":"145","line":392,"column":7,"nodeType":"146","messageId":"147","endLine":402,"endColumn":8},{"ruleId":"129","severity":1,"message":"153","line":448,"column":12,"nodeType":"131","messageId":"132","endLine":448,"endColumn":26},{"ruleId":"144","severity":1,"message":"145","line":465,"column":5,"nodeType":"146","messageId":"147","endLine":472,"endColumn":6},{"ruleId":"129","severity":1,"message":"154","line":6,"column":3,"nodeType":"131","messageId":"132","endLine":6,"endColumn":11},{"ruleId":"144","severity":1,"message":"145","line":39,"column":3,"nodeType":"146","messageId":"147","endLine":60,"endColumn":4},{"ruleId":"125","severity":1,"message":"151","line":61,"column":32,"nodeType":"127","messageId":"128","endLine":61,"endColumn":34},{"ruleId":"155","severity":1,"message":"156","line":93,"column":13,"nodeType":"131","messageId":"157","endLine":93,"endColumn":16},{"ruleId":"158","severity":1,"message":"159","line":1,"column":1,"nodeType":"160","endLine":11,"endColumn":2},{"ruleId":"129","severity":1,"message":"161","line":6,"column":3,"nodeType":"131","messageId":"132","endLine":6,"endColumn":9},{"ruleId":"129","severity":1,"message":"162","line":7,"column":10,"nodeType":"131","messageId":"132","endLine":7,"endColumn":30},{"ruleId":"129","severity":1,"message":"163","line":11,"column":10,"nodeType":"131","messageId":"132","endLine":11,"endColumn":32},{"ruleId":"129","severity":1,"message":"164","line":18,"column":10,"nodeType":"131","messageId":"132","endLine":18,"endColumn":30},{"ruleId":"129","severity":1,"message":"165","line":25,"column":10,"nodeType":"131","messageId":"132","endLine":25,"endColumn":30},{"ruleId":"129","severity":1,"message":"166","line":29,"column":10,"nodeType":"131","messageId":"132","endLine":29,"endColumn":32},{"ruleId":"129","severity":1,"message":"167","line":33,"column":10,"nodeType":"131","messageId":"132","endLine":33,"endColumn":30},{"ruleId":"129","severity":1,"message":"168","line":53,"column":10,"nodeType":"131","messageId":"132","endLine":53,"endColumn":25},{"ruleId":"129","severity":1,"message":"169","line":7,"column":10,"nodeType":"131","messageId":"132","endLine":7,"endColumn":22},{"ruleId":"129","severity":1,"message":"170","line":13,"column":10,"nodeType":"131","messageId":"132","endLine":13,"endColumn":27},{"ruleId":"125","severity":1,"message":"151","line":69,"column":41,"nodeType":"127","messageId":"128","endLine":69,"endColumn":43},{"ruleId":"129","severity":1,"message":"171","line":89,"column":5,"nodeType":"131","messageId":"132","endLine":89,"endColumn":16},"no-useless-constructor","Useless constructor.","MethodDefinition","noUselessConstructor","eqeqeq","Expected '===' and instead saw '=='.","BinaryExpression","unexpected","no-unused-vars","'FETCH_SUCCESS_STATISTIC' is assigned a value but never used.","Identifier","unusedVar","'prependCall' is defined but never used.","no-unreachable","Unreachable code.","IfStatement","unreachableCode","no-native-reassign",["172"],"no-negated-in-lhs",["173"],"'CallItem' is defined but never used.","'Table' is defined but never used.","default-case","Expected a default case.","SwitchStatement","missingDefaultCase","no-undef","'socket' is not defined.","undef","Expected '!==' and instead saw '!='.","'refs' is assigned a value but never used.","'sidebarVisible' is assigned a value but never used.","'Dropdown' is defined but never used.","no-redeclare","'obj' is already defined.","redeclared","import/no-anonymous-default-export","Assign object to a variable before exporting as module default","ExportDefaultDeclaration","'Header' is defined but never used.","'beginImportTalkgroup' is defined but never used.","'importTalkgroupSuccess' is defined but never used.","'importTalkgroupError' is defined but never used.","'beginExportTalkgroup' is defined but never used.","'exportTalkgroupSuccess' is defined but never used.","'exportTalkgroupError' is defined but never used.","'makeUserRequest' is defined but never used.","'updateObject' is defined but never used.","'updateItemInArray' is defined but never used.","'playEnabled' is assigned a value but never used.","no-global-assign","no-unsafe-negation"]
\ No newline at end of file
+[{"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/ListCalls.js":"1","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/call-actions.js":"2","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/System/ListSystemsContainer.js":"3","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/CallPlayer.js":"4","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Group/group-constants.js":"5","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/SupportModal.js":"6","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/FilterModal.js":"7","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/query-string.js":"8","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/CalendarModal.js":"9","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/redux-router/configureStore.js":"10","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Talkgroups/talkgroup-actions.js":"11","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Group/group-reducer.js":"12","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/MediaPlayer.js":"13","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/GroupModal.js":"14","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Group/group-actions.js":"15","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/redux-router/reducers.js":"16","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/System/SystemCard.js":"17","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/CalendarModalContainer.js":"18","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/System/ListSystems.js":"19","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Talkgroups/talkgroup-constants.js":"20","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/CallItem.js":"21"},{"size":1249,"mtime":1609596364896,"results":"22","hashOfConfig":"23"},{"size":9179,"mtime":1609597700043,"results":"24","hashOfConfig":"23"},{"size":277,"mtime":1545362103911,"results":"25","hashOfConfig":"23"},{"size":18156,"mtime":1609597871834,"results":"26","hashOfConfig":"23"},{"size":151,"mtime":1545362103908,"results":"27","hashOfConfig":"23"},{"size":1325,"mtime":1591209153088,"results":"28","hashOfConfig":"23"},{"size":4437,"mtime":1560856294173,"results":"29","hashOfConfig":"23"},{"size":362,"mtime":1609596675259,"results":"30","hashOfConfig":"23"},{"size":1778,"mtime":1609597248589,"results":"31","hashOfConfig":"23"},{"size":759,"mtime":1609425817988,"results":"32","hashOfConfig":"23"},{"size":2433,"mtime":1609597717050,"results":"33","hashOfConfig":"23"},{"size":1395,"mtime":1545362103908,"results":"34","hashOfConfig":"23"},{"size":4251,"mtime":1609599087987,"results":"35","hashOfConfig":"23"},{"size":2023,"mtime":1551754660116,"results":"36","hashOfConfig":"23"},{"size":1747,"mtime":1609597708479,"results":"37","hashOfConfig":"23"},{"size":595,"mtime":1609596047661,"results":"38","hashOfConfig":"23"},{"size":2045,"mtime":1609520570000,"results":"39","hashOfConfig":"23"},{"size":763,"mtime":1545362103896,"results":"40","hashOfConfig":"23"},{"size":1547,"mtime":1609520315634,"results":"41","hashOfConfig":"23"},{"size":537,"mtime":1545362103916,"results":"42","hashOfConfig":"23"},{"size":2865,"mtime":1560343858028,"results":"43","hashOfConfig":"23"},{"filePath":"44","messages":"45","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"46","usedDeprecatedRules":"47"},"1du4mf8",{"filePath":"48","messages":"49","errorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"50","usedDeprecatedRules":"47"},{"filePath":"51","messages":"52","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"47"},{"filePath":"53","messages":"54","errorCount":6,"warningCount":13,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"55","messages":"56","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"57","messages":"58","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"59","messages":"60","errorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"61"},{"filePath":"62","messages":"63","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"64","messages":"65","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"66"},{"filePath":"67","messages":"68","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"69"},{"filePath":"70","messages":"71","errorCount":0,"warningCount":7,"fixableErrorCount":0,"fixableWarningCount":0,"source":"72","usedDeprecatedRules":"47"},{"filePath":"73","messages":"74","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"75","messages":"76","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"77","messages":"78","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"79","messages":"80","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"81"},{"filePath":"82","messages":"83","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"84"},{"filePath":"85","messages":"86","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"47"},{"filePath":"87","messages":"88","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"89","messages":"90","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"91","messages":"92","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"93","messages":"94","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/ListCalls.js",["95","96"],"import React from \"react\";\nimport CallItem from \"./CallItem\";\nimport {\n Icon,\n Table,\n} from \"semantic-ui-react\";\nimport \"./CallPlayer.css\";\n\n// ----------------------------------------------------\nclass ListCalls extends React.Component {\n\n constructor(props) {\n super(props);\n\n }\n\n //https://stackoverflow.com/questions/36559661/how-can-i-dispatch-from-child-components-in-react-redux\n //https://stackoverflow.com/questions/42597602/react-onclick-pass-event-with-parameter\n render() {\n return (\n\n
\n \n \n Len\n Talkgroup\n Time\n \n \n \n \n\n {this.props.callsAllIds.map((callId, index) => )}\n\n \n
\n\n\n );\n }\n}\n\nexport default ListCalls;\n",["97","98"],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/call-actions.js",["99","100","101"],"import axios from \"axios\";\n\nimport * as types from \"./call-constants\";\nimport { push } from 'connected-react-router';\n\nconst FETCH_SUCCESS_STATISTIC = \"FETCH_SUCCESS_STATISTIC\"\n\nfunction beginFetchCallInfo() {\n return { type: types.FETCH_CALL_INFO };\n}\n\nfunction fetchCallInfoSuccess(data) {\n return { type: types.FETCH_SUCCESS_CALL_INFO,\n data };\n}\n\nfunction fetchCallInfoError(data) {\n return { type: types.FETCH_ERROR_CALL_INFO,\n data };\n}\n\nfunction prependCall() {\n return { type: types.PREPEND_CALL };\n}\n\nfunction beginAddStar() {\n return { type: types.ADD_STAR };\n}\n\nfunction addStarSuccess(data) {\n return { type: types.ADD_STAR_SUCCESS, data };\n}\n\nfunction addStarError(data) {\n return { type: types.ADD_STAR_ERROR, data };\n}\n\nfunction beginFetchCall() {\n return { type: types.FETCH_CALL };\n}\n\nfunction fetchCallSuccess(data) {\n return { type: types.FETCH_SUCCESS_CALL,\n data };\n}\n\n\n\nfunction fetchOlderCallSuccess(data) {\n return { type: types.FETCH_SUCCESS_OLDER_CALL,\n data };\n}\n\nfunction fetchNewerCallSuccess(data) {\n return { type: types.FETCH_SUCCESS_NEWER_CALL,\n data };\n}\n\nfunction fetchCallError(data) {\n return { type: types.FETCH_ERROR_CALL,\n data };\n}\n\n\nexport function changeUrl(url) {\n return dispatch => {\n dispatch(push(url));\n };\n}\n\n// Example of an Async Action Creator\n// http://redux.js.org/docs/advanced/AsyncActions.html\n\nfunction shouldFetchCalls(state, subreddit) {\n return true;\n if ((!state.call.items) || (state.call.items.length <1)) {\n return true\n } else if (state.call.isWaiting) {\n return false\n } else {\n return false\n }\n}\n\n\n\n\nfunction buildUrlParams(a) {\n return Object.keys(a).map(function(k) {\n return encodeURIComponent(k) + '=' + encodeURIComponent(a[k])\n }).join('&')\n}\n\nfunction buildCallUrl(state, date, direction) {\n var params = {};\n var url = \"\";\n\n\n if ((typeof direction === 'string') && (typeof date === 'number')) {\n url = url + '/' + direction;\n params[\"time\"] = date;\n } else {\n if (state.call.filterDate){\n url = url + '/older'\n params[\"time\"] = state.call.filterDate;\n }\n }\n if (state.call.filterStarred) {\n params[\"filter-starred\"] = true;\n }\n switch(state.call.filterType) {\n case 1:\n params[\"filter-type\"] = \"group\";\n params[\"filter-code\"] = state.call.filterGroupId;\n break;\n case 2:\n params[\"filter-type\"] = \"talkgroup\";\n params[\"filter-code\"] = state.call.filterTalkgroups;\n break;\n default:\n case 0:\n }\n/*\n\n if (this.filterCode != \"\") {\n params[\"filter-code\"] = this.filterCode;\n }\n\n if (this.filterType == this.FilterType.Group) {\n params[\"filter-type\"] = \"group\";\n params[\"filter-name\"] = this.filterName;\n }\n\n if (this.filterType == this.FilterType.Talkgroup) {\n params[\"filter-type\"] = \"talkgroup\";\n }\n\n if (this.filterType == this.FilterType.Unit) {\n params[\"filter-type\"] = \"unit\";\n }\n\n*/\n // url = startUp.backend_server + \"/\" + startUp.shortName.toLowerCase() + \"/calls\" + url + '?' + buildUrlParams(params);\n url = process.env.REACT_APP_BACKEND_SERVER + \"/\" + state.call.shortName + \"/calls\" + url + '?' + buildUrlParams(params);\n console.log(\"Trying to fetch data from this url: \" + url);\n return url;\n}\n\nexport function fetchNewerCalls( timestamp) {\n return (dispatch, getState) => {\n const state = getState();\n if (shouldFetchCalls(state)) {\n dispatch(beginFetchCall());\n const url = buildCallUrl(state, timestamp, \"newer\")\n return axios\n .get(url)\n .then(response => {\n if ((response.data) && (response.data.calls.length >0)) {\n var data = {shortName: state.call.shortName, calls: response.data.calls}\n dispatch(fetchNewerCallSuccess(data));\n } else {\n dispatch(fetchCallError());\n let registerMessage = response.data.message;\n return registerMessage;\n }\n })\n .catch(response => {\n if (response instanceof Error) {\n // Something happened in setting up the request that triggered an Error\n console.log(\"Error\", response.message);\n }\n });\n };\n};\n}\n\n\nexport function fetchOlderCalls( timestamp) {\n return (dispatch, getState) => {\n const state = getState();\n if (shouldFetchCalls(state)) {\n dispatch(beginFetchCall());\n const url = buildCallUrl(state, timestamp, \"older\")\n return axios\n .get(url)\n .then(response => {\n if (response.data) {\n var data = {shortName: state.call.shortName, calls: response.data.calls}\n dispatch(fetchOlderCallSuccess(data));\n } else {\n dispatch(fetchCallError());\n let registerMessage = response.data.message;\n return registerMessage;\n }\n })\n .catch(response => {\n if (response instanceof Error) {\n // Something happened in setting up the request that triggered an Error\n console.log(\"Error\", response.message);\n }\n });\n };\n};\n}\n\n\nexport function addStar( callId) {\n return (dispatch, getState) => {\n const state = getState();\n dispatch(beginAddStar());\n\n const url = process.env.REACT_APP_BACKEND_SERVER + \"/\" + state.call.shortName.toLowerCase() + \"/star/\" + callId\n return axios\n .post(url,{}, {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n }).then(response => {\n if (response.data.success) {\n dispatch(addStarSuccess(response.data.call));\n } else {\n dispatch(addStarError());\n let registerMessage = response.data.message;\n return registerMessage;\n }\n })\n .catch(response => {\n if (response instanceof Error) {\n // Something happened in setting up the request that triggered an Error\n console.log(\"Error\", response.message);\n }\n });\n };\n};\n\n\n\nexport function fetchCallInfo( callId) {\n return (dispatch, getState) => {\n const state = getState();\n dispatch(beginFetchCallInfo());\n\n const url = process.env.REACT_APP_BACKEND_SERVER + \"/\" + state.call.shortName.toLowerCase() + \"/call/\" + callId\n return axios\n .get(url)\n .then(response => {\n if (response.data.success) {\n dispatch(fetchCallInfoSuccess(response.data.call));\n } else {\n dispatch(fetchCallInfoError());\n let registerMessage = response.data.message;\n return registerMessage;\n }\n })\n .catch(response => {\n if (response instanceof Error) {\n // Something happened in setting up the request that triggered an Error\n console.log(\"Error\", response.message);\n }\n });\n };\n};\n\nexport function fetchCalls() {\n return (dispatch, getState) => {\n const state = getState();\n if (shouldFetchCalls(state)) {\n dispatch(beginFetchCall());\n const url=buildCallUrl(state);\n return axios\n .get(url)\n .then(response => {\n if (response.data) {\n // check to make sure you actually got some calls back.\n if (response.data.calls.length > 0) {\n var data = {shortName: state.call.shortName, calls: response.data.calls}\n dispatch(fetchCallSuccess(data));\n } else {\n dispatch(fetchCallError());\n }\n } else {\n dispatch(fetchCallError());\n let registerMessage = response.data.message;\n return registerMessage;\n }\n })\n .catch(response => {\n if (response instanceof Error) {\n // Something happened in setting up the request that triggered an Error\n console.log(\"Error\", response.message);\n }\n });\n };\n};\n}\n\nexport function addCall(call) {\n return (dispatch, getState) => {\n dispatch({ type: types.UPSERT_CALL, data: call});\n };\n}\n\nexport function setStarred(starred) {\n return (dispatch, getState) => {\n dispatch({ type: types.SET_STARRED_FILTER, data: starred});\n };\n}\n\nexport function setLive(live) {\n return (dispatch, getState) => {\n dispatch({ type: types.SET_LIVE, data: live});\n };\n}\n\nexport function setCurrentCallId(callId) {\n return (dispatch, getState) => {\n dispatch({ type: types.SET_CURRENT_CALL_ID, data: callId});\n };\n}\n\n// should be as a unix timestamp\nexport function setDateFilter(date) {\n return (dispatch, getState) => {\n dispatch({ type: types.SET_DATE_FILTER, date: date});\n };\n}\n\nexport function setAllFilter() {\n return (dispatch, getState) => {\n dispatch({ type: types.SET_ALL_FILTER});\n };\n}\n\nexport function setTalkgroupFilter(tgs) {\n return (dispatch, getState) => {\n dispatch({ type: types.SET_TALKGROUP_FILTER, talkgroups: tgs});\n };\n}\n\nexport function setGroupFilter(groupId) {\n return (dispatch, getState) => {\n dispatch({ type: types.SET_GROUP_FILTER, groupId: groupId});\n };\n}\n\nexport function setShortName(shortName) {\n return (dispatch, getState) => {\n dispatch({ type: types.SET_SHORT_NAME, data: shortName});\n };\n}\n\nexport function setFilter(filter) {\n return (dispatch, getState) => {\n dispatch({ type: types.SET_FILTER, data: filter});\n };\n}\n","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/System/ListSystemsContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/CallPlayer.js",["102","103","104","105","106","107","108","109","110","111","112","113","114","115","116","117","118","119","120"],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Group/group-constants.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/SupportModal.js",["121"],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/FilterModal.js",["122","123","124"],"import React, { Component } from \"react\";\nimport {\n Modal,\n Button,\n Icon,\n Tab,\n Header,\n Dropdown,\n Checkbox,\n Divider\n} from \"semantic-ui-react\";\nimport \"./FilterModal.css\";\n\n\nclass FilterModal extends Component {\n constructor(props) {\n super(props)\n this.handleInputChange = this.handleInputChange.bind(this);\n this.handleTabChange = this.handleTabChange.bind(this);\n this.toggleStarred = this.toggleStarred.bind(this);\n this.handleDone = this.handleDone.bind(this);\n this.handleClose = this.handleClose.bind(this);\n\n this.state = {\n open: false,\n selectedTalkgroup: this.props.selectedTalkgroups,\n selectedGroup: this.props.selectedGroup,\n filterStarred: this.props.filterStarred,\n activeTab: this.props.activeTab\n }\n}\n\n\nhandleTabChange = (e, data) => this.setState({activeTab: data.activeIndex});\nhandleInputChange = (e, { name, value }) => this.setState({ [name]: value });\ntoggleStarred = () => this.setState(prevState => ({ filterStarred: !prevState.filterStarred }));\nhandleClose = () => this.props.onClose(false);\nhandleDone(event) {\n switch(this.state.activeTab) {\n case 0:\n this.props.callActions.setAllFilter();\n this.props.onClose(true);\n break;\n case 1:\n if (this.state.selectedGroup) {\n this.props.callActions.setGroupFilter(this.state.selectedGroup);\n this.props.onClose(true);\n } else {\n this.props.onClose(false);\n }\n break;\n case 2:\n if (this.state.selectedTalkgroup) {\n this.props.callActions.setTalkgroupFilter(this.state.selectedTalkgroup);\n this.props.onClose(true);\n } else {\n this.props.onClose(false);\n }\n break;\n }\n if (this.state.filterStarred != this.props.filterStarred) {\n this.props.callActions.setStarred(this.state.filterStarred);\n this.props.onClose(true);\n }\n \n}\ncomponentWillUpdate(nextProps) {\n\n const filterChanged = ((nextProps.selectedTalkgroups !== this.props.selectedTalkgroups) || (nextProps.selectedGroup !== this.props.selectedGroup));\n if (filterChanged) {\n this.setState({selectedTalkgroup: nextProps.selectedTalkgroups, selectedGroup: nextProps.selectedGroup, activeTab: nextProps.activeTab});\n }\n}\n\n render() {\n\n var talkgroupList = [];\n if (this.props.talkgroups) {\n for (const num in this.props.talkgroups) {\n const talkgroup = this.props.talkgroups[num];\n var obj = {\n key: talkgroup.num,\n value: talkgroup.num,\n text: talkgroup.description\n }\n talkgroupList.push(obj);\n }\n }\n var groupList = [];\n if (this.props.groups) {\n for (const num in this.props.groups) {\n const group = this.props.groups[num];\n var obj = {\n key: group._id,\n value: group._id,\n text: group.groupName\n }\n groupList.push(obj);\n }\n }\n const panes = [\n { menuItem: 'All', render: () =>\n { return (\n \n \n Dispaly all of the calls.
\n \n )}},\n { menuItem: 'Groups', render: () =>\n { return (\n \n \n\n \n )} },\n { menuItem: 'Talkgroups', render: () =>\n { return (\n \n \n \n )} },\n]\n return (\n\n \n Select a Filter\n \n \n \n \n \n \n \n \n \n \n \n\n )\n }\n}\n\nexport default FilterModal;\n","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/query-string.js",["125"],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/CalendarModal.js",["126"],"import React, { Component } from \"react\";\nimport {\n Modal,\n Button,\n Icon,\n Header\n} from \"semantic-ui-react\";\nimport \"./CalendarModal.css\";\nimport DatePicker from 'react-datepicker';\nimport { subDays } from 'date-fns'\nimport 'react-datepicker/dist/react-datepicker.css';\n\nclass CalendarModal extends Component {\n constructor(props) {\n super(props)\n this.handleDateChange = this.handleDateChange.bind(this);\n this.handleDone = this.handleDone.bind(this);\n this.handleClose = this.handleClose.bind(this);\n\n this.state = {\n open: false,\n startDate: new Date()\n }\n}\n\nhandleDateChange = (date) => {\n this.setState({\n startDate: date\n });\n }\n\nhandleClose = () => this.props.onClose(false);\nhandleDone(event) {\n this.props.callActions.setDateFilter(this.state.startDate.getTime());\n this.props.onClose(true);\n}\n\n\n render() {\n \n return (\n\n \n Select a Date & Time\n \n \n \n \n \n \n \n \n \n\n )\n }\n}\n\nexport default CalendarModal;\n","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/redux-router/configureStore.js",[],["127","128"],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Talkgroups/talkgroup-actions.js",["129","130","131","132","133","134","135"],"import axios from 'axios';\n//import { browserHistory } from \"react-router\"\nimport * as types from \"./talkgroup-constants\";\nimport { push } from 'connected-react-router';\n\n// \"Log In\" action creators\nfunction beginImportTalkgroup() {\n return { type: types.IMPORT_TALKGROUP };\n}\n\nfunction importTalkgroupSuccess(data) {\n return {\n type: types.IMPORT_SUCCESS_TALKGROUP,\n data\n };\n}\n\nfunction importTalkgroupError(data) {\n return {\n type: types.IMPORT_ERROR_TALKGROUP,\n data\n };\n}\n\nfunction beginExportTalkgroup() {\n return { type: types.EXPORT_TALKGROUP };\n}\n\nfunction exportTalkgroupSuccess() {\n return { type: types.EXPORT_SUCCESS_TALKGROUP };\n}\n\nfunction exportTalkgroupError() {\n return { type: types.EXPORT_ERROR_TALKGROUP };\n}\n\n\nfunction beginFetchTalkgroup() {\n return { type: types.FETCH_TALKGROUP };\n}\n\nfunction fetchTalkgroupSuccess(data) {\n return { type: types.FETCH_SUCCESS_TALKGROUP,\n data };\n}\n\nfunction fetchTalkgroupError(data) {\n return { type: types.FETCH_ERROR_TALKGROUP,\n data };\n}\n\n\nfunction makeUserRequest(method, data, api) {\n // returns a Promise\n return axios({\n method: method,\n url: api,\n data: data\n });\n}\n\nexport function changeUrl(url) {\n return dispatch => {\n dispatch(push(url));\n };\n}\n\n\n// https://stackoverflow.com/questions/41878838/how-do-i-set-multipart-in-axios-with-react\n\n\n\nfunction shouldFetchTalkgroups(state, shortName) {\n if (!state.talkgroup.items.hasOwnProperty(shortName)) {\n return true\n } else if (state.talkgroup.isWaiting) {\n return false\n } else {\n return false\n }\n}\n\nexport function fetchTalkgroups(shortName) {\n return (dispatch, getState) => {\n if (shouldFetchTalkgroups(getState(), shortName)) {\n dispatch(beginFetchTalkgroup());\n\n return axios\n .get(process.env.REACT_APP_BACKEND_SERVER + \"/\" + shortName + \"/talkgroups\")\n .then(response => {\n if (response.data) {\n var data = {shortName: shortName, talkgroups: response.data.talkgroups}\n dispatch(fetchTalkgroupSuccess( data));\n } else {\n dispatch(fetchTalkgroupError());\n let registerMessage = response.data.message;\n return registerMessage;\n }\n })\n .catch(response => {\n if (response instanceof Error) {\n // Something happened in setting up the request that triggered an Error\n console.log(\"Error\", response.message);\n }\n });\n };\n};\n}\n","/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Group/group-reducer.js",["136","137"],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/MediaPlayer.js",["138","139"],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/GroupModal.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Group/group-actions.js",[],["140","141"],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/redux-router/reducers.js",[],["142","143"],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/System/SystemCard.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/CalendarModalContainer.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/System/ListSystems.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Talkgroups/talkgroup-constants.js",[],"/Users/luke/Projects/OpenMHz/trunk-server-public/frontend/src/Call/CallItem.js",["144","145"],{"ruleId":"146","severity":1,"message":"147","line":12,"column":3,"nodeType":"148","messageId":"149","endLine":15,"endColumn":4},{"ruleId":"150","severity":1,"message":"151","line":33,"column":89,"nodeType":"152","messageId":"153","endLine":33,"endColumn":91},{"ruleId":"154","replacedBy":"155"},{"ruleId":"156","replacedBy":"157"},{"ruleId":"158","severity":1,"message":"159","line":6,"column":7,"nodeType":"160","messageId":"161","endLine":6,"endColumn":30},{"ruleId":"158","severity":1,"message":"162","line":22,"column":10,"nodeType":"160","messageId":"161","endLine":22,"endColumn":21},{"ruleId":"163","severity":1,"message":"164","line":76,"column":3,"nodeType":"165","messageId":"166","endLine":82,"endColumn":4},{"ruleId":"158","severity":1,"message":"167","line":3,"column":8,"nodeType":"160","messageId":"161","endLine":3,"endColumn":16},{"ruleId":"158","severity":1,"message":"168","line":18,"column":3,"nodeType":"160","messageId":"161","endLine":18,"endColumn":8},{"ruleId":"169","severity":1,"message":"170","line":123,"column":5,"nodeType":"171","messageId":"172","endLine":132,"endColumn":6},{"ruleId":"173","severity":2,"message":"174","line":137,"column":5,"nodeType":"160","messageId":"175","endLine":137,"endColumn":11},{"ruleId":"173","severity":2,"message":"174","line":138,"column":5,"nodeType":"160","messageId":"175","endLine":138,"endColumn":11},{"ruleId":"173","severity":2,"message":"174","line":141,"column":5,"nodeType":"160","messageId":"175","endLine":141,"endColumn":11},{"ruleId":"173","severity":2,"message":"174","line":142,"column":5,"nodeType":"160","messageId":"175","endLine":142,"endColumn":11},{"ruleId":"173","severity":2,"message":"174","line":151,"column":5,"nodeType":"160","messageId":"175","endLine":151,"endColumn":11},{"ruleId":"173","severity":2,"message":"174","line":160,"column":5,"nodeType":"160","messageId":"175","endLine":160,"endColumn":11},{"ruleId":"169","severity":1,"message":"170","line":177,"column":5,"nodeType":"171","messageId":"172","endLine":185,"endColumn":6},{"ruleId":"150","severity":1,"message":"176","line":187,"column":24,"nodeType":"152","messageId":"153","endLine":187,"endColumn":26},{"ruleId":"150","severity":1,"message":"176","line":194,"column":24,"nodeType":"152","messageId":"153","endLine":194,"endColumn":26},{"ruleId":"158","severity":1,"message":"177","line":276,"column":15,"nodeType":"160","messageId":"161","endLine":276,"endColumn":19},{"ruleId":"150","severity":1,"message":"151","line":307,"column":38,"nodeType":"152","messageId":"153","endLine":307,"endColumn":40},{"ruleId":"150","severity":1,"message":"151","line":341,"column":30,"nodeType":"152","messageId":"153","endLine":341,"endColumn":32},{"ruleId":"150","severity":1,"message":"151","line":349,"column":30,"nodeType":"152","messageId":"153","endLine":349,"endColumn":32},{"ruleId":"169","severity":1,"message":"170","line":392,"column":7,"nodeType":"171","messageId":"172","endLine":402,"endColumn":8},{"ruleId":"158","severity":1,"message":"178","line":448,"column":12,"nodeType":"160","messageId":"161","endLine":448,"endColumn":26},{"ruleId":"169","severity":1,"message":"170","line":465,"column":5,"nodeType":"171","messageId":"172","endLine":472,"endColumn":6},{"ruleId":"158","severity":1,"message":"179","line":6,"column":3,"nodeType":"160","messageId":"161","endLine":6,"endColumn":11},{"ruleId":"169","severity":1,"message":"170","line":39,"column":3,"nodeType":"171","messageId":"172","endLine":60,"endColumn":4},{"ruleId":"150","severity":1,"message":"176","line":61,"column":32,"nodeType":"152","messageId":"153","endLine":61,"endColumn":34},{"ruleId":"180","severity":1,"message":"181","line":93,"column":13,"nodeType":"160","messageId":"182","endLine":93,"endColumn":16},{"ruleId":"183","severity":1,"message":"184","line":1,"column":1,"nodeType":"185","endLine":11,"endColumn":2},{"ruleId":"158","severity":1,"message":"186","line":6,"column":3,"nodeType":"160","messageId":"161","endLine":6,"endColumn":9},{"ruleId":"154","replacedBy":"187"},{"ruleId":"156","replacedBy":"188"},{"ruleId":"158","severity":1,"message":"189","line":7,"column":10,"nodeType":"160","messageId":"161","endLine":7,"endColumn":30},{"ruleId":"158","severity":1,"message":"190","line":11,"column":10,"nodeType":"160","messageId":"161","endLine":11,"endColumn":32},{"ruleId":"158","severity":1,"message":"191","line":18,"column":10,"nodeType":"160","messageId":"161","endLine":18,"endColumn":30},{"ruleId":"158","severity":1,"message":"192","line":25,"column":10,"nodeType":"160","messageId":"161","endLine":25,"endColumn":30},{"ruleId":"158","severity":1,"message":"193","line":29,"column":10,"nodeType":"160","messageId":"161","endLine":29,"endColumn":32},{"ruleId":"158","severity":1,"message":"194","line":33,"column":10,"nodeType":"160","messageId":"161","endLine":33,"endColumn":30},{"ruleId":"158","severity":1,"message":"195","line":53,"column":10,"nodeType":"160","messageId":"161","endLine":53,"endColumn":25},{"ruleId":"158","severity":1,"message":"196","line":7,"column":10,"nodeType":"160","messageId":"161","endLine":7,"endColumn":22},{"ruleId":"158","severity":1,"message":"197","line":13,"column":10,"nodeType":"160","messageId":"161","endLine":13,"endColumn":27},{"ruleId":"150","severity":1,"message":"176","line":69,"column":41,"nodeType":"152","messageId":"153","endLine":69,"endColumn":43},{"ruleId":"158","severity":1,"message":"198","line":89,"column":5,"nodeType":"160","messageId":"161","endLine":89,"endColumn":16},{"ruleId":"154","replacedBy":"199"},{"ruleId":"156","replacedBy":"200"},{"ruleId":"154","replacedBy":"201"},{"ruleId":"156","replacedBy":"202"},{"ruleId":"158","severity":1,"message":"203","line":41,"column":18,"nodeType":"160","messageId":"161","endLine":41,"endColumn":21},{"ruleId":"158","severity":1,"message":"204","line":74,"column":9,"nodeType":"160","messageId":"161","endLine":74,"endColumn":16},"no-useless-constructor","Useless constructor.","MethodDefinition","noUselessConstructor","eqeqeq","Expected '===' and instead saw '=='.","BinaryExpression","unexpected","no-native-reassign",["205"],"no-negated-in-lhs",["206"],"no-unused-vars","'FETCH_SUCCESS_STATISTIC' is assigned a value but never used.","Identifier","unusedVar","'prependCall' is defined but never used.","no-unreachable","Unreachable code.","IfStatement","unreachableCode","'CallItem' is defined but never used.","'Table' is defined but never used.","default-case","Expected a default case.","SwitchStatement","missingDefaultCase","no-undef","'socket' is not defined.","undef","Expected '!==' and instead saw '!='.","'refs' is assigned a value but never used.","'sidebarVisible' is assigned a value but never used.","'Dropdown' is defined but never used.","no-redeclare","'obj' is already defined.","redeclared","import/no-anonymous-default-export","Assign object to a variable before exporting as module default","ExportDefaultDeclaration","'Header' is defined but never used.",["205"],["206"],"'beginImportTalkgroup' is defined but never used.","'importTalkgroupSuccess' is defined but never used.","'importTalkgroupError' is defined but never used.","'beginExportTalkgroup' is defined but never used.","'exportTalkgroupSuccess' is defined but never used.","'exportTalkgroupError' is defined but never used.","'makeUserRequest' is defined but never used.","'updateObject' is defined but never used.","'updateItemInArray' is defined but never used.","'playEnabled' is assigned a value but never used.",["205"],["206"],["205"],["206"],"'src' is assigned a value but never used.","'current' is assigned a value but never used.","no-global-assign","no-unsafe-negation"]
\ No newline at end of file
diff --git a/frontend/.env b/frontend/.not-env
similarity index 100%
rename from frontend/.env
rename to frontend/.not-env
diff --git a/frontend/Dockerfile b/frontend/Dockerfile
new file mode 100644
index 0000000..8ba85db
--- /dev/null
+++ b/frontend/Dockerfile
@@ -0,0 +1,17 @@
+# build environment
+FROM node:13.12.0-alpine as build
+WORKDIR /app
+ENV PATH /app/node_modules/.bin:$PATH
+COPY package.json ./
+RUN npm install
+RUN npm install react-scripts@3.4.1 -g --silent
+COPY . ./
+RUN npm run build
+
+# production environment
+FROM node:13.12.0-alpine
+RUN mkdir -p /app/public
+WORKDIR /app
+RUN npm install -g serve
+COPY --from=build /app/build /app/public
+CMD serve -s public -l 3000
diff --git a/frontend/src/Call/CalendarModal.js b/frontend/src/Call/CalendarModal.js
index f2847d8..112f7fe 100644
--- a/frontend/src/Call/CalendarModal.js
+++ b/frontend/src/Call/CalendarModal.js
@@ -2,8 +2,7 @@ import React, { Component } from "react";
import {
Modal,
Button,
- Icon,
- Header
+ Icon
} from "semantic-ui-react";
import "./CalendarModal.css";
import DatePicker from 'react-datepicker';
diff --git a/frontend/src/Call/CallInfo.js b/frontend/src/Call/CallInfo.js
index 53e1823..86da1ad 100644
--- a/frontend/src/Call/CallInfo.js
+++ b/frontend/src/Call/CallInfo.js
@@ -12,10 +12,6 @@ import {
class CallInfo extends React.Component {
- constructor(props) {
- super(props);
- }
-
render() {
var srcList = "";
var callLength = "-";
diff --git a/frontend/src/Call/CallItem.js b/frontend/src/Call/CallItem.js
index b519bf2..3d5e4f6 100644
--- a/frontend/src/Call/CallItem.js
+++ b/frontend/src/Call/CallItem.js
@@ -71,7 +71,6 @@ showStar() {
render() {
const call = this.props.call;
const time = new Date(call.time);
- const current = new Date(time).setHours(0, 0, 0, 0);
var rowSelected={};
let starButton;
var starClickable = {};
diff --git a/frontend/src/Call/CallPlayer.js b/frontend/src/Call/CallPlayer.js
index 638c46b..899aae2 100644
--- a/frontend/src/Call/CallPlayer.js
+++ b/frontend/src/Call/CallPlayer.js
@@ -1,6 +1,5 @@
import React from "react";
import {Link} from 'react-router-dom';
-import CallItem from "./CallItem";
import MediaPlayer from "./MediaPlayer";
import FilterModal from "./FilterModalContainer";
import GroupModal from "./GroupModalContainer";
@@ -15,7 +14,6 @@ import {
Sticky,
Menu,
Icon,
- Table,
Sidebar
} from "semantic-ui-react";
import {Waypoint} from 'react-waypoint';
@@ -51,6 +49,7 @@ class CallPlayer extends React.Component {
this.handleLiveToggle = this.handleLiveToggle.bind(this);
this.getFilter = this.getFilter.bind(this);
this.callList = React.createRef();
+ this.socket = window.socket;
this.setupSocket = this.setupSocket.bind(this);
this.endSocket = this.endSocket.bind(this);
this.changeUrl = this.changeUrl.bind(this);
@@ -125,6 +124,7 @@ class CallPlayer extends React.Component {
filter.type = "group";
filter.code = this.props.filterGroupId;
break;
+ default:
case 2:
filter.type = "talkgroup";
filter.code = this.props.filterTalkgroups;
@@ -134,12 +134,12 @@ class CallPlayer extends React.Component {
return filter;
}
endSocket() {
- socket.removeAllListeners("new message");
- socket.removeAllListeners("reconnect");
+ this.socket.removeAllListeners("new message");
+ this.socket.removeAllListeners("reconnect");
}
setupSocket() {
- socket.on('new message', this.addCall);
- socket.on('reconnect', (attempts) => {
+ this.socket.on('new message', this.addCall);
+ this.socket.on('reconnect', (attempts) => {
console.log("Socket Reconnected after attempts: " + attempts); // true
if (this.props.live) {
var filter = this.getFilter();
@@ -148,7 +148,7 @@ class CallPlayer extends React.Component {
})
}
startSocket(shortName, filterType="", filterCode="", filterStarred=false) {
- socket.emit("start", {
+ this.socket.emit("start", {
filterCode: filterCode,
filterType: filterType,
filterName: "OpenMHz",
@@ -157,7 +157,7 @@ class CallPlayer extends React.Component {
});
}
stopSocket(){
- socket.emit("stop");
+ this.socket.emit("stop");
}
handleLiveToggle() {
if (!this.props.live) {
@@ -179,19 +179,20 @@ class CallPlayer extends React.Component {
case 1:
search = search + `filter-type=group&filter-code=${props.filterGroupId}`;
break;
+ default:
case 2:
search = search + `filter-type=talkgroup&filter-code=${props.filterTalkgroups}`;
break;
}
if (props.filterDate) {
- if (search.length!=1) {
+ if (search.length!==1) {
search = search + '&';
}
search = search + `time=${props.filterDate}`;
}
if (props.filterStarred) {
- if (search.length!=1) {
+ if (search.length!==1) {
search = search + '&';
}
search = search + `starred=true`;
@@ -304,7 +305,7 @@ class CallPlayer extends React.Component {
// is there a star filter?
if (uri.hasOwnProperty('starred')) {
const starred = uri['starred'];
- filter.filterStarred = starred == 'true'? true : false;
+ filter.filterStarred = starred === 'true'? true : false;
this.setState({urlOptions: true});
}
@@ -338,7 +339,7 @@ class CallPlayer extends React.Component {
this.setState({urlOptions: true});
// The Filter is a group
- if (uri['filter-type'] == "group") {
+ if (uri['filter-type'] === "group") {
filter.filterType = 1;
filter.filterGroupId = uri["filter-code"];
filterType="group";
@@ -346,7 +347,7 @@ class CallPlayer extends React.Component {
}
// The Filter is talkgroups
- if (uri['filter-type'] == 'talkgroup') {
+ if (uri['filter-type'] === 'talkgroup') {
const tg = uri["filter-code"].split(',').map(Number);
filter.filterType=2;
filter.filterTalkgroups=tg;
@@ -395,6 +396,7 @@ class CallPlayer extends React.Component {
typeString = 'group';
filterCode = nextProps.filterGroupId;
break;
+ default:
case 2:
typeString = 'talkgroup';
filterCode = nextProps.filterTalkgroups;
@@ -445,7 +447,6 @@ class CallPlayer extends React.Component {
}
var callInfoHeader = "Call Info";
- const {sidebarVisible} = this.state
const currentCall = this.props.callsById[this.state.callId];
@@ -466,6 +467,7 @@ class CallPlayer extends React.Component {
case 1:
filterLabel = "Group"
break;
+ default:
case 2:
filterLabel = "Talkgroups"
break;
diff --git a/frontend/src/Call/FilterModal.js b/frontend/src/Call/FilterModal.js
index 9fedf28..0cbf72e 100644
--- a/frontend/src/Call/FilterModal.js
+++ b/frontend/src/Call/FilterModal.js
@@ -37,10 +37,7 @@ toggleStarred = () => this.setState(prevState => ({ filterStarred: !prevState.fi
handleClose = () => this.props.onClose(false);
handleDone(event) {
switch(this.state.activeTab) {
- case 0:
- this.props.callActions.setAllFilter();
- this.props.onClose(true);
- break;
+
case 1:
if (this.state.selectedGroup) {
this.props.callActions.setGroupFilter(this.state.selectedGroup);
@@ -57,8 +54,13 @@ handleDone(event) {
this.props.onClose(false);
}
break;
+ default:
+ case 0:
+ this.props.callActions.setAllFilter();
+ this.props.onClose(true);
+ break;
}
- if (this.state.filterStarred != this.props.filterStarred) {
+ if (this.state.filterStarred !== this.props.filterStarred) {
this.props.callActions.setStarred(this.state.filterStarred);
this.props.onClose(true);
}
@@ -73,12 +75,12 @@ componentWillUpdate(nextProps) {
}
render() {
-
+ var obj;
var talkgroupList = [];
if (this.props.talkgroups) {
for (const num in this.props.talkgroups) {
const talkgroup = this.props.talkgroups[num];
- var obj = {
+ obj = {
key: talkgroup.num,
value: talkgroup.num,
text: talkgroup.description
@@ -90,7 +92,7 @@ componentWillUpdate(nextProps) {
if (this.props.groups) {
for (const num in this.props.groups) {
const group = this.props.groups[num];
- var obj = {
+ obj = {
key: group._id,
value: group._id,
text: group.groupName
diff --git a/frontend/src/Call/ListCalls.js b/frontend/src/Call/ListCalls.js
index 77e484c..2752668 100644
--- a/frontend/src/Call/ListCalls.js
+++ b/frontend/src/Call/ListCalls.js
@@ -9,10 +9,6 @@ import "./CallPlayer.css";
// ----------------------------------------------------
class ListCalls extends React.Component {
- constructor(props) {
- super(props);
-
- }
//https://stackoverflow.com/questions/36559661/how-can-i-dispatch-from-child-components-in-react-redux
//https://stackoverflow.com/questions/42597602/react-onclick-pass-event-with-parameter
@@ -30,7 +26,7 @@ class ListCalls extends React.Component {
- {this.props.callsAllIds.map((callId, index) => )}
+ {this.props.callsAllIds.map((callId, index) => )}
diff --git a/frontend/src/Call/MediaPlayer.js b/frontend/src/Call/MediaPlayer.js
index 8ed43bd..e1b1bf9 100644
--- a/frontend/src/Call/MediaPlayer.js
+++ b/frontend/src/Call/MediaPlayer.js
@@ -66,7 +66,7 @@ class MediaPlayer extends React.Component {
}
componentWillUpdate(nextProps) {
- if (nextProps.call && (nextProps.call != this.props.call)) {
+ if (nextProps.call && (nextProps.call !== this.props.call)) {
this.setState({
sourceIndex: 0
});
diff --git a/frontend/src/Call/SupportModal.js b/frontend/src/Call/SupportModal.js
index 1742224..8723bdd 100644
--- a/frontend/src/Call/SupportModal.js
+++ b/frontend/src/Call/SupportModal.js
@@ -2,8 +2,7 @@ import React, { Component } from "react";
import {
Modal,
Button,
- Icon,
- Dropdown
+ Icon
} from "semantic-ui-react";
import "./FilterModal.css";
diff --git a/frontend/src/Group/group-reducer.js b/frontend/src/Group/group-reducer.js
index c0bd50d..fb4993b 100644
--- a/frontend/src/Group/group-reducer.js
+++ b/frontend/src/Group/group-reducer.js
@@ -4,26 +4,6 @@ import {
FETCH_ERROR_GROUP
} from "./group-constants";
-function updateObject(oldObject, newValues) {
- // Encapsulate the idea of passing a new object as the first parameter
- // to Object.assign to ensure we correctly copy data instead of mutating
- return Object.assign({}, oldObject, newValues);
-}
-
-function updateItemInArray(array, itemId, updateItemCallback) {
- const updatedItems = array.map(item => {
- if(item.id !== itemId) {
- // Since we only want to update one item, preserve all others as they are now
- return item;
- }
-
- // Use the provided callback to create an updated item
- const updatedItem = updateItemCallback(item);
- return updatedItem;
- });
-
- return updatedItems;
-}
const group = (
state = {
diff --git a/frontend/src/System/system-actions.js b/frontend/src/System/system-actions.js
index 03d7514..9bade1f 100644
--- a/frontend/src/System/system-actions.js
+++ b/frontend/src/System/system-actions.js
@@ -3,7 +3,6 @@ import axios from "axios";
import * as types from "./system-constants";
import { push } from 'connected-react-router';
-const FETCH_SUCCESS_STATISTIC = "FETCH_SUCCESS_STATISTIC"
function beginFetchSystem() {
return { type: types.FETCH_SYSTEM };
@@ -19,16 +18,6 @@ function fetchSystemError(data) {
data };
}
-
-function makeUserRequest(method, data, api = "/login") {
- // returns a Promise
- return axios({
- method: method,
- url: api,
- data: data
- });
-}
-
export function changeUrl(url) {
return dispatch => {
dispatch(push(url));
diff --git a/frontend/src/System/system-reducer.js b/frontend/src/System/system-reducer.js
index e7a790b..4305be3 100644
--- a/frontend/src/System/system-reducer.js
+++ b/frontend/src/System/system-reducer.js
@@ -1,39 +1,9 @@
import {
- CREATE_SYSTEM,
- CREATE_SUCCESS_SYSTEM,
- CREATE_ERROR_SYSTEM,
- UPDATE_SYSTEM,
- UPDATE_SUCCESS_SYSTEM,
- UPDATE_ERROR_SYSTEM,
- DELETE_SYSTEM,
- DELETE_SUCCESS_SYSTEM,
- DELETE_ERROR_SYSTEM,
FETCH_SYSTEM,
FETCH_SUCCESS_SYSTEM,
FETCH_ERROR_SYSTEM
} from "./system-constants";
-function updateObject(oldObject, newValues) {
- // Encapsulate the idea of passing a new object as the first parameter
- // to Object.assign to ensure we correctly copy data instead of mutating
- return Object.assign({}, oldObject, newValues);
-}
-
-function updateObjectInArray(array, shortName, updatedItem) {
- return array.map( item => {
- if(item.shortName !== shortName) {
- // This isn't the item we care about - keep it as-is
- return item;
- }
-
- // Otherwise, this is the one we want - return an updated value
- return {
- ...item,
- ...updatedItem
- };
- });
-}
-
const system = (
state = {
diff --git a/frontend/src/Talkgroups/talkgroup-actions.js b/frontend/src/Talkgroups/talkgroup-actions.js
index 1f7dfff..17320e6 100644
--- a/frontend/src/Talkgroups/talkgroup-actions.js
+++ b/frontend/src/Talkgroups/talkgroup-actions.js
@@ -49,16 +49,6 @@ function fetchTalkgroupError(data) {
data };
}
-
-function makeUserRequest(method, data, api) {
- // returns a Promise
- return axios({
- method: method,
- url: api,
- data: data
- });
-}
-
export function changeUrl(url) {
return dispatch => {
dispatch(push(url));
diff --git a/frontend/src/Talkgroups/talkgroup-reducer.js b/frontend/src/Talkgroups/talkgroup-reducer.js
index d635a9e..396d0d1 100644
--- a/frontend/src/Talkgroups/talkgroup-reducer.js
+++ b/frontend/src/Talkgroups/talkgroup-reducer.js
@@ -10,27 +10,6 @@ import {
FETCH_ERROR_TALKGROUP
} from "./talkgroup-constants";
-function updateObject(oldObject, newValues) {
- // Encapsulate the idea of passing a new object as the first parameter
- // to Object.assign to ensure we correctly copy data instead of mutating
- return Object.assign({}, oldObject, newValues);
-}
-
-function updateItemInArray(array, itemId, updateItemCallback) {
- const updatedItems = array.map(item => {
- if(item.id !== itemId) {
- // Since we only want to update one item, preserve all others as they are now
- return item;
- }
-
- // Use the provided callback to create an updated item
- const updatedItem = updateItemCallback(item);
- return updatedItem;
- });
-
- return updatedItems;
-}
-
const talkgroup = (
state = {
isWaiting: false,