window.ghOptionsFilters = (() => {
  const filters = {
    assignees: {
      selector: 'img.avatar',
      name: assignee => assignee.alt.substring(1).replace('@', ''),
      prop: assignee => assignee.src
    },
    labels: {
      selector: '.issue-card-label',
      name: label => label.innerText,
      prop: label => label.style.cssText,
    }
  };

  const selected = {
    assignees: [],
    labels: []
  };

  const addButtons = () => {
    const $header = $('.project-header > .d-table.mt-1.float-right.f6');

    Object.keys(filters).forEach(type => {
      const template = Handlebars.templates[`${type}-filter`]();

      $header.prepend(template);

      $(`#gh-projects-options-${type}-button`).on('click', { type }, updateList);
    });
  };

  const updateList = (event, type) => {
    type = type || event.data.type;
    const $list = $(`#gh-projects-options-${type}-list`);
    const elements = getList(type);
    const template = Handlebars.templates[`${type}-list`];

    $list.html(template({ elements }));

    $(`.gh-projects-options-${type}-toggle`).on('click', { type }, toggle);
  };

  const getList = (type) => {
    const $elements = $(`.project-columns ${filters[type].selector}`);

    const elements = $elements.reduce((acc, element) => {
      const name = filters[type].name(element);
      const prop = filters[type].prop(element);
      const isSelected = selected[type].includes(name);

      if (acc[name]) {
        acc[name].count += 1;
      } else {
        acc[name] = { name, prop, isSelected, count: 1 };
      }

      return acc;
    }, {});

    // Add the fake "empty" element
    const emptyElement = '#empty';

    elements[emptyElement] = {
      name: emptyElement,
      isSelected: selected[type].includes(emptyElement),
      isEmptyElement: true
    };

    return Object.keys(elements).map(x => elements[x]).sort((a, b) => a.name.toLowerCase() > b.name.toLowerCase());
  };

  const toggle = (event) => {
    const type = event.data.type;
    const $target = $(event.target);
    const $parent = $target.parents('a.select-menu-item');
    const $cards = $('.issue-card');
    const element = $parent.length ? $parent.attr('id') : $target.attr('id');
    const index = selected[type].indexOf(element);

    if (index === -1) {
      selected[type].push(element);
    } else {
      selected[type].splice(index, 1);
    }

    $cards.each((index, card) => {
      const $card = $(card);

      if (!selected[type].length) {
        $card.show();
      } else {
        const $selector = $(card).find(filters[type].selector);

        // TODO: handle multiple assignees, authors, labels…
        let firstElement = $selector.length ? filters[type].name($selector[0]) : '#empty';

        if (selected[type].includes(firstElement)) {
          $card.show();
        } else {
          $card.hide();
        }
      }
    });

    updateList(null, type);
    event.stopPropagation();
  };

  const setup = () => {
    addButtons();
  };

  return {
    setup
  };
})();

@@ -2411,39 +2411,327 @@
  =%3E 
-%7B%0A      const $c
+$(card).toggle(shouldShowCard(card)));%0A%0A    updateList(null, type);%0A    event.stopPropagation();%0A  %7D;%0A%0A  const shouldShowC
 ard = 
-$
 (card)
-;%0A
+ =%3E %7B%0A    // A card is shown if it matches all the selected filters%0A    return Object.keys(selected).reduce((shouldShow, type) =%3E %7B%0A      // If no filter is selected, it should be shown
 %0A   
@@ -2767,36 +2767,49 @@
 ) %7B%0A        
-$card.show()
+return shouldShow && true
 ;%0A      %7D el
@@ -2801,34 +2801,32 @@
 rue;%0A      %7D
- else %7B%0A
+%0A    
   
+%0A
       const 
@@ -2882,18 +2882,16 @@
 %0A%0A      
-  
 // TODO:
@@ -2941,18 +2941,16 @@
 %E2%80%A6%0A      
- 
- 
 let firs
@@ -3031,22 +3031,37 @@
 %0A%0A      
-  if (
+return shouldShow && 
 selected
@@ -3093,158 +3093,21 @@
 ent)
-) %7B%0A          $card.show();%0A        %7D else %7B%0A          $card.hide();%0A        %7D%0A      %7D%0A    %7D);%0A%0A    updateList(null, type);%0A    event.stopPropagation(
+;%0A    %7D, true
 );%0A 

Fix mixing filters