...
Expand |
---|
title | api/CustomerPortal/fetchGeneralAddressCode |
---|
|
Code Block |
---|
const fetchGeneralAddressCode = async (organisationId, extendedModels, params, options = {}) => {
const { searchType, queryString } = params;
** searchType is hardcoded at frontend and sent in the body**
if (!searchType) {
throw helper.wrongInputError('Location Key should be present');
}
const metaData = await addressHierarchy.getAddressMetadata(extendedModels, organisationId);
if (!metaData) {
throw helper.wrongInputError('Metadata not found');
}
const hierarchy = metaData.hierarchy || [];
const nodeHierarchyMetaData = hierarchy.find(obj => helper.sanitizeStringCode(obj.location_key) === helper.sanitizeStringCode(searchType));
if (!nodeHierarchyMetaData) {
throw helper.wrongInputError('Invalid Location Key');
}
const parentMetaDataArr = [];
let searchTypeNodeFound = false;
if (Array.isArray(hierarchy) && hierarchy.length > 0) {
for (let i = 0; i < (hierarchy.length - 1); i++) {
if (searchTypeNodeFound || helper.sanitizeStringCode(hierarchy[i].location_key) === helper.sanitizeStringCode(searchType)) {
searchTypeNodeFound = true;
parentMetaDataArr.push(hierarchy[i + 1]);
}
}
}
const queryParameters = [];
let heirarchyId = nodeHierarchyMetaData.id;
let nodeCode = helper.sanitizeStringCode(queryString);
const toRet = {};
toRet.data = {};
queryParameters.push(organisationId);
queryParameters.push(heirarchyId);
queryParameters.push(nodeCode);
const selectPart = 'SELECT addressNode.id as node_id,addressNode.code as node_code,addressNode.name as node_name,addressNode.hierarchy_id as hierarchy_id';
const fromPart = ' FROM addressNode';
let extendedSelectPart = '';
let joinPart = '';
const wherePart = ' WHERE addressNode.organisation_id = $1 and addressNode.hierarchy_id = $2 and addressNode.code = $3';
if (parentMetaDataArr.length) {
extendedSelectPart = ',addressNode.parent_node_id as parent_node_id,parentAddressNode.code as parent_code,parentAddressNode.name as parent_name';
joinPart = ' JOIN addressNode AS parentAddressNode on addressNode.parent_node_id = parentAddressNode.id';
}
const queryToExecute = selectPart + extendedSelectPart + fromPart + joinPart + wherePart;
const result = await helper.executeQueryAsync(extendedModels.AddressNode, queryToExecute, queryParameters, options);
if (result[0] && result[0].node_name) {
toRet.data[searchType] = result[0].node_name;
} else {
throw helper.wrongInputError('Data not found for this location key');
}
let nextNodesResult = result;
for (let i = 0; i < parentMetaDataArr.length; i++) {
try {
heirarchyId = parentMetaDataArr[i].id;
nodeCode = nextNodesResult[0].parent_code;
const locationKey = parentMetaDataArr[i].location_key;
queryParameters[1] = heirarchyId;
queryParameters[2] = nodeCode;
if (i === (parentMetaDataArr.length - 1)) {
const lastNodeQueryResult = selectPart + fromPart + wherePart;
nextNodesResult = await helper.executeQueryAsync(extendedModels.AddressNode, lastNodeQueryResult, queryParameters, options);
} else {
nextNodesResult = await helper.executeQueryAsync(extendedModels.AddressNode, queryToExecute, queryParameters, options);
}
if (nextNodesResult[0] && nextNodesResult[0].node_name) {
toRet.data[locationKey] = nextNodesResult[0].node_name;
}
} catch (err) {
//do nothing
}
}
return toRet;
}; |
|
Code Block |
---|
//success response
{
"data": {
"pincode": "DAM",
"city": "Z1",
"state": "DAMMAM"
}
} |
Expand |
---|
|
Code Block |
---|
{
"searchType": "pincode",
"queryString": "DAM"
} |
|
...
Updated filter logic:
Code Block |
---|
if (shouldSearchByName) {
conditions.and.push({ name: { ilike: queryString } });
} else if (shouldSearchByBothNameAndCode) {
condition.and.push({
or: [
{ name: { ilike: queryString } },
{ code: { ilike: queryString } }
]
});
} else {
conditions.and.push({ code: { ilike: queryString } });
} |
...
Expand |
---|
title | Rendering snippet for address fields |
---|
|
Code Block |
---|
const renderPincodeBox = () => {
if (isAddressHierarchyPresent && isAddressMappingAllowed && hierarchyFieldsArr.include('pincode')) {
return (
<AutoComplete
value={newAddress.pincode}
className={classes.pincodeInput}
dropdownClassName={classes.pincodeInputDropdown}
options={
localityPincodesList.map((pincode: any) => {
return {
label: `${pincode.name} (${pincode.code})`,
value: pincode.code,
};
})
}
onSearch={loadPincodes}
onSelect={(e) => saveAddressUsingAddressHierarchy(e, 'pincode')}
onChange={(value) => updateAddressFieldWithValidations('pincode', value)}
style={{ textAlign: 'left' }}
allowClear
>
<Input
className={classes.autoCompleteInputBox}
allowClear
placeholder={t('address_pincode')}
/>
</AutoComplete>
);
} else
if (isAddressHierarchyPresent && !isAddressMappingAllowed && hierarchyFieldsArr.include('pincode')) {
return (
<Form.Item
className={classes.pincodeWithExtra}
name="pincode"
extra={samplePincode ? `Ex. ${samplePincode}` : undefined}
>
<Select
value={newAddress.pincode}
dropdownClassName={classes.pincodeInputDropdown}
placeholder={t('address_pincode')}
onChange={(e) => {
updateAddressFieldWithValidations('pincode', e);
const isValid = isValidPincode(e);
if (isValid !== validPincode) {
setValidPincode(isValid);
}
}}
options={
localityPincodesList.map((pincode: any) => {
return {
label: `${pincode.name} (${pincode.code})`,
value: pincode.code,
};
})
}
onSelect={(e) => saveAddressUsingAddressHierarchy(e, 'pincode')}
defaultActiveFirstOption={false}
filterOption={false}
onSearch={loadPincodes}
showSearch
allowClear
style={validPincode ? {} : { borderColor: 'red' }}
/>
</Form.Item>
);
}
else {
return (
<Input
value={newAddress.pincode}
className={classes.pincodeInput}
placeholder={t('address_citypincode')}
onChange={(e) => updateAddressFieldWithValidations('pincodeInputpincode', e.target.value)}
/>
);
} };
|
|
Additional Details:
Changes in src/network/pickup.api.ts
...