diff --git a/package.json b/package.json
index b688b6d7..ced99d4d 100644
--- a/package.json
+++ b/package.json
@@ -1,86 +1,86 @@
{
- "name": "alert-hub",
- "version": "0.0.0",
- "type": "module",
- "private": true,
- "scripts": {
- "start": "vite",
- "build": "vite build",
- "generate": "graphql-codegen --config codegen.yml && eslint --fix generated/types.ts",
- "lint:js": "eslint src",
- "lint:css": "stylelint \"./src/**/*.css\"",
- "lint:unused": "unimported",
- "lint": "yarn lint:js && yarn lint:css && yarn lint:unused",
- "test": "vitest",
- "test:coverage": "vitest run --coverage",
- "typecheck": "tsc"
- },
- "dependencies": {
- "@apollo/client": "^3.9.9",
- "@graphql-codegen/cli": "^5.0.2",
- "@graphql-codegen/introspection": "^4.0.3",
- "@graphql-codegen/typescript": "^4.0.6",
- "@graphql-codegen/typescript-operations": "^4.2.0",
- "@ifrc-go/icons": "^1.3.3",
- "@ifrc-go/ui": "^1.0.0",
- "@sentry/react": "^7.81.1",
- "@togglecorp/fujs": "^2.1.1",
- "@togglecorp/re-map": "^0.2.0-beta-6",
- "@togglecorp/toggle-form": "^2.0.4",
- "graphql": "^16.8.1",
- "mapbox-gl": "^1.13.0",
- "react": "^18.2.0",
- "react-dom": "^18.2.0",
- "react-router-dom": "^6.22.3"
- },
- "devDependencies": {
- "@eslint/eslintrc": "^2.0.3",
- "@julr/vite-plugin-validate-env": "^1.0.1",
- "@types/mapbox-gl": "^1.13.0",
- "@types/node": "^20.1.3",
- "@types/react": "^18.0.28",
- "@types/react-dom": "^18.2.22",
- "@types/react-router-dom": "^5.3.3",
- "@typescript-eslint/eslint-plugin": "^5.59.5",
- "@typescript-eslint/parser": "^5.59.5",
- "@vitejs/plugin-react-swc": "^3.5.0",
- "autoprefixer": "^10.4.14",
- "cross-var": "^1.1.0",
- "dotenv-cli": "^7.2.1",
- "eslint": "^8.40.0",
- "eslint-config-airbnb": "^19.0.4",
- "eslint-import-resolver-typescript": "^3.5.5",
- "eslint-plugin-import": "^2.27.5",
- "eslint-plugin-import-exports-imports-resolver": "^1.0.1",
- "eslint-plugin-import-newlines": "^1.3.4",
- "eslint-plugin-jsx-a11y": "^6.7.1",
- "eslint-plugin-react": "^7.32.2",
- "eslint-plugin-react-hooks": "^4.6.0",
- "eslint-plugin-react-refresh": "^0.3.4",
- "eslint-plugin-simple-import-sort": "^10.0.0",
- "fast-glob": "^3.3.0",
- "happy-dom": "^9.18.3",
- "postcss": "^8.3.0",
- "postcss-nested": "^6.0.1",
- "postcss-normalize": "^10.0.1",
- "postcss-preset-env": "^8.3.2",
- "postinstall-postinstall": "^2.1.0",
- "rollup-plugin-visualizer": "^5.9.0",
- "stylelint": "^15.6.1",
- "stylelint-config-concentric": "^2.0.2",
- "stylelint-config-recommended": "^12.0.0",
- "stylelint-no-unused-selectors": "git+https://github.com/toggle-corp/stylelint-no-unused-selectors#e0831e1",
- "stylelint-value-no-unknown-custom-properties": "^4.0.0",
- "surge": "^0.23.1",
- "typescript": "^5.0.4",
- "unimported": "1.28.0",
- "vite": "^5.0.10",
- "vite-plugin-checker": "^0.6.2",
- "vite-plugin-compression2": "^0.11.0",
- "vite-plugin-radar": "^0.9.2",
- "vite-plugin-svgr": "^4.2.0",
- "vite-plugin-webfont-dl": "^3.9.1",
- "vite-tsconfig-paths": "^4.2.2",
- "vitest": "^1.1.0"
- }
+ "name": "alert-hub",
+ "version": "0.0.0",
+ "type": "module",
+ "private": true,
+ "scripts": {
+ "start": "vite",
+ "build": "vite build",
+ "generate": "graphql-codegen --config codegen.yml && eslint --fix generated/types.ts",
+ "lint:js": "eslint src",
+ "lint:css": "stylelint \"./src/**/*.css\"",
+ "lint:unused": "unimported",
+ "lint": "yarn lint:js && yarn lint:css && yarn lint:unused",
+ "test": "vitest",
+ "test:coverage": "vitest run --coverage",
+ "typecheck": "tsc"
+ },
+ "dependencies": {
+ "@apollo/client": "^3.9.9",
+ "@graphql-codegen/cli": "^5.0.2",
+ "@graphql-codegen/introspection": "^4.0.3",
+ "@graphql-codegen/typescript": "^4.0.6",
+ "@graphql-codegen/typescript-operations": "^4.2.0",
+ "@ifrc-go/icons": "^1.3.3",
+ "@ifrc-go/ui": "^1.0.0",
+ "@sentry/react": "^7.81.1",
+ "@togglecorp/fujs": "^2.1.1",
+ "@togglecorp/re-map": "^0.2.0-beta-6",
+ "@togglecorp/toggle-form": "^2.0.4",
+ "graphql": "^16.8.1",
+ "mapbox-gl": "^1.13.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-router-dom": "^6.22.3"
+ },
+ "devDependencies": {
+ "@eslint/eslintrc": "^2.0.3",
+ "@julr/vite-plugin-validate-env": "^1.0.1",
+ "@types/mapbox-gl": "^1.13.0",
+ "@types/node": "^20.1.3",
+ "@types/react": "^18.0.28",
+ "@types/react-dom": "^18.2.22",
+ "@types/react-router-dom": "^5.3.3",
+ "@typescript-eslint/eslint-plugin": "^5.59.5",
+ "@typescript-eslint/parser": "^5.59.5",
+ "@vitejs/plugin-react-swc": "^3.5.0",
+ "autoprefixer": "^10.4.14",
+ "cross-var": "^1.1.0",
+ "dotenv-cli": "^7.2.1",
+ "eslint": "^8.40.0",
+ "eslint-config-airbnb": "^19.0.4",
+ "eslint-import-resolver-typescript": "^3.5.5",
+ "eslint-plugin-import": "^2.27.5",
+ "eslint-plugin-import-exports-imports-resolver": "^1.0.1",
+ "eslint-plugin-import-newlines": "^1.3.4",
+ "eslint-plugin-jsx-a11y": "^6.7.1",
+ "eslint-plugin-react": "^7.32.2",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-react-refresh": "^0.3.4",
+ "eslint-plugin-simple-import-sort": "^10.0.0",
+ "fast-glob": "^3.3.0",
+ "happy-dom": "^9.18.3",
+ "postcss": "^8.3.0",
+ "postcss-nested": "^6.0.1",
+ "postcss-normalize": "^10.0.1",
+ "postcss-preset-env": "^8.3.2",
+ "postinstall-postinstall": "^2.1.0",
+ "rollup-plugin-visualizer": "^5.9.0",
+ "stylelint": "^15.6.1",
+ "stylelint-config-concentric": "^2.0.2",
+ "stylelint-config-recommended": "^12.0.0",
+ "stylelint-no-unused-selectors": "git+https://github.com/toggle-corp/stylelint-no-unused-selectors#e0831e1",
+ "stylelint-value-no-unknown-custom-properties": "^4.0.0",
+ "surge": "^0.23.1",
+ "typescript": "^5.0.4",
+ "unimported": "1.28.0",
+ "vite": "^5.0.10",
+ "vite-plugin-checker": "^0.6.2",
+ "vite-plugin-compression2": "^0.11.0",
+ "vite-plugin-radar": "^0.9.2",
+ "vite-plugin-svgr": "^4.2.0",
+ "vite-plugin-webfont-dl": "^3.9.1",
+ "vite-tsconfig-paths": "^4.2.2",
+ "vitest": "^1.1.0"
+ }
}
diff --git a/src/utils/domain/CountryLink/index.tsx b/src/utils/domain/CountryLink/index.tsx
deleted file mode 100644
index a1b6dac6..00000000
--- a/src/utils/domain/CountryLink/index.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import { Link } from 'react-router-dom';
-
-export interface Props {
- name: string;
-}
-
-function CountryLink(props: Props) {
- const { name } = props;
-
- // Add TODO: Add country Link
- return (
-
- {name}
-
- );
-}
-
-export default CountryLink;
diff --git a/src/utils/domain/RegionLink/index.tsx b/src/utils/domain/RegionLink/index.tsx
deleted file mode 100644
index dd9fc380..00000000
--- a/src/utils/domain/RegionLink/index.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import { Link } from 'react-router-dom';
-
-export interface Props {
- name: string;
-}
-
-function RegionLink(props: Props) {
- const { name } = props;
-
- // Add TODO: Add region link
- return (
-
- {name}
-
- );
-}
-
-export default RegionLink;
diff --git a/src/utils/domain/tableHelpers.ts b/src/utils/domain/tableHelpers.ts
index 11dc6c8e..d5f9f7d5 100644
--- a/src/utils/domain/tableHelpers.ts
+++ b/src/utils/domain/tableHelpers.ts
@@ -12,8 +12,15 @@ import {
TableActionsProps,
} from '@ifrc-go/ui';
-import type { Props as CountryLinkProps } from './CountryLink';
-import type { Props as RegionLinkProps } from './RegionLink';
+// FIXME: remove after completion of table
+type CountryLinkProps = {
+ name: string;
+};
+
+// FIXME: remove after completion of table
+type RegionLinkProps = {
+ name: string;
+};
type Options = {
sortable?: boolean,
diff --git a/src/views/AlertTable/i18n.json b/src/views/AlertTable/i18n.json
index 3b361e6a..30574946 100644
--- a/src/views/AlertTable/i18n.json
+++ b/src/views/AlertTable/i18n.json
@@ -2,12 +2,12 @@
"namespace": "allOngoingAlerts",
"strings": {
"allOngoingAlertTitle":"All Alerts ",
- "alertTableEvent":"Event" ,
- "alertTableCategory":"Event Categories",
- "alertTableRegion":"Region",
- "alertTablecounteries":"Country",
- "alertTableviewDetailsTitle":"View Details",
- "alertTableAdmins":"Admin1s",
- "alertTableSent":"Sent"
+ "alertTableEventTitle":"Event" ,
+ "alertTableCategoryTitle":"Event Categories",
+ "alertTableRegionTitle":"Region",
+ "alertTableCountryTitle":"Country",
+ "alertTableViewDetailsTitle":"View Details",
+ "alertTableAdminsTitle":"Admin1s",
+ "alertTableSentLabel":"Sent"
}
-}
\ No newline at end of file
+}
diff --git a/src/views/AlertTable/index.tsx b/src/views/AlertTable/index.tsx
index bae95e92..6713d060 100644
--- a/src/views/AlertTable/index.tsx
+++ b/src/views/AlertTable/index.tsx
@@ -15,6 +15,7 @@ import {
createStringColumn,
} from '@ifrc-go/ui/utils';
import { isNotDefined } from '@togglecorp/fujs';
+import { removeNull } from '@togglecorp/toggle-form';
import {
AlertInformationsQuery,
@@ -24,10 +25,6 @@ import useFilterState from '#hooks/useFilterState';
import { createLinkColumn } from '#utils/domain/tableHelpers';
import i18n from './i18n.json';
-import styles from './styles.module.css';
-
-type AlertType = NonNullable['alerts']>['items']>[number];
-const alertKeySelector = (item: AlertType) => item.id;
const ALERT_INFORMATIONS = gql`
query AlertInformations($pagination: OffsetPaginationInput) {
@@ -35,6 +32,7 @@ const ALERT_INFORMATIONS = gql`
alerts(pagination: $pagination) {
limit
offset
+ count
items {
id
country {
@@ -50,9 +48,10 @@ const ALERT_INFORMATIONS = gql`
}
}
sent
- url
- infos {
+ info {
+ id
event
+ alertId
category
}
}
@@ -61,8 +60,14 @@ const ALERT_INFORMATIONS = gql`
}
`;
+type AlertType = NonNullable['alerts']>['items']>[number];
+
+const alertKeySelector = (item: AlertType) => item.id;
+const PAGE_SIZE = 10;
+
function AlertTable() {
const strings = useTranslation(i18n);
+
const {
sortState,
page,
@@ -73,120 +78,117 @@ function AlertTable() {
event?: string,
eventCategory?: string
}>({
- pageSize: 7,
+ pageSize: PAGE_SIZE,
filter: {},
});
+ const variables = useMemo(() => ({
+ pagination: {
+ offset: page,
+ limit,
+ },
+ }), [
+ page,
+ limit,
+ ]);
+
+ const {
+ loading,
+ previousData,
+ data: alertInfosResponse = previousData,
+ } = useQuery(
+ ALERT_INFORMATIONS,
+ {
+ skip: isNotDefined(variables),
+ variables,
+ },
+ );
+
+ const data = removeNull(alertInfosResponse?.public.alerts);
+
const columns = useMemo(
() => ([
createStringColumn(
'event',
- strings.alertTableEvent,
- (item) => (item.infos.map((info: { event: string; }) => info.event).join(', ')),
+ strings.alertTableEventTitle,
+ (item) => item.info?.event,
{ sortable: true },
),
createStringColumn(
'category',
- strings.alertTableCategory,
- (item) => (item.infos.map((info: { category: string; }) => info.category).join(',')),
+ strings.alertTableCategoryTitle,
+ (item) => item.info?.category,
),
createStringColumn(
'region',
- strings.alertTableRegion,
+ strings.alertTableRegionTitle,
(item) => (item.country.region.name),
),
createStringColumn(
'countries_details',
- strings.alertTablecounteries,
+ strings.alertTableCountryTitle,
(item) => (item.country.name),
{ sortable: true },
),
createStringColumn(
'admin',
- strings.alertTableAdmins,
- (item) => (item.country.admin1s.map((admin: { name: string; }) => admin.name).join(', ')),
+ strings.alertTableAdminsTitle,
+ // NOTE: adim1s may be multiple
+ // so for now we are using first element
+ (item) => item.country.admin1s?.[0]?.name,
),
createDateColumn(
'sent',
- strings.alertTableSent,
+ strings.alertTableSentLabel,
(item) => (item.sent),
),
createLinkColumn(
'view_details',
- strings.alertTableviewDetailsTitle,
+ strings.alertTableViewDetailsTitle,
() => 'View Details',
(item) => ({
- to: 'detailsLayout',
+ to: '/',
urlParams: { detailId: item.id },
}),
),
]),
[
- strings.alertTableEvent,
- strings.alertTableCategory,
- strings.alertTableRegion,
- strings.alertTablecounteries,
- strings.alertTableAdmins,
- strings.alertTableSent,
- strings.alertTableviewDetailsTitle,
+ strings.alertTableEventTitle,
+ strings.alertTableCategoryTitle,
+ strings.alertTableRegionTitle,
+ strings.alertTableCountryTitle,
+ strings.alertTableAdminsTitle,
+ strings.alertTableSentLabel,
+ strings.alertTableViewDetailsTitle,
],
);
- const variables = useMemo(() => ({
- pagination: {
- offset: page,
- limit,
- },
- }), [
- page,
- limit,
- ]);
-
- const {
- loading,
- data: alertInfosResponse,
- } = useQuery(
- ALERT_INFORMATIONS,
- {
- skip: isNotDefined(variables),
- variables,
- },
- );
-
- const itemsCount = alertInfosResponse?.public.alerts.count || 0;
- const items = alertInfosResponse?.public.alerts.items;
-
return (
-
+
+ )}
+ >
+
+
+
+
);
}
export default AlertTable;
diff --git a/src/views/AlertTable/styles.module.css b/src/views/AlertTable/styles.module.css
deleted file mode 100644
index e69de29b..00000000
diff --git a/src/views/Home/index.tsx b/src/views/Home/index.tsx
index a76c9fea..b9ef45d1 100644
--- a/src/views/Home/index.tsx
+++ b/src/views/Home/index.tsx
@@ -1,3 +1,10 @@
+import { useState } from 'react';
+import {
+ Tab,
+ TabList,
+ TabPanel,
+ Tabs,
+} from '@ifrc-go/ui';
import { useTranslation } from '@ifrc-go/ui/hooks';
import Page from '#components/Page';
@@ -8,26 +15,40 @@ import AlertTable from '../AlertTable';
import i18n from './i18n.json';
import styles from './styles.module.css';
+export type TabKeys = 'map' | 'table';
// eslint-disable-next-line import/prefer-default-export
export function Component() {
const strings = useTranslation(i18n);
+ const [activeTab, setActiveTab] = useState('map');
return (
- <>
-
+
-
-
-
- >
+
+ Map
+ Table
+
+
+
+
+
+
+
+
+
);
}