retejs / context-menu-plugin

https://retejs.org
MIT License
11 stars 43 forks source link

FR - new features #11

Closed Hatead1 closed 5 years ago

Hatead1 commented 5 years ago
  1. The items, created by "items: {}" key do not removed from the menu when using "search" function. May be properties "do not hide" for item.
  2. Context menu (main) have two mode: fixed and always on(linked to div like rete) and float (as in the current version).

По первому пункту - нужны пункты меню, которые не исчезают, когда с окошке поиска вводится буква, которой нет в слове. Это всяческая служебная мура, типа сохранить, очистить и т.п. Добавить флаг "не скрывать". По второму - нужно фиксированное меню, которое всегда на экране в своем контейнере. Вызывать меню правым кликом реально достает после 10 минут работы. Собственно, это тоже пара свойств: id контейнера, где будет жить меню, немножко другие стили и тип в конструкторе (fixed/float).

Ni55aN commented 5 years ago

По первому:

теперь можно задать функцию в searchKeep, которая при возвращении true не будет убирать пункт при поиске

searchKeep: title => keepItemTitles.includes(title)

где keepItemTitles может быть ['Refresh'], тогда этот пункт не будет убран

Hatead1 commented 5 years ago

Супер! Спасибо. Проверю попозже.

А кстати, как запихнуть элементы items: {} в подменю, если это необходимо?

Ni55aN commented 5 years ago

Сделать вложенный объект

Hatead1 commented 5 years ago

Есть некая странность в работе: конструкция

let dontHide = ['click'];
searchKeep: title => dontHide.includes(title)
items: { "click"(){alert(1);} }

работает, но если поменять 'click' на 'Click' - перестает с ошибкой vue в консоли.

Сделать вложенный объект

Можно пример?

Hatead1 commented 5 years ago

Добавлю, даже работающий вариант генерит ошибку в консоли. Вот мой код полностью

    let readyMenu = [10, 12, 14];
    let dontHide = ['click']; 

    editor.use(ContextMenuPlugin.default, {
            searchBar: true,
            delay: 300,
        searchKeep: title => dontHide.includes(title),
        allocate(component) {
            if (readyMenu.includes(component.path)) return ['ready'];
            return ['unready'];             
            },
        items: {
            "click"(){alert(1);}
        }
    });
Ni55aN commented 5 years ago

работает, но если поменять 'click' на 'Click' - перестает с ошибкой vue в консоли.

title возвращается в lowercase

Ni55aN commented 5 years ago

даже работающий вариант генерит ошибку в консоли.

какую? На codepen с Вашим кодом не наблюдаю ошибок

Hatead1 commented 5 years ago
vue.js:597 [Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "value"

found in
---> <Search> at C:\new\context-menu-plugin\src\menu\Search.vue
       <Menu> at C:\new\context-menu-plugin\src\menu\Menu.vue
         <Root>
Hatead1 commented 5 years ago

title возвращается в lowercase

Как-то не очень наглядно, надо постоянно про это помнить. Дубли строковые опять же в коде. Ну да ладно, работает, потом можно будет додумать.

Hatead1 commented 5 years ago

Подправьте в README, кстати. Большая буква в Refresh еще кого-нить введет в заблуждение.

    searchKeep: title => true, // leave item when searching, optional. For example,  title => ['refresh'].includes(title),
    allocate(component) {
        if (readyMenu.includes(component.path)) return ['ready'];
        return ['unready'];             
        },
    items: {
        "Refresh"(){ console.log('Works!');}
    }
Ni55aN commented 5 years ago

Почему же? В items все в норме? Главное, что title нужно проверять как lowercase

Hatead1 commented 5 years ago

Ну так я там и поправил, в комменте после // И сам items сделал Refresh вместо click.

Hatead1 commented 5 years ago

For example, title => ['refresh'].includes(title) (с ['Refresh'] не работает).

Hatead1 commented 5 years ago

Вы в lobby бываете? Вопросик есть по движку.. Не могу понять, как удалить соединения при удалении input|output.

Ni55aN commented 5 years ago

Ну так я там и поправил, в комменте после // И сам items сделал Refresh вместо click.

тогда лучше сделаю case insensitive

Hatead1 commented 5 years ago

Согласен :)

Ni55aN commented 5 years ago

Во втором пункту: модификация текущего меню может привести к проблемам с поддерживаемостью кода, поэтому лучше создать отдельное Dock меню, с тем же функционалом (можно вынести в миксины), но другим расположением

Пример: https://codepen.io/anon/pen/jQBxKe

Ni55aN commented 5 years ago

Все же, лучше будет сделать Dock меню в виде отдельного плагина. Более того, может быть полезно не только меню, но и псевдоузлы, которые можно добавлять перетаскиванием

Ni55aN commented 5 years ago

Discussion of the dock menu is transferred to https://github.com/retejs/dock-plugin/issues