Desativado Não categorizado aparece nas listas suspensas de categorias

Entendo, fiz apenas um pouco de depuração local, confirmo que isso é 100% reproduzível em instalações padrão do Discourse.

Deixe-me recapitular aqui:

Existem 2 configurações quando se trata de não categorizado:

allow_uncategorized_topics padrão desligado
suppress_uncategorized_badge padrão ligado

quando allow_uncategorized_topics está desabilitado (configuração padrão) nós vazamos sua presença em certos lugares.

Se você tentar contornar habilitando não categorizado para que possa excluí-lo, você se depara com:

No Discourse, esta categoria é super estranha no sentido de que:

  1. Ela deve existir
  2. Ela não pode ser excluída
  3. Nós a injetamos em muita lógica em muitos lugares:

Podemos corrigir o vazamento apenas adicionando mais e mais condicionais, provavelmente já estamos com pelo menos 10 agora, tanto no cliente quanto no servidor.

Ou podemos corrigir isso na raiz, apenas permitir que os administradores excluam a categoria, então ela desaparece e nunca mais precisamos verificá-la.

Minha recomendação aqui é:

  1. Excluir ambas as configurações e excluir a configuração oculta uncategorized_category_id
  2. Ter um conceito de categoria padrão (o que já temos) - já temos default_composer_category
  3. ‘uncategorized’ então não é mais um conceito especial, menos coisas para raciocinar.
  4. Ter um componente de tema para pessoas que precisam ter uma “categoria sem um distintivo”

O bug de pesquisa atual pode ser corrigido com algo como:

diff --git a/app/assets/javascripts/select-kit/addon/components/search-advanced-category-chooser.js b/app/assets/javascripts/select-kit/addon/components/search-advanced-category-chooser.js
index a678919d16..83a9ed27db 100644
--- a/app/assets/javascripts/select-kit/addon/components/search-advanced-category-chooser.js
+++ b/app/assets/javascripts/select-kit/addon/components/search-advanced-category-chooser.js
@@ -1,4 +1,5 @@
 import { classNames } from "@ember-decorators/component";
+import { setting } from "discourse/lib/computed";
 import CategoryChooserComponent from "select-kit/components/category-chooser";
 import {
   pluginApiIdentifiers,
@@ -7,11 +8,13 @@ import {
 
 @classNames("search-advanced-category-chooser")
 @selectKitOptions({
-  allowUncategorized: true,
+  allowUncategorized: "allowUncategorized",
   clearable: true,
   none: "category.all",
   displayCategoryDescription: false,
   permissionType: null,
 })
 @pluginApiIdentifiers("search-advanced-category-chooser")
-export default class SearchAdvancedCategoryChooser extends CategoryChooserComponent {}
+export default class SearchAdvancedCategoryChooser extends CategoryChooserComponent {
+  @setting("allow_uncategorized_topics") allowUncategorized;
+}
import { render } from "@ember/test-helpers";
import { module, test } from "qunit";
import { setupRenderingTest } from "discourse/tests/helpers/component-test";
import selectKit from "discourse/tests/helpers/select-kit-helper";
import SearchAdvancedCategoryChooser from "select-kit/components/search-advanced-category-chooser";

module(
  "Integration | Component | select-kit/search-advanced-category-chooser",
  function (hooks) {
    setupRenderingTest(hooks);

    hooks.beforeEach(function () {
      this.set("subject", selectKit());
    });

    test("respects allow_uncategorized_topics setting when false", async function (assert) {
      this.siteSettings.allow_uncategorized_topics = false;

      await render(
        <template><SearchAdvancedCategoryChooser /></template>
      );

      await this.subject.expand();

      // Uncategorized category (ID 17 in test data) should not be present when setting is false
      assert.false(
        this.subject.rowByValue(17).exists(),
        "uncategorized category is not available when allow_uncategorized_topics is false"
      );
    });

    test("shows uncategorized category when allow_uncategorized_topics is true", async function (assert) {
      this.siteSettings.allow_uncategorized_topics = true;

      await render(
        <template><SearchAdvancedCategoryChooser /></template>
      );

      await this.subject.expand();

      // Uncategorized category (ID 17 in test data) should be present when setting is true
      assert.true(
        this.subject.rowByValue(17).exists(),
        "uncategorized category is available when allow_uncategorized_topics is true"
      );
    });

    test("has correct default options", async function (assert) {
      await render(
        <template><SearchAdvancedCategoryChooser /></template>
      );

      assert.strictEqual(
        this.subject.header().label(),
        "All categories",
        "has correct default none label"
      );
    });
  }
);

Mas esse é apenas o bug da pesquisa avançada, estamos jogando whack-a-mole aqui…

3 curtidas