mirror of
https://github.com/pgadmin-org/pgadmin4.git
synced 2025-02-03 12:10:55 -06:00
199 lines
6.3 KiB
JavaScript
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);
|
|
}
|