diff --git a/frontend/micro-ui/web/micro-ui-internals/example/public/index.html b/frontend/micro-ui/web/micro-ui-internals/example/public/index.html index d34726016..7f9fb8602 100644 --- a/frontend/micro-ui/web/micro-ui-internals/example/public/index.html +++ b/frontend/micro-ui/web/micro-ui-internals/example/public/index.html @@ -13,7 +13,7 @@ - + diff --git a/frontend/micro-ui/web/micro-ui-internals/packages/css/package.json b/frontend/micro-ui/web/micro-ui-internals/packages/css/package.json index ee5f0b475..1e4e5f0d8 100644 --- a/frontend/micro-ui/web/micro-ui-internals/packages/css/package.json +++ b/frontend/micro-ui/web/micro-ui-internals/packages/css/package.json @@ -1,6 +1,6 @@ { "name": "@egovernments/digit-ui-css", - "version": "1.5.52", + "version": "1.5.54", "license": "MIT", "main": "dist/index.css", "author": "Jagankumar ", diff --git a/frontend/micro-ui/web/micro-ui-internals/packages/modules/hrms/src/components/MultiSelectDropdown.js b/frontend/micro-ui/web/micro-ui-internals/packages/modules/hrms/src/components/MultiSelectDropdown.js new file mode 100644 index 000000000..87a3fcee4 --- /dev/null +++ b/frontend/micro-ui/web/micro-ui-internals/packages/modules/hrms/src/components/MultiSelectDropdown.js @@ -0,0 +1,141 @@ +import React, { useEffect, useReducer, useRef, useState } from "react"; +import { ArrowDown, CheckSvg } from "@egovernments/digit-ui-react-components"; +import { useTranslation } from "react-i18next"; + +const MultiSelectDropdown = ({ options, optionsKey, selected = [], onSelect, defaultLabel = "", defaultUnit = "",BlockNumber=1,isOBPSMultiple=false,props={},isPropsNeeded=false,ServerStyle={}, isSurvey=false,placeholder, disable=false,config}) => { + const [active, setActive] = useState(false); + const [searchQuery, setSearchQuery] = useState(); + const [optionIndex, setOptionIndex] = useState(-1); + const dropdownRef = useRef(); + const { t } = useTranslation(); + + function reducer(state, action){ + switch(action.type){ + case "ADD_TO_SELECTED_EVENT_QUEUE": + return [...state, {[optionsKey]: action.payload?.[1]?.[optionsKey], propsData: action.payload} ] + case "REMOVE_FROM_SELECTED_EVENT_QUEUE": + const newState = state.filter( e => e?.[optionsKey] !== action.payload?.[1]?.[optionsKey]) + onSelect(newState.map((e) => e.propsData), props); + return newState + case "REPLACE_COMPLETE_STATE": + return action.payload + default: + return state + } + } + + useEffect(() => { + dispatch({type: "REPLACE_COMPLETE_STATE", payload: fnToSelectOptionThroughProvidedSelection(selected) }) + },[selected?.length, selected?.[0]?.code]) + + function fnToSelectOptionThroughProvidedSelection(selected){ + return selected?.map( e => ({[optionsKey]: e?.[optionsKey], propsData: [null, e]})) + } + + const [alreadyQueuedSelectedState, dispatch] = useReducer(reducer, selected, fnToSelectOptionThroughProvidedSelection) + + useEffect(()=> { + if(!active){ + onSelect(alreadyQueuedSelectedState?.map( e => e.propsData), props) + } + },[active]) + + + function handleOutsideClickAndSubmitSimultaneously(){ + setActive(false) + } + + Digit.Hooks.useClickOutside(dropdownRef, handleOutsideClickAndSubmitSimultaneously , active, {capture: true} ); + const filtOptns = + searchQuery?.length > 0 ? options.filter((option) => t(option[optionsKey]&&typeof option[optionsKey]=="string" && option[optionsKey].toUpperCase()).toLowerCase().indexOf(searchQuery.toLowerCase()) >= 0) : options; + + function onSearch(e) { + setSearchQuery(e.target.value); + } + + function onSelectToAddToQueue(...props){ + const isChecked = arguments[0].target.checked + isChecked ? dispatch({type: "ADD_TO_SELECTED_EVENT_QUEUE", payload: arguments }) : dispatch({type: "REMOVE_FROM_SELECTED_EVENT_QUEUE", payload: arguments }) + } + +/* Custom function to scroll and select in the dropdowns while using key up and down */ + const keyChange = (e) => { + if (e.key == "ArrowDown") { + setOptionIndex(state =>state+1== filtOptns.length?0:state+1); + if(optionIndex+1== filtOptns.length){ + e?.target?.parentElement?.parentElement?.children?.namedItem("jk-dropdown-unique")?.scrollTo?.(0,0) + }else{ + optionIndex>2&& e?.target?.parentElement?.parentElement?.children?.namedItem("jk-dropdown-unique")?.scrollBy?.(0,45) + } + e.preventDefault(); + } else if (e.key == "ArrowUp") { + setOptionIndex(state => state!==0? state - 1: filtOptns.length-1); + if(optionIndex===0){ + e?.target?.parentElement?.parentElement?.children?.namedItem("jk-dropdown-unique")?.scrollTo?.(100000,100000) + }else{ + optionIndex>2&&e?.target?.parentElement?.parentElement?.children?.namedItem("jk-dropdown-unique")?.scrollBy?.(0,-45) + } + e.preventDefault(); + }else if(e.key=="Enter"){ + onSelectToAddToQueue(e,filtOptns[optionIndex]); + } + } + + const MenuItem = ({ option, index }) => ( +
+ selectedOption[optionsKey] === option[optionsKey]) ? true : false} + onChange={(e) => isPropsNeeded?onSelectToAddToQueue(e, option,props):isOBPSMultiple?onSelectToAddToQueue(e, option,BlockNumber):onSelectToAddToQueue(e, option)} + style={{minWidth: "24px", width: "100%"}} + disabled={option.isDisabled || false} + /> +
+ +
+

{t(option[optionsKey]&&typeof option[optionsKey]=="string" && option[optionsKey])}

+
+ ); + + const Menu = () => { + const filteredOptions = + searchQuery?.length > 0 ? options.filter((option) => t(option[optionsKey]&&typeof option[optionsKey]=="string" && option[optionsKey].toUpperCase()).toLowerCase().indexOf(searchQuery.toLowerCase()) >= 0) : options; + return filteredOptions?.map((option, index) => ); + }; + + return ( +
+
+
+ setActive(true)} value={searchQuery} onChange={onSearch} placeholder={t(placeholder)} /> +
+

