Tipos de objetos para configuración de tema

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