Переключение видов сущностей в зависимости от userid и атрибутов этой сущности

Необходимо предоставлять пользователям различные UI в зависимости от наполнения сущности которую они открывают.

Есть сущность Project, она связана many-to-many отношением с сущностями Participants, каждый Participant состоит из Emp и Role атрибутов, где Emp - связь с Employee.

При открывании сущности Project пользователем, должен переключаться редактор сущности Project в зависимости от того, присутствует ли в сущности Project Participant c соответствующим пользователю Employee.user.id атрибутом и его Role.

Я создал вид для каждой из возможных Role, но совершенно не понимаю, как при открывании сущности пользователем получить его session$userid, сравнить его с Participant, а затем, если соответствующий Participant существует получить его Role и в зависимости от нее выбрать редактор сущности.

Какую функцию Cuba Framework нужно использовать, чтобы менять редактор перед его открытием?

Как Получить атрибуты открываемой сущности (Prefix$Project.participants.emp.user.id и соответствующий Prefix$Project.participants.role)?

Как Получить атрибут session$userid пользовательской сессии?

Вопрос очень туманный, поэтому, сложно посоветовать конкретный рецепт.

Менять редактор перед его открытием не получится. Но в зависимости от того, как построен UI, можно, например:

  1. На том экране, с которого отрывается экземпляр сущности Project, можно смотреть выбранный экземпляр сущности перед его открытием, анализировать то, какой вариант UI предоставить и, самостоятельно открывать соответствующий вариант экрана.
    Как устроен ваш UI - непонятно. Но, возможно, экземпляр сущности Project открывается по клику в таблице. Тогда переопределить это действие для открытия не стандартного, а нужного вам экрана, в зависимости от содержимого сущности Project.
    Возможно, это выбор сущности и явный клик по кнопке типа “Отрыть”. Тогда делаем это в обработчике кнопки.
  2. В зависимости от того, насколько разный должен быть UI, вы можете обойтись и одним экраном для Project.
    Просто на нем можно создать разные варианты UI, каждый в своем VBox, например. В зависимости от содержимого Project, переданного на экран, вы будете скрывать ненужные VBox в методе init или postinit контроллера экрана для Platform 6. Или на событии BeforeShowEvent для Platform 7.
    Т.е. разметка экрана будет примерно такая по структуре:
<layout>
  <vbox id="UI1">
    //... тут элементы управления для одного представления UI
  </vbox>
<vbox id="UI2">
    //... тут элементы управления для  второго представления UI
  </vbox>
...
</layout>

До данных пользователя текущей сессии добраться на экране просто. В документации описано.

...
@Inject
private UserSession userSession;
...
userSession.getUser().getId() //ID пользователя сессии
userSession.getCurrentOrSubstitutedUser().getUuid() //ID пользователя или заместителя
...

А в остальном - разберитесь со своей структурой UI, структурой данных, загляните в документацию и все должно получиться.

1 симпатия

Необходимо перед открытием редактора выполнять кусок кода который будет выбирать подходящий редактор, в зависимости от двух параметров, кусок кода я написал, теперь при нажатии кнопки атрибуты выбранного в таблице проекта подтягиваются и сравниваются, но, непонятно как переключать editor-ы перед открытием.

   public void hedit (Component source) {

    System.out.println("step0:Button Pressed");

    selectedProject=(cardsTable.getSingleSelected());
    participantsSet= selectedProject != null ? selectedProject.getParticipants() : null;

    for (Participants p : participantsSet) {

        if (p.getEmployee().getUser().getLogin().equals(userSession.getUser().getLogin())){
            System.out.println("step1:User exists");

            switch (p.getRole().getName()){
                case "Администратор":
                    hedit.setWindowId("ProjectView - Administrator");
                case "Куратор":
                    hedit.setWindowId("ProjectView - Curator");
                case "Конструктор":
                    hedit.setWindowId("ProjectView - Constructor");
                case "Экономист":
                    hedit.setWindowId("ProjectView - Economist");
                case "Инженер":
                    hedit.setWindowId("ProjectView - Engineer");
                case "Контроллер":
                    hedit.setWindowId("ProjectView - Controller");
                case "Специалист ВЭД":
                    hedit.setWindowId("ProjectView - ExtContractSpec");
                case "Специалист ДО":
                    hedit.setWindowId("ProjectView - ContractSpec");
                case "Специалист МТО":
                    hedit.setWindowId("ProjectView - SupportSpec");
            }
            System.out.println("Step 2 - User role is "+p.getRole().getName());
            break;

        }

    }
}

Нашел схожую тему - https://www.cuba-platform.com/t/how-to-present-different-editor-page-based-off-of-logic/2119/3, но там нет логики перед открытием, просто другая кнопка для открытия другого editor-а. Как выбрать editor из invoke а затем его открыть, или просто сразу открыть выбранный editor?

Версия платформы какая?

ext.thesisVersion = '4.3.1'
ext.cubaVersion = '5.9.5'

Ого. Достоверно по этой версии я ничего сказать не могу. @andrey_vb вам предлагал два варианта. На сколько могу судить вас интересует первый.
https://docs.cuba-platform.com/cuba/5.6/manual/ru/html-single/manual.html#screen_edit
В общем случае необходимо вызвать openEditor(), куда будете передавать ИД экрана (он-то у вас и будет меняться) и экземпляр редактируемого объекта. Естественно экраны необходимо предварительно создать.

1 симпатия

Работает, спасибо.