HCM Workbench UI Documentation
Workbench screens for Product and product variants were created through JSON schema.
Since the Project Type is present as master data, screens got generated through Workbench, To know more about refer here
Other screens in the HCM Workbench module were created as Custom screens.
Documentation for Create and Search screens
For Create and Search screens
Create Screen Data’s Postman Collection
https://drive.google.com/file/d/1j-2TPsKd6TnuDogCpb1h05_vJzfSeW64/view?usp=sharing
Create Screen Schema Postman Collection
https://drive.google.com/file/d/1N7uz8TyFBt2hr3Rnp11WnD907XoA6Ik5/view?usp=sharing
Search Screen Data Postman Collection
https://drive.google.com/file/d/1d5a4TUrodZpiyHRPu5NY_il8G_VjXw_Z/view?usp=sharing
Search Screen Schema Collection
https://drive.google.com/file/d/1jFv6VPpJc-w6BodUmMLy4dcj70wnAnHw/view?usp=sharing
Search Configs in UNIFIED-DEV
https://github.com/egovernments/egov-mdms-data/pull/3472
Sidebar Role Action
Navigation URL | Path | Role | Action ID |
/workbench-ui/employee/hcmworkbench/inbox | HCM.1TrackStatus | CAMPAIGN_ADMIN | 1887 |
/workbench-ui/employee/hcmworkbench/help-screen/check-list | HCM.2Checklist | CAMPAIGN_ADMIN | 1886 |
/workbench-ui/employee/hcmworkbench/help-screen/coded-user | HCM.3UserManagement.CodedUser | CAMPAIGN_ADMIN | 1885 |
/workbench-ui/employee/hcmworkbench/user | HCM.3UserManagement.NamedUser | CAMPAIGN_ADMIN | 1884 |
/health-ui/employee/hrms/search | HCM.3UserManagement.ManageUser | CAMPAIGN_ADMIN | 1883 |
/workbench-ui/employee/workbench/localisation-search | HCM.4Localization | CAMPAIGN_ADMIN | 1882 |
/workbench-ui/employee/hcmworkbench/campaign | HCM.5MasterData.7DetailedPlan | CAMPAIGN_ADMIN | 1881 |
/workbench-ui/employee/hcmworkbench/facility | HCM.5MasterData.6Facility.UploadFacility | CAMPAIGN_ADMIN | 1880 |
/workbench-ui/employee/utilities/search/commonHCMUiConfig/SearchFacilityConfig | HCM.5MasterData.6Facility.ViewFacility | CAMPAIGN_ADMIN | 1879 |
/workbench-ui/employee/hcmworkbench/project | HCM.5MasterData.5Project.UploadProject | CAMPAIGN_ADMIN | 1878 |
/workbench-ui/employee/utilities/search/commonHCMUiConfig/SearchProjectConfig | HCM.5MasterData.5Project.ViewProject | CAMPAIGN_ADMIN | 1877 |
/workbench-ui/employee/hcmworkbench/boundary | HCM.5MasterData.4BoundaryData | CAMPAIGN_ADMIN | 1876 |
/workbench-ui/employee/utilities/search/commonHCMUiConfig/SearchProductVariantConfig | HCM.5MasterData.2ProductVariant | CAMPAIGN_ADMIN | 1875 |
/workbench-ui/employee/utilities/search/commonHCMUiConfig/SearchProductConfig | HCM.5MasterData.1Product | CAMPAIGN_ADMIN | 1874 |
/workbench-ui/employee/hcmworkbench/help-screen/basic-setup | HCM.6BasicSetup | CAMPAIGN_ADMIN | 1873 |
/workbench-ui/employee/workbench/mdms-search-v2?moduleName=HCM-PROJECT-TYPES&masterName=projectTypes | HCM.5MasterData.3ProjectTypes | CAMPAIGN_ADMIN | 1862 |
Role action for the create and search screen
URL | For | Role | Action ID |
/mdms-v2/v2/_create/Health.Product | Creates master data for health product | CAMPAIGN_ADMIN | 1802 |
/mdms-v2/v2/_create/Health.ProductVariant | Creates master data for health product variant | CAMPAIGN_ADMIN | 1803 |
/project/v1/_search | Project Search | CAMPAIGN_ADMIN | 1828 |
/mdms-v2/v2/_create/Health.Project | Creates master data for health project | CAMPAIGN_ADMIN | 1808 |
/product/v1/_create | Product Create | SYSTEM_ADMINISTRATOR | 1537 |
/product/v1/_search | Product Search | SYSTEM_ADMINISTRATOR | 1542 |
/product/variant/v1/_search | Product Variant Search | SYSTEM_ADMINISTRATOR | 1544 |
/product/variant/v1/_create | Product Variant Create | SYSTEM_ADMINISTRATOR | 1536 |
/project/v1/_create | Project Create | SYSTEM_ADMINISTRATOR | 1592 |
/project/resource/v1/_search | Project Resource Search | SYSTEM_ADMINISTRATOR | 1614 |
/project/resource/v1/_create | Project Resource Create | SYSTEM_ADMINISTRATOR | 1608 |
/facility/v1/_search | Facility Search | SYSTEM_ADMINISTRATOR | 1621 |
/facility/v1/_create | Facility Create | SYSTEM_ADMINISTRATOR | 1615 |
/project/facility/v1/_search | Project Facility Search | SYSTEM_ADMINISTRATOR | 1628 |
/project/facility/v1/_create | Project Facility Create | SYSTEM_ADMINISTRATOR | 1622 |
/project/staff/v1/_create | Project Staff Create | SYSTEM_ADMINISTRATOR | 1539 |
/project/staff/v1/_search | Project Staff Search | SYSTEM_ADMINISTRATOR | 1545 |
UI Customization Code
All the search screens have the common UI customization config naming SearchDefaultConfig.
It takes the config dynamically from the url and then does the customization on the basis of that.
Each screen has its own conditions based on the based path.
SearchDefaultConfig: { customValidationCheck: (data) => { //checking both to and from date are present const { createdFrom, createdTo } = data; if ((createdFrom === "" && createdTo !== "") || (createdFrom !== "" && createdTo === "")) return { warning: true, label: "ES_COMMON_ENTER_DATE_RANGE" };
return false; }, preProcess: (data) => {
const location = useLocation(); data.params = { ...data.params }; const { masterName } = useParams();
const searchParams = new URLSearchParams(location.search); const paths = { SearchProjectConfig: { basePath: "Projects", pathConfig: { // id: "id[0]", tenantId: "tenantId", }, dateConfig: { endDate: "dayend", startDate: "daystart", }, selectConfig: {}, textConfig: ["id", "tenantId", "name", "projectNumber", "projectSubType", "projectType"], }, SearchProductConfig: { basePath: "Product", pathConfig: { id: "id[0]", }, dateConfig: {}, selectConfig: {}, textConfig: ["id", "manufacturer", "name", "type"], }, SearchHouseholdConfig: { basePath: "Household", pathConfig: { id: "id[0]", clientReferenceId: "clientReferenceId[0]", }, dateConfig: {}, selectConfig: {}, textConfig: ["boundaryCode", "clientReferenceId", "id"], }, SearchProductVariantConfig: { basePath: "ProductVariant", pathConfig: { id: "id[0]", }, dateConfig: {}, selectConfig: {}, textConfig: ["productId", "sku", "variation" , "id"], }, SearchProjectBeneficiaryConfig: { basePath: "ProjectBeneficiary", pathConfig: { id: "id[0]", clientReferenceId: "clientReferenceId[0]", }, dateConfig: { dateOfRegistration: "daystart", }, selectConfig: {}, textConfig: ["beneficiaryId", "projectId" , "id" , "clientReferenceId"], }, SearchProjectStaffConfig: { basePath: "ProjectStaff", pathConfig: { id: "id[0]", }, dateConfig: { startDate: "daystart", endDate: "dayend", }, selectConfig: {}, textConfig: ["projectId", "userId" , "id"], }, SearchProjectResourceConfig: { basePath: "ProjectResource", pathConfig: { id: "id[0]", }, dateConfig: {}, selectConfig: {}, textConfig: ["id"], }, SearchProjectTaskConfig: { basePath: "Task", pathConfig: { id: "id[0]", clientReferenceId: "clientReferenceId[0]", }, dateConfig: { plannedEndDate: "dayend", plannedStartDate: "daystart", actualEndDate: "dayend", actualStartDate: "daystart", }, selectConfig: {}, textConfig: ["projectId", "localityCode", "projectBeneficiaryId", "status" , "id" ,"clientReferenceId"], }, SearchFacilityConfig: { basePath: "Facility", pathConfig: { id: "id[0]", }, dateConfig: {}, selectConfig: {}, textConfig: ["faciltyUsage", "localityCode", "storageCapacity", "id"], }, SearchProjectFacilityConfig: { basePath: "ProjectFacility", pathConfig: { id: "id[0]", projectId: "projectId[0]", facilityId: "facilityId[0]" }, dateConfig: { }, selectConfig: { }, textConfig :["id","projectId","facilityId"] } };
const id = searchParams.get("config") || masterName;
if (!paths || !paths?.[id]) { return data; } let requestBody = { ...data.body[paths[id]?.basePath] }; const pathConfig = paths[id]?.pathConfig; const dateConfig = paths[id]?.dateConfig; const selectConfig = paths[id]?.selectConfig; const textConfig = paths[id]?.textConfig;
if (paths[id].basePath == "Projects") { data.state.searchForm = { ...data.state.searchForm, tenantId: "mz" }; } let Product = Object.keys(requestBody) .map((key) => { if (selectConfig[key]) { requestBody[key] = _.get(requestBody, selectConfig[key], null); } else if (typeof requestBody[key] == "object") { requestBody[key] = requestBody[key]?.code; } else if (textConfig?.includes(key)) { requestBody[key] = requestBody[key]?.trim(); } return key; }) .filter((key) => requestBody[key]) .reduce((acc, curr) => { if (pathConfig[curr]) { _.set(acc, pathConfig[curr], requestBody[curr]); } else if (dateConfig[curr] && dateConfig[curr]?.includes("day")) { _.set(acc, curr, Digit.Utils.date.convertDateToEpoch(requestBody[curr], dateConfig[curr])); } else { _.set(acc, curr, requestBody[curr]); } return acc; }, {});
if (paths[id].basePath == "Projects") { data.body[paths[id].basePath] = [{ ...Product }]; } else data.body[paths[id].basePath] = { ...Product }; return data; }, additionalCustomizations: (row, key, column, value, t, searchResult) => {
//here we can add multiple conditions //like if a cell is link then we return link //first we can identify which column it belongs to then we can return relevant result switch (key) { case "PROJECT_NUMBER":
return ( <span className="link"> <Link to={`/${window.contextPath}/employee/hcmworkbench/campaign-view?tenantId=${row?.tenantId}&projectNumber=${row?.projectNumber}`} >{row?.projectNumber}
</Link> </span> );
case "PROJECT_ID": return ( <span className="link"> <Link to={`/${window.contextPath}/employee/hcmworkbench/campaign-view?tenantId=${row?.tenantId}&projectId=${row?.projectId}`} >{row?.projectId}
</Link> </span> );
case "MASTERS_SOCIAL_CATEGORY": return value ? <span style={{ whiteSpace: "nowrap" }}>{String(t(`MASTERS_${value}`))}</span> : t("ES_COMMON_NA");
case "CORE_COMMON_PROFILE_CITY": return value ? <span style={{ whiteSpace: "nowrap" }}>{String(t(Digit.Utils.locale.getCityLocale(value)))}</span> : t("ES_COMMON_NA");
case "MASTERS_WARD": return value ? ( <span style={{ whiteSpace: "nowrap" }}>{String(t(Digit.Utils.locale.getMohallaLocale(value, row?.tenantId)))}</span> ) : ( t("ES_COMMON_NA") );
case "MASTERS_LOCALITY": return value ? ( <span style={{ whiteSpace: "break-spaces" }}>{String(t(Digit.Utils.locale.getMohallaLocale(value, row?.tenantId)))}</span> ) : ( t("ES_COMMON_NA") ); default: return t("ES_COMMON_NA"); } }, MobileDetailsOnClick: (row, tenantId) => { let link; Object.keys(row).map((key) => { if (key === "MASTERS_WAGESEEKER_ID") link = `/${window.contextPath}/employee/masters/view-wageseeker?tenantId=${tenantId}&wageseekerId=${row[key]}`; }); return link; }, additionalValidations: (type, data, keys) => { if (type === "date") { return data[keys.start] && data[keys.end] ? () => new Date(data[keys.start]).getTime() <= new Date(data[keys.end]).getTime() : true; } }, }
|