Hello friends, how do I organize a list, type, get and add to it, only the items corresponding to the set selected in your list?
Here I managed to make a small working UXP dashboard with codes obtained from this post:
Link:Any efficient way to get all actions list?
However, the result was not quite satisfactory! Thanks.
html:
<sp-dropdown size="s" class="main" placeholder="Select Action Set" >
<sp-label slot="label">Select Action Set</sp-label>
<sp-menu slot="options" id="list_AS" size="s"></sp-menu>
</sp-dropdown>
<!-- /////////////// xxxxxxxxxx -->
<sp-dropdown size="s" class="main" placeholder="Select Action" >
<sp-label slot="label">Select Action</sp-label>
<sp-menu slot="options" id="list_MD" size="s"></sp-menu>
</sp-dropdown>
js:
const actionList = []
const actionsSetList= []
for (let actionSet of app.actionTree ?? []) {
for (let action of actionSet.actions ?? []) {
const item = {
title: action.name,
data: {path: [actionSet.name, action.name]},
description: actionSet.name,
}
actionList.push(item)
}
}
for (let actionSet of app.actionTree ?? []) {
const item = { Set: actionSet.name}
actionsSetList.push(item)
}
itensActionsSet = actionsSetList.map(function (itemList) { return itemList.Set});
for (var i = 0; i < itensActionsSet.length; i++) {
document.getElementById("list_AS").insertAdjacentHTML("beforeend", `<sp-menu-item>${itensActionsSet[i]}</sp-menu-item>`);
}
itensActions = actionList.map(function (itemList) { return itemList.title});
for (var i = 0; i < itensActions.length; i++) {
document.getElementById("list_MD").insertAdjacentHTML("beforeend", `<sp-menu-item>${itensActions[i]}</sp-menu-item>`);
}
document.querySelector("#importIMG").addEventListener("click", async evt => {
await core.executeAsModal( async() => {
try {
const list_AS = document.getElementById("list_AS").value;
const list_MD = document.getElementById("list_MD").value;
await app.batchPlay([{"_obj":"play","_target":[{"_name": list_MD,"_ref":"action"},{"_name": list_AS,"_ref":"actionSet"}]}], { });
}
catch (err) { alert("SELECT A SET OF ACTIONS AND AN ACTION!")}
})
})
1 Like
No chance of this post being resolved?
Your actionList
contains all actions from all sets and you populate the dropdown with them and never update. You need to listen to a change event for sets dropdown and populate second dropdown only with actions from the selected set
1 Like
Hi @Karmalakas you, as always very attentive to us, thanks for showing up! Man, I must confess that even today I’m looking for this, but this is already far beyond my knowledge, that’s why I resorted here, I’ll be grateful if someone more experienced can show this, in practice. The code structure is in the post, I believe that with what we already have and someone with good knowledge we can try to find a solution. Thanks.
Jarda
February 13, 2023, 4:57pm
5
I think same algorithm is used in Alchemist when you select actionSet → action → command. But I think there is no copy paste solution you could use and it is probably better to write it from scratch.
const pairs = GetInfo.getHistory();
const result: IProperty<THistoryReference>[] = pairs.filter(p => p.snapshot === true).map(p => ({ value: p.value.toString(), label: p.label })); // remove snapshot
return result;
}
public static getActionSets(): IProperty<TActionSet>[] {
const actionSets: IProperty<TActionSet>[] = PS.actionTree.map(item => ({ value: item.id.toString(), label: item.name }));
return actionSets;
}
public static getActionItem(actionSetID: number): IProperty<TActionItem>[] {
const actionSet = new PS.ActionSet(actionSetID);
const action: IProperty<TActionItem>[] = actionSet.actions.map(item => ({ value: item.id.toString(), label: item.name }));
return action;
}
public static getActionCommand(actionItemID: number): IProperty<TActionCommand>[] {
const result2 = GetInfo.getAllCommandsOfAction(actionItemID);
const final: IProperty<TActionCommand>[] = result2.map(item => ({ value: item.ID.toString(), label: item.name }));
return final;
(t.type == "channel" && (channel?.content.value === "filterMask" || channel?.content.value === "mask"))
) {
rootT.push({
"_ref": "layer",
"_id": layer?.content.value === "active" ? activeID : parseInt(layer?.content.value as string),
});
}
}
switch (t.type) {
case "action": {
if (typeof actionset?.content?.value === "string") {
rootT.push({
"_ref": "actionSet",
"_id": parseInt(actionset.content.value), // TODO get index based on ID
});
}
if (typeof action?.content?.value === "string") {
rootT.push({
"_ref": "action",
case "layer":
return this.setState({...this.state,
layersList: GetList.getLayers(activeTargetReferenceDocument),
});
case "document":
return this.setState({...this.state,
documentsList: await GetList.getDocuments(),
});
case "action":
return this.setState({...this.state,
actionItemsList: GetList.getActionItem(parseInt(activeReferenceActionSet.value)),
});
case "actionset":
return this.setState({...this.state,
actionSetsList: GetList.getActionSets(),
});
case "command":
return this.setState({...this.state,
actionCommandsList: GetList.getActionCommand(parseInt(activeReferenceActionItem.value)),
});
case "channel":
1 Like
Thanks @Jarda I’ll dive into that and see if I can come up with something.
Hi @Jarda , man I tried to follow the links you indicated, but it left my head with bugs, I’m not at that level of understanding such complex code. I tried something with the codes at the end of this link however, I was not successful.
I ended up finding the solution in this other post:Execute a script via a button - #8 by ddbell
The result was quite satisfactory:
const getActionSet = require('photoshop').app.actionTree;
const ActionSet = document.getElementById("list_AS")
const AcrionList = document.getElementById("list_AC")
for (let i=0; i<getActionSet.length; i++){
ActionSet.insertAdjacentHTML("beforeend", `<sp-menu-item>${getActionSet[i].name}</sp-menu-item>`);
}
ActionSet.addEventListener("change", evt => {
AcrionList.innerHTML ="";
for (let i=0; i<getActionSet.length; i++){ var getActionItens = getActionSet[evt.target.selectedIndex]}
for (let i=0; i<getActionItens.actions.length; i++){
AcrionList.insertAdjacentHTML("beforeend", `<sp-menu-item>${getActionItens.actions[i].name}</sp-menu-item>`);
AcrionList.selectedIndex = 0;
}
})
document.querySelector("#btnRun").addEventListener("click", evt => {
core.executeAsModal( async() => {
const list_AS = ActionSet.value; list_AC = AcrionList.value;
await app.batchPlay([{"_obj":"play","_target":[{"_name": list_AC,"_ref":"action"},{"_name": list_AS,"_ref":"actionSet"}]}], { });
})
})
Here I share the 100% working plugin, maybe someone might find this useful.
ACTIONS-LIST_PS.ccx (6.7 KB)
2 Likes
Mauricio, as always very dedicated. Congratulations on the effort! I’ll take a look at the plugin.
1 Like