A macro for Jesse Grosjean's Bike Outliner.
BIKE – Focus on selected line, creating new tab
BIKE – Focus on selected line- creating new tab.kmmacros (25 KB)
Expand disclosure triangle to view JS source
(() => {
"use strict";
// New Bike app tab focused on selected row.
// Rob Trew @2022
// Ver 0.01
// main :: IO ()
const main = () => {
const
bike = Application("Bike"),
doc = bike.documents.at(0);
return doc.exists() ? (() => {
const
rows = doc.rows.where({
_and: [
{selected: true},
{_not: [{
name: ""
}]}
]
});
return 0 < rows.length ? (() => {
const selectedRowID = rows.at(0).id();
return (
bike.activate(),
bundleMenuItemClicked(
"com.hogbaysoftware.Bike"
)(["File", "New Tab"]) ? (() => {
const
tabDoc = bike.windows.at(0)
.document();
return Boolean(
tabDoc.focusedRow = tabDoc
.rows.byId(selectedRowID)
);
})() : "Menu item not clicked."
);
})() : "No line of text selected.";
})() : "No documents open in Bike";
};
// --------------------- GENERIC ---------------------
// bundleMenuItemClicked :: String -> [String] -> IO Bool
const bundleMenuItemClicked = bundleID =>
menuPath => {
// True if an item at the specified menu path
// has been successfully clicked in an
// application with the given bundle identifier.
const intMenuPath = menuPath.length;
return intMenuPath > 1 ? (() => {
const
appProcs = Application("System Events")
.processes.where({
bundleIdentifier: bundleID
});
return 0 < appProcs.length ? (
Application(bundleID)
.activate(),
menuPath.slice(1, -1).reduce(
(a, x) => a.menuItems[x].menus[x],
appProcs[0].menuBars[0].menus
.byName(menuPath[0])
)
.menuItems[menuPath[intMenuPath - 1]]
.click(),
true
) : false;
})() : false;
};
// MAIN ---
return main();
})();