Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: Add swap input values button #621

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions src/core/Operation.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class Operation {
this._disabled = false;
this._flowControl = false;
this._manualBake = false;
this._inputSwappable = false;
this._ingList = [];

// Public fields
Expand Down Expand Up @@ -316,6 +317,25 @@ class Operation {
this._manualBake = !!value;
}

/**
* Returns true if this Operation has swappable input values.
*
* @returns {boolean}
*/
get inputSwappable() {
return this._inputSwappable;
}


/**
* Set whether this Operation shoud show swap input icon.
*
* @param {boolean} value
*/
set inputSwappable(value) {
this._inputSwappable = !!value;
}

}

export default Operation;
17 changes: 9 additions & 8 deletions src/core/config/scripts/generateConfig.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,15 @@ for (const opObj in Ops) {
const op = new Ops[opObj]();

operationConfig[op.name] = {
module: op.module,
description: op.description,
infoURL: op.infoURL,
inputType: op.inputType,
outputType: op.presentType,
flowControl: op.flowControl,
manualBake: op.manualBake,
args: op.args
module: op.module,
description: op.description,
infoURL: op.infoURL,
inputType: op.inputType,
outputType: op.presentType,
flowControl: op.flowControl,
inputSwappable: op.inputSwappable,
manualBake: op.manualBake,
args: op.args
};

if ("patterns" in op) {
Expand Down
9 changes: 9 additions & 0 deletions src/core/config/scripts/newOperation.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,14 @@ If your operation does not rely on a library, just leave this blank and it will
required: true,
message: `The output type should be one of: ${ioTypes.join(", ")}.`
},
inputSwappable: {
description: "Input swappable option shows an icon that can swap input values of two ingredients.",
example: "true/false",
prompt: "Show input swaping",
type: "boolean",
default: "false",
message: "Enter true or false to specify if input spawing should be shown."
},
highlight: {
description: "If your operation does not change the length of the input in any way, we can enable highlighting. If it does change the length in a predictable way, we may still be able to enable highlighting and calculate the correct offsets. If this is not possible, we will disable highlighting for this operation.",
example: "true/false",
Expand Down Expand Up @@ -150,6 +158,7 @@ class ${moduleName} extends Operation {
this.infoURL = "${result.infoURL}";
this.inputType = "${result.inputType}";
this.outputType = "${result.outputType}";
this.inputSwappable = "${result.inputSwappable}";
this.args = [
/* Example arguments. See the project wiki for full details.
{
Expand Down
1 change: 1 addition & 0 deletions src/core/operations/ConvertArea.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ class ConvertArea extends Operation {
this.infoURL = "https://wikipedia.org/wiki/Orders_of_magnitude_(area)";
this.inputType = "BigNumber";
this.outputType = "BigNumber";
this.inputSwappable = true;
this.args = [
{
"name": "Input units",
Expand Down
1 change: 1 addition & 0 deletions src/core/operations/ConvertDataUnits.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ class ConvertDataUnits extends Operation {
this.infoURL = "https://wikipedia.org/wiki/Orders_of_magnitude_(data)";
this.inputType = "BigNumber";
this.outputType = "BigNumber";
this.inputSwappable = true;
this.args = [
{
"name": "Input units",
Expand Down
1 change: 1 addition & 0 deletions src/core/operations/ConvertDistance.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ class ConvertDistance extends Operation {
this.infoURL = "https://wikipedia.org/wiki/Orders_of_magnitude_(length)";
this.inputType = "BigNumber";
this.outputType = "BigNumber";
this.inputSwappable = true;
this.args = [
{
"name": "Input units",
Expand Down
1 change: 1 addition & 0 deletions src/core/operations/ConvertMass.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ class ConvertMass extends Operation {
this.infoURL = "https://wikipedia.org/wiki/Orders_of_magnitude_(mass)";
this.inputType = "BigNumber";
this.outputType = "BigNumber";
this.inputSwappable = true;
this.args = [
{
"name": "Input units",
Expand Down
1 change: 1 addition & 0 deletions src/core/operations/ConvertSpeed.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ class ConvertSpeed extends Operation {
this.infoURL = "https://wikipedia.org/wiki/Orders_of_magnitude_(speed)";
this.inputType = "BigNumber";
this.outputType = "BigNumber";
this.inputSwappable = true;
this.args = [
{
"name": "Input units",
Expand Down
20 changes: 12 additions & 8 deletions src/web/HTMLOperation.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,16 @@ class HTMLOperation {
* @param {Manager} manager - The CyberChef event manager.
*/
constructor(name, config, app, manager) {
this.app = app;
this.manager = manager;
this.app = app;
this.manager = manager;

this.name = name;
this.description = config.description;
this.infoURL = config.infoURL;
this.manualBake = config.manualBake || false;
this.config = config;
this.ingList = [];
this.name = name;
this.description = config.description;
this.infoURL = config.infoURL;
this.manualBake = config.manualBake || false;
this.inputSwappable = config.inputSwappable || false;
this.config = config;
this.ingList = [];

for (let i = 0; i < config.args.length; i++) {
const ing = new HTMLIngredient(config.args[i], this.app, this.manager);
Expand Down Expand Up @@ -77,6 +78,9 @@ class HTMLOperation {

for (let i = 0; i < this.ingList.length; i++) {
html += this.ingList[i].toHtml();
if (this.inputSwappable && i === 0) {
html += "<div class='inline'><i class='material-icons swap-icon' title='Swap input'>swap_horiz</i></div>";
}
}

html += `</div>
Expand Down
1 change: 1 addition & 0 deletions src/web/Manager.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ class Manager {
this.addDynamicListener(".arg[type=checkbox], .arg[type=radio], select.arg", "change", this.recipe.ingChange, this.recipe);
this.addDynamicListener(".disable-icon", "click", this.recipe.disableClick, this.recipe);
this.addDynamicListener(".breakpoint", "click", this.recipe.breakpointClick, this.recipe);
this.addDynamicListener(".swap-icon", "click", this.recipe.swapInputClick, this.recipe);
this.addDynamicListener("#rec-list li.operation", "dblclick", this.recipe.operationDblclick, this.recipe);
this.addDynamicListener("#rec-list li.operation > div", "dblclick", this.recipe.operationChildDblclick, this.recipe);
this.addDynamicListener("#rec-list .dropdown-menu.toggle-dropdown a", "click", this.recipe.dropdownToggleClick, this.recipe);
Expand Down
5 changes: 5 additions & 0 deletions src/web/stylesheets/components/_operation.css
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,11 @@ div.toggle-string {
cursor: pointer;
}

.swap-icon {
margin-top: 1.75rem;
cursor: pointer;
}

.disable-icon {
color: var(--disable-icon-colour);
}
Expand Down
17 changes: 17 additions & 0 deletions src/web/waiters/RecipeWaiter.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,23 @@ class RecipeWaiter {
window.dispatchEvent(this.manager.statechange);
}

/**
* Handler for swap input click event.
* Swaps values of two inputs.
*
* @fires Manager#statechange
* @param {event} e
*/
swapInputClick(e) {
const si = e.target;
const ings = si.parentNode.parentNode.querySelectorAll(".arg");

if (ings.length === 2) {
const left = ings[0], right = ings[1];
[left.value, right.value] = [right.value, left.value];
this.ingChange();
}
}

/**
* Handler for operation doubleclick events.
Expand Down