Merge branch 'feature/SUPPORT-8957_manage_users' into SUPPORT-8943_seamlessness

# Conflicts:
#	resources/src/main/resources/business-model/Список заявок на пользователя/Обработка заявки на добавление пользователя.page
This commit is contained in:
gulnaz 2025-03-07 17:48:50 +03:00
commit 2abae2162f
27 changed files with 709 additions and 1 deletions

View file

@ -216,6 +216,14 @@
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.parent.artifactId}</finalName>

View file

@ -16,6 +16,7 @@ import org.springframework.context.annotation.FilterType;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
/**
@ -75,4 +76,9 @@ public class AppConfig {
liquibase.setChangeLog("classpath:config/changelog-master.xml");
return liquibase;
}
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}

View file

@ -0,0 +1,121 @@
package ru.micord.ervu.account_applications.controller;
import java.net.URI;
import java.util.List;
import java.util.stream.Collectors;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.HttpServerErrorException;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import ru.micord.ervu.account_applications.dto.Account;
import ru.micord.ervu.account_applications.dto.ProcessRequest;
import ru.micord.ervu.account_applications.dto.create.CreateProcessRequest;
import ru.micord.ervu.account_applications.dto.create.CreateUserDto;
import ru.micord.ervu.account_applications.dto.create.Credential;
import ru.micord.ervu.account_applications.dto.create.CreateData;
import ru.micord.ervu.account_applications.dto.Person;
import ru.micord.ervu.account_applications.dto.ProcessResponse;
import ru.micord.ervu.account_applications.dto.Role;
import ru.micord.ervu.account_applications.dto.Roles;
import ru.micord.ervu.account_applications.dto.deactivate.DeactivateData;
import ru.micord.ervu.account_applications.dto.deactivate.DeactivateProcessRequest;
import ru.micord.ervu.account_applications.dto.edit.EditData;
import ru.micord.ervu.account_applications.dto.edit.EditPersonDto;
import ru.micord.ervu.account_applications.dto.edit.EditPersonProcessRequest;
import ru.micord.ervu.account_applications.enums.ProcessKey;
import ru.micord.ervu.account_applications.security.context.SecurityContext;
/**
* @author gulnaz
*/
@RestController
@RequestMapping("/user")
public class AdminController {
private static final String PROCESS_START_PATH = "/service/wf/service/start";
private final RestTemplate restTemplate;
private final SecurityContext securityContext;
@Value("${ervu.url}")
private String ervuUrl;
public AdminController(RestTemplate restTemplate, SecurityContext securityContext) {
this.restTemplate = restTemplate;
this.securityContext = securityContext;
}
@PostMapping(value = "/create", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> create(@RequestBody @Valid CreateUserDto dto) {
Credential credential = new Credential(dto.username());
Account account = new Account(dto.userDomain(), dto.position());
Person person = new Person(dto.surname(), dto.firstname(), dto.middlename(), dto.sex(),
dto.email(), dto.birthdate(), dto.snils(), dto.ipAddresses());
List<Role> rolesList = dto.roles()
.stream()
.map(role -> new Role(role, ""))
.collect(Collectors.toList());
Roles roles = new Roles(rolesList);
CreateProcessRequest request = new CreateProcessRequest(
ProcessKey.CREATE.getValue(), getUserId(), new CreateData(credential, account, person, roles));
return doRequest(request);
}
@PostMapping(value = "/edit", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> edit(@RequestBody @Valid EditPersonDto dto) {
Person person = new Person(dto.id(), dto.firstname(), dto.surname(), dto.middlename(), dto.sex(),
dto.email(), dto.birthdate(), dto.snils(), dto.ipAddresses());
EditPersonProcessRequest request = new EditPersonProcessRequest(ProcessKey.EDIT_PERSON.getValue(),
getUserId(), new EditData(dto.accountId(), person));
return doRequest(request);
}
@PostMapping(value = "/deactivate", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> deactivate(@RequestBody DeactivateData data) {
DeactivateProcessRequest request = new DeactivateProcessRequest(ProcessKey.DEACTIVATE.getValue(),
getUserId(), data);
return doRequest(request);
}
private <R> ResponseEntity<?> doRequest(ProcessRequest<R> request) {
HttpEntity<ProcessRequest<R>> entity = setEntity(getToken(), request);
URI uri = UriComponentsBuilder.fromHttpUrl(ervuUrl)
.path(PROCESS_START_PATH)
.build()
.toUri();
try {
return restTemplate.postForEntity(uri, entity, ProcessResponse.class);
}
catch (HttpClientErrorException | HttpServerErrorException e) {
return new ResponseEntity<>(e.getMessage(), e.getStatusCode());
}
}
private <R> HttpEntity<R> setEntity(String token, R body) {
HttpHeaders headers = new HttpHeaders();
headers.setBearerAuth(token);
headers.setContentType(MediaType.APPLICATION_JSON);
return new HttpEntity<>(body, headers);
}
private String getUserId() {
return securityContext.getUserId();
}
//TODO after SUPPORT-8975
private String getToken() {
return "";
}
}

View file

@ -0,0 +1,15 @@
package ru.micord.ervu.account_applications.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
/**
* @author gulnaz
*/
public record Account(String schema, @JsonProperty("user-domain") String userDomain,
String position, boolean enabled, boolean esiaAccount,
String start, String finish) {
public Account(String userDomain, String position) {
this("Account", userDomain, position, true, false, "", "");
}
}

View file

@ -0,0 +1,21 @@
package ru.micord.ervu.account_applications.dto;
import java.util.List;
/**
* @author gulnaz
*/
public record Person(String id, String surname, String firstname, String middlename, String sex,
String email, String birthdate, String snils, List<String> ipAddresses,
boolean secondFactorEnabled) {
public Person(String surname, String firstname, String middlename, String sex, String email,
String birthdate, String snils, List<String> ipAddresses) {
this("", surname, firstname, middlename, sex, email, birthdate, snils, ipAddresses);
}
public Person(String id, String surname, String firstname, String middlename, String sex,
String email, String birthdate, String snils, List<String> ipAddresses) {
this(id, surname, firstname, middlename, sex, email, birthdate, snils, ipAddresses, false);
}
}

View file

@ -0,0 +1,29 @@
package ru.micord.ervu.account_applications.dto;
/**
* @author gulnaz
*/
public abstract class ProcessRequest<T> {
protected final String processKey;
protected final String userId;
protected final T data;
public ProcessRequest(String processKey, String userId, T data) {
this.processKey = processKey;
this.userId = userId;
this.data = data;
}
public String getProcessKey() {
return processKey;
}
public String getUserId() {
return userId;
}
public T getData() {
return data;
}
}

View file

@ -0,0 +1,7 @@
package ru.micord.ervu.account_applications.dto;
/**
* @author gulnaz
*/
public record ProcessResponse(String code, String msg, String traceId) {
}

View file

@ -0,0 +1,7 @@
package ru.micord.ervu.account_applications.dto;
/**
* @author gulnaz
*/
public record Role(String id, String finish) {
}

View file

@ -0,0 +1,9 @@
package ru.micord.ervu.account_applications.dto;
import java.util.List;
/**
* @author gulnaz
*/
public record Roles(List<Role> rolesList) {
}

View file

@ -0,0 +1,11 @@
package ru.micord.ervu.account_applications.dto.create;
import ru.micord.ervu.account_applications.dto.Account;
import ru.micord.ervu.account_applications.dto.Person;
import ru.micord.ervu.account_applications.dto.Roles;
/**
* @author gulnaz
*/
public record CreateData(Credential credential, Account account, Person person, Roles roles) {
}

View file

@ -0,0 +1,13 @@
package ru.micord.ervu.account_applications.dto.create;
import ru.micord.ervu.account_applications.dto.ProcessRequest;
/**
* @author gulnaz
*/
public class CreateProcessRequest extends ProcessRequest<CreateData> {
public CreateProcessRequest(String processKey, String userId, CreateData data) {
super(processKey, userId, data);
}
}

View file

@ -0,0 +1,19 @@
package ru.micord.ervu.account_applications.dto.create;
import java.util.List;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
/**
* @author gulnaz
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public record CreateUserDto(@NotNull String firstname, @NotNull String surname, String middlename,
String birthdate, String sex, String position, String email,
@NotNull String username, @NotNull String snils,
@NotNull @NotEmpty String userDomain,
String start, String finish,
List<String> roles, List<String> ipAddresses) {
}

View file

@ -0,0 +1,7 @@
package ru.micord.ervu.account_applications.dto.create;
/**
* @author gulnaz
*/
public record Credential(String userName) {
}

View file

@ -0,0 +1,9 @@
package ru.micord.ervu.account_applications.dto.deactivate;
import java.util.List;
/**
* @author gulnaz
*/
public record DeactivateData(List<String> accountIdList) {
}

View file

@ -0,0 +1,13 @@
package ru.micord.ervu.account_applications.dto.deactivate;
import ru.micord.ervu.account_applications.dto.ProcessRequest;
/**
* @author gulnaz
*/
public class DeactivateProcessRequest extends ProcessRequest<DeactivateData> {
public DeactivateProcessRequest(String processKey, String userId, DeactivateData data) {
super(processKey, userId, data);
}
}

View file

@ -0,0 +1,9 @@
package ru.micord.ervu.account_applications.dto.edit;
import ru.micord.ervu.account_applications.dto.Person;
/**
* @author gulnaz
*/
public record EditData(String accountId, Person personData) {
}

View file

@ -0,0 +1,16 @@
package ru.micord.ervu.account_applications.dto.edit;
import java.util.List;
import javax.validation.constraints.NotNull;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
/**
* @author gulnaz
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public record EditPersonDto(@NotNull String accountId, @NotNull String id,
@NotNull String firstname, @NotNull String surname, String middlename,
String birthdate, String sex, String position, String email,
@NotNull String snils, List<String> ipAddresses) {
}

View file

@ -0,0 +1,13 @@
package ru.micord.ervu.account_applications.dto.edit;
import ru.micord.ervu.account_applications.dto.ProcessRequest;
/**
* @author gulnaz
*/
public class EditPersonProcessRequest extends ProcessRequest<EditData> {
public EditPersonProcessRequest(String processKey, String userId, EditData data) {
super(processKey, userId, data);
}
}

View file

@ -0,0 +1,22 @@
package ru.micord.ervu.account_applications.enums;
/**
* @author gulnaz
*/
public enum ProcessKey {
CREATE("milBaseCreateAccountProcess"),
EDIT_PERSON("milBaseEditAccountPersonIDMProcess"),
EDIT_ACCOUNT("milBaseEditAccountIDMProcess"),
EDIT_ROLES("milBaseEditAccountRolesIDMSubProcess"),
DEACTIVATE("milBaseMassDeActivateAccountIDMProcess");
private final String value;
ProcessKey(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}

View file

@ -0,0 +1,14 @@
<jboss-deployment-structure>
<deployment>
<exclusions>
<module name="com.fasterxml.jackson.core.jackson-core" />
<module name="com.fasterxml.jackson.core.jackson-databind" />
<module name="com.fasterxml.jackson.core.jackson-annotations" />
<module name="com.fasterxml.jackson.dataformat.jackson-dataformat-yaml" />
<module name="com.fasterxml.jackson.datatype.jackson-datatype-jdk8" />
<module name="com.fasterxml.jackson.datatype.jackson-datatype-jsr310" />
<module name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider" />
<module name="org.jboss.resteasy.resteasy-jackson2-provider" />
</exclusions>
</deployment>
</jboss-deployment-structure>

View file

@ -56,6 +56,7 @@
<property name="fias.enable" value="false"/>
<property name="registration.enabled" value="false"/>
<property name="com.arjuna.ats.arjuna.allowMultipleLastResources" value="true"/>
<property name="ervu.url" value="https://ervu-uat.test.gosuslugi.ru"/>
</system-properties>
<management>
<audit-log>

View file

@ -11,3 +11,5 @@ DB_SEC_PASSWORD=ervu_account_applications
DB_SEC_HOST=10.10.31.118
DB_SEC_PORT=5432
DB_SEC_NAME=account_applications
ERVU_URL=https://ervu-uat.test.gosuslugi.ru

View file

@ -0,0 +1,73 @@
import {
AnalyticalScope,
Behavior,
NotNull,
SaveButton
} from "@webbpm/base-package";
import {HttpClient} from "@angular/common/http";
import {FormField} from "../field/FormField";
import {AccountAction} from "../enum/AccountAction";
import {AuthorizationService} from "../../../modules/app/service/authorization.service";
@AnalyticalScope(SaveButton)
export class UserManagementService extends Behavior {
@NotNull()
public action: AccountAction;
private button: SaveButton;
private httpClient: HttpClient;
private onClickFunction: Function;
initialize() {
super.initialize();
this.button = this.getScript(SaveButton);
this.httpClient = this.injector.get(HttpClient);
let authService = this.injector.get(AuthorizationService);
this.onClickFunction = () => {
if (!authService.hasRole('security_administrator')) {
return;
}
let jsonObj = this.collectData();
switch (this.action) {
case AccountAction.CREATE:
this.doRequest("user/create", jsonObj);
break;
case AccountAction.EDIT:
this.doRequest("user/edit", jsonObj);
break;
case AccountAction.DEACTIVATE:
this.doRequest("user/deactivate", jsonObj);
break;
}
}
}
private collectData(): any {
let jsonObj = {};
let fields: FormField[] = this.button.form.getScriptsInChildren(FormField);
for (let field of fields) {
jsonObj[`${field.name}`] = field.getValue();
}
return jsonObj;
}
private doRequest(url: string, jsonObj: any): void {
this.httpClient.post(url, jsonObj).toPromise()
.catch(() => {
//TODO change status
});
}
bindEvents() {
super.bindEvents();
this.button.addClickListener(this.onClickFunction);
}
unbindEvents() {
super.unbindEvents();
this.button.removeClickListener(this.onClickFunction);
}
}

View file

@ -0,0 +1,5 @@
export enum AccountAction {
CREATE = "CREATE",
EDIT = "EDIT",
DEACTIVATE = "DEACTIVATE"
}

View file

@ -0,0 +1,31 @@
import {
AnalyticalScope,
Autocomplete,
Behavior,
Control,
GridV2,
NotNull
} from "@webbpm/base-package";
@AnalyticalScope(Control)
export class FormField extends Behavior {
//TODO SUPPORT-8987
@NotNull()
public name: string;
public gridValue: boolean = false;
@NotNull("gridValue == true")
public columnId: string;
public getValue(): any {
if (this.gridValue) {
let grid = this.getScript(GridV2);
return grid.getAllRows().map(rowData => rowData[this.columnId])
}
return this.context instanceof Autocomplete
? this.getScript(Autocomplete).getBusinessId()
: this.getScript('component.ControlWithValue').getValueForForm();
}
}

10
pom.xml
View file

@ -286,6 +286,16 @@
<version>${webbpm-platform.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>9.0.0.CR1</version>
</dependency>
</dependencies>
</dependencyManagement>
<repositories>

View file

@ -1549,6 +1549,7 @@
<componentRootId>823d1a90-4962-4b0a-aa92-f4071ac8a69d</componentRootId>
<name>Text-role</name>
<container>false</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c">
<properties>
@ -2470,6 +2471,22 @@
</properties>
</scripts>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="a95c2a70-a49d-48be-8dda-add384ec0f07">
<classRef type="TS">
<className>FormField</className>
<packageName>account_applications.component.field</packageName>
</classRef>
<enabled>true</enabled>
<expanded>true</expanded>
<properties>
<entry>
<key>name</key>
<value>
<simple>"surname"</simple>
</value>
</entry>
</properties>
</scripts>
</children>
<children id="2f4f2e66-4195-49b4-83ef-2bdc621b4224">
<prototypeId>133ca212-09a6-413a-ac66-e2f6ce188f1f</prototypeId>
@ -2532,6 +2549,22 @@
</properties>
</scripts>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="64bef2d0-a436-4a65-8d33-654833453952">
<classRef type="TS">
<className>FormField</className>
<packageName>account_applications.component.field</packageName>
</classRef>
<enabled>true</enabled>
<expanded>true</expanded>
<properties>
<entry>
<key>name</key>
<value>
<simple>"firstname"</simple>
</value>
</entry>
</properties>
</scripts>
</children>
<children id="8ff4fc15-f4c1-4643-8317-4d1109135e4b">
<prototypeId>133ca212-09a6-413a-ac66-e2f6ce188f1f</prototypeId>
@ -2588,6 +2621,22 @@
</properties>
</scripts>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="3205d741-3a7a-4da0-b2e5-b6e474e7236f">
<classRef type="TS">
<className>FormField</className>
<packageName>account_applications.component.field</packageName>
</classRef>
<enabled>true</enabled>
<expanded>true</expanded>
<properties>
<entry>
<key>name</key>
<value>
<simple>"middlename"</simple>
</value>
</entry>
</properties>
</scripts>
</children>
<children id="10290fda-7b79-431b-b64a-2c16458f1b10">
<prototypeId>bce312bd-0c82-45e5-89dc-a1af90431c18</prototypeId>
@ -2673,6 +2722,22 @@
<simple>{"schema":"public","table":"user_application_list","entity":"user_application_list","name":"sex"}</simple>
</value>
</entry>
</properties>
</scripts>
<scripts id="bf2889bb-32ec-4cf8-9818-5156ec4e2486">
<classRef type="TS">
<className>FormField</className>
<packageName>account_applications.component.field</packageName>
</classRef>
<enabled>true</enabled>
<expanded>true</expanded>
<properties>
<entry>
<key>name</key>
<value>
<simple>"sex"</simple>
</value>
</entry>
</properties>
</scripts>
</children>
@ -2760,6 +2825,22 @@
<simple>{"schema":"public","table":"user_application_list","entity":"user_application_list","name":"birth_date"}</simple>
</value>
</entry>
</properties>
</scripts>
<scripts id="b4b00780-a750-4c9e-837f-96dd376072a6">
<classRef type="TS">
<className>FormField</className>
<packageName>account_applications.component.field</packageName>
</classRef>
<enabled>true</enabled>
<expanded>true</expanded>
<properties>
<entry>
<key>name</key>
<value>
<simple>"birthdate"</simple>
</value>
</entry>
</properties>
</scripts>
</children>
@ -2837,6 +2918,22 @@
</properties>
</scripts>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="2f7f56bd-98c7-40f0-a7be-da38ebe9ae56">
<classRef type="TS">
<className>FormField</className>
<packageName>account_applications.component.field</packageName>
</classRef>
<enabled>true</enabled>
<expanded>true</expanded>
<properties>
<entry>
<key>name</key>
<value>
<simple>"username"</simple>
</value>
</entry>
</properties>
</scripts>
</children>
<children id="b838c4d9-b8f2-4142-96fe-240540a4802e">
<prototypeId>312c9663-86b4-4672-97bd-67d313585c00</prototypeId>
@ -2999,6 +3096,22 @@
</properties>
</scripts>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="9e9e2c76-69b9-4991-baa1-73570dfb7ab7">
<classRef type="TS">
<className>FormField</className>
<packageName>account_applications.component.field</packageName>
</classRef>
<enabled>true</enabled>
<expanded>true</expanded>
<properties>
<entry>
<key>name</key>
<value>
<simple>"position"</simple>
</value>
</entry>
</properties>
</scripts>
</children>
<children id="c8f3dc99-0552-4dce-aadb-94cde674f77d">
<prototypeId>98594cec-0a9b-4cef-af09-e1b71cb2ad9e</prototypeId>
@ -3093,6 +3206,22 @@
</properties>
</scripts>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="bcf7261b-3951-4594-bd3a-92fa96f20a50">
<classRef type="TS">
<className>FormField</className>
<packageName>account_applications.component.field</packageName>
</classRef>
<enabled>true</enabled>
<expanded>true</expanded>
<properties>
<entry>
<key>name</key>
<value>
<simple>"snils"</simple>
</value>
</entry>
</properties>
</scripts>
</children>
</children>
</children>
@ -3143,7 +3272,7 @@
<entry>
<key>businessIdColumn</key>
<value>
<simple>{"schema":"public","table":"recruitment","entity":"recruitment","name":"fullname"}</simple>
<simple>{"schema":"public","table":"recruitment","entity":"recruitment","name":"idm_id"}</simple>
</value>
</entry>
<entry>
@ -3194,6 +3323,22 @@
<key>columnForSave</key>
<value>
<simple>{"schema":"public","table":"user_application_list","entity":"user_application_list","name":"recruitment_id"}</simple>
</value>
</entry>
</properties>
</scripts>
<scripts id="93cced4c-2537-4583-95cf-db5937d58efd">
<classRef type="TS">
<className>FormField</className>
<packageName>account_applications.component.field</packageName>
</classRef>
<enabled>true</enabled>
<expanded>true</expanded>
<properties>
<entry>
<key>name</key>
<value>
<simple>"userDomain"</simple>
</value>
</entry>
</properties>
@ -3399,6 +3544,34 @@
</properties>
</scripts>
<scripts id="be8fe0e1-4909-4224-8664-be55168595c6"/>
<scripts id="79126393-0edc-40b0-89d7-4238c392e3de">
<classRef type="TS">
<className>FormField</className>
<packageName>account_applications.component.field</packageName>
</classRef>
<enabled>true</enabled>
<expanded>true</expanded>
<properties>
<entry>
<key>columnId</key>
<value>
<simple>"user_group$name"</simple>
</value>
</entry>
<entry>
<key>gridValue</key>
<value>
<simple>true</simple>
</value>
</entry>
<entry>
<key>name</key>
<value>
<simple>"roles"</simple>
</value>
</entry>
</properties>
</scripts>
<children id="8a4be27e-9e06-466a-9d96-822df62a1570">
<prototypeId>364c8faa-5e56-46cd-9203-d2ec6ef2dc74</prototypeId>
<componentRootId>8a4be27e-9e06-466a-9d96-822df62a1570</componentRootId>
@ -3616,6 +3789,34 @@
</properties>
</scripts>
<scripts id="be8fe0e1-4909-4224-8664-be55168595c6"/>
<scripts id="e6845ea7-23e8-4042-b73b-255707d5c740">
<classRef type="TS">
<className>FormField</className>
<packageName>account_applications.component.field</packageName>
</classRef>
<enabled>true</enabled>
<expanded>true</expanded>
<properties>
<entry>
<key>columnId</key>
<value>
<simple>"link_user_application_ip_address$ip_address"</simple>
</value>
</entry>
<entry>
<key>gridValue</key>
<value>
<simple>true</simple>
</value>
</entry>
<entry>
<key>name</key>
<value>
<simple>"ipAddresses"</simple>
</value>
</entry>
</properties>
</scripts>
<children id="a062f520-09a7-42bc-a331-7546913530e8">
<prototypeId>364c8faa-5e56-46cd-9203-d2ec6ef2dc74</prototypeId>
<componentRootId>a062f520-09a7-42bc-a331-7546913530e8</componentRootId>
@ -9700,6 +9901,22 @@
</entry>
</properties>
</scripts>
<scripts id="0c2a0e80-ab66-469c-a97e-0dd1b0f808dc">
<classRef type="TS">
<className>UserManagementService</className>
<packageName>account_applications.component.button</packageName>
</classRef>
<enabled>true</enabled>
<expanded>true</expanded>
<properties>
<entry>
<key>action</key>
<value>
<simple>"CREATE"</simple>
</value>
</entry>
</properties>
</scripts>
</children>
<children id="7ed531bc-a941-43a9-8cf7-31d32dd6e0cd">
<prototypeId>c8dfe691-a84a-48da-b79e-6298d90db71d</prototypeId>