blob: 0e8b4fb95b897834a5b34db683748678ba79308f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { toast } from "react-toastify";
import { entityStateReadOnly, globalSessionData } from "./Enum";
import { dateTimeFormat, entityImgPath } from "./Global";
import moment from "moment-timezone";
import sanitizeHtml from "sanitize-html";
import { cloneDeep, toArrayifObject, uniq } from "./Helper";
import { attributeFilter } from "./CommonViewFunction";
import Messages from "./Messages";
interface childrenInterface {
gType: string;
guid: string;
id: string;
name: string;
text: string;
type: string;
}
interface serviceTypeInterface {
[key: string]: {
children: childrenInterface[];
name: string;
totalCount: number;
};
}
const customSortBy = (
array: { id: string; label: string }[] | any,
keys: string[]
) =>
[...array]?.sort(
(a: { id: string; label: string }, b: { id: string; label: string }) =>
keys.reduce((result, key) => {
if (result !== 0) return result;
return a[key as keyof { id: string; label: string }] <
b[key as keyof { id: string; label: string }]
? -1
: a[key as keyof { id: string; label: string }] >
b[key as keyof { id: string; label: string }]
? 1
: 0;
}, 0)
);
const customSortByObjectKeys = (
array: serviceTypeInterface[] | any
): serviceTypeInterface[] | any => {
return [...array]?.sort((a: any, b: any) => {
const keysA = Object.keys(a);
const keysB = Object.keys(b);
keysA.sort();
keysB.sort();
const keyA = keysA[0];
const keyB = keysB[0];
return keyA?.localeCompare(keyB);
});
};
const removeDuplicateObjects = (AllColumns: any[]) => {
return AllColumns?.filter(Boolean).filter(
(obj: any, index: any, arr: any[]) => {
return (
arr.findIndex((o) => {
return (
JSON.stringify(o.accessorKey) === JSON.stringify(obj.accessorKey)
);
}) === index
);
}
);
};
const getBoolean = (value: string) => {
return value == "false" ? false : true;
};
const isNull = (data: any) => {
if (data === null) {
return true;
} else {
return false;
}
};
const isArray = (data: any) => {
if (Array.isArray(data)) {
return true;
} else {
return false;
}
};
const isEmpty = (value: any) => {
return (
value === undefined ||
value === null ||
(typeof value === "object" && Object.keys(value).length === 0) ||
(typeof value === "string" && value.trim().length === 0)
);
};
const isObject = (obj: any) => {
return obj !== null && typeof obj === "object";
};
const isString = (obj: any) => {
return obj !== null && typeof obj === "string";
};
const isNumber = (obj: any) => {
return obj !== null && typeof obj === "number";
};
const isBoolean = (obj: any) => {
return obj !== null && typeof obj === "boolean";
};
const isFunction = (obj: any) => {
return obj !== null && typeof obj === "function";
};
const pick = (obj: { [x: string]: any }, keys: any[]) =>
keys.reduce(
(acc, key) => (obj[key] != undefined && (acc[key] = obj[key]), acc),
{}
);
const findWhere = (array: any[], criteria: { [x: string]: any }) => {
return !isEmpty(array)
? array.find((item) =>
Object.keys(criteria).every((key) => item[key] === criteria[key])
)
: {};
};
const findUniqueValues = (array1: any, array2: any) => {
const uniqueValues: any = [];
array1.forEach((value: any) => {
if (!array2.includes(value)) {
uniqueValues.push(value);
}
});
return uniqueValues;
};
const getBaseUrl = (url: string, noPop?: boolean | undefined) => {
var path = url.replace(/\/[\w-]+.(jsp|html)|\/+$/gi, ""),
splitPath = path.split("/");
if (
noPop !== true &&
splitPath &&
(splitPath[splitPath.length - 1] === "n" ||
splitPath[splitPath.length - 1] === "n3")
) {
splitPath.pop();
return splitPath.join("/");
}
return path;
};
const extractKeyValueFromEntity = (
data: any,
priorityAttribute?: any,
skipAttribute?: any,
getGuid?: any,
headerData?: any
) => {
let collectionJSON = cloneDeep(data);
let returnObj: { name: string; found: boolean; key: null | string } = {
name: "-",
found: true,
key: null
};
const attributeOrder = [
"name",
"displayName",
"qualifiedName",
"displayText",
"guid",
"id"
];
if (collectionJSON?.attributes?.[priorityAttribute]) {
returnObj.name = collectionJSON.attributes[priorityAttribute];
returnObj.key = priorityAttribute;
return returnObj;
}
if (collectionJSON?.[priorityAttribute]) {
returnObj.name = collectionJSON[priorityAttribute];
returnObj.key = priorityAttribute;
return returnObj;
}
for (const attribute of attributeOrder) {
if (collectionJSON?.attributes?.[attribute]) {
if (
attribute === "id" &&
typeof collectionJSON.attributes.id === "object"
) {
returnObj.name = collectionJSON.attributes.id.id;
} else {
returnObj.name = collectionJSON.attributes[attribute];
}
returnObj.key = attribute;
return returnObj;
}
}
const propertyOrder = [
"name",
"displayName",
"qualifiedName",
"displayText",
"guid",
"id"
];
for (const property of propertyOrder) {
if (collectionJSON?.[property]) {
if (property === "id" && typeof collectionJSON.id === "object") {
returnObj.name = collectionJSON.id.id;
} else if (property == "guid" && !isEmpty(getGuid)) {
getGuid(collectionJSON[property]);
if (headerData != undefined) {
returnObj.name = headerData;
}
} else {
returnObj.name = collectionJSON[property];
}
returnObj.key = property;
return returnObj;
}
}
returnObj.found = false;
if (skipAttribute && returnObj.key == skipAttribute) {
return {
name: "-",
found: true,
key: null
};
} else {
return returnObj;
}
};
const getNestedSuperTypes = (options: { data: any; collection: any }) => {
let data = options.data,
collection = options.collection,
superTypes: any[] = [];
const getTypeData = function (data: any, collection: any) {
if (data) {
superTypes = superTypes.concat(data.superTypes);
if (data.superTypes && data.superTypes.length) {
let collectionData;
data.superTypes.forEach((superTypeName: string) => {
if (collection) {
collectionData = findWhere(collection, { name: superTypeName });
} else {
collectionData = findWhere(collection, { name: superTypeName });
}
getTypeData(collectionData, collection);
});
}
}
};
getTypeData(data, collection);
return superTypes;
};
const getEntityIconPath = (options: any) => {
let entityData = options && options.entityData,
serviceType: string,
status: any,
typeName: string,
iconBasePath: string = getBaseUrl(window.location.pathname) + entityImgPath;
typeName = entityData.typeName;
serviceType = entityData && entityData.serviceType;
status = entityData && entityData.status;
const getImgPath = (imageName: string) => {
return (
iconBasePath +
(entityStateReadOnly[status] ? "disabled/" + imageName : imageName)
);
};
function getDefaultImgPath() {
if (entityData.isProcess) {
if (entityStateReadOnly[status]) {
return iconBasePath + "disabled/process.png";
} else {
return iconBasePath + "process.png";
}
} else {
if (entityStateReadOnly[status]) {
return iconBasePath + "disabled/table.png";
} else {
return iconBasePath + "table.png";
}
}
}
if (entityData) {
if (options.errorUrl) {
var isErrorInTypeName =
options.errorUrl &&
options.errorUrl.match(
"entity-icon/" + typeName + ".png|disabled/" + typeName + ".png"
)
? true
: false;
if (serviceType && isErrorInTypeName) {
var imageName = serviceType + ".png";
return getImgPath(imageName);
} else {
return getDefaultImgPath();
}
} else if (entityData.typeName) {
var imageName = entityData.typeName + ".png";
return getImgPath(imageName);
} else {
return getDefaultImgPath();
}
}
};
const serverError = (error: any, toastId: any) => {
if (
error.response !== undefined &&
error.response.data.errorMessage !== undefined
) {
toast.dismiss(toastId.current);
toastId.current = toast.error(error.response.data.errorMessage);
} else if (
error.response !== undefined &&
error.response.data !== undefined
) {
toast.dismiss(toastId.current);
toastId.current = toast.error(error.response.data);
} else if (
error.response !== undefined &&
error.response.data.msgDesc !== undefined
) {
toast.dismiss(toastId.current);
toastId.current = toast.error(error.response.data.msgDesc);
}
};
const dateFormat = (date: number) => {
const { isTimezoneFormatEnabled = "" } = globalSessionData || {};
if (isTimezoneFormatEnabled) {
return date != 0
? `${moment(date).format(dateTimeFormat)} (${moment
.tz(moment.tz.guess())
.zoneAbbr()})`
: `${moment().format(dateTimeFormat)} (${moment
.tz(moment.tz.guess())
.zoneAbbr()})`;
}
return date != 0
? `${moment(date).format(dateTimeFormat)}`
: `${moment().format(dateTimeFormat)}`;
};
const formatedDate = function (options: any) {
let dateValue: any = null,
dateFormat = dateTimeFormat,
isValidDate = false;
const { isTimezoneFormatEnabled = "" } = globalSessionData || {};
if (options && !options.date) {
return "N/A";
} else {
dateValue = options.date;
if (dateValue !== "-") {
dateValue = parseInt(dateValue);
if (isNaN(dateValue)) {
dateValue = options.date;
}
dateValue = moment(dateValue);
if (dateValue._isValid) {
isValidDate = true;
dateValue = dateValue.format(dateFormat);
}
}
}
if (dateValue !== "-") {
if (isValidDate === false && options && options.defaultDate !== false) {
dateValue = moment().format(dateFormat);
}
if (isTimezoneFormatEnabled) {
if (!options || (options && options.zone !== false)) {
dateValue += " (" + moment.tz(moment.tz.guess()).zoneAbbr() + ")";
}
}
}
return dateValue;
};
function flattenArray(arr: any) {
let flattened: any = [];
arr?.forEach((item: any) => {
if (Array.isArray(item)) {
flattened.push(...flattenArray(item));
} else {
flattened.push(item);
}
});
return flattened;
}
const Capitalize = (stringData: string) => {
return stringData[0].toUpperCase() + stringData.slice(1);
};
let groupBy = function (xs: any[], key: string) {
return xs.reduce(function (rv, x) {
(rv[x[key]] = rv[x[key]] || []).push(x);
return rv;
}, {});
};
const noTreeData = () => {
return [{ id: "No Records Found", label: "No Records Found" }];
};
const sanitizeHtmlContent = (htmlContent: HTMLElement | string | any) => {
let cleanContent = sanitizeHtml(htmlContent, {
allowedTags: [
"b",
"em",
"strong",
"u",
"a",
"ul",
"ol",
"li",
"p",
"strike",
"h1",
"h2",
"h3",
"h4"
],
allowedAttributes: {
a: ["href"]
},
allowedSchemesByTag: ["script", "img", "iframe", "svg", "title"] as any
});
return cleanContent;
};
const getTagObj = (entity: any, classifications: any) => {
let tags: any = {
self: [],
propagated: [],
propagatedMap: {},
combineMap: {},
entity: entity
};
if (!isEmpty(classifications)) {
let newClassifications: any[] = structuredClone(classifications);
for (let val in newClassifications) {
let typeName: string = newClassifications[val].typeName;
if (newClassifications[val].entityGuid === entity.guid) {
tags.self.push(newClassifications[val]);
} else {
tags.propagated.push(newClassifications[val]);
if (tags.propagatedMap[typeName]) {
tags.propagatedMap[typeName].count++;
} else {
tags.propagatedMap[typeName] = newClassifications[val];
tags.propagatedMap[typeName].count = 1;
}
}
if (!isEmpty(tags.combineMap[typeName])) {
tags.combineMap[typeName] = newClassifications[val];
}
}
}
return tags;
};
const millisecondsToTime = (duration: number | moment.Duration) => {
let milliseconds = parseInt((((duration as number) % 1000) / 100) as any),
seconds: number | string = parseInt(
(((duration as number) / 1000) % 60) as any
),
minutes: number | string = parseInt(
(((duration as number) / (1000 * 60)) % 60) as any
),
hours: number | string = parseInt(
(((duration as number) / (1000 * 60 * 60)) % 24) as any
);
hours = hours < 10 ? "0" + hours : hours;
minutes = minutes < 10 ? "0" + minutes : minutes;
seconds = seconds < 10 ? "0" + seconds : seconds;
return hours + ":" + minutes + ":" + seconds + "." + milliseconds;
};
export const jsonParse = (jsonObj: any) => {
return !isEmpty(jsonObj)
? JSON.parse(jsonObj, (_key, value) => {
try {
return JSON.parse(value);
} catch (e) {
return value;
}
})
: [];
};
export const getNestedSuperTypeObj = (options: any) => {
let mainData = options.data,
collection = options.collection,
attrMerge = options.attrMerge,
seperateRelatioshipAttr = options.seperateRelatioshipAttr || false,
mergeRelationAttributes =
options.mergeRelationAttributes ||
(seperateRelatioshipAttr ? false : true);
if (mergeRelationAttributes && seperateRelatioshipAttr) {
throw "Both mergeRelationAttributes & seperateRelatioshipAttr cannot be true!";
}
let attributeDefs: any = {};
if (attrMerge && !seperateRelatioshipAttr) {
attributeDefs = [];
} else if (options.attrMerge && seperateRelatioshipAttr) {
attributeDefs = {
attributeDefs: [],
relationshipAttributeDefs: []
};
}
const getRelationshipAttributeDef = (data: {
relationshipAttributeDefs: any;
}) => {
return !isEmpty(data.relationshipAttributeDefs)
? data.relationshipAttributeDefs.filter((obj: any) => {
return obj;
})
: [];
};
const getData = (data: any, collection: any) => {
if (options.attrMerge) {
if (seperateRelatioshipAttr) {
attributeDefs.attributeDefs = attributeDefs.attributeDefs.concat(
data.attributeDefs
);
attributeDefs.relationshipAttributeDefs =
attributeDefs.relationshipAttributeDefs.concat(
getRelationshipAttributeDef(data)
);
} else {
attributeDefs = attributeDefs.concat(data.attributeDefs);
if (mergeRelationAttributes) {
attributeDefs = attributeDefs.concat(
getRelationshipAttributeDef(data)
);
}
}
} else {
if (attributeDefs[data.name]) {
attributeDefs[data.name] = toArrayifObject(
attributeDefs[data.name]
).concat(data.attributeDefs);
} else {
if (seperateRelatioshipAttr) {
attributeDefs[data.name] = {
attributeDefs: data.attributeDefs,
relationshipAttributeDefs: data.relationshipAttributeDefs
};
} else {
attributeDefs[data.name] = data.attributeDefs;
if (mergeRelationAttributes) {
attributeDefs[data.name] = toArrayifObject(
attributeDefs[data.name]
).concat(getRelationshipAttributeDef(data));
}
}
}
}
if (data.superTypes && data.superTypes.length) {
return data.superTypes.forEach((superTypeName: string) => {
if (collection) {
var collectionData = findWhere(collection, {
name: superTypeName
});
} else {
var collectionData = findWhere(collection, {
name: superTypeName
});
}
collectionData =
collectionData && collectionData.toJSON
? collectionData.toJSON()
: collectionData;
if (collectionData) {
return getData(collectionData, collection);
} else {
return;
}
});
}
};
getData(mainData, collection);
if (attrMerge) {
if (seperateRelatioshipAttr) {
attributeDefs = {
attributeDefs: uniq(
customSortBy(attributeDefs.attributeDefs, ["name"]),
true,
function (obj: { name: string }) {
return obj.name;
}
),
relationshipAttributeDefs: uniq(
customSortBy(attributeDefs.relationshipAttributeDefs, ["name"]),
true,
function (obj: { name: string; relationshipTypeName: string }) {
return obj.name + obj.relationshipTypeName;
}
)
};
} else {
attributeDefs = uniq(
customSortBy(attributeDefs, ["name"]),
true,
function (obj: { name: string; relationshipTypeName: string }) {
if (obj?.relationshipTypeName) {
return obj.name + obj.relationshipTypeName;
} else {
return obj?.name;
}
}
);
}
}
return attributeDefs;
};
const convertToValidDate = (dateValue: string): any => {
let value = dateValue.split(" ");
let dateSplit: any =
value[0].indexOf("-") == -1 ? value[0].split("/") : value[0].split("-");
if (value.length > 1) {
let time: any = value[1].split(":");
return new Date(
dateSplit[2],
Number(dateSplit[1]) - 1,
dateSplit[0],
time[0],
time[1],
time[2]
);
} else {
return new Date(dateSplit[2], Number(dateSplit[1]) - 1, dateSplit[0]);
}
};
const getUrlState = {
getQueryUrl: (url: string) => {
var hashValue = window.location.hash;
if (url) {
hashValue = url;
}
return {
firstValue: hashValue.split("/")[1],
hash: hashValue,
queyParams: hashValue.split("?"),
lastValue: hashValue.split("/")[hashValue.split("/").length - 1]
};
},
checkTabUrl: (options: any) => {
var url = options && options.url,
matchString = options && options.matchString,
quey = getUrlState.getQueryUrl(url);
return (
quey.firstValue == matchString ||
quey.queyParams[0] == "#!/" + matchString
);
},
isRelationTab: (url: string) => {
return getUrlState.checkTabUrl({
url: url,
matchString: "relationship"
});
},
isRelationSearch: (url?: string) => {
return getUrlState.checkTabUrl({
url: url,
matchString: "relationship/relationshipSearchResult"
});
},
getQueryParams: function (url: string) {
var qs = this.getQueryUrl(url).queyParams[1];
if (typeof qs == "string") {
qs = qs.split("+").join(" ");
var params: any = {},
tokens,
re = /[?&]?([^=]+)=([^&]*)/g;
while ((tokens = re.exec(qs))) {
params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]);
}
return params;
}
}
};
const searchParamsAPiQuery = (rules: string | null) => {
let ruleObj = attributeFilter.generateAPIObj(rules);
return ruleObj;
};
const serverErrorHandler = function (
response: { responseJSON: any },
defaultErrorMessage: any
) {
var responseJSON = response ? response.responseJSON : response,
message = defaultErrorMessage
? defaultErrorMessage
: Messages.defaultErrorMessage;
if (response && responseJSON) {
message =
responseJSON.errorMessage ||
responseJSON.message ||
responseJSON.error ||
message;
}
const existingError =
document?.querySelector(".Toastify__toast--error .Toastify__toast-body")
?.textContent || "";
if (existingError !== message) {
toast.error(message);
}
};
let backNavigate: string = "";
const GlobalQueryState = {
query: {},
setQuery: function (newQuery: {}) {
this.query = newQuery;
},
getQuery: function () {
return this.query;
}
};
const setNavigate = (url: string) => {
backNavigate = url;
};
const getNavigate = () => {
return backNavigate;
};
const globalSearchFilterInitialQuery: any = {
query: {},
setQuery: (newQuery: any) => {
globalSearchFilterInitialQuery.query = {
...globalSearchFilterInitialQuery.query,
...newQuery
};
},
getQuery: () => {
return globalSearchFilterInitialQuery.query;
}
};
const globalSearchParams = {
basicParams: {},
dslParams: {}
};
export {
customSortBy,
customSortByObjectKeys,
removeDuplicateObjects,
isNull,
isArray,
isEmpty,
findUniqueValues,
extractKeyValueFromEntity,
isObject,
isString,
isBoolean,
isNumber,
getEntityIconPath,
serverError,
dateFormat,
flattenArray,
Capitalize,
groupBy,
isFunction,
getBoolean,
noTreeData,
pick,
getNestedSuperTypes,
findWhere,
sanitizeHtmlContent,
getTagObj,
millisecondsToTime,
formatedDate,
convertToValidDate,
getUrlState,
searchParamsAPiQuery,
getBaseUrl,
serverErrorHandler,
GlobalQueryState,
setNavigate,
getNavigate,
globalSearchParams,
globalSearchFilterInitialQuery
};