After adding all required Dependency. we will add the Birth-Registration module code.
Create form Form UI :-
Add Card On Homepage:-
Integration with Backend Api:-
Routing:-
Now we will see how to add a new screen. Create an index.js (you can give any name) file in a particular module or service as seen below
...
So here in pages ->citizen->create-> index.js, we are adding new screen code whatever we need to render on UI that code we will add. after adding the code will add the route for the create.js file.
...
For Routing will create an index.js file where we mention or add all routes. Above index.js will add a private route so we mention the path and component name which component we need to show or render after entering a specific path or link.
Module.js:-
In Module.js we register the component which components we need to show or render on UI.
e.g:-
Code Block |
---|
Code Block |
import { FormComposer } from "@egovernments/digit-ui-react-components";
import React from "react";
import { useTranslation } from "react-i18next";
import { newConfig } from "../../../components/config/config";
const Create = () => {
const { t } = useTranslation();
const configs = newConfig?newConfig:newConfig;
return (
<FormComposer
heading={t("Create Birth Registration")}
label={t("ES_COMMON_APPLICATION_SUBMIT")}
config={configs.map((config) => {
return {
...config,
body: config.body.filter((a) => !a.hideInEmployee),
};
})}
fieldStyle={{ marginRight: 0 }}
/>
);
};
export default Create;
|
Config.js:-
Code Block |
---|
export const newConfig =[
{
"head": "Birth-Details",
"body": [
{
type: "component",
component: "BrSelectName",
key: "BrSelectName",
withoutLabel: true,
},
{
type: "component",
component: "BRSelectGender",
key: "BRSelectPhoneGender",
withoutLabel: true,
},
{
type: "component",
component: "BRSelectPhoneNumber",
key: "BRSelectPhoneNumber",
withoutLabel: true,
},
{
type: "component",
component: "BRSelectEmailId",
key: "BRSelectEmailId",
withoutLabel: true,
},
{
type: "component",
component: "BrSelectAddress",
key: "BrSelectAddress",
withoutLabel: true,
},
{
type: "component",
component: "SelectCorrespondenceAddress",
key: "SelectCorrespondenceAddress",
withoutLabel: true,
},
]
},
]; |
Componets:-
Add Card On Homepage:-
Module.js:-
Code Block |
---|
import { CitizenHomeCard, PTIcon } from "@egovernments/digit-ui-react-components"; import React, { useEffect } from "react"; import { useTranslation } from "react-i18next"; import { useRouteMatch } from "react-router-dom"; import CitizenApp from "./pages/citizen |
...
"; import Create from "./pages/citizen/create/index"; import EmployeeApp from "./pages/employee"; import BrSelectName from "./pagecomponents/BrSelectName"; import BRSelectPhoneNumber from "./pagecomponents/BrSelectPhoneNumber"; import BRSelectGender from "./pagecomponents/BRSelectGender"; import BRSelectEmailId from "./pagecomponents/SelectEmailId"; import BRSelectPincode from "./pagecomponents/BRSelectPincode"; import BrSelectAddress from "./pagecomponents/BrSelectAddress"; import SelectCorrespondenceAddress from "./pagecomponents/SelectCorrespondenceAddress"; import SelectDocuments from "./pagecomponents/SelectDocuments"; import BRCard from "./components/config/BRCard"; import BRManageApplication from "./pages/employee/BRManageApplication"; import RegisterDetails from "./pages/employee/RegisterDetails"; import Response from "./pages/citizen/create/Response"; const componentsToRegister = { Response, RegisterDetails, BRManageApplication, BRCard, SelectDocuments, SelectCorrespondenceAddress, BrSelectAddress, BRSelectPincode, BRSelectEmailId, BRSelectGender, BRSelectPhoneNumber, BrSelectName, BRCreate : Create, |
...
}; export const BRModule = ({ stateCode, userType, tenants }) => { const { path, url } = useRouteMatch(); const moduleCode = "BR"; const language = Digit.StoreData.getCurrentLanguage(); const { isLoading, data: store } = Digit.Services.useStore({ stateCode, moduleCode, language }); if (userType === "citizen") { return <CitizenApp path={path} stateCode={stateCode} />; } return <EmployeeApp path={path} stateCode={stateCode} />; }; export const BRLinks = ({ matchPath, userType }) => { const { t } = useTranslation(); const links = [ { |
...
link: `${matchPath}/birth`,
i18nKey: t("Create BirthRegistration"),
},
];
return <CitizenHomeCard header={t("BirthRegistration")} links={links} Icon={() => <PTIcon className="fill-path-primary-main" />} />;
};
export const initBRComponents = () => {
Object.entries(componentsToRegister).forEach(([key, value]) => {
Digit.ComponentRegistryService.setComponent(key, value);
});
};
|
Web->app.js
Code Block |
---|
import React from 'react';
import { initDSSComponents } from "@egovernments/digit-ui-module-dss";
import { PaymentModule, PaymentLinks, paymentConfigs } from "@egovernments/digit-ui-module-common";
import { DigitUI } from "@egovernments/digit-ui-module-core";
import { initLibraries } from "@egovernments/digit-ui-libraries";
import { initEngagementComponents } from "@egovernments/digit-ui-module-engagement";
// import { initWSComponents } from "@egovernments/digit-ui-module-ws";
import {initCustomisationComponents} from "./Customisations";
import { initCommonPTComponents } from "@egovernments/digit-ui-module-commonpt";
import { BRModule ,initBRComponents ,BRLinks} from "@egovernments/digit-ui-module-br";
initLibraries();
//"WS" removed the ws enabledModules ;
const enabledModules = ["Payment","QuickPayLinks", "DSS","Engagement", "BR"];
window.Digit.ComponentRegistryService.setupRegistry({
...paymentConfigs,
PaymentModule,
PaymentLinks,
BRModule,
BRLinks,
});
initBRComponents();
initDSSComponents();
initEngagementComponents();
// initWSComponents();
initCustomisationComponents();
function App() {
const stateCode = window.globalConfigs?.getConfig("STATE_LEVEL_TENANT_ID") || process.env.REACT_APP_STATE_LEVEL_TENANT_ID;
if (!stateCode) {
return <h1>stateCode is not defined</h1>
}
return (
<DigitUI stateCode={stateCode} enabledModules={enabledModules} />
);
}
export default App;
|
example->index.js :-
Code Block |
---|
import React from "react";
import ReactDOM from "react-dom";
import { initLibraries } from "@egovernments/digit-ui-libraries";
import { BRModule, initBRComponents ,BRLinks} from "@egovernments/digit-ui-module-br";
import { initDSSComponents } from "@egovernments/digit-ui-module-dss";
import { PaymentModule, PaymentLinks, paymentConfigs } from "@egovernments/digit-ui-module-common";
import { initEngagementComponents } from "@egovernments/digit-ui-module-engagement";
import { DigitUI } from "@egovernments/digit-ui-module-core";
// import {initCustomisationComponents} from "./customisations";
// import { PGRModule, PGRLinks } from "@egovernments/digit-ui-module-pgr";
// import { Body, TopBar } from "@egovernments/digit-ui-react-components";
import "@egovernments/digit-ui-css/example/index.css";
// import * as comps from "@egovernments/digit-ui-react-components";
// import { subFormRegistry } from "@egovernments/digit-ui-libraries";
var Digit = window.Digit || {};
const enabledModules = [ "Payment","QuickPayLinks", "DSS","Engagement","BR"];
const initTokens = (stateCode) => {
const userType = window.sessionStorage.getItem("userType") || process.env.REACT_APP_USER_TYPE || "CITIZEN";
const token =window.localStorage.getItem("token")|| process.env[`REACT_APP_${userType}_TOKEN`];
const citizenInfo = window.localStorage.getItem("Citizen.user-info")
const citizenTenantId = window.localStorage.getItem("Citizen.tenant-id") || stateCode;
const employeeInfo = window.localStorage.getItem("Employee.user-info");
const employeeTenantId = window.localStorage.getItem("Employee.tenant-id");
const userTypeInfo = userType === "CITIZEN" || userType === "QACT" ? "citizen" : "employee";
window.Digit.SessionStorage.set("user_type", userTypeInfo);
window.Digit.SessionStorage.set("userType", userTypeInfo);
if (userType !== "CITIZEN") {
window.Digit.SessionStorage.set("User", { access_token: token, info: userType !== "CITIZEN" ? JSON.parse(employeeInfo) : citizenInfo });
} else {
// if (!window.Digit.SessionStorage.get("User")?.extraRoleInfo) window.Digit.SessionStorage.set("User", { access_token: token, info: citizenInfo });
}
window.Digit.SessionStorage.set("Citizen.tenantId", citizenTenantId);
if(employeeTenantId && employeeTenantId.length) window.Digit.SessionStorage.set("Employee.tenantId", employeeTenantId);
};
const initDigitUI = () => {
window?.Digit.ComponentRegistryService.setupRegistry({
PaymentModule,
BRModule,
PaymentLinks,
BRLinks,
// TLModule,
// TLLinks,
});
initDSSComponents();
initEngagementComponents();
initBRComponents();
// initCustomisationComponents();
const stateCode = window?.globalConfigs?.getConfig("STATE_LEVEL_TENANT_ID") || "pb";
initTokens(stateCode);
const registry = window?.Digit.ComponentRegistryService.getRegistry();
ReactDOM.render(<DigitUI stateCode={stateCode} enabledModules={enabledModules} />, document.getElementById("root"));
};
initLibraries().then(() => {
initDigitUI();
});
|
core->
Code Block |
---|
import { Calender, CardBasedOptions, CaseIcon, ComplaintIcon, DocumentIcon, HomeIcon, Loader, OBPSIcon, PTIcon, StandaloneSearchBar, WhatsNewCard } from "@egovernments/digit-ui-react-components"; import React from "react"; import { useTranslation } from "react-i18next"; import { useHistory } from "react-router-dom"; const Home = () => { const { t } = useTranslation(); const history = useHistory(); const tenantId = Digit.ULBService.getCitizenCurrentTenant(true); const { data: { stateInfo } = {}, isLoading } = Digit.Hooks.useStore.getInitData(); const conditionsToDisableNotificationCountTrigger = () => { const { t } = useTranslation(); // const [params, setParams, clearParams]if (Digit.UserService?.getUser()?.info?.type === "EMPLOYEE") return false; if (!Digit.UserService?.getUser()?.access_token) return false; return true; }; const { data: EventsData, isLoading: EventsDataLoading } = Digit.Hooks.useSessionStorage("PT_CREATE_PROPERTY", {}); // useEffect(() => { // clearParams(); // }, []); const links = [ useEvents({ tenantId, variant: "whats-new", config: { enabled: conditionsToDisableNotificationCountTrigger(), }, }); if (!tenantId) { history.push(`/digit-ui/citizen/select-language`); } const allCitizenServicesProps = { header: t("DASHBOARD_CITIZEN_SERVICES_LABEL"), sideOption: { name: t("DASHBOARD_VIEW_ALL_LABEL"), onClick: () => history.push("/digit-ui/citizen/all-services"), }, options: [ { name: t("Birth-Registration"), Icon: <OBPSIcon />, onClick: () => history.push("/digit-ui/citizen/br-home"), }, ], styles: { display: "flex", flexWrap: "wrap", justifyContent: "flex-start", width: "100%" }, }; const allInfoAndUpdatesProps = { header: t("CS_COMMON_DASHBOARD_INFO_UPDATES"), sideOption: { name: t("DASHBOARD_VIEW_ALL_LABEL"), onClick: () => {}, }, options: [ { name: t("CS_HEADER_MYCITY"), Icon: <HomeIcon />, }, { name: t("EVENTS_EVENTS_HEADER"), Icon: <Calender />, link: `${matchPath}/birth`, i18nKey onClick: () => history.push("/digit-ui/citizen/engagement/events"), }, { name: t("CS_COMMON_DOCUMENTS"), Icon: <DocumentIcon />, onClick: () => history.push("/digit-ui/citizen/engagement/docs"), }, { name: t("Create_BirthRegistrationCS_COMMON_SURVEYS"), Icon: <DocumentIcon />, onClick: () => history.push("/digit-ui/citizen/engagement/surveys/list"), }, ], styles: { display: "flex", flexWrap: "wrap", justifyContent: "flex-start", width: "100%" }, }; return <CitizenHomeCard header isLoading ? ( <Loader /> ) : ( <div className="HomePageWrapper"> <div className="BannerWithSearch"> <img src={stateInfo?.bannerUrl} /> <div className="Search"> <StandaloneSearchBar placeholder={t("BirthRegistrationCS_COMMON_SEARCH_PLACEHOLDER")} links={links} Icon={() => <PTIcon className="fill-path-primary-main" />} />; }; export const initBRComponents = (/> </div> </div> <div className="ServicesSection"> <CardBasedOptions {...allCitizenServicesProps} /> <CardBasedOptions {...allInfoAndUpdatesProps} /> </div> {conditionsToDisableNotificationCountTrigger() ? ( EventsDataLoading ? ( <Loader /> ) : ( <div className="WhatsNewSection"> <div className="headSection"> <h2>{t("DASHBOARD_WHATS_NEW_LABEL")}</h2> <p onClick={() => history.push("/digit-ui/citizen/engagement/whats-new")}>{t("DASHBOARD_VIEW_ALL_LABEL")}</p> </div> <WhatsNewCard {...EventsData?.[0]} /> </div> ) ) : null} </div> ); }; export default Home; |
Integration with Backend Api:-
Hooks: -
Code Block |
---|
import { useQuery, useMutation } from "react-query"; import BRService from "../../services/elements/BR"; export const useBRCreate = (tenantId, config = {}) => { |
...
...
So After adding all components to the module.js again we need to enable modules into the web->src-> app.js and in example->src->index.js. there we need to import.
After enabling the module into App.js and index.js routing will work.
return useMutation((data) => BRService.create(data, tenantId));
};
export default useBRCreate;
|
service → elements
Code Block |
---|
import Urls from "../atoms/urls";
import { Request } from "../atoms/Utils/Request";
const BRService = {
create: (data, tenantId) =>
Request({
data: data,
url: Urls.br.create,
useCache: false,
method: "POST",
auth: true,
userService: true,
params: { tenantId },
}),
get: (data, tenantId) =>
Request({
data: data,
url: Urls.br.get,
useCache: false,
method: "GET",
auth: true,
userService: true,
params: { tenantId },
}),
};
export default BRService;
|
service-> atoms-> url.js
Code Block |
---|
br: {
create: "https://62f0e3e5e2bca93cd23f2ada.mockapi.io/user",
get:"https://62f0e3e5e2bca93cd23f2ada.mockapi.io/user",
}, |
register index.js
Code Block |
---|
import Enums from "./enums/index";
import mergeConfig from "./config/mergeConfig";
import { useStore } from "./services/index";
import { initI18n } from "./translations/index";
import { Storage, PersistantStorage } from "./services/atoms/Utils/Storage";
import { UserService } from "./services/elements/User";
import { ULBService } from "./services/molecules/Ulb";
import Hooks from "./hooks";
import { subFormRegistry } from "./subFormRegistry";
import BRService from "./services/elements/BR";
const setupLibraries = (Library, props) => {
window.Digit = window.Digit || {};
window.Digit[Library] = window.Digit[Library] || {};
window.Digit[Library] = { ...window.Digit[Library], ...props };
};
const initLibraries = () => {
setupLibraries("SessionStorage", Storage);
setupLibraries("PersistantStorage", PersistantStorage);
setupLibraries("UserService", UserService);
setupLibraries("ULBService", ULBService);
setupLibraries("Config", { mergeConfig });
setupLibraries("Services", { useStore });
setupLibraries("BRService", BRService);
return new Promise((resolve) => {
initI18n(resolve);
});
};
export { initLibraries, Enums, Hooks, subFormRegistry };
|
Use service into create.js add on submit function
Code Block |
---|
import { FormComposer, Loader } from "@egovernments/digit-ui-react-components";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import { useHistory } from "react-router-dom";
import { newConfig } from "../../../components/config/config";
const Create = () => {
const tenantId = Digit.ULBService.getCurrentTenantId();
const { t } = useTranslation();
const history = useHistory();
const onSubmit = (data) => {
let Users = [
{
user: {
babyFirstName: data?.BrSelectName?.babyFirstName,
babyLastName: data?.BrSelectName?.babyLastName,
fatherName: data?.BrSelectName?.fatherName,
motherName: data?.BrSelectName?.motherName,
gender: data?.BrSelectGender?.gender,
doctorName: data?.BrSelectName?.doctorName,
hospitalName: data?.BrSelectName?.hospitalName,
placeOfBirth: data?.BrSelectName?.placeOfBirth,
applicantMobileNumber: data?.BRSelectPhoneNumber?.applicantMobileNumber,
altMobileNumber: data?.BRSelectPhoneNumber?.altMobileNumber,
emailId: data?.BRSelectEmailId?.emailId,
permanentAddress: data?.BrSelectAddress?.permanentAddress,
permanentCity: data?.BrSelectAddress?.permanentCity,
correspondenceCity: data?.SelectCorrespondenceAddress?.correspondenceCity,
correspondenceAddress: data?.SelectCorrespondenceAddress?.correspondenceAddress,
bloodGroup: data?.SelectCorrespondenceAddress?.bloodGroup,
tenantId: tenantId,
},
},
];
/* use customiseCreateFormData hook to make some chnages to the Employee object */
Digit.BRService.create(Users, tenantId).then((result,err)=>{
let getdata = {...data , get: result }
onSelect("", getdata, "", true);
console.log("daaaa",getdata);
})
.catch((e) => {
console.log("err");
});
history.push("/digit-ui/citizen/br/response");
console.log("getting data",Users)
};
/* use newConfig instead of commonFields for local development in case needed */
const configs = newConfig?newConfig:newConfig;
return (
<FormComposer
heading={t("Create Birth Registration")}
label={t("ES_COMMON_APPLICATION_SUBMIT")}
config={configs.map((config) => {
return {
...config,
body: config.body.filter((a) => !a.hideInEmployee),
};
})}
onSubmit={onSubmit}
fieldStyle={{ marginRight: 0 }}
/>
);
};
export default Create;
|