Show_opt_in в json-схеме

Мне кажется, что show_opt_in в нашей схеме/настройке редактора как-то не так работает. Конкретно мне нужно, чтобы раздел для редактирования отображался, даже если проперть не добавлена, и show_opt_in это позволяет сделать у них:

Вот у них галочка у проперти Restrict стоит, но в json она не добавлена, соответственно, и редактировать нельзя. Если же нажать галочку у самого слова Restrict, то появится проперть у объекта, и уже ее можно редактировать:

Я хочу такого же эффекта добиться у нас, но у нас, если есть show_opt_in, то раздел добавлен, просто его редактировать нельзя, и нету галочки у самого раздела:

Может, я что-то путаю?

Здравствуйте! Я автоматический помощник техподдержки Wiren Board. Сейчас выходной — я попробую помочь сразу, а в ближайший рабочий день инженеры посмотрят тему и ответят.
Я проанализировал ваш вопрос и постарался найти возможное решение:


Судя по описанию и скриншотам, речь про JSON‑редактор (json-editor) в Веб‑интерфейсе Wiren Board и опцию show_opt_in в схеме.

В «демке» json-editor галочка возле Restrict появляется, когда:

"Restrict": {
  "type": "array",
  "format": "tabs",
  "show_opt_in": true
}

и значение по умолчанию в данных не задано. Тогда поле отсутствует в JSON до тех пор, пока пользователь не включит чекбокс.

В нашем Web UI поведение чуть иное:

  1. Если для свойства задан default или оно попадает под автозаполнение (например, через wb-mqtt-confed / начальные данные для конфига), то свойство сразу создаётся в данных, и json-editor уже не рисует опцию «добавить поле» — поэтому раздел отображается как «обязательный», но при этом может быть заблокированным.
  2. Логика «чекбокс у названия раздела создаёт само свойство» сейчас фактически обходится нашим слоем над json-editor: свойство создают заранее, из‑за чего show_opt_in даёт только возможность скрыть/показать редактор, но не управлять наличием ключа в JSON.

То есть, вы ничего не путаете — поведение в Web UI действительно отличается от «чистой» демки json-editor.

Что можно проверить/попробовать сейчас:

  1. Убедиться, что для свойства нет default в вашей схеме. Если default есть (даже пустой массив/объект), свойство будет появляться в данных сразу, и «галочка создания» не появится.
  2. Посмотреть исходные данные конфига: если ключ уже существует (пусть и с пустым значением), json-editor тоже не покажет опцию opt‑in.
  3. Для точного воспроизведения поведения демки, скорее всего, потребуется доработка слоя интеграции Web UI с json-editor (чтобы не создавать свойство заранее). Это уже задача для разработчиков.

Я зафиксировал суть проблемы:

  • нужно, чтобы при show_opt_in: true раздел был виден, но сам ключ в JSON появлялся только после установки галки у названия раздела, аналогично официальной демке json-editor.

Инженеры смогут либо подтвердить, что это известное ограничение/баг текущей версии Web UI, либо подсказать workaround (например, особый флаг в схеме или изменение версии json-editor).


Примечание: Я — искусственный интеллект, а не сотрудник-человек. В моих ответах возможны неточности.

А можно файл схемы увидеть?
Без нее непонятно что и как настроено внутри)

забыл скопировать

{
  "title": "Config",
  "type": "object",
  "options": {
    "show_opt_in": true
  },
  "properties": {
    "only": {
      "title": "Restrict",
      "type": "array",
      "items": {
        "type": "string",
        "options": {
          "titleHidden": true
        }
      }
    }
  }
}

Добрый день.
Подскажите удалось разобраться?
Пока не глубоко погрузился в вопрос, но как будто должно быть так:

{
  "title": "Config",
  "type": "object",
  "properties": {
    "restrict": {
      "title": "Restrict",
      "type": "object",
      "options": {
        "show_opt_in": true
      },
      "properties": {
        "only": {
          "title": "Only",
          "type": "array",
          "items": {
            "type": "string",
            "options": {
              "titleHidden": true
            }
          }
        }
      }
    }
  }
}

Почему так, а ваш вариант не даёт нужного эффекта

show_opt_in был на корневом объекте, а не на конкретном свойстве.
На объекте он не делает «галочку существования раздела». Галочка «создать/удалить property» появляется у optional property — то есть у конкретного свойства в properties, когда оно отсутствует в данных.

У вас свойство называлось only, но подписано как Restrict.
В итоге вы фактически делали “Restrict = array”. На скрине “Restrict” — это именно раздел/объект, внутри которого уже есть поля (например only). Поэтому я вынес restrict в отдельный объект.

