mirror of
https://github.com/usebruno/bruno.git
synced 2026-06-25 13:45:52 +00:00
sort folders by name first and then sequence (#5063)
* sort folders by name first and then sequence --------- Co-authored-by: lohit <lohit@usebruno.com>
This commit is contained in:
@@ -326,14 +326,14 @@ const addDirectory = async (win, pathname, collectionUid, collectionPath) => {
|
||||
}
|
||||
|
||||
let name = path.basename(pathname);
|
||||
let seq = 1;
|
||||
let seq;
|
||||
const folderBruFilePath = path.join(pathname, `folder.bru`);
|
||||
|
||||
if (fs.existsSync(folderBruFilePath)) {
|
||||
let folderBruFileContent = fs.readFileSync(folderBruFilePath, 'utf8');
|
||||
let folderBruData = await collectionBruToJson(folderBruFileContent);
|
||||
name = folderBruData?.meta?.name || name;
|
||||
seq = folderBruData?.meta?.seq || seq;
|
||||
seq = folderBruData?.meta?.seq;
|
||||
}
|
||||
|
||||
const directory = {
|
||||
|
||||
@@ -33,8 +33,11 @@ const collectionBruToJson = async (data, parsed = false) => {
|
||||
if (json?.meta) {
|
||||
transformedJson.meta = {
|
||||
name: json.meta.name,
|
||||
seq: !isNaN(sequence) ? Number(sequence) : 1
|
||||
};
|
||||
|
||||
if (sequence) {
|
||||
transformedJson.meta.seq = Number(sequence);
|
||||
}
|
||||
}
|
||||
|
||||
return transformedJson;
|
||||
@@ -67,8 +70,11 @@ const jsonToCollectionBru = async (json, isFolder) => {
|
||||
if (json?.meta) {
|
||||
collectionBruJson.meta = {
|
||||
name: json.meta.name,
|
||||
seq: !isNaN(sequence) ? Number(sequence) : 1
|
||||
};
|
||||
|
||||
if (sequence) {
|
||||
collectionBruJson.meta.seq = Number(sequence);
|
||||
}
|
||||
}
|
||||
|
||||
return _jsonToCollectionBru(collectionBruJson);
|
||||
@@ -129,7 +135,7 @@ const bruToJson = (data, parsed = false) => {
|
||||
const transformedJson = {
|
||||
type: requestType,
|
||||
name: _.get(json, 'meta.name'),
|
||||
seq: !isNaN(sequence) ? Number(sequence) : 1,
|
||||
seq: !_.isNaN(sequence) ? Number(sequence) : 1,
|
||||
request: {
|
||||
method: _.upperCase(_.get(json, 'http.method')),
|
||||
url: _.get(json, 'http.url'),
|
||||
@@ -187,7 +193,7 @@ const jsonToBru = async (json) => {
|
||||
meta: {
|
||||
name: _.get(json, 'name'),
|
||||
type: type,
|
||||
seq: !isNaN(sequence) ? Number(sequence) : 1
|
||||
seq: !_.isNaN(sequence) ? Number(sequence) : 1
|
||||
},
|
||||
http: {
|
||||
method: _.lowerCase(_.get(json, 'request.method')),
|
||||
@@ -228,7 +234,7 @@ const jsonToBruViaWorker = async (json) => {
|
||||
meta: {
|
||||
name: _.get(json, 'name'),
|
||||
type: type,
|
||||
seq: !isNaN(sequence) ? Number(sequence) : 1
|
||||
seq: !_.isNaN(sequence) ? Number(sequence) : 1
|
||||
},
|
||||
http: {
|
||||
method: _.lowerCase(_.get(json, 'request.method')),
|
||||
|
||||
@@ -213,8 +213,7 @@ const registerRendererEventHandlers = (mainWindow, watcher, lastOpenedCollection
|
||||
|
||||
if (!folderRoot.meta) {
|
||||
folderRoot.meta = {
|
||||
name: folderName,
|
||||
seq: 1
|
||||
name: folderName
|
||||
};
|
||||
}
|
||||
|
||||
@@ -400,8 +399,7 @@ const registerRendererEventHandlers = (mainWindow, watcher, lastOpenedCollection
|
||||
} else {
|
||||
folderBruFileJsonContent = {
|
||||
meta: {
|
||||
name: newName,
|
||||
seq: 1
|
||||
name: newName
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -451,8 +449,7 @@ const registerRendererEventHandlers = (mainWindow, watcher, lastOpenedCollection
|
||||
} else {
|
||||
folderBruFileJsonContent = {
|
||||
meta: {
|
||||
name: newName,
|
||||
seq: 1
|
||||
name: newName
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -526,20 +523,14 @@ const registerRendererEventHandlers = (mainWindow, watcher, lastOpenedCollection
|
||||
});
|
||||
|
||||
// new folder
|
||||
ipcMain.handle('renderer:new-folder', async (event, pathname, folderName) => {
|
||||
ipcMain.handle('renderer:new-folder', async (event, { pathname, folderBruJsonData }) => {
|
||||
const resolvedFolderName = sanitizeName(path.basename(pathname));
|
||||
pathname = path.join(path.dirname(pathname), resolvedFolderName);
|
||||
try {
|
||||
if (!fs.existsSync(pathname)) {
|
||||
fs.mkdirSync(pathname);
|
||||
const folderBruFilePath = path.join(pathname, 'folder.bru');
|
||||
let data = {
|
||||
meta: {
|
||||
name: folderName,
|
||||
seq: 1
|
||||
}
|
||||
};
|
||||
const content = await jsonToCollectionBru(data, true); // isFolder flag
|
||||
const content = await jsonToCollectionBru(folderBruJsonData, true); // isFolder flag
|
||||
await writeFile(folderBruFilePath, content);
|
||||
} else {
|
||||
return Promise.reject(new Error('The directory already exists'));
|
||||
@@ -762,8 +753,8 @@ const registerRendererEventHandlers = (mainWindow, watcher, lastOpenedCollection
|
||||
const folderRootPath = path.join(item.pathname, 'folder.bru');
|
||||
let folderBruJsonData = {
|
||||
meta: {
|
||||
name: path.basename(item?.pathname),
|
||||
seq: item?.seq || 1
|
||||
name: path.basename(item.pathname),
|
||||
seq: item.seq
|
||||
}
|
||||
};
|
||||
if (fs.existsSync(folderRootPath)) {
|
||||
@@ -771,8 +762,8 @@ const registerRendererEventHandlers = (mainWindow, watcher, lastOpenedCollection
|
||||
folderBruJsonData = await collectionBruToJson(bru);
|
||||
if (!folderBruJsonData?.meta) {
|
||||
folderBruJsonData.meta = {
|
||||
name: path.basename(item?.pathname),
|
||||
seq: item?.seq || 1
|
||||
name: path.basename(item.pathname),
|
||||
seq: item.seq
|
||||
};
|
||||
}
|
||||
if (folderBruJsonData?.meta?.seq === item.seq) {
|
||||
|
||||
@@ -24,9 +24,8 @@ const { uuid, safeStringifyJSON, safeParseJSON, parseDataFromResponse, parseData
|
||||
const { chooseFileToSave, writeBinaryFile, writeFile } = require('../../utils/filesystem');
|
||||
const { addCookieToJar, getDomainsWithCookies, getCookieStringForUrl } = require('../../utils/cookies');
|
||||
const { createFormData } = require('../../utils/form-data');
|
||||
const { findItemInCollectionByPathname, sortFolder, getAllRequestsInFolderRecursively, getEnvVars, getTreePathFromCollectionToItem, mergeVars } = require('../../utils/collection');
|
||||
const { findItemInCollectionByPathname, sortFolder, getAllRequestsInFolderRecursively, getEnvVars, getTreePathFromCollectionToItem, mergeVars, sortByNameThenSequence } = require('../../utils/collection');
|
||||
const { getOAuth2TokenUsingAuthorizationCode, getOAuth2TokenUsingClientCredentials, getOAuth2TokenUsingPasswordCredentials, getOAuth2TokenUsingImplicitGrant } = require('../../utils/oauth2');
|
||||
const { setupProxyAgents } = require('../../utils/proxy-util');
|
||||
const { preferencesUtil } = require('../../store/preferences');
|
||||
const { getProcessEnvVars } = require('../../store/process-env');
|
||||
const { getBrunoConfig } = require('../../store/bruno-config');
|
||||
@@ -1003,10 +1002,9 @@ const registerNetworkIpc = (mainWindow) => {
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// sort requests by seq property
|
||||
folderRequests.sort((a, b) => {
|
||||
return a.seq - b.seq;
|
||||
});
|
||||
folderRequests = sortByNameThenSequence(folderRequests)
|
||||
}
|
||||
|
||||
let currentRequestIndex = 0;
|
||||
|
||||
@@ -346,7 +346,7 @@ const sortCollection = (collection) => {
|
||||
let folderItems = filter(items, (item) => item.type === 'folder');
|
||||
let requestItems = filter(items, (item) => item.type !== 'folder');
|
||||
|
||||
folderItems = folderItems.sort((a, b) => a.seq - b.seq);
|
||||
folderItems = sortByNameThenSequence(folderItems);
|
||||
requestItems = requestItems.sort((a, b) => a.seq - b.seq);
|
||||
|
||||
collection.items = folderItems.concat(requestItems);
|
||||
@@ -361,7 +361,7 @@ const sortFolder = (folder = {}) => {
|
||||
let folderItems = filter(items, (item) => item.type === 'folder');
|
||||
let requestItems = filter(items, (item) => item.type !== 'folder');
|
||||
|
||||
folderItems = folderItems.sort((a, b) => a.seq - b.seq);
|
||||
folderItems = sortByNameThenSequence(folderItems);
|
||||
requestItems = requestItems.sort((a, b) => a.seq - b.seq);
|
||||
|
||||
folder.items = folderItems.concat(requestItems);
|
||||
@@ -467,6 +467,47 @@ const mergeAuth = (collection, request, requestTreePath) => {
|
||||
}
|
||||
};
|
||||
|
||||
const sortByNameThenSequence = items => {
|
||||
const isSeqValid = seq => Number.isFinite(seq) && Number.isInteger(seq) && seq > 0;
|
||||
|
||||
// Sort folders alphabetically by name
|
||||
const alphabeticallySorted = [...items].sort((a, b) => a.name && b.name && a.name.localeCompare(b.name));
|
||||
|
||||
// Extract folders without 'seq'
|
||||
const withoutSeq = alphabeticallySorted.filter(f => !isSeqValid(f['seq']));
|
||||
|
||||
// Extract folders with 'seq' and sort them by 'seq'
|
||||
const withSeq = alphabeticallySorted.filter(f => isSeqValid(f['seq'])).sort((a, b) => a.seq - b.seq);
|
||||
|
||||
const sortedItems = withoutSeq;
|
||||
|
||||
// Insert folders with 'seq' at their specified positions
|
||||
withSeq.forEach((item) => {
|
||||
const position = item.seq - 1;
|
||||
const existingItem = withoutSeq[position];
|
||||
|
||||
// Check if there's already an item with the same sequence number
|
||||
const hasItemWithSameSeq = Array.isArray(existingItem)
|
||||
? existingItem[0].seq === item.seq
|
||||
: existingItem?.seq === item.seq;
|
||||
|
||||
if (hasItemWithSameSeq) {
|
||||
// If there's a conflict, group items with same sequence together
|
||||
const newGroup = Array.isArray(existingItem)
|
||||
? [...existingItem, item]
|
||||
: [existingItem, item];
|
||||
|
||||
withoutSeq.splice(position, 1, newGroup);
|
||||
} else {
|
||||
// Insert item at the specified position
|
||||
withoutSeq.splice(position, 0, item);
|
||||
}
|
||||
});
|
||||
|
||||
// return flattened sortedItems
|
||||
return sortedItems.flat();
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
mergeHeaders,
|
||||
mergeVars,
|
||||
@@ -487,5 +528,6 @@ module.exports = {
|
||||
sortFolder,
|
||||
getAllRequestsInFolderRecursively,
|
||||
getEnvVars,
|
||||
getFormattedCollectionOauth2Credentials
|
||||
getFormattedCollectionOauth2Credentials,
|
||||
sortByNameThenSequence
|
||||
};
|
||||
Reference in New Issue
Block a user