Tipos de objetos para configuración de tema

Narrador: “No se implementó esa semana”. :upside_down_face:

2 Me gusta

¿Hay algún cambio en esto? Acabo de reescribir un componente para alguien que usa tipos de objetos y no está contento porque no puede reordenar.

4 Me gusta

¿Va a entrar esto en la lista de alguien pronto?

Además, es bastante terrible que todas se llamen “field_name-X”. ¿Sería posible tener un nombre de campo que se pudiera usar allí? Tener que hacer clic en cada una para ver qué hay es una pesadilla si tienes más de un par de objetos.

Si no podemos reordenar los elementos y no puedes saber qué son sin hacer clic en ellos, probablemente tendré que volver a usar una configuración de cadena única con varios valores separados por, eh, algún carácter para separar los diferentes campos. Y creo que con los arrays del estilo antiguo podías reordenar cosas, ¿verdad? Así que este tipo de objetos parece un paso atrás para todos excepto para los programadores.

2 Me gusta

No creo que haya nada en proceso para reordenar en este momento, aunque todavía es algo que nos gustaría incluir. El cambio de nombre ya es posible con la propiedad identifier. Por ejemplo, desde el componente temático de enlaces de encabezado personalizados

El campo de nombre se establece como el identificador de cada enlace, por lo que puedes ver cuál es cuál

2 Me gusta

¡Hurra! Pensé que debía haber pasado por alto eso, pero no lo había encontrado antes. ¡Gracias!

EDITAR: Y ahora usé la propiedad identifier y agregué un campo ‘order’, así que no está tan mal. Todavía creo que poder reordenar la configuración sería bueno, y está disponible con arrays. . .

Gracias de nuevo por tu ayuda.

1 me gusta

Hace poco hice un commit que agrega la capacidad de reordenar objetos. Aquí hay una pequeña configuración de prueba para mostrar los botones:

10 Me gusta

Creo que vale la pena anunciar que ahora tenemos uploads como opción de tipo de campo, y creo que se mencionó en algún lugar, pero es bueno mencionar de nuevo que type: objects funciona tanto en la configuración del tema como en la configuración del sitio (plugins).

10 Me gusta

Lo correcto debería ser upload

1 me gusta

¡Gracias! Se solucionará en

1 me gusta

¿El tipo objects admite el límite max? Lo intenté, pero parece que no funciona.

¿Te refieres a un campo de tipo string en un árbol de objetos?
Prueba con max_length

Consulta #Validaciones para tipos string sobre este tema; o un ejemplo funcional:

Creo que se refiere a:

1 me gusta

Sí, me refiero a limitar la cantidad máxima de elementos en el array de objetos.

Actualmente, la versión oficial no lo soporta, por lo que he extendido esta funcionalidad en un componente de tema privado personalizado. La configuración es la siguiente (solo como referencia):

Configuración para limitar el número máximo de elementos en el array:

themes/quectel-custom-homepage/settings.yml

banner_images:
  type: objects
  default: []
  schema:
    name: "Imagen de carrusel"
    max: 9 // Nueva configuración extendida para limitar la cantidad máxima de elementos en el array
    identifier: image_url
    properties:
      image_url:
        type: upload
        required: true
      link_url:
        type: string
        min: 0
        max: 1023

Código específico de la extensión:

themes/quectel-custom-homepage/javascripts/discourse/api-initializers/quectel-custom-homepage.gjs

import { action } from "@ember/object";
import { apiInitializer } from "discourse/lib/api";
import classPrepend from "discourse/lib/class-prepend";
import { i18n } from "discourse-i18n";

export default apiInitializer(() => {
  // Utilizar classPrepend para extender el componente SchemaSettingNewEditor y soportar la limitación max para el tipo objects
  // Cargar este componente solo en el contexto de administrador
  let SchemaSettingNewEditor;
  try {
    SchemaSettingNewEditor =
      require("discourse/admin/components/schema-setting/editor").default;
  } catch {
    // Los usuarios que no son administradores no pueden cargar este componente, omitir la extensión
    return;
  }

  classPrepend(SchemaSettingNewEditor, (Superclass) => {
    return class extends Superclass {
      @action
      addItem() {
        // Verificar si se ha alcanzado el límite max
        const maxLimit = this.args.setting.max || this.activeSchema?.max;

        if (maxLimit && this.activeData.length >= maxLimit) {
          this.validationErrorMessage = i18n(
            themePrefix("theme_settings.errors.objects_value_not_valid_max"),
            {
              count: maxLimit,
            }
          );
          return;
        }

        return super.addItem(...arguments);
      }

      @action
      addChildItem(propertyName, parentNodeIndex) {
        const propertySchema = this.activeSchema.properties[propertyName];

        // Verificar si se ha alcanzado el límite max
        if (
          propertySchema?.max &&
          this.activeData[parentNodeIndex][propertyName].length >=
            propertySchema.max
        ) {
          this.validationErrorMessage = i18n(
            themePrefix("theme_settings.errors.objects_value_not_valid_max"),
            {
              count: propertySchema.max,
            }
          );
          return;
        }

        return super.addChildItem(...arguments);
      }
    };
  });
});

Configuración de traducción del tema:

themes/quectel-custom-homepage/locales/zh_CN.yml

zh_CN:
  theme_settings:
    errors:
      objects_value_not_valid_max: "La cantidad no puede superar %{count}"

Efecto concreto:

  1. Mensaje de error
  2. No se pueden añadir más elementos
1 me gusta