pgadmin4/web/pgadmin/browser/static/js/node_ajax.js

199 lines
6.3 KiB
JavaScript

/////////////////////////////////////////////////////////////
//
// pgAdmin 4 - PostgreSQL Tools
//
// Copyright (C) 2013 - 2024, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
import _ from 'lodash';
import getApiInstance from '../../../static/js/api_instance';
import {generate_url} from 'sources/browser/generate_url';
import pgAdmin from 'sources/pgadmin';
/* It generates the URL based on collection node selected */
export function generateCollectionURL(item, type) {
let opURL = {
'properties': 'obj',
'children': 'nodes',
'drop': 'obj',
};
let nodeObj= this;
let collectionPickFunction = function (treeInfoValue, treeInfoKey) {
return (treeInfoKey != nodeObj.type);
};
let treeInfo = pgAdmin.Browser.tree.getTreeNodeHierarchy(item);
let actionType = type in opURL ? opURL[type] : type;
let nodeType = type === 'properties' ? nodeObj.type : nodeObj.node;
return generate_url(
pgAdmin.Browser.URL, treeInfo, actionType, nodeType,
collectionPickFunction
);
}
/* It generates the URL based on tree node selected */
export function generateNodeUrl(treeNodeInfo, actionType, itemNodeData, withId, jumpAfterNode) {
let opURL = {
'create': 'obj',
'drop': 'obj',
'edit': 'obj',
'properties': 'obj',
'statistics': 'stats',
},
priority = -Infinity;
let nodeObj = this;
let itemID = withId && itemNodeData._type == nodeObj.type ? encodeURIComponent(itemNodeData._id) : '';
actionType = actionType in opURL ? opURL[actionType] : actionType;
if (nodeObj.parent_type) {
if (_.isString(nodeObj.parent_type)) {
let p = treeNodeInfo[nodeObj.parent_type];
if (p) {
priority = p.priority;
}
} else {
_.each(nodeObj.parent_type, function(o) {
let p = treeNodeInfo[o];
if (p) {
if (priority < p.priority) {
priority = p.priority;
}
}
});
}
}
let jump_after_priority = priority;
if(jumpAfterNode && treeNodeInfo[jumpAfterNode]) {
jump_after_priority = treeNodeInfo[jumpAfterNode].priority;
}
let nodePickFunction = function(treeInfoValue) {
return (treeInfoValue.priority <= jump_after_priority || treeInfoValue.priority == priority);
};
return generate_url(pgAdmin.Browser.URL, treeNodeInfo, actionType, nodeObj.type, nodePickFunction, itemID);
}
/* Get the nodes list as options required by select controls
* The options are cached for performance reasons.
*/
export function getNodeAjaxOptions(url, nodeObj, treeNodeInfo, itemNodeData, params={}, transform=(data)=>data) {
let otherParams = {
urlWithId: false,
jumpAfterNode: null,
useCache: true,
customGenerateUrl: null,
...params
};
return new Promise((resolve, reject)=>{
const api = getApiInstance();
let fullUrl = '';
if(url) {
if(otherParams.customGenerateUrl) {
fullUrl = otherParams.customGenerateUrl.call(
nodeObj, treeNodeInfo, url, itemNodeData, otherParams.urlWithId, otherParams.jumpAfterNode
);
} else {
fullUrl = generateNodeUrl.call(
nodeObj, treeNodeInfo, url, itemNodeData, otherParams.urlWithId, otherParams.jumpAfterNode
);
}
}
if (url) {
let cacheNode = pgAdmin.Browser.Nodes[otherParams.cacheNode] || nodeObj;
let cacheLevel = otherParams.cacheLevel || cacheNode.cache_level(treeNodeInfo, otherParams.urlWithId);
/*
* We needs to check, if we have already cached data for this url.
* If yes - use that, and do not bother about fetching it again,
* and use it.
*/
let data = cacheNode.cache(nodeObj.type + '#' + url, treeNodeInfo, cacheLevel);
if (_.isUndefined(data) || _.isNull(data)) {
api.get(fullUrl, {
params: otherParams.urlParams,
}).then((res)=>{
data = res.data;
if(res.data.data) {
data = res.data.data;
}
otherParams.useCache && cacheNode.cache(nodeObj.type + '#' + url, treeNodeInfo, cacheLevel, data);
resolve(transform(data));
}).catch((err)=>{
reject(err instanceof Error ? err : Error('Something went wrong'));
});
} else {
// To fetch only options from cache, we do not need time from 'at'
// attribute but only options.
resolve(transform(data.data || []));
}
}
});
}
/* Get the nodes list based on current selected node id */
export function getNodeListById(nodeObj, treeNodeInfo, itemNodeData, params={}, filter=()=>true, postTransform=(res)=>res) {
nodeObj = typeof(nodeObj) == 'string' ? pgAdmin.Browser.Nodes[nodeObj] : nodeObj;
/* Transform the result to add image details */
const transform = (rows) => {
let res = [];
_.each(rows, function(r) {
if (filter(r)) {
let l = (_.isFunction(nodeObj['node_label']) ?
nodeObj['node_label'](r) :
r.label),
image = (_.isFunction(nodeObj['node_image']) ?
nodeObj['node_image'](r) :
(nodeObj['node_image'] || ('icon-' + nodeObj.type)));
res.push({
'value': r._id,
'image': image,
'label': l,
});
}
});
return postTransform(res);
};
return getNodeAjaxOptions('nodes', nodeObj, treeNodeInfo, itemNodeData, params, transform);
}
/* Get the nodes list based on node name passed */
export function getNodeListByName(node, treeNodeInfo, itemNodeData, params={}, filter=()=>true, postTransform=(res)=>res) {
let nodeObj = pgAdmin.Browser.Nodes[node];
let {includeItemKeys} = params;
/* Transform the result to add image details */
const transform = (rows) => {
let res = [];
_.each(rows, function(r) {
if (filter(r)) {
let l = (_.isFunction(nodeObj['node_label']) ?
nodeObj['node_label'](r) :
r.label),
image = (_.isFunction(nodeObj['node_image']) ?
nodeObj['node_image'](r) :
(nodeObj['node_image'] || ('icon-' + nodeObj.type)));
res.push({
'value': r.label,
'image': image,
'label': l,
..._.pick(r, includeItemKeys),
});
}
});
return postTransform(res);
};
return getNodeAjaxOptions('nodes', nodeObj, treeNodeInfo, itemNodeData, params, transform);
}