diff --git a/.gitignore b/.gitignore index 5d716fe..dc128f0 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ .env.test.local .env.production.local +debug.log npm-debug.log* yarn-debug.log* yarn-error.log* diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 0000000..34905a3 --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,18 @@ +tasks: + - init: npm install + command: echo DANGEROUSLY_DISABLE_HOST_CHECK=true >> .env + command: npm start +ports: + - port: 3000 + onOpen: open-preview +github: + prebuilds: + master: true + branches: true + pullRequests: true + pullRequestsFromForks: true + addCheck: true + addComment: true + addBadge: false + addLabel: false + \ No newline at end of file diff --git a/src/components/applications/ApplicationList.js b/src/components/applications/ApplicationList.js index 72084a3..9d60984 100644 --- a/src/components/applications/ApplicationList.js +++ b/src/components/applications/ApplicationList.js @@ -1,26 +1,29 @@ import React from "react"; import { useMediaQuery } from "@material-ui/core"; -import { - List, - Datagrid, - TextField, - SimpleList, - Pagination, - ReferenceField, -} from "react-admin"; - -const ApplicationPagination = (props) => ( - -); +import { List, Datagrid, TextField, SimpleList } from "react-admin"; +import Pagination from "../pagination/Pagination"; +import Filter from "../pagination/Filter"; const ApplicationList = (props) => { const isSmall = useMediaQuery((theme) => theme.breakpoints.down("sm")); + const filters = [ + { + label: "Filter by name", + source: "applicationName", + alwaysOn: true, + }, + { + label: "Filter by organization", + source: "organizationName", + }, + ]; return ( } + pagination={} + filters={} {...props} > {isSmall ? ( @@ -31,14 +34,7 @@ const ApplicationList = (props) => { ) : ( - - - + )} diff --git a/src/components/msadmins/AdminFilter.js b/src/components/msadmins/AdminFilter.js new file mode 100644 index 0000000..6860e74 --- /dev/null +++ b/src/components/msadmins/AdminFilter.js @@ -0,0 +1,12 @@ +import React from "react"; +import { Filter, TextInput } from "react-admin"; + +const AdminFilter = (props) => ( + + + + + +); + +export default AdminFilter; diff --git a/src/components/msadmins/AdminList.js b/src/components/msadmins/AdminList.js index 476130e..942c9a8 100644 --- a/src/components/msadmins/AdminList.js +++ b/src/components/msadmins/AdminList.js @@ -1,31 +1,33 @@ import React from "react"; import { useMediaQuery } from "@material-ui/core"; -import { - List, - Datagrid, - TextField, - EmailField, - SimpleList, - TopToolbar, - ExportButton, - CreateButton, -} from "react-admin"; - -const AdminListActions = ({ basePath, data, resource }) => ( - - - - -); +import { List, Datagrid, TextField, EmailField, SimpleList } from "react-admin"; +import Pagination from "../pagination/Pagination"; +import Filter from "../pagination/Filter"; const AdminList = (props) => { const isSmall = useMediaQuery((theme) => theme.breakpoints.down("sm")); + const filters = [ + { + label: "Filter by name", + source: "fullname", + alwaysOn: true, + }, + { + label: "Filter by email", + source: "email", + }, + { + label: "Filter by role", + source: "role", + }, + ]; return ( } + pagination={} + filters={} {...props} > {isSmall ? ( @@ -36,7 +38,7 @@ const AdminList = (props) => { tertiaryText={(record) => record.role} /> ) : ( - false}> + diff --git a/src/components/msadmins/AdminShow.js b/src/components/msadmins/AdminShow.js index 6dccbf2..668f2cd 100644 --- a/src/components/msadmins/AdminShow.js +++ b/src/components/msadmins/AdminShow.js @@ -5,12 +5,10 @@ import { TextField, TopToolbar, DeleteButton, - EditButton, } from "react-admin"; const AdminShowActions = ({ basePath, data, resource }) => ( - ); diff --git a/src/components/organizations/OrganizationFilter.js b/src/components/organizations/OrganizationFilter.js new file mode 100644 index 0000000..826c24d --- /dev/null +++ b/src/components/organizations/OrganizationFilter.js @@ -0,0 +1,11 @@ +import React from "react"; +import { Filter, TextInput } from "react-admin"; + +const OrganizationFilter = (props) => ( + + + + +); + +export default OrganizationFilter; diff --git a/src/components/organizations/OrganizationList.js b/src/components/organizations/OrganizationList.js index 134a59d..8ab488d 100644 --- a/src/components/organizations/OrganizationList.js +++ b/src/components/organizations/OrganizationList.js @@ -1,26 +1,29 @@ import React from "react"; import { useMediaQuery } from "@material-ui/core"; -import { - List, - Datagrid, - TextField, - EmailField, - SimpleList, - Pagination, -} from "react-admin"; - -const OrganizationPagination = (props) => ( - -); +import { List, Datagrid, TextField, EmailField, SimpleList } from "react-admin"; +import Pagination from "../pagination/Pagination"; +import Filter from "../pagination/Filter"; const OrganizationList = (props) => { const isSmall = useMediaQuery((theme) => theme.breakpoints.down("sm")); + const filters = [ + { + label: "Filter by name", + source: "organizationName", + alwaysOn: true, + }, + { + label: "Filter by email", + source: "organizationEmail", + }, + ]; return ( } + pagination={} + filters={} {...props} > {isSmall ? ( diff --git a/src/components/organizations/OrganizationShow.js b/src/components/organizations/OrganizationShow.js index 0991945..84110d5 100644 --- a/src/components/organizations/OrganizationShow.js +++ b/src/components/organizations/OrganizationShow.js @@ -38,8 +38,8 @@ const OrganizationShow = (props) => { ( + + {filters.map((filter) => ( + + ))} + +); diff --git a/src/components/pagination/Pagination.js b/src/components/pagination/Pagination.js new file mode 100644 index 0000000..18f6623 --- /dev/null +++ b/src/components/pagination/Pagination.js @@ -0,0 +1,6 @@ +import React from "react"; +import { Pagination } from "react-admin"; + +export default (props) => ( + +); diff --git a/src/components/plans/PlanFilter.js b/src/components/plans/PlanFilter.js new file mode 100644 index 0000000..7593a85 --- /dev/null +++ b/src/components/plans/PlanFilter.js @@ -0,0 +1,10 @@ +import React from "react"; +import { Filter, TextInput } from "react-admin"; + +const PlanFilter = (props) => ( + + + +); + +export default PlanFilter; diff --git a/src/components/plans/PlanList.js b/src/components/plans/PlanList.js index 4b81685..d6b7edc 100644 --- a/src/components/plans/PlanList.js +++ b/src/components/plans/PlanList.js @@ -1,31 +1,29 @@ import React from "react"; import { useMediaQuery } from "@material-ui/core"; -import { - List, - Datagrid, - TextField, - SimpleList, - TopToolbar, - CreateButton, - ExportButton, -} from "react-admin"; - -const PlanListActions = ({ basePath, data, resource }) => ( - - - - -); +import { List, Datagrid, TextField, SimpleList } from "react-admin"; +import Pagination from "../pagination/Pagination"; +import Filter from "../pagination/Filter"; const PlanList = (props) => { const isSmall = useMediaQuery((theme) => theme.breakpoints.down("sm")); + const filters = [ + { + label: "Filter by name", + source: "organizationName", + alwaysOn: true, + }, + { + label: "Filter by email", + source: "organizationEmail", + }, + ]; return ( } - pagination={null} + pagination={} + filters={} {...props} > {isSmall ? ( diff --git a/src/services/data-provider.js b/src/services/data-provider.js index 6cbea3e..32dbe20 100644 --- a/src/services/data-provider.js +++ b/src/services/data-provider.js @@ -1,7 +1,7 @@ import { fetchUtils } from "react-admin"; import endpoints from "../utils/endpoints"; import { stringify } from "querystring"; -import getPaginateQuery from "../utils/pagination"; +import getPaginateQuery, { filter } from "../utils/pagination"; import handleProfileData from "../utils/data/profile-data"; import { GET_LIST, @@ -29,7 +29,7 @@ export default { const endpoint = endpoints(GET_LIST, resource, params); return httpClient(`${endpoint.url}?${stringify(query)}`).then( ({ json }) => ({ - data: endpoint.getData(json.data), + data: filter(endpoint.getData(json.data), params), total: json.data.pageInfo ? json.data.pageInfo.totalRecord : json.data.length, @@ -56,12 +56,20 @@ export default { getManyReference: (resource, params) => { const endpoint = endpoints(GET_MANY_REFERENCE, resource, params); - return httpClient(endpoint.url).then(({ json }) => ({ - data: endpoint.getData(json.data, endpoint.target, endpoint.targetId), - total: json.data.pageInfo - ? json.data.pageInfo.totalRecord - : json.data.length, - })); + console.log("REFERENCE", params); + const query = { + limit: 50, + sort: "ASC", + page: 1, + }; + return httpClient(`${endpoint.url}?${stringify(query)}`).then( + ({ json }) => ({ + data: endpoint.getData(json.data, endpoint.target, endpoint.targetId), + total: json.data.pageInfo + ? json.data.pageInfo.totalRecord + : json.data.length, + }) + ); }, update: (resource, params) => { diff --git a/src/utils/data/admin-data.js b/src/utils/data/admin-data.js index 211208f..278d00f 100644 --- a/src/utils/data/admin-data.js +++ b/src/utils/data/admin-data.js @@ -1,6 +1,10 @@ export default (data) => { - if (data.records && Array.isArray(data.records)) { - return data.records.map((item) => ({ id: item.msAdminId, ...item })); + if (Array.isArray(data.records)) { + const profile = localStorage.getItem("profile"); + const currentUserId = JSON.parse(profile).msAdminId; + return data.records + .filter((admin) => admin.msAdminId !== currentUserId) + .map((item) => ({ id: item.msAdminId, ...item })); } else if (data.msAdminId) { return { id: data.msAdminId, ...data }; } diff --git a/src/utils/data/application-data.js b/src/utils/data/application-data.js index d2d7084..22d9fcc 100644 --- a/src/utils/data/application-data.js +++ b/src/utils/data/application-data.js @@ -1,14 +1,8 @@ -const getApplicationsData = (data, target, id) => { +const getApplicationsData = (data) => { let mappedData = data; if (Array.isArray(data.records) && data.records[0].applicationId) { mappedData = data.records.map(mapApplicationIdToId); - - if (target && id) { - mappedData = mappedData.filter((item) => { - return item[target]._id === id; - }); - } } return mappedData; diff --git a/src/utils/data/organizations-data.js b/src/utils/data/organizations-data.js index e0c2806..7674bb7 100644 --- a/src/utils/data/organizations-data.js +++ b/src/utils/data/organizations-data.js @@ -1,14 +1,10 @@ -const getOrganizationsData = (data, target, id) => { +const getOrganizationsData = (data) => { let mappedData = data; if (Array.isArray(data.records) && data.records[0].organizationId) { mappedData = data.records.map(mapOrganizationIdToId); } - if (target && id) { - mappedData = mappedData.filter((item) => item[target] === id); - } - return mappedData; }; diff --git a/src/utils/data/plans-data.js b/src/utils/data/plans-data.js index f88836f..6cfaa60 100644 --- a/src/utils/data/plans-data.js +++ b/src/utils/data/plans-data.js @@ -1,4 +1,4 @@ -const getPlansData = (data, target, id) => { +const getPlansData = (data) => { let mappedData = data; if (Array.isArray(data) && data[0].planId) { @@ -7,10 +7,6 @@ const getPlansData = (data, target, id) => { mappedData = mapPlanIdToId(data); } - if (target && id) { - mappedData = mappedData.filter((item) => item[target] === id); - } - return mappedData; }; diff --git a/src/utils/endpoints/admin-endpoints.js b/src/utils/endpoints/admin-endpoints.js index 821a484..8b00abc 100644 --- a/src/utils/endpoints/admin-endpoints.js +++ b/src/utils/endpoints/admin-endpoints.js @@ -6,7 +6,7 @@ import { UPDATE, DELETE, GET_MANY, - GET_MANY_REFERENCE, + DELETE_MANY, } from "react-admin"; const apiUrl = "https://comments-microservice.herokuapp.com/v1"; @@ -28,11 +28,6 @@ export default (type, params) => { url: `${apiUrl}/msadmins`, getData: getData, }; - case GET_MANY_REFERENCE: - return { - url: `${apiUrl}/msadmins`, - getData: getData, - }; case UPDATE: return { url: `${apiUrl}/msadmins`, @@ -57,6 +52,11 @@ export default (type, params) => { options: { method: "DELETE" }, getData: getData, }; + case DELETE_MANY: + return { + urls: params.ids.map((id) => `${apiUrl}/msadmins/${id}`), + getData: getData, + }; default: throw new Error(`Unsupported Admin Data Provider request type ${type}`); } diff --git a/src/utils/endpoints/application-endpoints.js b/src/utils/endpoints/application-endpoints.js index a8e8b2a..f074dcf 100644 --- a/src/utils/endpoints/application-endpoints.js +++ b/src/utils/endpoints/application-endpoints.js @@ -20,10 +20,8 @@ export default (type, params) => { }; case GET_MANY_REFERENCE: return { - url: `${apiUrl}/msadmins/applications`, - getData: (data) => { - return getData(data, params.target, params.id); - }, + url: `${apiUrl}/msadmins/applications/${params.id}`, + getData: getData, }; case GET_ONE: case DELETE: diff --git a/src/utils/endpoints/organizations-endpoints.js b/src/utils/endpoints/organizations-endpoints.js index b4c8889..a3d2111 100644 --- a/src/utils/endpoints/organizations-endpoints.js +++ b/src/utils/endpoints/organizations-endpoints.js @@ -19,10 +19,8 @@ export default (type, params) => { }; case GET_MANY_REFERENCE: return { - url: `${apiUrl}/msadmins/organizations`, - getData: (data) => { - return getData(data, params.target, params.id); - }, + url: `${apiUrl}/msadmins/organizations/${params.id}/applications`, + getData: getData, }; case GET_ONE: case DELETE: diff --git a/src/utils/pagination.js b/src/utils/pagination.js index ade1ae7..0040c41 100644 --- a/src/utils/pagination.js +++ b/src/utils/pagination.js @@ -8,3 +8,27 @@ export default (params) => { page: page, }; }; + +export const filter = (data, params) => { + const filter = params ? params.filter : {}; + if (Object.keys(filter).length) { + return Object.keys(filter).reduce( + (acc, key) => + acc.filter((item) => RegExp(filter[key], "i").test(item[key])), + data + ); + } + return data; +}; + +export const sortData = (data, params) => { + const sort = params.sort; + if (sort) { + return [].concat(data).sort((a, b) => { + return isNaN(a[sort.field]) + ? a[sort.field].localeCompare(b[sort.field]) + : a - b; + }); + } + return data; +};