Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Конструктор ограничений #1452

Open
mar-hab opened this issue May 17, 2023 · 0 comments
Open

Конструктор ограничений #1452

mar-hab opened this issue May 17, 2023 · 0 comments
Assignees

Comments

@mar-hab
Copy link

mar-hab commented May 17, 2023

Цель

Реализовать конструктор сложных ограничений для списка и работу с этим ограничениями для пользователя приложения.

Функциональные требования

  1. Конструктор предназначен для использования продвинутым пользователем, способным построить логическое выражение, но не владеющим навыком программирования.
  2. Конструктор должен позволять задавать ограничения для списка по условиям на атрибуты списка (и связанных объектов, в т.ч. мастеров и детейлов любого уровня) соединенных любой последовательностью И/ИЛИ/НЕ. Список таких условий должен быть доступен для выбора пользователю.
  3. Условия могут быть стандартные =, <>, >, < и должна быть возможность расширения (например "содержит", "пусто"). Список таких условий должен быть доступен для выбора пользователю.
  4. Должна быть возможность использовать в условиях преобразования и "константы" (Год указанного значения даты, текущие дата-время). Должна быть возможность расширения. Список таких функций должен быть доступен для выбора пользователю.
  5. Пользователю должен быть предоставлен перечень атрибутов, которые можно использовать.
  6. Должна быть проверка валидности условия по типам операндов, по синтаксису (если использовать вариант, предложенный ниже)
  7. Должна быть возможность сохранения ограничения, создания на основе текущего, объединения разных ограничений по И, ИЛИ (м.б. НЕ).
  8. Должна быть возможность "миграции" ограничения (сохранения его, чтобы распространить на разных источниках- например разработать на dev, поставить на prod)
  9. Желательна возможность использования параметров (не заданных изначально значений, которые можно задать при использовании ограничения)
  10. Желательно возможность выбора/подстановки значений для ограничения из источника данных.

Требования к реализации

Предложение, как можно сделать. См макет. Это не дизайн, а про содержание но форме.
Предлагается отказаться от элементов программирования (new SimplePredicate и т.п.) и использовать более человекочитаемую запись. При этом оставить возможность описания в старом формате (по тогглеру "В виде кода" переключаться в разные представления без потери содержания). Чтобы явно разделять атрибуты, значения, операторы, параметры, функции предлагается использовать служебные символы @, #, ?. Возможно, жестко требовать наличие хотя бы одного пробела между элементами. При проверке выражения в т.ч. проверять парность скобок, соответствие типов слева и справа от операнда. Допускаются строковые значения без '. В случае использования в строковом значении спецсимволов - допускается ' (тогда проверять парность).
Перечень атрибутов, условий, функций нужно задавать в коде для конкретного списка. Содержание таких настроек может выглядеть так

  • для атрибутов - наименование в модели для создания ограничения, тип, капшн для отображения, списковая форма для выбора значения, атрибут, из которого нужно получить значение для подстановки
  • для атрибутов типа ссылок (см @ПропискаТерритория) - еще дополнительно атрибут для отображения в тексте ограничения (т.е. Пермь показываем, но в ограничении реально подставлен guid)
  • для логического условия - капшн, его программное соотв-вие ( = это 'eq'), возможно допустимый тип (для #содержит)
  • для функций - - капшн, его программное соотв-вие, тип параметра, тип возвращаемого значения
  • для атрибутов сложных ограничений (это атрибутика детейлов) - информация для связки объекта детейла с мастером, + то же, что для атрибутов
    В атрибутах (и простых ограничений и сложных) есть кнопка лукапа, которая открывает в диалоге список значении из БД на выбор (м.б. проще чтото можно).
    Доступные действия:
  • клик по названию атрибута, условия, функции подставляет ее в место курсора в поле выражения
  • клик по лукапу значения атрибута и выбор значения подставляет значения в место курсора в поле выражения
    При применении ограничения, если есть ?параметр - сначала открывается диалог с полями для ввода параметров. Если заданы настройки для лукапа для операнда слева выражения - должна быть возможность лукапа.
    Пояснение к ограничениям на детейлы - в примере перемешана атрибутика из разных объектов для простоты описания условий. Предполагается, что если в одних скобках собраны атрибуты одного класса и другого - превращать это в столько сложных условий, сколько объектов, атрибуты одного объекта собирать в одном условии. М.б. стоит, наоборот, запретить такую запись. Считаем, что сложные условия требуют более продвинутого уровня пользователя и что такие условия будут редко создаваться пользователем.

Полезные ссылки, скриншоты

2023-05-17 16-21-32 WebEAIS – Figma — Mozilla Firefox

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants