סוגי אובייקטים להגדרת נושא

Narrator: “It was not landed that week.” :upside_down_face:

2 לייקים

Is there any change on this? I just re-wrote a component for someone using objects type and they are unhappy that they can’t reorder.

4 לייקים

האם זה יופיע ברשימה של מישהו בקרוב?

בנוסף, זה די נורא שכולם נקראים “field_name-X”. האם ניתן יהיה להשתמש בשם שדה שניתן להשתמש בו שם? הצורך ללחוץ על כל אחד מהם כדי לראות מה יש שם זה סיוט אם יש לך יותר מכמה אובייקטים.

אם איננו יכולים לסדר מחדש את הפריטים ואינך יכול לדעת מה הם מבלי ללחוץ עליהם, סביר להניח שאצטרך לחזור לשימוש בהגדרת מחרוזת אחת עם ערכים מרובים המופרדים על ידי, אה, תו כלשהו להפרדת השדות השונים. ואני חושב שבמערכים מהסוג הישן יכולת לסדר דברים מחדש, נכון? אז סוג האובייקטים הזה נראה כמו צעד אחורה לכולם מלבד מתכנתים.

2 לייקים

I don’t think there’s anything in process for reordering at the moment, though it’s still something we’d like to include. Renaming is already possible with the identifier property. For example, from the custom header links theme component

The name field is set as the identifier for each link, so you can see which link is which

2 לייקים

Hooray. I thought I must have overlooked that but have not managed to find it before. Thanks!

EDIT: And now I used the identifier property and added an ‘order’ field, so it’s not too bad. I still think being able to reorder settings would be nice, and it’s available with arrays. . .

Thanks again for your help

לייק 1

I made a commit a bit ago that adds re-ordering for objects. Here is a little test setting to show the buttons:

10 לייקים

I think it is worth announcing that we got uploads as a field type option now, and I think it was mentioned somewhere, but it is nice to mention again that type: objects works on both theme settings and in site settings(plugins)

10 לייקים

The correct one should be upload

לייק 1

Thank you! Will be fixed in

לייק 1

Does the objects type support a max limit? I tried it, but it seems it doesn’t.

Do you mean like for a string type field in a objects tree?
Try max_length

See #Validations for string types on this topic; or a working example:

I think he’s referring to:

לייק 1

Yes, I am referring to limiting the maximum number of items in the objects array.

Currently, this is not supported out of the box, so I extended the functionality in a custom private theme component. Here is the configuration (for reference only):

Configuration for maximum array count limit:

themes/quectel-custom-homepage/settings.yml

banner_images:
  type: objects
  default: []
  schema:
    name: "Carousel"
    max: 9 // New extended configuration to limit the maximum number of items in the array
    identifier: image_url
    properties:
      image_url:
        type: upload
        required: true
      link_url:
        type: string
        min: 0
        max: 1023

Extended code:

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(() => {
  // Use classPrepend to extend the SchemaSettingNewEditor component to support the max limit for objects type
  // Load this component only in the admin context
  let SchemaSettingNewEditor;
  try {
    SchemaSettingNewEditor =
      require("discourse/admin/components/schema-setting/editor").default;
  } catch {
    // Non-admin users cannot load this component, skip extension
    return;
  }

  classPrepend(SchemaSettingNewEditor, (Superclass) => {
    return class extends Superclass {
      @action
      addItem() {
        // Check if the max limit is reached
        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];

        // Check if the max limit is reached
        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);
      }
    };
  });
});

Theme translation configuration:

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

en:
  theme_settings:
    errors:
      objects_value_not_valid_max: "The number cannot exceed %{count}"

Actual effect:

  1. Error message
  2. Unable to add more items
לייק 1