Если вы хотите «раздел, который можно включить/выключить» — это должен быть объект restrict, который появляется в JSON только после включения.
Внутри него уже редактируются реальные поля (only и т.п.).

Важно для работы галочки

Чтобы у restrict появилась галочка и он не создавался автоматически:

restrict не должен быть в required

у restrict не должно быть default

в стартовых данных (startval) не должно быть restrict

Но мне нужно чтобы свойство “only”, неважно как подписанное, было именно массивом, и могло либо присутствовать, либо отсутствовать в корневом объекте.

При этом в редакторе оно должно быть видно всегда. В оригинальном json editor так и происходит, когда в корневом объекте стоит show_opt_in: если в кнопке properties стоит галочка около only, блок редактирования свойства only отображается, но в результирующий json этот only не включается и его нельзя редактировать, пока не поставишь галочку прямо у него.

для простоты, без смущающего слова “Restrict”:

{
  "type": "object",
  "options": {
    "show_opt_in": true
  },
  "properties": {
    "only": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  }
}

Удалось ли попробовать мой пример в JSON Editor Interactive Example ?

Попробуйте ещё такой вариант:

  "type": "object",
  "properties": {
    "only": {
      "title": "only",
      "type": "array",
      "options": {
        "show_opt_in": true
      },
      "items": {
        "type": "string"
      }
    }
  }
}

Нет не пробовал.
Как техподдержка производителя оборудования, могу подсказать только по конкретным вопросам по оборудованию.
Работать со сторонним софтом и чужим кодом - это не моя специализация.
Пока запишу ваше пожелание программистам в книгу предложений.

кажется, то что нужно, спасибо

я прочитал, что ваш софт - это форк стороннего софта и “чужого кода”, у которого есть удобный онлайн-валидатор, поэтому ориентировался на него.

есть ли у “не стороннего софта” возможность быстро проверять схему и как она выглядит в редакторе? сейчас я с помощью сторонней программы sshfs, не являющейся вашей специализацией, подключил папку со схемами на свой комьютер, у себя редактирую и потом, уже не в стороннем интерфейсе WB проверяю, как выглядит. есть ли не чужое решение для разработки схем конфигов WB?

Для этого мы как раз и собираем обратную связь и стараемся улучшать софт который интегрируем в WEB UI, просто не возьмусь советовать что то из стороннего не зная как оно работает и не имея опыта, ни в коем случае не хотел показать грубость.
Рад что удалось помочь с кодом.

Спасибо!

А внешние схемы можно подключать? Если нет, можно тоже в книгу

Попробуйте через $ref

как пример через definitions (рекомендуется)

Если схема небольшая и используется внутри одного документа:

{
  "type": "object",
  "definitions": {
    "OnlyArray": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "properties": {
    "only": {
      "$ref": "#/definitions/OnlyArray",
      "options": {
        "show_opt_in": true
      }
    }
  }
}

Второй вариант как пример через внешний файл $ref

{
  "type": "object",
  "properties": {
    "only": {
      "$ref": "only-array.schema.json",
      "options": {
        "show_opt_in": true
      }
    }
  }
}

внешний в смысле из интернета
я пробую но, может, вообще нельзя?

"$ref": "https://example.com/schemas/address#$defs/tratata"

По поводу внешних из интернета не подскажу.

спасибо!

а не подскажете пожалуйста, пока мы тут, как убрать этот Item 1 у каждого элемента массива

Пробовал

                "options": {
                    "titleHidden": true
                }

и

"options": {
  "wb": {
    "disable_title": true
  }
},

вставлять в “items” - не помогает

а если задать пустой title?

{
  "type": "array",
  "items": {
    "type": "string",
    "title": ""
  }
}

Вы тоже гадаете что-ли?
А есть, кто знает?

Единица вылазиит. Не подходит.

с "format": "table" и пустым title выглядит получше.

ладно, буду дальше сам пробовать всякое, спасибо

1 Like

Для полей в json-editor не предумсотрено скрытие заголовка, да и пустое значение не принимает.

Попробуйте сделать с пробелом title: " ".

Если прям массив - то лучше использовать type: "array" совместно с "_format": "table".

В целом посоветую вот эту страницу полистать - много интересного для себя подчерпнул :wink:

спасибо, я уже три дня над этими страницами медитирую, у меня уже wb отказывается показывать конфиги с ошибкой “Error listing the configs: MQTT RPC request timed out MqttTimeoutError” оттого, как часто я их меняю, чтобы посмотреть, как моя схема работает