2023-06-16 17:08:43 +12:00
|
|
|
import {COperationLi} from "./c-operation-li.mjs";
|
2023-07-24 14:54:34 +12:00
|
|
|
import Sortable from "sortablejs";
|
2023-06-16 17:08:43 +12:00
|
|
|
|
|
|
|
/**
|
|
|
|
* c(ustom element)-operation-list
|
|
|
|
*
|
|
|
|
* @param {App} app - The main view object for CyberChef
|
|
|
|
* @param {string[]} opNames - A list of operation names
|
|
|
|
* @param {boolean} includeStarIcon - optionally add the 'star' icon to the left of the operation
|
|
|
|
* @param {Object} icon ( { class: string, innerText: string } ). check-icon by default
|
|
|
|
*/
|
|
|
|
export class COperationList extends HTMLElement {
|
2023-07-24 14:54:34 +12:00
|
|
|
constructor(
|
|
|
|
app,
|
|
|
|
opNames,
|
|
|
|
includeStarIcon,
|
2023-07-25 14:54:43 +12:00
|
|
|
isSortable = false,
|
|
|
|
isCloneable = true,
|
2023-07-24 14:54:34 +12:00
|
|
|
icon,
|
2023-07-25 14:54:43 +12:00
|
|
|
|
2023-07-24 14:54:34 +12:00
|
|
|
) {
|
2023-06-16 17:08:43 +12:00
|
|
|
super();
|
|
|
|
|
|
|
|
this.app = app;
|
|
|
|
this.opNames = opNames;
|
|
|
|
this.includeStarIcon = includeStarIcon;
|
2023-07-24 14:54:34 +12:00
|
|
|
this.isSortable = isSortable;
|
2023-07-25 14:54:43 +12:00
|
|
|
this.isCloneable = isCloneable;
|
|
|
|
this.icon = icon;
|
2023-06-16 17:08:43 +12:00
|
|
|
}
|
|
|
|
|
2023-07-21 11:47:00 +12:00
|
|
|
/**
|
|
|
|
* Build c-operation-list
|
|
|
|
*/
|
2023-06-16 17:08:43 +12:00
|
|
|
build() {
|
|
|
|
const ul = document.createElement("ul");
|
|
|
|
ul.classList.add("op-list");
|
|
|
|
|
|
|
|
this.opNames.forEach((opName => {
|
|
|
|
const li = new COperationLi(
|
|
|
|
this.app,
|
|
|
|
opName,
|
|
|
|
{
|
|
|
|
class: this.icon ? this.icon.class : "check-icon",
|
|
|
|
innerText: this.icon ? this.icon.innerText : "check"
|
|
|
|
},
|
|
|
|
this.includeStarIcon
|
|
|
|
);
|
|
|
|
|
|
|
|
ul.appendChild(li);
|
|
|
|
}))
|
|
|
|
|
2023-07-24 14:54:34 +12:00
|
|
|
if (this.isSortable) {
|
|
|
|
const sortableList = Sortable.create(ul, {
|
|
|
|
group: "sorting",
|
|
|
|
sort: true,
|
|
|
|
draggable: "c-operation-li",
|
|
|
|
onFilter: function (e) {
|
|
|
|
const el = sortableList.closest(e.item);
|
|
|
|
if (el && el.parentNode) {
|
|
|
|
$(el).popover("dispose");
|
|
|
|
el.parentNode.removeChild(el);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
onEnd: function(e) {
|
|
|
|
if (this.removeIntent) {
|
|
|
|
$(e.item).popover("dispose");
|
|
|
|
e.item.remove();
|
|
|
|
}
|
|
|
|
}.bind(this),
|
|
|
|
});
|
2023-07-25 14:54:43 +12:00
|
|
|
} else if (!this.app.isMobileView() && this.isCloneable) {
|
|
|
|
const cloneableList = Sortable.create(ul, {
|
|
|
|
group: {
|
|
|
|
name: "recipe",
|
|
|
|
pull: "clone",
|
|
|
|
},
|
|
|
|
draggable: "c-operation-li",
|
|
|
|
sort: false
|
|
|
|
})
|
2023-07-24 14:54:34 +12:00
|
|
|
}
|
|
|
|
|
2023-06-16 17:08:43 +12:00
|
|
|
this.append(ul);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
customElements.define("c-operation-list", COperationList);
|