import React from "react"; import type { ControlProps } from "./BaseControl"; import BaseControl from "./BaseControl"; import { generateReactKey } from "utils/generators"; import orderBy from "lodash/orderBy"; import isString from "lodash/isString"; import isUndefined from "lodash/isUndefined"; import { DraggableListControl } from "pages/Editor/PropertyPane/DraggableListControl"; import { DraggableListCard } from "components/propertyControls/DraggableListCard"; import { Button } from "@appsmith/ads"; interface State { focusedIndex: number | null; } class MenuItemsControl extends BaseControl { constructor(props: ControlProps) { super(props); this.state = { focusedIndex: null, }; } componentDidUpdate(prevProps: ControlProps): void { //on adding a new column last column should get focused if ( prevProps.propertyValue && this.props.propertyValue && Object.keys(prevProps.propertyValue).length + 1 === Object.keys(this.props.propertyValue).length ) { this.updateFocus(Object.keys(this.props.propertyValue).length - 1, true); } } // TODO: Fix this the next time the file is edited // eslint-disable-next-line @typescript-eslint/no-explicit-any updateItems = (items: Array>) => { // TODO: Fix this the next time the file is edited // eslint-disable-next-line @typescript-eslint/no-explicit-any const menuItems = items.reduce((obj: any, each: any, index) => { obj[each.id] = { ...each, index, }; return obj; }, {}); this.updateProperty(this.props.propertyName, menuItems); }; getMenuItems = () => { const menuItems: Array<{ id: string; label: string; isDisabled: boolean; isVisible: boolean; widgetId: string; }> = isString(this.props.propertyValue) || isUndefined(this.props.propertyValue) ? [] : Object.values(this.props.propertyValue); return orderBy(menuItems, ["index"], ["asc"]); }; onEdit = (index: number) => { const menuItems = this.getMenuItems(); const targetMenuItem = menuItems[index]; this.props.openNextPanel({ index, ...targetMenuItem, propPaneId: this.props.widgetProperties.widgetId, }); }; render() { return (
DraggableListCard({ ...props, isDelete: true, placeholder: "Menu item label", }) } toggleVisibility={this.toggleVisibility} updateFocus={this.updateFocus} updateItems={this.updateItems} updateOption={this.updateOption} />
); } toggleVisibility = (index: number) => { const menuItems = this.getMenuItems(); const isVisible = menuItems[index].isVisible === true ? false : true; const updatedMenuItems = menuItems.map((item, itemIndex) => { if (index === itemIndex) { return { ...item, isVisible: isVisible, }; } return item; }); this.updateProperty(this.props.propertyName, updatedMenuItems); }; deleteOption = (index: number) => { const menuItemsArray = this.getMenuItems(); if (menuItemsArray.length === 1) return; // TODO: Fix this the next time the file is edited // eslint-disable-next-line @typescript-eslint/no-explicit-any const updatedArray = menuItemsArray.filter((eachItem: any, i: number) => { return i !== index; }); const updatedObj = updatedArray.reduce( // TODO: Fix this the next time the file is edited // eslint-disable-next-line @typescript-eslint/no-explicit-any (obj: any, each: any, index: number) => { obj[each.id] = { ...each, index, }; return obj; }, {}, ); this.updateProperty(this.props.propertyName, updatedObj); }; updateOption = (index: number, updatedLabel: string) => { const menuItemsArray = this.getMenuItems(); const itemId = menuItemsArray[index].id; this.updateProperty( `${this.props.propertyName}.${itemId}.label`, updatedLabel, ); }; addOption = () => { let menuItems = this.props.propertyValue || []; const menuItemsArray = this.getMenuItems(); const newMenuItemId = generateReactKey({ prefix: "menuItem" }); menuItems = { ...menuItems, [newMenuItemId]: { id: newMenuItemId, index: menuItemsArray.length, label: "Menu Item", widgetId: generateReactKey(), isDisabled: false, isVisible: true, }, }; this.updateProperty(this.props.propertyName, menuItems); }; updateFocus = (index: number, isFocused: boolean) => { this.setState({ focusedIndex: isFocused ? index : null }); }; static getControlType() { return "MENU_ITEMS"; } } export default MenuItemsControl;