{alreadyQueuedSelectedState.length > 0 ? `${isSurvey? alreadyQueuedSelectedState?.filter((ob) => ob?.i18nKey !== undefined).length : alreadyQueuedSelectedState.length} ${defaultUnit}` : defaultLabel}

+ +
+
+ {active ? ( +
+ +
+ ) : null} + +
+ {config?.isDropdownWithChip ?
+ {alreadyQueuedSelectedState.length > 0 && + alreadyQueuedSelectedState.map((value, index) => { + return onSelectToAddToQueue(e, value,props) + : (e) => onSelectToAddToQueue(e, value) + } />; + })} +
: null} +
+ ); +}; + +export default MultiSelectDropdown; diff --git a/frontend/micro-ui/web/micro-ui-internals/packages/modules/hrms/src/components/SearchUserForm.js b/frontend/micro-ui/web/micro-ui-internals/packages/modules/hrms/src/components/SearchUserForm.js new file mode 100644 index 000000000..9e1a3a999 --- /dev/null +++ b/frontend/micro-ui/web/micro-ui-internals/packages/modules/hrms/src/components/SearchUserForm.js @@ -0,0 +1,443 @@ +import { Loader, Header, Dropdown, LabelFieldPair, CardLabel, LinkLabel, SubmitBar, Toast } from "@egovernments/digit-ui-react-components"; +import React, { useState, useMemo, useEffect } from "react"; +import { useTranslation } from "react-i18next"; +import { Controller, useForm, useWatch } from "react-hook-form"; +import MultiSelectDropdown from "./MultiSelectDropdown"; +function filterKeys(data, keys) { + return data.map((item) => { + const filteredItem = {}; + keys.forEach((key) => { + if (item.hasOwnProperty(key)) { + filteredItem[key] = item[key]; + } + }); + return filteredItem; + }); +} + +function getUniqueLeafCodes(tree) { + const codes = new Set(); + + function traverse(node) { + if (!node || typeof node !== "object") return; + + const keys = Object.keys(node).filter((key) => key !== "options" && key !== "codes"); + + // Check if it's a leaf node (all remaining keys' values are strings) + const isLeafNode = keys.every((key) => typeof node[key] === "string"); + + if (isLeafNode && node.code) { + codes.add(node.code); + } else { + // Traverse every other key except options and codes + keys.forEach((key) => { + if (typeof node[key] === "object") { + traverse(node[key]); + } + }); + } + } + + traverse(tree); + + return Array.from(codes); +} + +function buildTree(data, hierarchy) { + const tree = { options: [] }; + + data.forEach((item) => { + // Ignore items without zoneCode + if (!item.zoneCode) return; + + let currentLevel = tree; + + hierarchy.forEach(({ level }, index) => { + const value = item[level]; + + if (!currentLevel[value]) { + // Clone the item and delete the options property from it + const clonedItem = { ...item }; + delete clonedItem.options; + + // Initialize the current level with the cloned item + currentLevel[value] = { ...clonedItem, options: [] }; + + // Push the cloned item to the options array without the options property + currentLevel.options.push({ ...clonedItem }); + } + + if (index === hierarchy.length - 1) { + currentLevel[value].codes = currentLevel[value].codes || []; + currentLevel[value].codes.push(item.code); + } + + currentLevel = currentLevel[value]; + }); + }); + + return tree; +} + +const SearchUserForm = ({ uniqueTenants, setUniqueTenants, roles, setUniqueRoles }) => { + const { t } = useTranslation(); + const [showToast, setShowToast] = useState(null); + const [hierarchy, setHierarchy] = useState([ + { level: "zoneCode", value: 1, optionsKey: "zoneName", isMandatory: true }, + { level: "circleCode", value: 2, optionsKey: "circleName", isMandatory: true }, + { level: "divisionCode", value: 3, optionsKey: "divisionName", isMandatory: true }, + { level: "subDivisionCode", value: 4, optionsKey: "subDivisionName", isMandatory: false }, + { level: "sectionCode", value: 5, optionsKey: "sectionName", isMandatory: false }, + // { "level": "schemeCode", "value": 6,"optionsKey":"schemeName" }, + { level: "code", value: 7, optionsKey: "name", isMandatory: false }, + ]); + const [tree, setTree] = useState(null); + const [rolesOptions,setRolesOptions] = useState(null) + // const [zones,setZones] = useState([]) + // const [circles,setCircles] = useState([]) + // const [divisions,setDivisions] = useState([]) + // const [subDivisions,setSubDivisions] = useState([]) + // const [sections,setSections] = useState([]) + // const [schemes,setSchemes] = useState([]) + // const [codes,setCodes] = useState([]) + + const requestCriteria = { + url: "/mdms-v2/v1/_search", + params: { tenantId: Digit.ULBService.getStateId() }, + body: { + MdmsCriteria: { + tenantId: Digit.ULBService.getStateId(), + moduleDetails: [ + { + moduleName: "tenant", + masterDetails: [ + { + name: "tenants", + }, + ], + }, + { + moduleName: "ws-services-masters", + masterDetails: [ + { + name: "WSServiceRoles", + }, + ], + } + ], + }, + }, + config: { + cacheTime: Infinity, + select: (data) => { + const requiredKeys = [ + "code", + "name", + "zoneCode", + "zoneName", + "circleCode", + "circleName", + "divisionCode", + "divisionName", + "subDivisionCode", + "subDivisionName", + "sectionCode", + "sectionName", + "schemeCode", + "schemeName", + ]; + const result = data?.MdmsRes?.tenant?.tenants; + const filteredResult = filterKeys(result, requiredKeys); + const resultInTree = buildTree(filteredResult, hierarchy); + const excludeCodes = ["HRMS_ADMIN", "LOC_ADMIN", "MDMS_ADMIN", "EMPLOYEE", "SYSTEM"]; + setRolesOptions(data?.MdmsRes?.["ws-services-masters"]?.["WSServiceRoles"]?.filter(row => !excludeCodes.includes(row?.code))) + //updating to state roles as requested + // setRolesOptions([ + // // { + // // code: "", + // // name: "Select All", + // // description: "", + // // }, + // { + // code: "EMPLOYEE", + // name: "EMPLOYEE", + // labelKey: "ACCESSCONTROL_ROLES_ROLES_EMPLOYEE", + // }, + // { + // code: "DIV_ADMIN", + // name: "DIVISION ADMIN", + // labelKey: "ACCESSCONTROL_ROLES_ROLES_DIV_ADMIN", + // }, + // { + // code: "HRMS_ADMIN", + // name: "HRMS_ADMIN", + // labelKey: "ACCESSCONTROL_ROLES_ROLES_HRMS_ADMIN", + // }, + // { + // code: "MDMS_ADMIN", + // name: "MDMS Admin", + // description: "Mdms admin", + // }, + + // ]) + setTree(resultInTree); + return result; + }, + }, + }; + + const { isLoading, data, revalidate, isFetching, error } = Digit.Hooks.useCustomAPIHook(requestCriteria); + + const { + register, + handleSubmit, + setValue, + getValues, + reset, + watch, + trigger, + control, + formState, + errors, + setError, + clearErrors, + unregister, + } = useForm({ + defaultValues: { + "zoneCode": "", + "circleCode": "", + "divisionCode": "", + "subDivisionCode": "", + "sectionCode": "", + "code": "", + "roles": [] + }, + }); + + const formData = watch(); + + const clearSearch = () => { + reset({ + "zoneCode": "", + "circleCode": "", + "divisionCode": "", + "subDivisionCode": "", + "sectionCode": "", + "code": "", + "roles": [] + }); + setUniqueRoles(null); + setUniqueTenants(null); + + // dispatch({ + // type: uiConfig?.type === "filter"?"clearFilterForm" :"clearSearchForm", + // state: { ...uiConfig?.defaultValues } + // //need to pass form with empty strings + // }) + //here reset tableForm as well + // dispatch({ + // type: "tableForm", + // state: { limit:10,offset:0 } + // //need to pass form with empty strings + // }) + }; + + const onSubmit = (data) => { + //assuming atleast one hierarchy is entered + + if (Object.keys(data).length === 0 || Object.values(data).every((value) => !value)) { + //toast message + setShowToast({ warning: true, label: t("ES_COMMON_MIN_SEARCH_CRITERIA_MSG") }); + setTimeout(closeToast, 5000); + return; + } + //other validations if any + //check mandatory fields + let areMandatoryFieldsNotFilled = false; + hierarchy.forEach(({ level, isMandatory }) => { + if (isMandatory && (!data[level] || data[level]?.length === 0)) { + areMandatoryFieldsNotFilled = true; + return; // Exit the loop early + } + }); + + if (areMandatoryFieldsNotFilled) { + setShowToast({ warning: true, label: t("ES_COMMON_MIN_SEARCH_CRITERIA_MSG") }); + setTimeout(closeToast, 5000); + return; + } + + //checking roles + if(data?.roles?.length === 0 || !data?.roles){ + setShowToast({ warning: true, label: t("ES_COMMON_MIN_SEARCH_CRITERIA_MSG") }); + setTimeout(closeToast, 5000); + return; + } + + //here apply a logic to compute the subtree based on the hierarchy selected + const levels = hierarchy.map(({ level }) => level); + //compute current level + let maxSelectedLevel = levels[0]; + levels.forEach((level) => { + if (formData[level]) { + maxSelectedLevel = level; + } else { + return; + } + }); + + const levelIndex = levels.indexOf(maxSelectedLevel); + + let currentLevel = tree; + for (let i = 0; i <= levelIndex; i++) { + const code = data?.[levels[i]]?.[levels[i]]; + if (!code || !currentLevel[code]) return []; + currentLevel = currentLevel[code]; + } + + //this is the list of tenants under the current subtree + const listOfUniqueTenants = getUniqueLeafCodes(currentLevel); + setUniqueTenants(() => listOfUniqueTenants); + setUniqueRoles(() => data?.roles?.filter(row=>row.code)?.map(role=> role.code)); + }; + + const optionsForHierarchy = (level, value) => { + if (!tree) return []; + + const levels = hierarchy.map(({ level }) => level); + const levelIndex = levels.indexOf(level); + + //zoneCode(1st level(highest parent)) + if (levelIndex === -1 || levelIndex === 0) return tree.options; + + let currentLevel = tree; + for (let i = 0; i < levelIndex; i++) { + const code = formData[levels[i]]?.[levels[i]]; + if (!code || !currentLevel[code]) return []; + currentLevel = currentLevel[code]; + } + return currentLevel.options || []; + }; + + const closeToast = () => { + setShowToast(null); + }; + + const renderHierarchyFields = useMemo(() => { + return hierarchy.map(({ level, optionsKey, isMandatory, ...rest }, idx) => ( + + {`${t(Digit.Utils.locale.getTransformedLocale(`HR_SU_${level}`))} ${ + isMandatory ? "*" : "" + }`} + ( + { + props.onChange(e); + //clear all child levels + const childLevels = hierarchy.slice(hierarchy.findIndex((h) => h.level === level) + 1); + childLevels.forEach((child) => setValue(child.level, "")); + }} + selected={props.value} + defaultValue={props.value} + t={t} + optionCardStyles={{ + top: "2.3rem", + overflow: "auto", + maxHeight: "200px", + }} + /> + )} + rules={{}} + defaultValue={""} + name={level} + control={control} + /> + + )); + }, [formData]); + + if (isLoading || !setTree) { + return ; + } + + return ( +
+
+
+

{t("HR_SU_HINT")}

+
+ {renderHierarchyFields} + + {`${t(Digit.Utils.locale.getTransformedLocale(`HR_SU_ROLES`))} ${"*"}`} + { + return ( +
+ { + props.onChange( + e + ?.map((row) => { + return row?.[1] ? row[1] : null; + }) + .filter((e) => e) + ) + }} + selected={props?.value || []} + defaultLabel={t("HR_SU_SELECT_ROLES")} + defaultUnit={ t("COMMON_ROLES_SELECTED")} + // showSelectAll={true} + t={t} + // config={config} + // disable={false} + // optionsDisable={config?.optionsDisable} + /> +
+ ) + }} + rules={{}} + defaultValue={[]} + name={"roles"} + control={control} + /> +
+
+ { + clearSearch(); + }} + > + {t("HR_SU_CLEAR_SEARCH")} + + +
+
+
+
+ {showToast && ( + { + closeToast(); + }} + isDleteBtn={true} + /> + )} +
+ ); +}; + +export default SearchUserForm; diff --git a/frontend/micro-ui/web/micro-ui-internals/packages/modules/hrms/src/components/SearchUserResults.js b/frontend/micro-ui/web/micro-ui-internals/packages/modules/hrms/src/components/SearchUserResults.js new file mode 100644 index 000000000..0d9529dd0 --- /dev/null +++ b/frontend/micro-ui/web/micro-ui-internals/packages/modules/hrms/src/components/SearchUserResults.js @@ -0,0 +1,122 @@ +import React from 'react' +import { useTranslation } from "react-i18next"; +import { Table,Loader,Card } from "@egovernments/digit-ui-react-components"; +import { Link } from "react-router-dom"; + +const SearchUserResults = ({isLoading,data,...props}) => { + const { t } = useTranslation(); + const GetCell = (value) => {t(value)}; + const GetSlaCell = (value) => { + return value == "INACTIVE" ? ( + {t(value) || ""} + ) : ( + {t(value) || ""} + ); + }; + + const columns = React.useMemo(() => { + return [ + { + Header: t("HR_EMP_ID_LABEL"), + disableSortBy: false, + accessor: "code", + Cell: ({ row }) => { + return ( + + {row.original.code} + + // GetCell(`${row.original?.code}`) + ); + }, + }, + { + Header: t("HR_EMP_NAME_LABEL"), + disableSortBy: false, + accessor: "name", + Cell: ({ row }) => { + return GetCell(`${row.original?.user?.name}`); + }, + }, + { + Header: t("HR_USER_ID_LABEL"), + disableSortBy: false, + accessor: "mobileNumber", + Cell: ({ row }) => { + return GetCell(`${row.original?.user?.mobileNumber}`); + }, + }, + { + Header: t("HR_STATUS_LABEL"), + disableSortBy: false, + accessor: "isActive", + Cell: ({ row }) => { + return GetSlaCell(`${row.original?.isActive ? "ACTIVE" : "INACTIVE"}`); + }, + }, + { + Header: t("HR_SU_TENANT"), + disableSortBy: false, + accessor: "tenantId", + Cell: ({ row }) => { + return GetCell(`${row.original?.tenantId}`); + }, + }, + ]; + }, [data]); + + let result; + + if (isLoading) { + result = ; + } else if (data?.length === 0) { + result = ( + + {/* TODO Change localization key */} + {t("COMMON_TABLE_NO_RECORD_FOUND") + .split("\\n") + .map((text, index) => ( +

+ {text} +

+ ))} +
+ ); + } else if (data?.length > 0) { + result = ( + { + return { + style: { + maxWidth: cellInfo.column.Header == t("HR_EMP_ID_LABEL") ? "150px" : "", + padding: "20px 18px", + fontSize: "16px", + minWidth: "150px", + }, + }; + }} + // onNextPage={onNextPage} + // onPrevPage={onPrevPage} + // currentPage={currentPage} + totalRecords={data ? data.length : 0} + // onPageSizeChange={onPageSizeChange} + // pageSizeLimit={pageSizeLimit} + // onSort={onSort} + // sortParams={sortParams} + // disableSort={disableSort} + autoSort={true} + manualPagination={false} + /> + ); + } + + return ( +
+ {result} +
+ ) +} + +export default SearchUserResults \ No newline at end of file diff --git a/frontend/micro-ui/web/micro-ui-internals/packages/modules/hrms/src/components/hrmscard.js b/frontend/micro-ui/web/micro-ui-internals/packages/modules/hrms/src/components/hrmscard.js index b2a880704..455ddb85b 100644 --- a/frontend/micro-ui/web/micro-ui-internals/packages/modules/hrms/src/components/hrmscard.js +++ b/frontend/micro-ui/web/micro-ui-internals/packages/modules/hrms/src/components/hrmscard.js @@ -75,6 +75,10 @@ const HRMSCard = () => { }, ], links: [ + { + label: t("HR_SEARCH_USER"), + link: `/${window?.contextPath}/employee/hrms/search-user`, + }, { label: t("HR_HOME_SEARCH_RESULTS_HEADING"), link: `/${window?.contextPath}/employee/hrms/inbox`, diff --git a/frontend/micro-ui/web/micro-ui-internals/packages/modules/hrms/src/pages/SearchUser.js b/frontend/micro-ui/web/micro-ui-internals/packages/modules/hrms/src/pages/SearchUser.js new file mode 100644 index 000000000..ead17dcfd --- /dev/null +++ b/frontend/micro-ui/web/micro-ui-internals/packages/modules/hrms/src/pages/SearchUser.js @@ -0,0 +1,49 @@ +import React,{useState,useEffect} from 'react' +import SearchUserForm from '../components/SearchUserForm' +import SearchUserResults from '../components/SearchUserResults'; +import { Header } from '@egovernments/digit-ui-react-components' +import { useTranslation } from "react-i18next"; + + +const SearchUser = () => { + const {t} = useTranslation() + const [uniqueTenants,setUniqueTenants] = useState(null) + const [roles,setUniqueRoles] = useState(null) + + const requestCriteriaForEmployeeSearch = { + url: "/egov-hrms/employees/_searchListOfEmployee", + params: {}, + body: { + criteria:{ + tenantIds:uniqueTenants, + roles:roles, + type:"EMPLOYEE" + } + }, + config: { + enabled: !!uniqueTenants && !!roles, + select: (data) => { + return data?.Employees + }, + + }, + changeQueryName:{uniqueTenants,roles} + }; + + const { isLoading, data, revalidate, isFetching, error } = Digit.Hooks.useCustomAPIHook(requestCriteriaForEmployeeSearch); + + + return ( +
+
+
{t("HR_SU")}
+ +
+
+ +
+
+ ) +} + +export default SearchUser \ No newline at end of file diff --git a/frontend/micro-ui/web/micro-ui-internals/packages/modules/hrms/src/pages/index.js b/frontend/micro-ui/web/micro-ui-internals/packages/modules/hrms/src/pages/index.js index 47b1f4e7a..56279ed7e 100644 --- a/frontend/micro-ui/web/micro-ui-internals/packages/modules/hrms/src/pages/index.js +++ b/frontend/micro-ui/web/micro-ui-internals/packages/modules/hrms/src/pages/index.js @@ -2,7 +2,7 @@ import { PrivateRoute } from "@egovernments/digit-ui-react-components"; import React,{ useEffect } from "react"; import { useTranslation } from "react-i18next"; import { Link, Switch, useLocation, useHistory } from "react-router-dom"; - +import SearchUser from "./SearchUser"; // const {SixFtApart,Rotate360}=SVG; const EmployeeApp = ({ path, url, userType }) => { const { t } = useTranslation(); @@ -53,6 +53,7 @@ const EmployeeApp = ({ path, url, userType }) => { } /> } /> } /> + } /> diff --git a/frontend/micro-ui/web/package.json b/frontend/micro-ui/web/package.json index 4e347449d..bcaba2048 100644 --- a/frontend/micro-ui/web/package.json +++ b/frontend/micro-ui/web/package.json @@ -18,7 +18,7 @@ "@egovernments/digit-ui-libraries": "1.5.7", "@egovernments/digit-ui-module-dss": "1.5.34", "@egovernments/digit-ui-module-core": "1.5.46", - "@egovernments/digit-ui-css": "1.5.52", + "@egovernments/digit-ui-css": "1.5.54", "@egovernments/digit-ui-module-hrms": "1.5.27", "@egovernments/digit-ui-module-pgr": "1.7.0", "@egovernments/digit-ui-module-engagement": "1.5.20", diff --git a/frontend/micro-ui/web/public/index.html b/frontend/micro-ui/web/public/index.html index fb0077fd1..79178b5bd 100644 --- a/frontend/micro-ui/web/public/index.html +++ b/frontend/micro-ui/web/public/index.html @@ -10,7 +10,7 @@ - +