-
Notifications
You must be signed in to change notification settings - Fork 19
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Tenant update #1340
Tenant update #1340
Conversation
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Base branches to auto review (7)
Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the WalkthroughWalkthroughA new configuration file for tenant updates has been added, along with a Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant App
participant TenantUpdate
participant API
User->>App: Navigate to Tenant Management
App->>User: Show tenant list
User->>TenantUpdate: Click update button
TenantUpdate->>API: Fetch tenant data
API-->>TenantUpdate: Return tenant data
User->>TenantUpdate: Submit updated information
TenantUpdate->>API: Send update request
API-->>TenantUpdate: Confirm update
TenantUpdate->>User: Show success notification
Poem
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 4
Outside diff range, codebase verification and nitpick comments (2)
micro-ui/web/micro-ui-internals/packages/modules/sandbox/src/pages/employee/tenantMgmt/TenantUpdate.js (2)
10-18
: Ensure consistent key naming indefaultValue
.The keys in the
defaultValue
object should follow a consistent naming convention. For example, use camelCase for all keys.- const defaultValue = { - tenantName:name, - tenantCode:code, - emailId:email, - isActive:"" - }; + const defaultValue = { + tenantName: name, + tenantCode: code, + emailId: email, + isActive: "" + };
29-36
: Remove unusedreqCreate
object.The
reqCreate
object is defined but not used in the component. Remove it to clean up the code.- const reqCreate = { - url: `/tenant-management/tenant/_update`, - params: {}, - body: {}, - config: { - enable: false, - }, - };
Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Files selected for processing (6)
- micro-ui/web/micro-ui-internals/packages/modules/sandbox/src/configs/tenantSearchConfig.js (1 hunks)
- micro-ui/web/micro-ui-internals/packages/modules/sandbox/src/configs/tenantUpdateConfig.js (1 hunks)
- micro-ui/web/micro-ui-internals/packages/modules/sandbox/src/pages/employee/index.js (2 hunks)
- micro-ui/web/micro-ui-internals/packages/modules/sandbox/src/pages/employee/tenantMgmt/TenantUpdate.js (1 hunks)
- micro-ui/web/micro-ui-internals/packages/modules/sandbox/src/pages/employee/tenantMgmt/TenantView.js (1 hunks)
- micro-ui/web/micro-ui-internals/packages/modules/sandbox/src/utils/TenantUpdateUtil.js (1 hunks)
Files skipped from review due to trivial changes (1)
- micro-ui/web/micro-ui-internals/packages/modules/sandbox/src/configs/tenantSearchConfig.js
Additional context used
Path-based instructions (5)
micro-ui/web/micro-ui-internals/packages/modules/sandbox/src/utils/TenantUpdateUtil.js (1)
Pattern
**/*.js
: checkmicro-ui/web/micro-ui-internals/packages/modules/sandbox/src/pages/employee/tenantMgmt/TenantView.js (1)
Pattern
**/*.js
: checkmicro-ui/web/micro-ui-internals/packages/modules/sandbox/src/configs/tenantUpdateConfig.js (1)
Pattern
**/*.js
: checkmicro-ui/web/micro-ui-internals/packages/modules/sandbox/src/pages/employee/index.js (1)
Pattern
**/*.js
: checkmicro-ui/web/micro-ui-internals/packages/modules/sandbox/src/pages/employee/tenantMgmt/TenantUpdate.js (1)
Pattern
**/*.js
: check
Additional comments not posted (5)
micro-ui/web/micro-ui-internals/packages/modules/sandbox/src/configs/tenantUpdateConfig.js (2)
1-59
: Review validation patterns for accuracy.Ensure that the validation patterns are accurate and meet the expected requirements.
populators: { name: "tenantName", error: "Required", validation: { pattern: /^[A-Za-z0-9]+$/i } }, populators: { name: "emailId", error: "Required", validation: { pattern: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/i } }, populators: { name: "tenantCode", error: "Required", validation: { pattern: /^[A-Za-z0-9.]+$/i } },
1-59
: Ensure alignment with the expected data structure.Verify that the configuration aligns with the expected data structure for tenant updates.
export const tenantUpdateConfig = [ { head: null, body: [ { inline: true, label: "SANDBOX_CREATE_TENANT_NAME_LABEL", isMandatory: true, key: "tenantName", type: "text", disable: true, populators: { name: "tenantName", error: "Required", validation: { pattern: /^[A-Za-z0-9]+$/i } }, }, { inline: true, label: "SANDBOX_CREATE_TENANT_EMAIL_LABEL", isMandatory: true, key: "emailId", type: "text", disable: true, populators: { name: "emailId", error: "Required", validation: { pattern: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/i } }, }, { inline: true, label: "SANDBOX_CREATE_TENANT_CODE_LABEL", isMandatory: true, key: "tenantCode", type: "text", disable: true, populators: { name: "tenantCode", error: "Required", validation: { pattern: /^[A-Za-z0-9.]+$/i } }, }, { isMandatory: false, key: "isActive", type: "dropdown", label: "SANDBOX_CREATE_TENANT_ACTIVE_LABEL", disable: false, populators: { name: "isActive", optionsKey: "name", error: " Required", required: true, options: [ { code: "true", name: "TRUE", active: true, }, { code: "false", name: "FALSE", active: true, }, ], }, }, ], }, ];micro-ui/web/micro-ui-internals/packages/modules/sandbox/src/pages/employee/index.js (2)
12-12
: LGTM!The import statement for
TenantUpdate
is correctly added.The code changes are approved.
59-59
: LGTM!The route for
TenantUpdate
is correctly added and follows the existing pattern for private routes.The code changes are approved.
micro-ui/web/micro-ui-internals/packages/modules/sandbox/src/pages/employee/tenantMgmt/TenantUpdate.js (1)
1-6
: LGTM!The import statements are correctly added.
The code changes are approved.
export const transformCreateData = (data) => { | ||
const tenantId = Digit.ULBService.getCurrentTenantId(); | ||
|
||
return { | ||
tenant: { | ||
name: data.tenantName, | ||
email: data.emailId, | ||
code: data.tenantCode, | ||
isActive:data.isActive.code, | ||
parentId: tenantId, | ||
}, | ||
}; | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add error handling for Digit.ULBService.getCurrentTenantId()
.
The function should handle potential errors when retrieving the current tenant ID.
export const transformCreateData = (data) => {
- const tenantId = Digit.ULBService.getCurrentTenantId();
+ let tenantId;
+ try {
+ tenantId = Digit.ULBService.getCurrentTenantId();
+ } catch (error) {
+ console.error("Failed to get current tenant ID:", error);
+ // Handle error appropriately, e.g., return or throw an error
+ return;
+ }
return {
tenant: {
name: data.tenantName,
email: data.emailId,
code: data.tenantCode,
isActive: data.isActive.code,
parentId: tenantId,
},
};
};
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
export const transformCreateData = (data) => { | |
const tenantId = Digit.ULBService.getCurrentTenantId(); | |
return { | |
tenant: { | |
name: data.tenantName, | |
email: data.emailId, | |
code: data.tenantCode, | |
isActive:data.isActive.code, | |
parentId: tenantId, | |
}, | |
}; | |
}; | |
export const transformCreateData = (data) => { | |
let tenantId; | |
try { | |
tenantId = Digit.ULBService.getCurrentTenantId(); | |
} catch (error) { | |
console.error("Failed to get current tenant ID:", error); | |
// Handle error appropriately, e.g., return or throw an error | |
return; | |
} | |
return { | |
tenant: { | |
name: data.tenantName, | |
email: data.emailId, | |
code: data.tenantCode, | |
isActive: data.isActive.code, | |
parentId: tenantId, | |
}, | |
}; | |
}; |
Validate input data.
The function should validate the input data to ensure it meets the expected structure.
export const transformCreateData = (data) => {
+ if (!data || typeof data !== 'object') {
+ console.error("Invalid input data:", data);
+ // Handle error appropriately, e.g., return or throw an error
+ return;
+ }
let tenantId;
try {
tenantId = Digit.ULBService.getCurrentTenantId();
} catch (error) {
console.error("Failed to get current tenant ID:", error);
// Handle error appropriately, e.g., return or throw an error
return;
}
return {
tenant: {
name: data.tenantName,
email: data.emailId,
code: data.tenantCode,
isActive: data.isActive.code,
parentId: tenantId,
},
};
};
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
export const transformCreateData = (data) => { | |
const tenantId = Digit.ULBService.getCurrentTenantId(); | |
return { | |
tenant: { | |
name: data.tenantName, | |
email: data.emailId, | |
code: data.tenantCode, | |
isActive:data.isActive.code, | |
parentId: tenantId, | |
}, | |
}; | |
}; | |
export const transformCreateData = (data) => { | |
if (!data || typeof data !== 'object') { | |
console.error("Invalid input data:", data); | |
// Handle error appropriately, e.g., return or throw an error | |
return; | |
} | |
let tenantId; | |
try { | |
tenantId = Digit.ULBService.getCurrentTenantId(); | |
} catch (error) { | |
console.error("Failed to get current tenant ID:", error); | |
// Handle error appropriately, e.g., return or throw an error | |
return; | |
} | |
return { | |
tenant: { | |
name: data.tenantName, | |
email: data.emailId, | |
code: data.tenantCode, | |
isActive: data.isActive.code, | |
parentId: tenantId, | |
}, | |
}; | |
}; |
const code = row?.code; | ||
const name= row?.name; | ||
const email=row?.email; | ||
history.push(`/${window?.contextPath}/employee/sandbox/tenant-management/update`, {name,code,email}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Validate the row
object.
The function should ensure that the row
object contains the expected properties.
const onClickRow = ({ original: row }) => {
+ if (!row || typeof row !== 'object') {
+ console.error("Invalid row data:", row);
+ return;
+ }
const code = row?.code;
const name = row?.name || "N/A";
const email = row?.email || "N/A";
history.push(`/${window?.contextPath}/employee/sandbox/tenant-management/update`, { name, code, email });
};
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
const code = row?.code; | |
const name= row?.name; | |
const email=row?.email; | |
history.push(`/${window?.contextPath}/employee/sandbox/tenant-management/update`, {name,code,email}); | |
const onClickRow = ({ original: row }) => { | |
if (!row || typeof row !== 'object') { | |
console.error("Invalid row data:", row); | |
return; | |
} | |
const code = row?.code; | |
const name = row?.name || "N/A"; | |
const email = row?.email || "N/A"; | |
history.push(`/${window?.contextPath}/employee/sandbox/tenant-management/update`, { name, code, email }); | |
}; |
Add null checks for name
and email
properties.
The function should handle cases where name
or email
properties are missing.
const onClickRow = ({ original: row }) => {
const code = row?.code;
- const name = row?.name;
- const email = row?.email;
+ const name = row?.name || "N/A";
+ const email = row?.email || "N/A";
history.push(`/${window?.contextPath}/employee/sandbox/tenant-management/update`, { name, code, email });
};
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
const code = row?.code; | |
const name= row?.name; | |
const email=row?.email; | |
history.push(`/${window?.contextPath}/employee/sandbox/tenant-management/update`, {name,code,email}); | |
const code = row?.code; | |
const name = row?.name || "N/A"; | |
const email = row?.email || "N/A"; | |
history.push(`/${window?.contextPath}/employee/sandbox/tenant-management/update`, { name, code, email }); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Files selected for processing (1)
- micro-ui/web/micro-ui-internals/packages/modules/sandbox/src/pages/employee/tenantMgmt/TenantUpdate.js (1 hunks)
Files skipped from review as they are similar to previous changes (1)
- micro-ui/web/micro-ui-internals/packages/modules/sandbox/src/pages/employee/tenantMgmt/TenantUpdate.js
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
Outside diff range, codebase verification and nitpick comments (1)
micro-ui/web/micro-ui-internals/packages/modules/sandbox/src/pages/employee/tenantMgmt/TenantUpdate.js (1)
1-7
: Review of imports and initial setup.
- The imports are generally well-organized and relevant to the functionality of the component.
- The spacing in the import from
react-router-dom
is inconsistent (useHistory ,useLocation
). Consider adding a space after the comma for consistency.- The utility functions and configurations are properly imported, which is good for modularity.
Consider fixing the spacing in the import statement:
-import { useHistory ,useLocation} from "react-router-dom"; +import { useHistory, useLocation } from "react-router-dom";
Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Files selected for processing (2)
- micro-ui/web/micro-ui-internals/example/public/index.html (2 hunks)
- micro-ui/web/micro-ui-internals/packages/modules/sandbox/src/pages/employee/tenantMgmt/TenantUpdate.js (1 hunks)
Additional context used
Path-based instructions (1)
micro-ui/web/micro-ui-internals/packages/modules/sandbox/src/pages/employee/tenantMgmt/TenantUpdate.js (1)
Pattern
**/*.js
: check
Gitleaks
micro-ui/web/micro-ui-internals/example/public/index.html
19-19: Uncovered a GCP API key, which could lead to unauthorized access to Google Cloud services and data breaches.
(gcp-api-key)
Additional comments not posted (3)
micro-ui/web/micro-ui-internals/packages/modules/sandbox/src/pages/employee/tenantMgmt/TenantUpdate.js (3)
30-36
: API request configuration for tenant updates.
- The configuration object for the API request is well-defined.
- The
enable
flag withinconfig
is set tofalse
initially, which might be intentional to prevent automatic triggering. Ensure this aligns with the intended behavior.Verify the intended use of the
enable
flag within the API request configuration to ensure it aligns with the expected behavior.
38-74
: Form submission and mutation handling.
- The form submission logic includes proper error handling and success management.
- The use of a conditional to prevent updates if the
tenantId
matches thecode
is a good security practice.- The mutation hook is used effectively to manage API requests.
The implementation of form submission and mutation handling is robust and follows best practices.
76-94
: Rendering of theTenantUpdate
component.
- The component structure is clear and functional.
- The use of
FormComposerV2
andHeader
from the DIGIT UI library is appropriate.- The conditional rendering of the
Toast
component based onshowToast
state is implemented correctly.The rendering logic and component usage are well-implemented and follow React best practices.
const TenantUpdate = () => { | ||
const location = useLocation(); | ||
const { name,code,email} = location.state || {}; | ||
const defaultValue = { | ||
tenantName:name, | ||
tenantCode:code, | ||
emailId:email, | ||
isActive:"" | ||
}; | ||
const tenantId = Digit.ULBService.getCurrentTenantId(); | ||
const { t } = useTranslation(); | ||
const history = useHistory(); | ||
const [showToast, setShowToast] = useState(false); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Initialization and state management in TenantUpdate
component.
- The use of React hooks for state and effect management is appropriate.
- The destructuring from
location.state
is concise, but lacks null-checking which could lead to runtime errors iflocation.state
is undefined. - The
useState
forshowToast
is initialized correctly.
Add null-checking for location.state
to prevent potential runtime errors:
- const { name,code,email} = location.state || {};
+ const { name, code, email } = location.state ? location.state : { name: '', code: '', email: '' };
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
const TenantUpdate = () => { | |
const location = useLocation(); | |
const { name,code,email} = location.state || {}; | |
const defaultValue = { | |
tenantName:name, | |
tenantCode:code, | |
emailId:email, | |
isActive:"" | |
}; | |
const tenantId = Digit.ULBService.getCurrentTenantId(); | |
const { t } = useTranslation(); | |
const history = useHistory(); | |
const [showToast, setShowToast] = useState(false); | |
const TenantUpdate = () => { | |
const location = useLocation(); | |
const { name, code, email } = location.state ? location.state : { name: '', code: '', email: '' }; | |
const defaultValue = { | |
tenantName:name, | |
tenantCode:code, | |
emailId:email, | |
isActive:"" | |
}; | |
const tenantId = Digit.ULBService.getCurrentTenantId(); | |
const { t } = useTranslation(); | |
const history = useHistory(); | |
const [showToast, setShowToast] = useState(false); |
const closeToast = () => { | ||
setTimeout(() => { | ||
setShowToast(false); | ||
}, 5000); | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Toast timeout management.
- The
closeToast
function usessetTimeout
to hide the toast, which is a common pattern. - However, there is no cleanup for the timeout, which could lead to memory leaks or unexpected behavior if the component unmounts before the timeout completes.
Add cleanup for the timeout in closeToast
to prevent potential memory leaks:
+ useEffect(() => {
+ return () => clearTimeout(toastTimeout);
+ }, []);
+
const closeToast = () => {
+ const toastTimeout = setTimeout(() => {
setShowToast(false);
- }, 5000);
+ }, 5000);
};
Committable suggestion was skipped due to low confidence.
var globalConfigs = (function () { | ||
var stateTenantId = "pg"; | ||
var gmaps_api_key = 'AIzaSyCslxyiD1nuQuoshbu_E3WkIV8J2SUA6KI'; | ||
var contextPath = 'sandbox-ui'; | ||
var configModuleName = 'commonUiConfig'; | ||
var centralInstanceEnabled = false; | ||
var localeRegion = "IN"; | ||
var multiRootTenant = true; | ||
var isOTPBasedLogin = true; | ||
var localeDefault = "en"; | ||
var mdmsContextV1 = "egov-mdms-service"; | ||
var mdmsContextV2 = "mdms-v2"; | ||
var footerBWLogoURL = 'https://s3.ap-south-1.amazonaws.com/egov-uat-assets/digit-footer-bw.png'; | ||
var footerLogoURL = 'https://unified-dev.digit.org/egov-dev-assets/digit-footer.png'; | ||
var digitHomeURL = 'https://www.digit.org/'; | ||
var assetS3Bucket = 'works-qa-asset'; | ||
var invalidEmployeeRoles = [] | ||
var getConfig = function (key) { | ||
if (key === 'STATE_LEVEL_TENANT_ID') { | ||
return stateTenantId; | ||
} | ||
else if (key === 'GMAPS_API_KEY') { | ||
return gmaps_api_key; | ||
} | ||
else if (key === 'ENABLE_SINGLEINSTANCE') { | ||
return centralInstanceEnabled; | ||
} else if (key === 'MULTI_ROOT_TENANT') { | ||
return multiRootTenant; | ||
} else if (key === 'OTP_BASED_LOGIN') { | ||
return isOTPBasedLogin; | ||
} else if (key === 'DIGIT_FOOTER_BW') { | ||
return footerBWLogoURL; | ||
} else if (key === 'DIGIT_FOOTER') { | ||
return footerLogoURL; | ||
} else if (key === 'DIGIT_HOME_URL') { | ||
return digitHomeURL; | ||
} else if (key === 'xstate-webchat-services') { | ||
return xstateWebchatServices; | ||
} else if (key === 'S3BUCKET') { | ||
return assetS3Bucket; | ||
} else if (key === 'CONTEXT_PATH') { | ||
return contextPath; | ||
} else if (key === 'UICONFIG_MODULENAME') { | ||
return configModuleName; | ||
} else if (key === "LOCALE_REGION") { | ||
return localeRegion; | ||
} else if (key === "LOCALE_DEFAULT") { | ||
return localeDefault; | ||
} else if (key === "MDMS_V1_CONTEXT_PATH") { | ||
return mdmsContextV2; | ||
} else if (key === "MDMS_V2_CONTEXT_PATH") { | ||
return mdmsContextV2; | ||
} if (key === 'INVALIDROLES') { | ||
return invalidEmployeeRoles; | ||
} | ||
}; | ||
return { | ||
getConfig | ||
}; | ||
}()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Security Issue: Exposed API Key and Suggested Improvements for getConfig
Function.
The inclusion of a hardcoded Google Maps API key in the script poses a significant security risk. It is recommended to remove this key from the public files and instead load it securely from environment variables or a secure configuration management service.
Additionally, the getConfig
function currently does not handle cases where the key is not defined, which could lead to undefined behavior or errors in the application. Consider adding a default case or error handling mechanism to manage undefined keys gracefully.
Proposed changes for the getConfig
function:
-var getConfig = function (key) {
+var getConfig = function (key) {
+ var configMap = {
+ 'STATE_LEVEL_TENANT_ID': stateTenantId,
+ 'GMAPS_API_KEY': gmaps_api_key,
+ // other keys...
+ };
+ return configMap[key] || 'Key not found'; // Default message or throw an error
+};
Committable suggestion was skipped due to low confidence.
Tools
Gitleaks
19-19: Uncovered a GCP API key, which could lead to unauthorized access to Google Cloud services and data breaches.
(gcp-api-key)
* Application Management Updated > module master added > boundary update > workbench enhance * Pgr sandbox (#1360) * pgr * pgr (#1357) * fix (#1358) * Update index.html --------- Co-authored-by: nabeelmd-eGov <[email protected]> * hrms create and search (#1361) * hrms create and search * Update index.html * review changes * Update createEmployee.js --------- Co-authored-by: nabeelmd-eGov <[email protected]> * fix (#1362) Co-authored-by: nabeelmd-eGov <[email protected]> * Tenant update (#1340) * update component added * update component added * tenant update component * update tenant search update * revert index.html --------- Co-authored-by: nabeelmd-eGov <[email protected]> * adding CSS changes (#1363) Co-authored-by: NabeelAyubee <[email protected]> * fix (#1364) Co-authored-by: nabeelmd-eGov <[email protected]> * fix (#1365) * fix * Update Home.js --------- Co-authored-by: nabeelmd-eGov <[email protected]> * hrms changes (#1367) * hrms changes * removed console log * review changes --------- Co-authored-by: nabeelmd-eGov <[email protected]> * PR comment resolve (#1368) Co-authored-by: NabeelAyubee <[email protected]> * css update * Update index.js * PR resolve * pr resolve * pr resolve * pr resolve * Pr resolve * pr resolve * prresolve * resolve * pr resolve * resolve * resolve --------- Co-authored-by: NabeelAyubee <[email protected]> Co-authored-by: aaradhya-egov <[email protected]> Co-authored-by: mithunhegde-egov <[email protected]> Co-authored-by: Jagankumar <[email protected]> Co-authored-by: aaradhya-egov <[email protected]>
tenant update component and config added