Las opciones deshabilitadas sin categoría se muestran en los menús desplegables de categorías

Entiendo, acabo de hacer un poco de depuración local, confirmo que esto es 100% reproducible en instalaciones predeterminadas de Discourse.

Permítanme recapitular aquí:

Hay 2 configuraciones cuando se trata de no categorizado:

allow_uncategorized_topics predeterminado desactivado
suppress_uncategorized_badge predeterminado activado

cuando allow_uncategorized_topics está deshabilitado (configuración predeterminada), filtramos su presencia en ciertos lugares.

Si intenta solucionar esto habilitando no categorizado para poder eliminarlo, se le presenta:

En Discourse, esta categoría es muy extraña en el sentido de que:

  1. Debe estar allí
  2. No se puede eliminar
  3. La inyectamos en mucha lógica en muchos lugares:

Podemos solucionar la fuga simplemente agregando más y más condicionales, probablemente ya estemos en al menos 10, tanto en el cliente como en el servidor.

O podemos solucionarlo en el núcleo, simplemente permitir que los administradores eliminen la categoría, entonces desaparecerá y nunca necesitaremos verificarla.

Mi recomendación aquí es:

  1. Eliminar ambas configuraciones y la configuración oculta uncategorized_category_id
  2. Tener un concepto de categoría predeterminada (que ya tenemos): ya tenemos default_composer_category
  3. ‘uncategorized’ entonces ya no es un concepto especial, menos cosas que razonar.
  4. Tener un componente temático para las personas que deben tener una “categoría sin insignia”.

El error de búsqueda actual se puede solucionar con 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"
      );
    });
  }
);

Pero ese es solo el error de búsqueda avanzada, estamos jugando al whack-a-mole aquí…

3 Me gusta