Merge branch 'refs/heads/feature/SUPPORT-8956_mfe' into SUPPORT-8943_seamlessness

# Conflicts:
#	pom.xml
#	resources/src/main/resources/business-model/Список заявок на пользователя/Обработка заявки на добавление пользователя.page
#	resources/src/main/resources/business-model/Список заявок на пользователя/Создание заявки на добавление пользователя.page
#	resources/src/main/resources/business-model/Список заявок на пользователя/Создать заявку на деактивацию.page
#	resources/src/main/resources/business-model/Список заявок на пользователя/Создать заявку на изменение.page
#	resources/src/main/resources/business-model/Список заявок на пользователя/Список заявок.page
#	resources/src/main/resources/business-model/Управление пользователями/Группы редактирование.page
#	resources/src/main/resources/business-model/Управление пользователями/Группы создание.page
#	resources/src/main/resources/business-model/Управление пользователями/Группы.page
#	resources/src/main/resources/business-model/Управление пользователями/Организации.page
#	resources/src/main/resources/business-model/Управление пользователями/Организация редактирование(создание).page
#	resources/src/main/resources/business-model/Управление пользователями/Пользователи редактирование.page
#	resources/src/main/resources/business-model/Управление пользователями/Пользователи создание.page
#	resources/src/main/resources/business-model/Управление пользователями/Пользователи.page
#	resources/src/main/resources/business-model/Управление пользователями/Роли редактирование (создание).page
#	resources/src/main/resources/business-model/Управление пользователями/Роли.page
#	resources/src/main/resources/business-model/Управление пользователями/Функции безопасности.page
This commit is contained in:
adel.ka 2025-03-06 10:26:53 +03:00
commit c69b5d4c33
100 changed files with 1712 additions and 4968 deletions

View file

@ -20,6 +20,11 @@
<artifactId>jjwt-impl</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>ru.cg.webbpm.packages.base</groupId>
<artifactId>backend</artifactId>
@ -139,14 +144,6 @@
<groupId>ru.cg.webbpm.modules</groupId>
<artifactId>standard-annotations</artifactId>
</dependency>
<dependency>
<groupId>ru.cg.webbpm.modules.security</groupId>
<artifactId>security-beans</artifactId>
</dependency>
<dependency>
<groupId>ru.cg.webbpm.modules.security</groupId>
<artifactId>security-api</artifactId>
</dependency>
<dependency>
<groupId>ru.cg.webbpm.modules.reporting</groupId>
<artifactId>reporting-api</artifactId>
@ -183,14 +180,6 @@
<groupId>ru.cg.webbpm.modules</groupId>
<artifactId>webkit-base</artifactId>
</dependency>
<dependency>
<groupId>ru.cg.webbpm.modules.security</groupId>
<artifactId>security-db-synchronization-api</artifactId>
</dependency>
<dependency>
<groupId>ru.cg.webbpm.modules.security</groupId>
<artifactId>security-db-synchronization-ldap-impl</artifactId>
</dependency>
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>

View file

@ -11,7 +11,6 @@ import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
@ -33,14 +32,13 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc;
"i18n",
"errorhandling",
"database",
"security",
"component.addresses",
"gen",
"ru.cg",
"ru.micord"
}, excludeFilters = {
@ComponentScan.Filter(type = FilterType.REGEX, pattern = "ru.cg.webbpm.modules.security.api.impl.SecurityDbConfiguration"),
@ComponentScan.Filter(type = FilterType.REGEX, pattern = "ru.cg.webbpm.modules.database.impl.DatabaseConfiguration"),
@ComponentScan.Filter(type = FilterType.REGEX, pattern = "security.WebSecurityConfig"),
@ComponentScan.Filter(type = FilterType.REGEX, pattern = "service.email.EmailConfig"),
})
@EnableAspectJAutoProxy(proxyTargetClass = true)
@ -71,7 +69,6 @@ public class AppConfig {
}
@Bean
@DependsOn("securityLiquibase")
public SpringLiquibase liquibase(@Qualifier("datasource") DataSource dataSource) {
SpringLiquibase liquibase = new SpringLiquibase();
liquibase.setDataSource(dataSource);

View file

@ -0,0 +1,9 @@
package ru.micord.ervu.account_applications;
import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
/**
* @author Adel Kalimullin
*/
public class SecurityWebAppInitializer extends AbstractSecurityWebApplicationInitializer {
}

View file

@ -19,8 +19,8 @@ public class RecruitmentDao {
this.dslContext = dslContext;
}
public List<String> getRecruitmentIdsWithParentByOrgCode(String orgCode) {
return getRecruitmentIdmIdsByParentId(orgCode, Recruitment.RECRUITMENT.IDM_ID);
public List<String> getRecruitmentIdsWithParentByDomainId(String domainId) {
return getRecruitmentIdmIdsByParentId(domainId, Recruitment.RECRUITMENT.IDM_ID);
}
public List<String> getRecruitmentIdsWithParentByRecruitmentId(String recruitmentId) {

View file

@ -19,7 +19,7 @@ import ru.cg.webbpm.modules.database.api.dao.option.SortOrder;
import ru.cg.webbpm.modules.database.bean.filter.EntityFilter;
import ru.cg.webbpm.modules.database.bean.filter.EntityFilterGroup;
import ru.cg.webbpm.modules.database.bean.filter.FilterOperation;
import ru.cg.webbpm.modules.security.api.runtime.SecurityContext;
import ru.micord.ervu.account_applications.security.context.SecurityContext;
/**
* @author Adel Kalimullin
@ -90,8 +90,8 @@ public class RecruitmentAutoCompleteService extends AbstractAutocompleteService<
}
private List<String> getRecruitmentIdsForCurrentUser() {
String currentOrgUnitCode = securityContext.getCurrentOrgUnitCode();
return recruitmentDao.getRecruitmentIdsWithParentByOrgCode(currentOrgUnitCode);
String recruitmentId = securityContext.getDomainId();
return recruitmentDao.getRecruitmentIdsWithParentByDomainId(recruitmentId);
}
private EntityFilter getEntityFilterForRecruitmentIds(List<String> ids) {

View file

@ -9,6 +9,7 @@ import org.springframework.stereotype.Service;
import property.enums.DisplayType;
import property.grid.ColumnSort;
import ru.micord.ervu.account_applications.component.dao.RecruitmentDao;
import ru.micord.ervu.account_applications.security.context.SecurityContext;
import service.field.ComboBoxServiceImpl;
import ru.cg.webbpm.modules.database.api.bean.TableRow;
@ -16,7 +17,6 @@ import ru.cg.webbpm.modules.database.api.dao.option.LoadOptions;
import ru.cg.webbpm.modules.database.api.dao.option.SortOrder;
import ru.cg.webbpm.modules.database.bean.filter.EntityFilter;
import ru.cg.webbpm.modules.database.bean.filter.FilterOperation;
import ru.cg.webbpm.modules.security.api.runtime.SecurityContext;
/**
@ -26,13 +26,12 @@ import ru.cg.webbpm.modules.security.api.runtime.SecurityContext;
public class RecruitmentComboBoxService extends ComboBoxServiceImpl {
private final RecruitmentDao recruitmentDao;
private final SecurityContext securityContext;
public RecruitmentComboBoxService(RecruitmentDao recruitmentDao,
SecurityContext securityContext) {
public RecruitmentComboBoxService(RecruitmentDao recruitmentDao, SecurityContext securityContext) {
this.recruitmentDao = recruitmentDao;
this.securityContext = securityContext;
}
@Override
public List<ComboBoxModel> loadData() {
return load(new LoadOptions());
@ -102,8 +101,8 @@ public class RecruitmentComboBoxService extends ComboBoxServiceImpl {
}
private List<String> getRecruitmentIdsForCurrentUser() {
String currentOrgUnitCode = securityContext.getCurrentOrgUnitCode();
return recruitmentDao.getRecruitmentIdsWithParentByOrgCode(currentOrgUnitCode);
String domainId = securityContext.getDomainId();
return recruitmentDao.getRecruitmentIdsWithParentByDomainId(domainId);
}
private EntityFilter getEntityFilterForRecruitmentIds(List<String> recruitmentIds) {

View file

@ -18,7 +18,7 @@ import ru.cg.webbpm.modules.database.bean.annotation.LocalGraphSource;
import ru.cg.webbpm.modules.database.bean.entity_graph.EntityColumn;
import ru.cg.webbpm.modules.database.bean.filter.EntityFilter;
import ru.cg.webbpm.modules.database.bean.filter.FilterOperation;
import ru.cg.webbpm.modules.security.api.runtime.SecurityContext;
import ru.micord.ervu.account_applications.security.context.SecurityContext;
import ru.cg.webbpm.modules.standard_annotations.editor.ObjectRef;
import ru.cg.webbpm.modules.standard_annotations.validation.NotNull;
@ -33,6 +33,7 @@ public class RecruitmentGridService extends GridV2ServiceImpl {
@NotNull
public FilterControl filterControlRef;
@LocalGraphSource(sourceFieldName = "loadDao")
@NotNull
public EntityColumn recruitmentColumn;
public RecruitmentGridService(RecruitmentDao recruitmentDao, SecurityContext securityContext) {
@ -70,8 +71,8 @@ public class RecruitmentGridService extends GridV2ServiceImpl {
}
private List<String> getRecruitmentIdsForCurrentUser() {
String currentOrgUnitCode = securityContext.getCurrentOrgUnitCode();
return recruitmentDao.getRecruitmentIdsWithParentByOrgCode(currentOrgUnitCode);
String domainId = securityContext.getDomainId();
return recruitmentDao.getRecruitmentIdsWithParentByDomainId(domainId);
}
private EntityFilter getEntityFilterForRecruitmentIds(List<String> recruitmentIds) {

View file

@ -7,6 +7,7 @@ import database.dao.DefaultLoadDao;
import org.springframework.stereotype.Service;
import ru.micord.ervu.account_applications.component.model.TreeItemDto;
import ru.micord.ervu.account_applications.component.rpc.TreeItemRpcService;
import ru.micord.ervu.account_applications.security.context.SecurityContext;
import ru.cg.webbpm.modules.database.api.bean.TableRow;
import ru.cg.webbpm.modules.database.api.dao.option.LoadOptions;
@ -14,8 +15,6 @@ import ru.cg.webbpm.modules.database.bean.annotation.GraphSource;
import ru.cg.webbpm.modules.database.bean.annotation.TypedColumn;
import ru.cg.webbpm.modules.database.bean.entity_graph.EntityColumn;
import ru.cg.webbpm.modules.database.bean.entity_graph.EntityColumnType;
import ru.cg.webbpm.modules.security.api.runtime.SecurityContext;
import ru.cg.webbpm.modules.security.api.service.OrgUnitService;
import ru.cg.webbpm.modules.standard_annotations.validation.NotNull;
/**
@ -24,7 +23,6 @@ import ru.cg.webbpm.modules.standard_annotations.validation.NotNull;
@Service
public class TreeItemService {
private final SecurityContext securityContext;
private final OrgUnitService orgUnitService;
@NotNull
public DefaultLoadDao loadDao;
@GraphSource(value = TreeItemRpcService.class, scanMode = GraphSource.ScanMode.SELF)
@ -42,15 +40,14 @@ public class TreeItemService {
@GraphSource(value = TreeItemRpcService.class, scanMode = GraphSource.ScanMode.SELF)
public EntityColumn domainIdColumn;
public TreeItemService(SecurityContext securityContext, OrgUnitService orgUnitService) {
public TreeItemService(SecurityContext securityContext) {
this.securityContext = securityContext;
this.orgUnitService = orgUnitService;
}
public List<TreeItemDto> loadTreeData() {
String currentOrgUnitCode = securityContext.getCurrentOrgUnitCode();
String domainId = securityContext.getDomainId();
List<TreeItemDto> filteredTreeItems = loadTreeItems().stream()
.filter(item -> item.domainId.equalsIgnoreCase(currentOrgUnitCode))
.filter(item -> item.domainId.equalsIgnoreCase(domainId))
.toList();
filteredTreeItems.forEach(this::setDomainIdToNull);
return filteredTreeItems;

View file

@ -1,129 +0,0 @@
package ru.micord.ervu.account_applications.security;
import java.lang.invoke.MethodHandles;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collections;
import javax.sql.DataSource;
import liquibase.integration.spring.SpringLiquibase;
import org.jooq.ConnectionProvider;
import org.jooq.DSLContext;
import org.jooq.SQLDialect;
import org.jooq.conf.RenderQuotedNames;
import org.jooq.conf.Settings;
import org.jooq.impl.DataSourceConnectionProvider;
import org.jooq.impl.DefaultConfiguration;
import org.jooq.impl.DefaultDSLContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* @author kochetkov
*/
@Configuration
@EnableTransactionManagement
public class WebSecurityDbConfiguration {
private static final Logger LOGGER = LoggerFactory.getLogger(
MethodHandles.lookup().lookupClass());
@Autowired
@Qualifier("datasource")
private DataSource dataSource;
@Bean
public DataSource securityDataSource() {
createSecuritySchema(dataSource);
return dataSource;
}
@Bean
@DependsOn("securityLiquibase")
public DSLContext securityDslContext(@Qualifier("securityDataSource") DataSource securityDataSource) {
DefaultConfiguration configuration = new DefaultConfiguration();
configuration.setSQLDialect(sqlDialect(securityDataSource));
ConnectionProvider connectionProvider = new DataSourceConnectionProvider(securityDataSource);
configuration.setConnectionProvider(connectionProvider);
Settings settings = new Settings();
settings.setRenderQuotedNames(RenderQuotedNames.NEVER);
configuration.setSettings(settings);
return new DefaultDSLContext(configuration);
}
@Bean
public SpringLiquibase securityLiquibase(
@Qualifier("securityDataSource") DataSource securityDataSource) {
SpringLiquibase liquibase = new SpringLiquibase();
liquibase.setChangeLog(
"classpath:ru/cg/webbpm/modules/security/api/changelog/changelog-master.xml");
liquibase.setDataSource(securityDataSource);
liquibase.setLiquibaseSchema("security");
liquibase.setChangeLogParameters(
Collections.singletonMap("projectUser", getProjectDbUserName()));
return liquibase;
}
private String getProjectDbUserName() {
try (Connection connection = dataSource.getConnection()) {
return connection.getMetaData().getUserName();
}
catch (SQLException e) {
throw new RuntimeException(e);
}
}
private static SQLDialect sqlDialect(DataSource securityDataSource) {
SQLDialect sqlDialect = SQLDialect.DEFAULT;
String databaseProductName;
try {
Connection connection = securityDataSource.getConnection();
DatabaseMetaData databaseMetaData = connection.getMetaData();
databaseProductName = databaseMetaData.getDatabaseProductName();
}
catch (SQLException e) {
throw new RuntimeException(e);
}
switch (databaseProductName) {
case "MySQL" -> sqlDialect = SQLDialect.MYSQL;
case "PostgreSQL" -> sqlDialect = SQLDialect.POSTGRES;
case "H2" -> sqlDialect = SQLDialect.H2;
default -> LOGGER.error("sql dialect is not defined for: " + databaseProductName);
}
return sqlDialect;
}
private void createSecuritySchema(DataSource dataSource) {
try (Connection connection = dataSource.getConnection()) {
LOGGER.info("Start creating security schema");
String sql = "CREATE SCHEMA IF NOT EXISTS security;";
try (Statement statement = connection.createStatement()) {
connection.setAutoCommit(false);
statement.execute(sql);
connection.commit();
LOGGER.info("Security schema was created");
}
catch (SQLException e) {
LOGGER.error(e.getMessage(), e);
connection.rollback();
throw new RuntimeException(e);
}
}
catch (SQLException e) {
LOGGER.error(e.getMessage(), e);
throw new RuntimeException(e);
}
}
}

View file

@ -0,0 +1,66 @@
package ru.micord.ervu.account_applications.security.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import ru.micord.ervu.account_applications.security.filter.JwtAuthenticationFilter;
import ru.micord.ervu.account_applications.security.provider.ErvuJwtAuthenticationProvider;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private JwtAuthenticationFilter jwtAuthenticationFilter;
@Autowired
private ErvuJwtAuthenticationProvider jwtAuthenticationProvider;
@Value("${security.roles.allowed:#{null}}")
private String[] allowedRoles;
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeHttpRequests(auth -> {
auth.antMatchers("/version").permitAll();
auth.antMatchers("/session").authenticated();
if (allowedRoles != null && allowedRoles.length > 0) {
auth.anyRequest().hasAnyAuthority(allowedRoles);
}
else {
auth.anyRequest().authenticated();
}
})
.sessionManagement(session ->
session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
)
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) {
auth.authenticationProvider(jwtAuthenticationProvider);
}
@Bean(name = "authenticationManager")
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}

View file

@ -0,0 +1,13 @@
package ru.micord.ervu.account_applications.security.context;
import ru.micord.ervu.account_applications.security.model.jwt.UserSession;
public interface SecurityContext {
String getDomainId();
String getUserId();
UserSession getUserSession();
}

View file

@ -0,0 +1,29 @@
package ru.micord.ervu.account_applications.security.context;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import ru.micord.ervu.account_applications.security.model.jwt.UserSession;
import ru.micord.ervu.account_applications.security.model.jwt.authentication.JwtTokenAuthentication;
@Component
public class SecurityContextImpl
implements SecurityContext {
@Override
public String getDomainId() {
JwtTokenAuthentication auth = (JwtTokenAuthentication) SecurityContextHolder.getContext().getAuthentication();
return auth != null ? auth.getUserSession().domainId() : null;
}
@Override
public String getUserId() {
JwtTokenAuthentication auth = (JwtTokenAuthentication) SecurityContextHolder.getContext().getAuthentication();
return auth != null ? auth.getUserSession().userId() : null;
}
@Override
public UserSession getUserSession() {
JwtTokenAuthentication auth = (JwtTokenAuthentication) SecurityContextHolder.getContext().getAuthentication();
return auth != null ? auth.getUserSession() : null;
}
}

View file

@ -0,0 +1,36 @@
package ru.micord.ervu.account_applications.security.controller;
import java.util.stream.Collectors;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import ru.micord.ervu.account_applications.security.context.SecurityContext;
import ru.micord.ervu.account_applications.security.dto.SessionDto;
import ru.micord.ervu.account_applications.security.model.jwt.UserSession;
import ru.micord.ervu.account_applications.security.model.role.ErvuRoleAuthority;
@RestController
public class AuthorizationController {
private final SecurityContext securityContext;
public AuthorizationController(SecurityContext securityContext) {
this.securityContext = securityContext;
}
@GetMapping("/session")
public SessionDto getSession() {
UserSession userSession = securityContext.getUserSession();
return new SessionDto(
userSession.userId(),
userSession.name(),
userSession.realm(),
userSession.roles()
.stream()
.map(ErvuRoleAuthority::getAuthority)
.collect(Collectors.toSet()),
userSession.domainId()
);
}
}

View file

@ -0,0 +1,11 @@
package ru.micord.ervu.account_applications.security.dto;
import java.util.Set;
public record SessionDto(
String userId,
String name,
String realm,
Set<String> roles,
String domainId
) {}

View file

@ -0,0 +1,17 @@
package ru.micord.ervu.account_applications.security.exception;
import org.springframework.security.core.AuthenticationException;
/**
* @author Adel Kalimullin
*/
public class JwtProcessingException extends AuthenticationException {
public JwtProcessingException(String message) {
super(message);
}
public JwtProcessingException(String message, Throwable cause) {
super(message, cause);
}
}

View file

@ -0,0 +1,71 @@
package ru.micord.ervu.account_applications.security.filter;
import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.Optional;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import ru.micord.ervu.account_applications.security.model.jwt.authentication.JwtTokenDummy;
@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {
private static final Logger LOGGER = LoggerFactory.getLogger(
MethodHandles.lookup().lookupClass());
private final AuthenticationManager authenticationManager;
public JwtAuthenticationFilter(AuthenticationManager authenticationManager) {
this.authenticationManager = authenticationManager;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
try {
Authentication authentication = attemptAuthentication(request);
if (authentication != null) {
SecurityContextHolder.getContext().setAuthentication(authentication);
}
}
catch (AuthenticationException e) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
LOGGER.warn(e.getMessage());
return;
}
filterChain.doFilter(request, response);
}
protected Authentication attemptAuthentication(HttpServletRequest request)
throws AuthenticationException {
String token = extractAuthTokenFromRequest(request);
if (token == null) {
return null;
}
Authentication authentication = new JwtTokenDummy(token);
authentication = authenticationManager.authenticate(authentication);
return authentication;
}
private String extractAuthTokenFromRequest(HttpServletRequest request) {
return Optional.ofNullable(request.getHeader("Authorization"))
.map(token -> URLDecoder.decode(token, StandardCharsets.UTF_8))
.map(token -> token.replace("Bearer", ""))
.map(String::trim)
.orElse(null);
}
}

View file

@ -0,0 +1,58 @@
package ru.micord.ervu.account_applications.security.model.jwt;
import java.util.Set;
import ru.micord.ervu.account_applications.security.model.role.ErvuRoleAuthority;
public record UserSession(
String userId,
String name,
String realm,
Set<ErvuRoleAuthority> roles,
String domainId
) {
public static UserSessionBuilder builder() {
return new UserSessionBuilder();
}
public static final class UserSessionBuilder {
private String userId;
private String name;
private String realm;
private Set<ErvuRoleAuthority> roles;
private String domainId;
private UserSessionBuilder() {
}
public UserSessionBuilder withUserId(String userId) {
this.userId = userId;
return this;
}
public UserSessionBuilder withName(String name) {
this.name = name;
return this;
}
public UserSessionBuilder withRealm(String realm) {
this.realm = realm;
return this;
}
public UserSessionBuilder withRoles(Set<ErvuRoleAuthority> roles) {
this.roles = roles;
return this;
}
public UserSessionBuilder withDomainId(String domainId) {
this.domainId = domainId;
return this;
}
public UserSession build() {
return new UserSession(userId, name, realm, roles, domainId);
}
}
}

View file

@ -0,0 +1,55 @@
package ru.micord.ervu.account_applications.security.model.jwt.authentication;
import java.util.Collection;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import ru.micord.ervu.account_applications.security.model.jwt.UserSession;
public class JwtTokenAuthentication implements Authentication {
private final UserSession userSession;
public JwtTokenAuthentication(UserSession userSession) {
this.userSession = userSession;
}
public UserSession getUserSession() {
return userSession;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return userSession.roles();
}
@Override
public Object getCredentials() {
return null;
}
@Override
public Object getDetails() {
return null;
}
@Override
public Object getPrincipal() {
return null;
}
@Override
public boolean isAuthenticated() {
return true;
}
@Override
public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
}
@Override
public String getName() {
return userSession.name();
}
}

View file

@ -0,0 +1,55 @@
package ru.micord.ervu.account_applications.security.model.jwt.authentication;
import java.util.Collection;
import org.apache.commons.lang3.NotImplementedException;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
public class JwtTokenDummy implements Authentication {
private final String token;
public JwtTokenDummy(String token) {
this.token = token;
}
public String getToken() {
return token;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
throw new NotImplementedException("Not implemented for dummy");
}
@Override
public Object getCredentials() {
throw new NotImplementedException("Not implemented for dummy");
}
@Override
public Object getDetails() {
throw new NotImplementedException("Not implemented for dummy");
}
@Override
public Object getPrincipal() {
throw new NotImplementedException("Not implemented for dummy");
}
@Override
public boolean isAuthenticated() {
throw new NotImplementedException("Not implemented for dummy");
}
@Override
public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
throw new NotImplementedException("Not implemented for dummy");
}
@Override
public String getName() {
throw new NotImplementedException("Not implemented for dummy");
}
}

View file

@ -0,0 +1,17 @@
package ru.micord.ervu.account_applications.security.model.role;
import org.springframework.security.core.GrantedAuthority;
public class ErvuRoleAuthority implements GrantedAuthority {
private final String role;
public ErvuRoleAuthority(String role) {
this.role = role;
}
@Override
public String getAuthority() {
return role;
}
}

View file

@ -0,0 +1,33 @@
package ru.micord.ervu.account_applications.security.provider;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.stereotype.Component;
import ru.micord.ervu.account_applications.security.model.jwt.UserSession;
import ru.micord.ervu.account_applications.security.model.jwt.authentication.JwtTokenAuthentication;
import ru.micord.ervu.account_applications.security.model.jwt.authentication.JwtTokenDummy;
import ru.micord.ervu.account_applications.security.service.JwtTokenService;
@Component
public class ErvuJwtAuthenticationProvider implements AuthenticationProvider {
private final JwtTokenService jwtTokenService;
public ErvuJwtAuthenticationProvider(JwtTokenService jwtTokenService) {
this.jwtTokenService = jwtTokenService;
}
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
JwtTokenDummy jwtTokenDummy = (JwtTokenDummy) authentication;
String jwtToken = jwtTokenDummy.getToken();
UserSession userSession = jwtTokenService.getUserSession(jwtToken);
return new JwtTokenAuthentication(userSession);
}
@Override
public boolean supports(Class<?> authentication) {
return JwtTokenDummy.class.isAssignableFrom(authentication);
}
}

View file

@ -0,0 +1,110 @@
package ru.micord.ervu.account_applications.security.service;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import ru.micord.ervu.account_applications.security.exception.JwtProcessingException;
import ru.micord.ervu.account_applications.security.model.jwt.UserSession;
import ru.micord.ervu.account_applications.security.model.role.ErvuRoleAuthority;
@Service
public class ErvuJwtTokenService implements JwtTokenService {
private final boolean enableJwtValidation;
private final String issuer;
private final PublicKey publicKey;
public ErvuJwtTokenService(
@Value("${security.jwt.validation.enable:false}") boolean enableJwtValidation,
@Value("${security.jwt.validation.issuer:#{null}}") String issuer,
@Value("${security.jwt.validation.public_key:#{null}}") String publicKeyStr
) {
this.enableJwtValidation = enableJwtValidation;
this.issuer = issuer;
this.publicKey =
publicKeyStr != null ? extractPublicKey(publicKeyStr) : null;
}
@Override
public UserSession getUserSession(String token) {
return enableJwtValidation ? parseToken(token) : unsafeParseToken(token);
}
protected UserSession unsafeParseToken(String token) {
try {
token = token.substring(0, token.lastIndexOf(".") + 1);
JwtParser parser = Jwts.parser();
Claims claims = parser
.parseClaimsJwt(token).getBody();
return UserSession.builder()
.withUserId(claims.getSubject())
.withName(claims.get("name", String.class))
.withRealm(claims.get("realm", String.class))
.withDomainId(claims.get("domain_id", String.class))
.withRoles(getRoles((List<String>) claims.get("roles", ArrayList.class)))
.build();
}
catch (JwtException e) {
throw new JwtProcessingException(e.getMessage());
}
}
protected UserSession parseToken(String token) {
JwtParser parser = Jwts.parser();
try {
if (issuer != null && !issuer.isEmpty()) {
parser = parser.requireIssuer(issuer);
}
if (publicKey != null) {
parser = parser.setSigningKey(publicKey);
}
Claims claims = parser.parseClaimsJws(token).getBody();
return UserSession.builder()
.withUserId(claims.getSubject())
.withName(claims.get("name", String.class))
.withRealm(claims.get("realm", String.class))
.withDomainId(claims.get("domain_id", String.class))
.withRoles((getRoles((List<String>) claims.get("roles", ArrayList.class))))
.build();
}
catch (JwtException e){
throw new JwtProcessingException(e.getMessage());
}
}
protected Set<ErvuRoleAuthority> getRoles(List<String> roles) {
return roles
.stream()
.map(ErvuRoleAuthority::new)
.collect(Collectors.toSet());
}
private PublicKey extractPublicKey(String publicKeyStr) {
try {
byte[] decodedPublicKey = Base64.getDecoder().decode(publicKeyStr);
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(decodedPublicKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePublic(x509EncodedKeySpec);
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
}

View file

@ -0,0 +1,8 @@
package ru.micord.ervu.account_applications.security.service;
import ru.micord.ervu.account_applications.security.model.jwt.UserSession;
public interface JwtTokenService {
UserSession getUserSession(String token);
}

View file

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.9"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.9
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.9.xsd">
<changeSet id="0001" author="a.kalimullin">
<comment>Create table user_application_role</comment>
<sql>
CREATE TABLE IF NOT EXISTS public.user_application_role (
user_role_id VARCHAR(36) PRIMARY KEY,
role_name VARCHAR(255) UNIQUE NOT NULL,
created TIMESTAMP WITHOUT TIME ZONE DEFAULT now(),
updated TIMESTAMP WITHOUT TIME ZONE DEFAULT now()
)
TABLESPACE pg_default;
ALTER TABLE IF EXISTS public.user_application_role
OWNER TO ervu_account_applications;
GRANT ALL ON TABLE public.user_application_role TO ervu_account_applications;
COMMENT ON COLUMN public.user_application_role.user_role_id IS 'Уникальный идентификатор роли пользователя';
COMMENT ON COLUMN public.user_application_role.role_name IS 'Название роли пользователя';
COMMENT ON COLUMN public.user_application_role.created IS 'Дата и время создания записи';
COMMENT ON COLUMN public.user_application_role.updated IS 'Дата и время последнего обновления записи';
INSERT INTO public.user_application_role (user_role_id, role_name)
VALUES
('562b57c0-8b89-4847-8b70-222f655c4134', 'Специалист ВК по воинскому учёту'),
('1023907145', 'Сотрудник ВК'),
('9230269d-6a0e-42d0-8830-8cfb7fe65c6d', 'Специалист ВК по комплектованию'),
('c67e8903-a600-4c43-b3b5-139ee49eba01', 'Специалист ВК по обработке заявлений'),
('60f2a601-5269-48b5-b2b9-4f8bef9f828f', 'Наблюдатель ГОМУ'),
('da0b1320-96ae-43b3-834e-da981ff115ad', 'Наблюдатель штаба ВО'),
('a496d6cf-872b-4b27-9439-9d33262fc9bf', 'Наблюдатель ВК субъекта'),
('fd0dd608-acf3-46e5-af72-ff4105251b5c', 'Cотрудник Главного организационно-мобилизационного управления'),
('cb1921c9-e0b5-44a4-9dfc-8b6944e44df3', 'Супервайзер ГОМУ'),
('2df13796-2ea3-44f4-ad12-4764141cd84c', 'Администратор ИС'),
('02e38044-7060-436b-99ec-cf11e3e051ea', 'Администратор ПОИБ'),
('5cc57c00-4f3b-4c79-83ea-1d9371ce5f8e', 'Военный комиссар'),
('bdf376ab-2e68-4751-94e5-f092794e5213', 'Администратор военкомата'),
('d7c2a369-f68c-48fd-868e-3a81e546a9ab', 'Ответственный за защиту информации'),
('0e9dca63-f66c-4e28-b29f-a9572df41df0', 'Ответственный за защиту информации военного комиссариата субъекта РФ')
ON CONFLICT DO NOTHING;
</sql>
</changeSet>
<changeSet id="0002" author="a.kalimullin">
<comment>Drop table public.link_user_application_user_group</comment>
<sql>
DROP TABLE IF EXISTS public.link_user_application_user_group CASCADE;
</sql>
</changeSet>
<changeSet id="0003" author="a.kalimullin">
<comment>Create table link_user_application_user_application_role</comment>
<sql>
CREATE TABLE IF NOT EXISTS public.link_user_application_user_application_role (
link_user_application_user_role_id bigserial,
user_application_list_id bigint NOT NULL,
user_role_id VARCHAR(36) NOT NULL,
created TIMESTAMP WITHOUT TIME ZONE DEFAULT now(),
CONSTRAINT pk_link_user_application_user_application_role PRIMARY KEY (link_user_application_user_role_id),
CONSTRAINT uni_user_application_role UNIQUE (user_application_list_id, user_role_id),
CONSTRAINT fk_user_application_list FOREIGN KEY (user_application_list_id)
REFERENCES public.user_application_list (user_application_list_id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE CASCADE,
CONSTRAINT fk_user_role FOREIGN KEY (user_role_id)
REFERENCES public.user_application_role (user_role_id) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
) TABLESPACE pg_default;
ALTER TABLE IF EXISTS public.link_user_application_user_application_role
OWNER TO ervu_account_applications;
GRANT ALL ON TABLE public.link_user_application_user_application_role TO ervu_account_applications;
</sql>
</changeSet>
</databaseChangeLog>

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.9"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.9
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.9.xsd">
<changeSet id="0001" author="a.kalimullin">
<sql>
DROP SCHEMA security CASCADE;
</sql>
</changeSet>
</databaseChangeLog>

View file

@ -11,6 +11,10 @@
<include file="20250207_ERVU-273_create_db.xml" relativeToChangelogFile="true"/>
<include file="20250211_create_admin_user.xml" relativeToChangelogFile="true"/>
<include file="20250211_fix_parent_org_unit.xml" relativeToChangelogFile="true"/>
<include file="20250303_SUPPORT-8956_create_table_role.xml" relativeToChangelogFile="true"/>
<include file="20250304_SUPPORT-8956_drop_security.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>

219
config.md
View file

@ -4,18 +4,11 @@
## Общие
- `webbpm.security.login.case_sensitive`. Default value = true. Параметр отвечающий за чувствительность к регистру при обработке логина пользователя.
- true - Login и login, обрабатываются как разные логины.
- false - Login и login, обрабатывается как один и тот же логин.
- `webbpm.db.pool_size`. Нужен только для `webbpm.mode` = development.
- `webbpm.mode`. Режим работы приложения. Значения - development, production.
- development - в этом режиме используется соединение к БД проекта, заданное в Studio.
- production - в этом режиме используется соединение к БД проекта, заданное с помощью jndi имени.
## Модуль BPMN
```bpmn.enable``` - по умолчанию true, отвечает за создание бинов использующих модуль bpmn (при флаге false можно убрать зависимости модуля, смотри **docs/ru/developer-guide/Отключение_bpmn_модуля.md**)
Пример:
```xml
<property name="bpmn.enable" value="false"/>
@ -54,211 +47,29 @@
<property name="webbpm.jbpm.runtime_strategy" value="PER_PROCESS_INSTANCE"/>
```
## Способ аутентификации
## Способы авторизации:
- authentication.method - способ аутентификации. Поддерживаемые способы аутентификации: form, kerberos, cert_over_db, cert_over_ldap
- По Jwt токену, указанному в заголовке Authorization
### По логину и паролю
### Настройка авторизации по JWT
Пример конфигурации:
По умолчанию все верификации токена отключены. Для того, чтобы нстроить авторизацию, следует использовать
следующие переменные среды:
```xml
<property name="authentication.method" value="form"/>
```
| Название переменной | Тип | Описание | Пример | Значение по умолчанию |
|------------------------------------|----------------|-------------------------------------------------------------------------------------------------------------------------------------|---------------------|-----------------------|
| security.jwt.validation.enable | boolean | Включает базовую верификацию токена, включающее в себя поле exp. | true | false |
| security.jwt.validation.issuer | String | Включает верификацию по issuer, включается только при security.jwt.validation.enable = true. При пустом значении не верифицируется. | https://example.com | null |
| security.jwt.validation.public_key | String(base64) | Включает верификацию по ключу, включается только при security.jwt.validation.enable = true. При пустом значении не верифицируется. | ZGFzaGJvYXJk | null |
| security.roles.allowed | String[] | Включает авторизацию по ролям. В случае, если пользователь не имеет ни одной указанной роли, доступ к ресурсам отклоняется | role1,role2,role3 | null |
### По сертификату
## Настройка MFe:
- cert_over_db - проверка наличия пользователя в базе данных безопасности
- cert_over_ldap - проверка наличия пользователя в базе данных безопасности и в LDAP
Собранный образ фронтенда имеет возможность работать как полноценное standalone приложение, так и как удалённый модуль MFe. Для настройки Mfe следует указать следующие переменные:
Примеры:
* MFE_BASE_URL - указывается frontend/.env, либо в переменных среды сборки приложения. При изменении переменной приложение надо пересобирать. По умолчанию /mfe/account-applications
* backend.url - если необходимо настроить url бэкенда, его можно указать в frontend/src/resources/app.config.json
```xml
<property name="authentication.method" value="cert_over_db"/>
<property name="authentication.method" value="cert_over_ldap"/>
```
Параметр способа аутентификации authentication.method должен быть также установлен на клиентской части приложения в app-config.json
Также для аутентификации по сертификату нужны свойства для хранилища сертификатов:
- certificate.keystore.location - путь до java key store. Key store - это хранилище доверенных сертификатов, с помощью которых можно проверить корневой сертификат. Сертификат устанавливается с помощью команды:
```text
keytool -importcert -alias myAlias -file Example.cer -keystore exampleKeyStore
```
- certificate.keystore.password - пароль для keystore, установленный при импорте сертификата
Примеры:
```xml
<property name="certificate.keystore.location" value="${jboss.home.dir}/mfc"/>
<property name="certificate.keystore.password" value="mfc_auth"/>
```
### Kerberos
Получите от администратора Kerberos .keytab файл, из которого командой `klist -k http.keytab` можно получить список principal-ов
Проверить успешность авторизации principal-а можно командой `kinit -t -i http.keytab %principal%`.
В
случае успешной авторизации команда `klist` в качестве default principal которым проводилась авторизация.
После этого в standalone.xml поправить параметр `app.service-principal` на principal, которым успешно авторизовались. principal имеет формат: `HTTP/%hostname%@%REALM%`
Пример конфигурации:
```xml
<property name="app.service-principal" value="HTTP/oleg-rxserver.alt.dom@ALT.DOM"/>
<property name="app.keytab-location" value="${jboss.home.dir}/http.keytab"/>
<property name="authentication.method" value="kerberos"/>
```
- app.service-principal. Пример - HTTP/oleg-rxserver.alt.dom@ALT.DOM
- app.keytab-location - расположение keytab файла. Пример - ${jboss.home.dir}/
- http.keytab.
Также необходимо в настройках браузера на клиенте задать параметр `network.negotiate-auth.trusted-uris` задать значение `.%domain%`.
Пример:
```xml
.ALT.DOM
```
### Ldap
Аутентификация происходит посредством логина и пароля синхронизированного пользователя Ldap.
Логин и пароль введенные в форму входа, будут проверены сервисом Ldap.
Пример конфигурации:
```xml
<property name="ldap.url" value="ldap://localhost:389"/>
<property name="ldap.base" value="dc=example,dc=org"/>
<property name="ldap.username" value="cn=admin,dc=example,dc=org"/>
<property name="ldap.password" value="admin"/>
<property name="authentication.method" value="form"/>
```
#### Настройка сервера приложений для работы с Kerberos
1. создать учетные записи в домене:
- тестовые для проверки работоспособности функционала (пользователи домена, почтовые ящики):
`User1 pass1 user1@example.com`
`User2 pass2 user2@example.com`
- сервисную для доступа сервиса(приложения) к MS AD - (пользователь домена - снять устаревание пароля, ограничение по времени действия, почтовый ящик):
`serviceUser servicePass serviceuser@example.com`
---
2. завести учетную запись машины `appserver.machine.name` (fqdn-имя сервиса) в AD (вручную, как запись в computer) и в DNS (A-запись)
`appserver.machine.name 10.250.216.91`
3. сгенерировать keytab (утилита ktpass) для аутентификации сервисов(приложения) для единой точки входа - `serviceUser` - с именем test.file.name.keytab - привязав к ней пользователя serviceUser
например, так:
```
ktpass -princ http/appserverMachineName.example.com@example.com -mapuser example.com\serviceUser -pass "пароль_уз_serviceUser" -crypto All -ptype KRB5_NT_PRINCIPAL -out "путь_к_директории_выгрузки_файла\test.file.name.keytab"
```
##### Kerberos FAQ
- В случае, если авторизация не проходит и в логах сервера приложений присутствует следующий вывод:
```
2019-05-14 05:33:36,588 INFO [security.controller.KerberosAuthenticationController] (default task-3) Authentication request header Authorization not exists
2019-05-14 05:33:36,588 INFO [security.controller.KerberosAuthenticationController] (default task-3) Authentication object is not presented
```
необходимо проверить настройку браузера firefox `network.negotiate-auth.trusted-uris`, она должна соответствовать домену из principal-а.
Для этого в поисковую строку браузера вводим "about:config", в открывшемся окне нажимаем "accept with risk and continue", в поисковой строке открывшейся страницы ввести `network.negotiate-auth.trusted-uris`.
Пример: для principal-а `HTTP/oleg-rxserver.alt.dom@ALT.DOM` настройка в браузере должна быть `.alt.dom`, приложение в браузере должно открываться по `http:\\oleg-rxserver.alt.dom:8080\...`
- если в логах сервера приложений есть ошибка:
```xml
2019-05-13 14:13:07,095 WARN [org.springframework.security.kerberos.web.authentication.SpnegoAuthenticationProcessingFilter] (default task-1) Negotiate Header was invalid: Negotiate TlRMTVNTUAABAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAKAGNFAAAADw==: org.springframework.security.authentication.BadCredentialsException: Kerberos validation not successful
...
Caused by: java.security.PrivilegedActionException: GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)
at java.security.AccessController.doPrivileged(Native Method) [rt.jar:1.8.0_211]
at javax.security.auth.Subject.doAs(Subject.java:422) [rt.jar:1.8.0_211]
at org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidator.validateTicket(SunJaasKerberosTicketValidator.java:68) [spring-security-kerberos-core-1.0.1.RELEASE.jar:1.0.1.RELEASE]
... 66 more
Caused by: GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)
at sun.security.jgss.GSSHeader.(GSSHeader.java:97) [rt.jar:1.8.0_211]
at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:306) [rt.jar:1.8.0_211]
at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:285) [rt.jar:1.8.0_211]
at org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidatorKerberosValidateAction.run(SunJaasKerberosTicketValidator.java:170) [spring-security-kerberos-core-1.0.1.RELEASE.jar:1.0.1.RELEASE]
at org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidatorKerberosValidateAction.run(SunJaasKerberosTicketValidator.java:153) [spring-security-kerberos-core-1.0.1.RELEASE.jar:1.0.1.RELEASE]
... 69 more
```
необходимо проверить правильность указанного в standalone.xml principal-а.
### Комбинации нескольких способов аутентификации
Приложение может обрабатывать запросы на несколько способов аутентификации. Для этого необходимо переичислить нужные профили через запятую.
Примеры:
```xml
<property name="authentication.method" value="form,cert_over_db"/>
<property name="authentication.method" value="form,cert_over_ldap"/>
<property name="authentication.method" value="kerberos,cert_over_db"/>
<property name="authentication.method" value="kerberos,cert_over_ldap"/>
```
### Время жизни токенов аутентификации
```xml
<property name="webbpm.security.access_token.duration.minutes" value="60"/>
<property name="webbpm.security.refresh_token.duration.days" value="30"/>
<property name="webbpm.security.session.active.count" value="2"/>
```
`webbpm.security.access_token.duration.minutes` - опциональный параметр (значение по умолчанию 60), время жизни в минутах, сколько будет действителен токен, после истечения этого времени токен будет обновлён `webbpm.security.refresh_token.duration.days` - опциональный параметр (значение по умолчанию 30), время жизни в днях, после истечения этого времени с последнего обновления, пользователю будет необходимо повторно войти `webbpm.security.session.active.count` - опциональный параметр (значение по умолчанию 1), количество сохраняемых в базу токенов обновления (количество активных сессий)
Примечания.
- Нельзя использовать одновременно профили cert_over_db c cert_over_ldap и kerberos с form.
## Синхронизация пользователей с LDAP
```xml
<property name="ldap.auto.sync.enabled" value="true"/>
<property name="ldap.synchronizer.cron" value="0 0 * * * *"/>
<property name="ldap.url" value="ldap://localhost:389"/>
<property name="ldap.base" value="dc=alt,dc=dom"/>
<property name="ldap.username" value="uid=test,ou=People,dc=alt,dc=dom"/>
<property name="ldap.password" value="password"/>
<property name="webbpm.ldap.implementation" value="open-ldap"/>
```
Настройки подключения к LDAP:
- `ldap.auto.sync.enabled` - включает/отключает автоматическую синхронизацию с LDAP
- `ldap.synchronizer.cron` - cron расписание автоматической синхронизации с LDAP
- `ldap.url`. Пример - ldap://localhost:389
- `ldap.base`. Пример - dc=alt,dc=dom
- `ldap.username`. Пример - uid=test,ou=People,dc=alt,dc=dom
- `ldap.password`
- `webbpm.ldap.implementation`. Допускается два значения: open-ldap и active-directory.
## WEBGUARD
Для синхронизации пользователей в WEBGUARD и для корректной работы админки необходимо указать настройки соединения к REST API WEBGUARD
```xml
<property name="webguard.url" value="http://wg-host:8081/security-manager"/>
<property name="webguard.user.login" value="wg-user"/>
<property name="webguard.user.password" value="wg-password"/>
```
## Статистика

1
frontend/.env Normal file
View file

@ -0,0 +1 @@
MFE_BASE_URL=/mfe/account-applications

View file

@ -0,0 +1,32 @@
"use strict";
exports.__esModule = true;
var fs = require('fs');
var mfeBaseUrlKey = 'MFE_BASE_URL';
var srcUrlRegex = /url\((\\?["'])?(?!data:)\S+(\\?["'])?\)/g;
function normalizeCssPaths(params) {
params.paths = params.paths ? params.paths : [];
params.paths.forEach(function (path) { return normalizeCssPath(path, params.outDir); });
}
exports.normalizeCssPaths = normalizeCssPaths;
function normalizeCssPath(path, outputDirectory) {
console.log("Start processing " + path);
var css = fs.readFileSync(path, 'utf8');
var counter = 0;
var processedCss = css.replace(srcUrlRegex, function (srcUrl) {
if (srcUrl.search(outputDirectory) != -1)
return srcUrl;
var fileName = getFileName(srcUrl);
var processedUrl = "url('" + outputDirectory + "/" + fileName + "')";
counter++;
console.log("Replaced " + srcUrl + " -> " + processedUrl);
return processedUrl;
});
console.log("Replaced " + counter + " urls");
fs.writeFileSync(path, processedCss);
}
function getFileName(srcUrl) {
var url = srcUrl.substring(4, srcUrl.length - 1); // unbox 'url(...)'
url = url.replace(/(\\?["'])/g, '');
var urlPaths = url.split('/');
return urlPaths[urlPaths.length - 1].split('?')[0];
}

View file

@ -0,0 +1,33 @@
const fs = require('fs');
const srcUrlRegex = /url\((\\?["'])?(?!data:)\S+(\\?["'])?\)/g;
export function normalizeCssPaths(params: {paths: string[], outDir: string}) {
params.paths = params.paths ? params.paths : [];
params.paths.forEach(path => normalizeCssPath(path, params.outDir));
}
function normalizeCssPath(path: string, outputDirectory: string) {
console.log(`Start processing ${path}`);
const css: string = fs.readFileSync(path, 'utf8');
let counter = 0;
const processedCss = css.replace(srcUrlRegex, (srcUrl: string) => {
if (srcUrl.search(outputDirectory) != -1) return srcUrl;
let fileName = getFileName(srcUrl);
let processedUrl = `url('${outputDirectory}/${fileName}')`;
counter++;
console.log(`Replaced ${srcUrl} -> ${processedUrl}`);
return processedUrl;
});
console.log(`Replaced ${counter} urls`);
fs.writeFileSync(path, processedCss);
}
function getFileName(srcUrl: string): string {
let url = srcUrl.substring(4, srcUrl.length - 1); // unbox 'url(...)'
url = url.replace(/(\\?["'])/g, '');
let urlPaths = url.split('/');
return urlPaths[urlPaths.length - 1].split('?')[0];
}

View file

@ -3276,6 +3276,38 @@
}
}
},
"dotenv": {
"version": "16.4.7",
"resolved": "https://repo.micord.ru/repository/npm-all/dotenv/-/dotenv-16.4.7.tgz",
"integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
"dev": true
},
"dotenv-defaults": {
"version": "2.0.2",
"resolved": "https://repo.micord.ru/repository/npm-all/dotenv-defaults/-/dotenv-defaults-2.0.2.tgz",
"integrity": "sha512-iOIzovWfsUHU91L5i8bJce3NYK5JXeAwH50Jh6+ARUdLiiGlYWfGw6UkzsYqaXZH/hjE/eCd/PlfM/qqyK0AMg==",
"dev": true,
"requires": {
"dotenv": "^8.2.0"
},
"dependencies": {
"dotenv": {
"version": "8.6.0",
"resolved": "https://repo.micord.ru/repository/npm-all/dotenv/-/dotenv-8.6.0.tgz",
"integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==",
"dev": true
}
}
},
"dotenv-webpack": {
"version": "8.1.0",
"resolved": "https://repo.micord.ru/repository/npm-all/dotenv-webpack/-/dotenv-webpack-8.1.0.tgz",
"integrity": "sha512-owK1JcsPkIobeqjVrk6h7jPED/W6ZpdFsMPR+5ursB7/SdgDyO+VzAU+szK8C8u3qUhtENyYnj8eyXMR5kkGag==",
"dev": true,
"requires": {
"dotenv-defaults": "^2.0.2"
}
},
"downloadjs": {
"version": "1.4.8",
"resolved": "https://repo.micord.ru/repository/npm-all/downloadjs/-/downloadjs-1.4.8.tgz",

View file

@ -85,6 +85,8 @@
"cross-env": "5.2.1",
"css-loader": "6.11.0",
"del": "2.2.2",
"dotenv": "^16.4.5",
"dotenv-webpack": "^8.1.0",
"file-loader": "6.2.0",
"html-webpack-plugin": "5.6.0",
"mini-css-extract-plugin": "2.9.1",

View file

@ -0,0 +1,41 @@
/*
* @font-face from bootstrap-icons
*/
@font-face {
font-display: block;
font-family: "bootstrap-icons";
src: url("../../../node_modules/bootstrap-icons/font/fonts/bootstrap-icons.woff2?24e3eb84d0bcaf83d77f904c78ac1f47") format("woff2"),
url("../../../node_modules/bootstrap-icons/font/fonts/bootstrap-icons.woff?24e3eb84d0bcaf83d77f904c78ac1f47") format("woff");
}
/*
* @font-face from font-awesome
*/
@font-face {
font-family: 'FontAwesome';
src: url('../../../node_modules/font-awesome/fonts/fontawesome-webfont.eot?v=4.7.0');
src: url('../../../node_modules/font-awesome/fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),
url('../../../node_modules/font-awesome/fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),
url('../../../node_modules/font-awesome/fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),
url('../../../node_modules/font-awesome/fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),
url('../../../node_modules/font-awesome/fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Golos';
src: url('../fonts/golos-regular.ttf');
}
@font-face {
font-family: 'GolosM';
src: url('../fonts/golos-medium.ttf');
}
@font-face {
font-family: 'GolosUI';
src: url('../fonts/golos-ul-regular.ttf');
}
@font-face {
font-family: 'GolosUIM';
src: url('../fonts/golos-ul-medium.ttf');
}

View file

@ -1,29 +0,0 @@
<div *ngIf="(currentSession | async)?.authorities.includes('USER_MANAGEMENT.USER.LIST') ||
(currentSession | async)?.authorities.includes('USER_MANAGEMENT.GROUP.LIST') ||
(currentSession | async)?.authorities.includes('USER_MANAGEMENT.ROLE.LIST') ||
(currentSession | async)?.authorities.includes('USER_MANAGEMENT.ORG_UNIT.LIST') ||
(currentSession | async)?.authorities.includes('USER_MANAGEMENT.AUTHORITY.LIST')" ngbDropdown class="nav-item" [placement]="placement">
<button class="nav-link bi bi-gear-fill" id="adminDropdownMenu" ngbDropdownToggle title="Администрирование"></button>
<div ngbDropdownMenu aria-labelledby="adminDropdownMenu">
<button *ngIf="(currentSession | async)?.authorities.includes('USER_MANAGEMENT.USER.LIST')"
routerLink="/user-management/users" ngbDropdownItem>
Пользователи
</button>
<button *ngIf="(currentSession | async)?.authorities.includes('USER_MANAGEMENT.GROUP.LIST')"
routerLink="/user-management/groups" ngbDropdownItem>
Группы
</button>
<button *ngIf="(currentSession | async)?.authorities.includes('USER_MANAGEMENT.ROLE.LIST')"
routerLink="/user-management/roles" ngbDropdownItem>
Роли
</button>
<button *ngIf="(currentSession | async)?.authorities.includes('USER_MANAGEMENT.ORG_UNIT.LIST')"
routerLink="/user-management/org-units" ngbDropdownItem>
Организации
</button>
<button *ngIf="(currentSession | async)?.authorities.includes('USER_MANAGEMENT.AUTHORITY.LIST')"
routerLink="/user-management/authorities" ngbDropdownItem>
Безопасность действий
</button>
</div>
</div>

View file

@ -1,11 +1,7 @@
<nav class="header" *ngIf="currentSession | async as session" id="webbpm-header">
<nav class="header" id="webbpm-header">
<div class="header-logo">
<div class="logo"><a routerLink="/"></a></div>
<div class="main-page">ЦЕНТРАЛИЗОВАННОЕ УПРАВЛЕНИЕ УЧЕТНЫМИ ЗАПИСЯМИ</div>
</div>
<div class="header-menu">
<admin-menu [placement]="'bottom'"></admin-menu>
<div ngbDropdown class="logout" log-out></div>
</div>
</nav>

View file

@ -1,27 +0,0 @@
<div class="confirm">
<div class="form-logo">
<div></div>
</div>
<div class="info">
<div>
<h2>Подтверждение почты</h2>
<div *ngIf="verificationStatus.toString() === 'VERIFYING'">
Подтверждение...
</div>
<div *ngIf="verificationStatus.toString() === 'VERIFIED'">
<div class="alert alert-success">
Адрес электронной почты успешно подтвержден
</div>
</div>
<div *ngIf="verificationStatus.toString() === 'FAILED'">
<div class="alert alert-danger">{{ errorMessage }}</div>
</div>
<div *ngIf="(currentSession | async) == null">
<a href="#/login"><span class="fa fa-lock"></span>Войти</a><br/>
<a href="#/registration">Зарегистрироваться</a>
</div>
</div>
</div>
</div>

View file

@ -1,9 +0,0 @@
<button class="nav-link bi bi-person-fill" ngbDropdownToggle title="Пользователь"></button>
<div ngbDropdownMenu *ngIf="currentSession | async as session">
<div class="user-info">
<div class="user-fio">{{session.fullUserName}}</div>
<div class="user-login">{{session.username}}</div>
<div class="user-department">{{getOrgUnitName()}}</div>
</div>
<button ngbDropdownItem *ngIf="isLogoutButtonVisible()" (click)="logout()">Выход</button>
</div>

View file

@ -1,49 +0,0 @@
<div class="form-signin">
<form #formComponent="ngForm">
<div class="alert alert-success" [hidden]="!confirmationSent">На ваш почтовый адрес было отправлено письмо. Подтвердите почту, чтобы войти в систему
</div>
<div class="alert alert-danger" [hidden]="!errorMessage">{{errorMessage}}</div>
<div class="logo">
<h2>ЦЕНТРАЛИЗОВАННОЕ УПРАВЛЕНИЕ<br />УЧЕТНЫМИ ЗАПИСЯМИ</h2>
</div>
<div class="row">
<div class="input-group">
<input type="text" name="username" class="form-control" placeholder=" " required autofocus [(ngModel)]="username" maxlength="100">
<label>Логин</label>
</div>
</div>
<div class="row">
<div class="input-group">
<input
[type]="passwordType ? 'text' : 'password'"
name="password"
class="form-control field-password-view"
placeholder=" " required
[(ngModel)]="password"
maxlength="100"
>
<label>Пароль</label>
<div class="input-group-append">
<span class="input-group-text">
<i
(click)="togglePasswordType()"
class="fa"
[ngClass]="{
'fa-eye': passwordType,
'fa-eye-slash': !passwordType
}"
></i>
</span>
</div>
</div>
<!--<div class="msg-text"><a href="#/reset-password">Восстановить пароль</a></div>-->
</div>
<div class="btn-box">
<!--<esia-login-button></esia-login-button>-->
<button type="submit" class="btn btn-primary" (click)="formComponent.form.valid && login()">Войти</button>
</div>
</form>
</div>

View file

@ -1,103 +0,0 @@
<div class="form-signup">
<div class="form-logo">
<div></div>
</div>
<div class="form-new-password">
<form #formComponent="ngForm">
<div [hidden]="!errorMessage" class="alert alert-danger">{{ errorMessage }}</div>
<p class="has-account">Вспомнили пароль?
<a href="#/login"><span class="fa fa-lock"></span>Войти</a></p>
<p class="has-account">Задайте новый пароль</p>
<div class="row">
<label>Пароль</label>
<div class="input-group">
<input
#passwordInput="ngModel"
[(ngModel)]="password"
[type]="passwordType ? 'text' : 'password'"
class="form-control"
maxlength="32"
minlength="6"
name="password"
pattern="^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]+$"
required
(change)="validPasswords()"
>
<div class="input-group-append">
<span class="input-group-text">
<i
(click)="togglePasswordType()"
class="fa"
[ngClass]="{
'fa-eye': passwordType,
'fa-eye-slash': !passwordType
}"
></i>
</span>
</div>
</div>
<div *ngIf="passwordInput.invalid && (passwordInput.dirty || passwordInput.touched)">
<div *ngIf="passwordInput.errors.required" class="msg-alert">Поле обязательно
</div>
<div *ngIf="passwordInput.errors.minlength" class="msg-alert">Пароль должен
содержать как минимум 6 символов
</div>
<div *ngIf="passwordInput.errors.pattern" class="msg-alert">Пароль должен
содержать заглавные и прописные буквы и как минимум 1 цифру
</div>
</div>
</div>
<div class="row">
<label>Подтверждение пароля</label>
<div class="input-group">
<input
#confirmPasswordInput="ngModel"
[(ngModel)]="confirmPassword"
[type]="confirmPasswordType ? 'text' : 'password'"
class="form-control"
maxlength="32"
minlength="6"
name="confirmPassword"
pattern="^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]+$"
required
(change)="validPasswords()"
>
<div class="input-group-append">
<span class="input-group-text">
<i
(click)="toggleConfirmPasswordType()"
class="fa"
[ngClass]="{
'fa-eye': confirmPasswordType,
'fa-eye-slash': !confirmPasswordType
}"
></i>
</span>
</div>
</div>
<div *ngIf="confirmPasswordInput.invalid && (confirmPasswordInput.dirty || confirmPasswordInput.touched)">
<div *ngIf="confirmPasswordInput.errors.required" class="msg-alert">Поле обязательно
</div>
<div *ngIf="confirmPasswordInput.errors.minlength" class="msg-alert">Пароль должен
содержать как минимум 6 символов
</div>
<div *ngIf="confirmPasswordInput.errors.pattern" class="msg-alert">Пароль должен
содержать заглавные и прописные буквы и как минимум 1 цифру
</div>
</div>
</div>
<div class="reset-password-btn-box">
<button
(click)="formComponent.form.valid && validPasswords() && changePassword()"
[disabled]="!formComponent.form.valid && !validPasswords()"
class="btn btn-primary"
type="submit"
>
Изменить пароль
</button>
</div>
</form>
</div>
</div>

View file

@ -1,121 +0,0 @@
<div class="form-signup">
<div class="form-logo">
<div></div>
</div>
<div class="form-register">
<form #formComponent="ngForm">
<div [hidden]="!errorMessage" class="alert alert-danger">{{ errorMessage }}</div>
<h2>Регистрация</h2>
<p class="has-account">Уже зарегистрированы?
<a href="#/login"><span class="fa fa-lock"></span>Войти</a></p>
<div class="row">
<label>Имя</label>
<input
#name="ngModel"
[(ngModel)]="username"
class="form-control"
maxlength="100"
name="username"
required
type="text"
>
<div *ngIf="name.invalid && (name.dirty || name.touched)">
<div *ngIf="name.errors.required" class="msg-alert">Поле обязательно</div>
</div>
</div>
<div class="row">
<label>Адрес эл. почты</label>
<input
#emailInput="ngModel"
[(ngModel)]="email"
class="form-control"
email
maxlength="100"
name="email"
required
type="email"
>
<div *ngIf="emailInput.invalid && (emailInput.dirty || emailInput.touched)">
<div *ngIf="emailInput.errors.required" class="msg-alert">Поле обязательно</div>
<div *ngIf="emailInput.errors.email" class="msg-alert">Неверный формат адреса
эл. почты
</div>
</div>
</div>
<div class="row">
<label>Номер телефона</label>
<international-phone-number
#phoneInput="ngModel"
[(ngModel)]="phoneNumber"
[defaultCountry]="'ru'"
[pattern]="'^\\+(?!7 ?\\d{11})[0-9 ]+$'"
maxlength="20"
minlength="8"
name="phoneNumber"
placeholder="+79991112233"
(focusout)="phoneInputFocusOut()"
required
></international-phone-number>
<div *ngIf="phoneInput.invalid && (phoneInput.dirty || phoneIsTouched)">
<div *ngIf="phone.selectedCountry">
<div *ngIf="phoneHasOnlyDialCode()" class="msg-alert">Поле обязательно</div>
<div *ngIf="!phoneHasOnlyDialCode()" class="msg-alert">Введите корректный номер</div>
</div>
<div *ngIf="!phone.selectedCountry">
<div *ngIf="phoneInput.errors.required" class="msg-alert">Поле обязательно</div>
<div *ngIf="!phoneInput.errors.required" class="msg-alert">Введите код страны</div>
</div>
</div>
</div>
<div class="row">
<label>Пароль</label>
<div class="input-group">
<input
#passwordInput="ngModel"
[(ngModel)]="password"
[type]="fieldType ? 'text' : 'password'"
class="form-control"
maxlength="32"
minlength="8"
name="password"
[pattern]="passwordPattern"
required
>
<div class="input-group-append">
<span class="input-group-text">
<i
(click)="toggleFieldType()"
class="fa"
[ngClass]="{
'fa-eye': fieldType,
'fa-eye-slash': !fieldType
}"
></i>
</span>
</div>
</div>
<div *ngIf="passwordInput.invalid && (passwordInput.dirty || passwordInput.touched)">
<div *ngIf="passwordInput.errors.required" class="msg-alert">Поле обязательно
</div>
<div *ngIf="passwordInput.errors.minlength" class="msg-alert">Пароль должен
содержать как минимум 8 символов
</div>
<div *ngIf="passwordInput.errors.pattern" class="msg-alert" [innerText]="passwordPatternErrorMessage">
</div>
</div>
</div>
<div class="register-btn-box">
<button
(click)="formComponent.form.valid && register()"
[disabled]="!formComponent.form.valid"
class="btn btn-primary"
type="submit"
>
Зарегистрироваться
</button>
</div>
<div *ngIf="consent" [innerHTML]="consent" class="consent"></div>
</form>
</div>
</div>

View file

@ -1,45 +0,0 @@
<div class="form-signup">
<div class="form-logo">
<div></div>
</div>
<div class="form-reset-password">
<form #formComponent="ngForm">
<div [hidden]="!errorMessage" class="alert alert-danger">{{ errorMessage }}</div>
<p class="has-account">Вспомнили пароль?
<a href="#/login"><span class="fa fa-lock"></span>Войти</a></p>
<p class="has-account">Укажите адрес эл. почты, который был указан при регистрации,
на него пришлем временный пароль. Пароль сможете поменять в личном кабинете.
</p>
<div class="row">
<input
#emailInput="ngModel"
[(ngModel)]="email"
class="form-control"
email
maxlength="100"
name="email"
required
type="email"
>
<label>Адрес эл. почты</label>
<div *ngIf="emailInput.invalid && (emailInput.dirty || emailInput.touched)" class="msg-text">
<div *ngIf="emailInput.errors.required" class="msg-alert">Поле обязательно</div>
<div *ngIf="emailInput.errors.email" class="msg-alert">Неверный формат адреса эл. почты
</div>
</div>
</div>
<div class="btn-box">
<button
(click)="formComponent.form.valid && resetPassword()"
[disabled]="!formComponent.form.valid"
class="btn btn-primary"
type="submit"
>
Восстановить
</button>
</div>
</form>
</div>
</div>

View file

@ -0,0 +1,39 @@
<div class="form-signin">
<form #formComponent="ngForm">
<div class="row">
<label>Имя</label>
<div class="input-group">
<input type="text" name="name" class="form-control" placeholder="Имя" required autofocus
[(ngModel)]="name">
</div>
</div>
<div class="row">
<label>Название подразделения</label>
<div class="input-group">
<input type="text" name="realm" class="form-control" placeholder="Название подразделения" required
[(ngModel)]="realm">
</div>
</div>
<div class="row">
<label>Роль</label>
<div class="input-group">
<input type="text" name="role" class="form-control" placeholder="Роль" required
[(ngModel)]="role">
</div>
</div>
<div class="row">
<label>Domain id</label>
<div class="input-group">
<input type="text" name="domain_id" class="form-control" placeholder="Id подразделения" required
[(ngModel)]="domainId">
</div>
</div>
<div class="login-btn-box">
<button type="submit" class="btn btn-primary" (click)="enter()">Войти</button>
</div>
</form>
</div>

View file

@ -0,0 +1,14 @@
<div webbpm class="webbpm account-applications">
<div class="wrapper">
<app-header *ngIf="headerVisible">
</app-header>
<div class="container">
<div class="container-inside" id="webbpm-angular-application-container">
<router-outlet></router-outlet>
</div>
</div>
<app-footer *ngIf="footerVisible">
</app-footer>
</div>
</div>

View file

@ -0,0 +1 @@
<mfe-webbpm style="all: initial; display: block; height: 100vh"></mfe-webbpm>

View file

@ -0,0 +1,17 @@
import {AnalyticalScope, Behavior, Source, Visible} from "@webbpm/base-package";
import {AuthorizationService} from "../modules/app/service/authorization.service";
@AnalyticalScope(Behavior)
export class ErvuCheckUserRole extends Behavior{
private authService: AuthorizationService;
public initialize(): void {
super.initialize();
this.authService = this.injector.get(AuthorizationService);
}
@Visible()
public hasRole(@Source("roles") role: string): boolean {
return this.authService.hasRole(role);
}
}

View file

@ -0,0 +1,24 @@
import {AnalyticalScope, Behavior, TextField} from "@webbpm/base-package";
import {AuthorizationService} from "../../modules/app/service/authorization.service";
@AnalyticalScope("TextField")
export class SetCurrentRecruitmentIdAsDefValue extends Behavior {
private textField: TextField;
private authService: AuthorizationService;
initialize() {
super.initialize();
this.textField = this.getScript('component.ControlWithValue');
this.authService = this.injector.get(AuthorizationService);
}
start(): void {
super.start();
if (this.textField && this.textField.isPristine() && this.authService &&
this.authService.getCurrentSession()) {
this.textField.setValue(this.authService.getDomainId());
this.getContext().getChangeDetector().detectChanges();
}
}
}

View file

@ -1,24 +0,0 @@
import {AnalyticalScope, Behavior, SessionStore, TextField} from "@webbpm/base-package";
@AnalyticalScope("TextField")
export class SetCurrentUserIdAsDefValue extends Behavior {
private textField: TextField;
private sessionStore: SessionStore;
initialize() {
super.initialize();
this.textField = this.getScript('component.ControlWithValue');
this.sessionStore = this.injector.get(SessionStore);
}
start(): void {
super.start();
if (this.textField && this.textField.isPristine() && this.sessionStore &&
this.sessionStore.getSession()) {
this.textField.setValue(this.sessionStore.getSession().userAccountId);
this.getContext().getChangeDetector().detectChanges();
}
}
}

View file

@ -0,0 +1,74 @@
import {platformBrowserDynamic} from "@angular/platform-browser-dynamic";
import {MfeConfigurationProvider} from "./modules/mfe/provider/mfe-configuration.provider";
import {NgModuleRef} from "@angular/core";
let childEventHandlerFromContainer = null;
export type ChildEventType = 'navigate' | 'token-request'
export type ParentEventType = 'navigate';
export function fireMfeEventToContainer(eventType: ChildEventType, eventData: any): Promise<any> {
if (typeof childEventHandlerFromContainer === 'function') {
return childEventHandlerFromContainer(eventType, eventData);
}
else {
throw new Error(
'Event fired from child MFE to container before being bootstrapped as MFE App',
);
}
}
export function bootstrapMfeApp(createApp: () => Promise<NgModuleRef<unknown> | void>) {
function mount(
element: HTMLElement,
settings: {
standalone: boolean,
useShadowDom?: boolean,
containerBaseUrl?: string,
componentBaseUrl?: string,
startUrl: string,
childEventHandler?: any,
params?: any
} = {
standalone: false,
startUrl: '/mfe/account-applications'
},
) {
let containerBaseUrl = settings.containerBaseUrl || ''; // префикс ресурса
let startUrl = settings.startUrl || ''; // ресурс хост-приложения
MfeConfigurationProvider.setPageBaseUrl(joinPath(containerBaseUrl, startUrl));
element.appendChild(createContainerForBootstrap())
childEventHandlerFromContainer = settings.childEventHandler;
createApp();
return {
parentEventHandler(eventType: ParentEventType, url: string) {
},
unmount() {
console.log("Unmounting account-applications application");
platformBrowserDynamic().destroy();
},
}
}
return {
mount,
};
}
function createContainerForBootstrap(): HTMLElement {
let mfeBootstrapContainer = document.createElement('div');
mfeBootstrapContainer.setAttribute(MfeConfigurationProvider.BASE_COMPONENT_ATTRIBUTE, '');
return mfeBootstrapContainer;
}
export function joinPath(...paths: string[]): string {
return '/' + paths
.filter(path => path)
.map(path => path.endsWith('/') ? path.substring(0, path.length - 1) : path)
.map(path => path.startsWith('/') ? path.substring(1, path.length) : path)
.join('/')
}

View file

@ -0,0 +1,18 @@
import 'zone.js/dist/zone';
import {enableProdMode} from "@angular/core";
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import {bootstrapMfeApp} from './mfe-app-tools';
// @ts-ignore
import {MfeWebbpmModuleNgFactory} from "./modules/mfe/mfe-webbpm.module.ngfactory";
window['dev_mode'] = false;
enableProdMode();
const mount = bootstrapMfeApp(() => {
return platformBrowserDynamic()
.bootstrapModuleFactory(MfeWebbpmModuleNgFactory)
.catch((err) => console.error(err));
}).mount;
export {mount};

View file

@ -1,70 +1,39 @@
import {NgModule} from "@angular/core";
import {RouterModule, Routes} from "@angular/router";
import {AccessDeniedComponent} from "./component/access-denied.component";
import {LoginComponent} from "./component/login.component";
import {AuthenticationGuard, ConfirmExitGuard, SignedInGuard} from "@webbpm/base-package";
import {RegisterComponent} from "./component/register.component";
import {ConfirmUserEmailComponent} from "./component/confirm-user-email.component";
import {ResetPasswordComponent} from "./component/reset-password.component";
import {NewPasswordComponent} from "./component/new-password.component";
import {ConfirmExitGuard} from "@webbpm/base-package";
import {RolesGuard} from "./guard/RolesGuard";
const appRoutes: Routes = [
{
path: 'login',
component: LoginComponent,
canActivate: [SignedInGuard]
},
{
path: 'home',
loadChildren: 'generated-sources/page-home.module#PagehomeModule',
canActivate: [AuthenticationGuard, ConfirmExitGuard]
canActivate: [ConfirmExitGuard, RolesGuard]
},
{
path: 'app_list',
loadChildren: 'generated-sources/page-app_list.module#Pageapp_listModule',
canActivate: [AuthenticationGuard, ConfirmExitGuard]
canActivate: [ConfirmExitGuard, RolesGuard]
},
{
path: 'add_user_application',
loadChildren: 'generated-sources/page-add_user_application.module#Pageadd_user_applicationModule',
canActivate: [AuthenticationGuard, ConfirmExitGuard]
canActivate: [ConfirmExitGuard, RolesGuard]
},
{
path: 'edit_user_application',
loadChildren: 'generated-sources/page-edit_user_application.module#Pageedit_user_applicationModule',
canActivate: [AuthenticationGuard, ConfirmExitGuard]
canActivate: [ConfirmExitGuard, RolesGuard]
},
{
path: 'block_user_application',
loadChildren: 'generated-sources/page-block_user_application.module#Pageblock_user_applicationModule',
canActivate: [AuthenticationGuard, ConfirmExitGuard]
canActivate: [ConfirmExitGuard, RolesGuard]
},
{
path: 'process_application/:id',
loadChildren: 'generated-sources/page-process_application.module#Pageprocess_applicationModule',
canActivate: [AuthenticationGuard, ConfirmExitGuard]
},
{
path: 'access-denied',
component: AccessDeniedComponent,
canActivate: [AuthenticationGuard, ConfirmExitGuard]
},
{
path: 'registration',
component: RegisterComponent,
canActivate: [SignedInGuard]
},
{
path: 'confirm',
component: ConfirmUserEmailComponent
},
{
path: 'reset-password',
component: ResetPasswordComponent
},
{
path: 'new-password',
component: NewPasswordComponent
canActivate: [ConfirmExitGuard, RolesGuard]
}
];

View file

@ -11,23 +11,16 @@ import {
ProgressIndicationService,
SecurityModule
} from "@webbpm/base-package";
import {AdminMenuComponent} from "./component/admin-menu.component";
import {AppHeaderComponent} from "./component/app-header.component";
import {AppFooterComponent} from "./component/app-footer.component";
import {LogOutComponent} from "./component/logout.component";
import {LoginComponent} from "./component/login.component";
import {AccessDeniedComponent} from "./component/access-denied.component";
import {ApplicationVersionComponent} from "./component/application-version.component";
import {RouterModule} from "@angular/router";
import {RegisterComponent} from "./component/register.component";
import {ConfirmUserEmailComponent} from "./component/confirm-user-email.component";
import {InternationalPhoneNumberModule} from "ngx-international-phone-number";
import {ResetPasswordComponent} from "./component/reset-password.component";
import {NewPasswordComponent} from "./component/new-password.component";
import {AppProgressIndicationComponent} from "./component/app-progress-indication.component";
import {AppProgressIndicationService} from "./service/app-progress-indication.service";
import {VBoxLoadValues} from "../../account_applications/component/container/VBoxLoadValues";
import {ErvuAccountTextFieldGridEditor} from "../../account_applications/component/editablegrid/editors/ErvuAccountTextFieldGridEditor";
import {TokenInterceptor} from "./interceptor/token.interceptor.service";
import {DropdownTreeViewComponent}from "../../account_applications/component/field/DropdownTreeViewComponent";
import {DropdownTreeviewSelectComponent} from "../../account_applications/component/external/ngx-treeview/dropdown-treeview-select/dropdown-treeview-select.component";
import {TreeviewModule} from "ngx-treeview";
@ -36,15 +29,7 @@ registerLocaleData(localeRu);
export const DIRECTIVES = [
forwardRef(() => AppHeaderComponent),
forwardRef(() => AppFooterComponent),
forwardRef(() => AdminMenuComponent),
forwardRef(() => ApplicationVersionComponent),
forwardRef(() => LogOutComponent),
forwardRef(() => LoginComponent),
forwardRef(() => AccessDeniedComponent),
forwardRef(() => RegisterComponent),
forwardRef(() => ConfirmUserEmailComponent),
forwardRef(() => ResetPasswordComponent),
forwardRef(() => NewPasswordComponent),
forwardRef(() => AppProgressIndicationComponent),
forwardRef(() => VBoxLoadValues),
forwardRef(() => DropdownTreeViewComponent),
@ -73,7 +58,8 @@ export const DIRECTIVES = [
DIRECTIVES
],
providers: [
{ provide: ProgressIndicationService, useClass: AppProgressIndicationService }
TokenInterceptor,
{provide: ProgressIndicationService, useClass: AppProgressIndicationService }
],
bootstrap: [],
entryComponents: [AppProgressIndicationComponent]

View file

@ -1,23 +0,0 @@
import {ChangeDetectionStrategy, Component, Input} from "@angular/core";
import {UserService, Session} from "@webbpm/base-package";
import {NgbDropdownConfig, Placement} from "@ng-bootstrap/ng-bootstrap";
import {Observable} from "rxjs";
@Component({
moduleId: module.id,
selector: 'admin-menu',
templateUrl: '../../../../../src/resources/template/app/component/admin_menu.html',
providers: [NgbDropdownConfig],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class AdminMenuComponent {
@Input()
public placement: Placement = 'bottom';
public currentSession: Observable<Session>;
constructor(protected userService: UserService, public config: NgbDropdownConfig) {
this.config.placement = this.placement;
this.currentSession = this.userService.getCurrentSession();
}
}

View file

@ -1,7 +1,5 @@
import {ChangeDetectionStrategy, Component} from "@angular/core";
import {Router} from "@angular/router";
import {UserService, Session} from "@webbpm/base-package";
import {Observable} from "rxjs";
import {ChangeDetectionStrategy, ChangeDetectorRef, Component} from "@angular/core";
import {AuthorizationService} from "../service/authorization.service";
@Component({
moduleId: module.id,
@ -11,10 +9,16 @@ import {Observable} from "rxjs";
})
export class AppHeaderComponent {
public currentSession: Observable<Session>;
name: string;
realm: string;
constructor(protected userService: UserService,
protected router: Router) {
this.currentSession = this.userService.getCurrentSession();
constructor(protected authService: AuthorizationService,
protected cd: ChangeDetectorRef) {
authService.onSessionUpdate
.subscribe(session => {
this.name = session.name;
this.realm = session.realm;
cd.markForCheck()
})
}
}

View file

@ -1,51 +0,0 @@
import {ActivatedRoute, Router} from "@angular/router";
import {ChangeDetectionStrategy, ChangeDetectorRef, Component, Input} from "@angular/core";
import {Session, UserService} from "@webbpm/base-package";
import {Observable} from "rxjs";
enum VerificationStatus {
VERIFYING = "VERIFYING",
VERIFIED = "VERIFIED",
FAILED = "FAILED"
}
@Component({
moduleId: module.id,
selector: "confirm",
changeDetection: ChangeDetectionStrategy.OnPush,
templateUrl: "../../../../../src/resources/template/app/component/confirm-user-email.html"
})
export class ConfirmUserEmailComponent {
public verificationStatus = VerificationStatus.VERIFYING;
public currentSession: Observable<Session>;
@Input()
public errorMessage: string;
constructor(private router: Router, private userService: UserService,
private route: ActivatedRoute, private cd: ChangeDetectorRef) {
this.currentSession = this.userService.getCurrentSession();
}
ngOnInit() {
const link: string = this.route.snapshot.queryParamMap.get("link");
// remove link from url to prevent http referer leakage
this.router.navigate([], { relativeTo: this.route, replaceUrl: true });
this.userService.confirm(
link,
(reason) => {
this.verificationStatus = VerificationStatus.FAILED;
if (reason.status === 404) {
this.errorMessage = 'Ссылка недействительна. Требуется повторная регистрация.';
}
else {
this.errorMessage = 'Произошла ошибка, обратитесь в службу технической поддержки!';
}
this.cd.markForCheck();
})
.then(() => {
this.verificationStatus = VerificationStatus.VERIFIED;
this.cd.markForCheck();
});
}
}

View file

@ -1,68 +0,0 @@
import {Component, Input} from "@angular/core";
import {ActivatedRoute, Router} from "@angular/router";
import {UserService, Credentials} from "@webbpm/base-package";
@Component({
moduleId: module.id,
selector: "login",
templateUrl: "../../../../../src/resources/template/app/component/login.html"
})
export class LoginComponent {
@Input()
public username: string;
@Input()
public password: string;
public passwordType: boolean;
@Input()
public errorMessage: string;
@Input()
public confirmationSent: boolean;
constructor(private router: Router, private userService: UserService,
private route: ActivatedRoute) {
}
ngOnInit() {
this.confirmationSent = this.route.snapshot.queryParamMap.get('confirmationSent') === 'true';
this.router.navigate([], { relativeTo: this.route, replaceUrl: true });
}
public login(): void {
let credentials: Credentials = new Credentials();
credentials.username = this.username;
credentials.password = this.password;
this.userService.login(credentials, "Password")
.then(() => this.router.navigateByUrl("/"),
(reason: any) => {
switch (reason.status) {
case 401: {
this.errorMessage = "Неправильный логин или пароль";
break;
}
case 404: {
this.errorMessage = "Приложение стартует. Пожалуйста, подождите...";
break;
}
default: {
this.errorMessage =
"Произошла неизвестная ошибка, обратитесь в службу технической поддержки!";
break;
}
}
}
);
}
public goToRegister(): void {
this.router.navigateByUrl("/register");
}
togglePasswordType(): void {
this.passwordType = !this.passwordType;
}
}

View file

@ -1,37 +0,0 @@
import {Component} from "@angular/core";
import {UserService, Session, AuthenticationMethodService} from "@webbpm/base-package";
import {Observable} from "rxjs";
@Component({
moduleId: module.id,
selector: "[log-out]",
templateUrl: "../../../../../src/resources/template/app/component/log_out.html"
})
export class LogOutComponent {
public currentSession: Observable<Session>;
constructor(private userService: UserService, private authenticationMethodService: AuthenticationMethodService) {
this.currentSession = userService.getCurrentSession();
}
public logout(): void {
this.userService.logout();
}
public getCurrentUserName(): string {
return this.userService.getCurrentUserName();
}
public getFullUserName(): string {
return this.userService.getFullUserName();
}
public isLogoutButtonVisible(): boolean {
return this.authenticationMethodService.isFormAuth();
}
public getOrgUnitName(): string {
return this.userService.getOrgUnitName();
}
}

View file

@ -1,79 +0,0 @@
import {ActivatedRoute, Router} from "@angular/router";
import {Component, Input} from "@angular/core";
import {Session, UserPasswordResetRequestDto, UserService} from "@webbpm/base-package";
import {Observable} from "rxjs";
@Component({
moduleId: module.id,
selector: "newPassword",
templateUrl: "../../../../../src/resources/template/app/component/new_password.html"
})
export class NewPasswordComponent {
public currentSession: Observable<Session>;
private token: string;
@Input()
public password: string;
public passwordType: boolean;
@Input()
public confirmPassword: string;
public confirmPasswordType: boolean;
@Input()
public errorMessage: string;
constructor(private router: Router, private userService: UserService,
private route: ActivatedRoute) {
this.currentSession = this.userService.getCurrentSession();
}
ngOnInit() {
this.token = this.route.snapshot.queryParamMap.get("token");
this.router.navigate([], {relativeTo: this.route, replaceUrl: true});
if (this.token == undefined || this.token === '') {
this.errorMessage = 'Ссылка недействительна. Требуется повторить восстановление пароля.';
return;
}
}
public changePassword(): void {
let dto: UserPasswordResetRequestDto = new UserPasswordResetRequestDto();
dto.password = this.password;
dto.passwordConfirm = this.confirmPassword;
this.userService.changePassword(dto, this.token)
.then(() => this.router.navigateByUrl("/"),
() => {
this.errorMessage =
'Произошла неизвестная ошибка, обратитесь в службу технической поддержки!';
});
}
togglePasswordType(): void {
this.passwordType = !this.passwordType;
}
toggleConfirmPasswordType(): void {
this.confirmPasswordType = !this.confirmPasswordType;
}
validPasswords(): boolean {
if (this.password === undefined || this.confirmPassword === undefined) {
return false;
}
let eq = this.password === this.confirmPassword;
if (!eq) {
this.errorMessage = 'Введенные пароли не совпадают. Убедитесь, что данные, ' +
'введенные в поле "Подтверждение пароля", совпадают с теми, ' +
'которые указаны в поле "Пароль".';
}
else {
this.errorMessage = '';
}
return eq;
}
}

View file

@ -1,71 +0,0 @@
import {Component, Input, ViewChild} from "@angular/core";
import {AppConfigService, UserDto, UserService} from "@webbpm/base-package";
import {Router} from "@angular/router";
import {PhoneNumberComponent} from "ngx-international-phone-number";
@Component({
moduleId: module.id,
selector: "register",
templateUrl: "../../../../../src/resources/template/app/component/register.html"
})
export class RegisterComponent {
public passwordPattern: string;
public passwordPatternErrorMessage: string;
public errorMessage: string;
@Input()
public username: string;
@Input()
public email: string;
@ViewChild(PhoneNumberComponent)
public phone: PhoneNumberComponent;
public phoneNumber: string;
public phoneIsTouched: boolean = false;
@Input()
public password: string;
public fieldType: boolean;
@Input()
public consent: string;
constructor(private router: Router, private userService: UserService,private appConfigService: AppConfigService) {
this.passwordPattern = appConfigService.getParamValue("password_pattern");
this.passwordPatternErrorMessage = appConfigService.getParamValue("password_pattern_error");
}
public register(): void {
let user: UserDto = new UserDto();
user.username = this.username;
user.email = this.email;
user.name = this.username;
user.phone = this.phone.value;
user.password = this.password;
this.userService.register(user)
.then(() => this.router.navigateByUrl("/login?confirmationSent=true"),
(reason: any) => {
if (reason.status === 409) {
this.errorMessage = 'Пользователь с данным почтовым адресом уже существует';
}
else {
this.errorMessage = 'Произошла неизвестная ошибка, обратитесь в службу технической поддержки!';
}
});
}
toggleFieldType(): void {
this.fieldType = !this.fieldType;
}
phoneHasOnlyDialCode(): boolean {
return this.phone.phoneNumber.trim() === this.phone.getSelectedCountryDialCode().trim()
}
phoneInputFocusOut(): void {
this.phoneIsTouched = true;
}
}

View file

@ -1,30 +0,0 @@
import {Component, Input} from "@angular/core";
import {UserService} from "@webbpm/base-package";
import {Router} from "@angular/router";
@Component({
moduleId: module.id,
selector: "resetPassword",
templateUrl: "../../../../../src/resources/template/app/component/reset_password.html"
})
export class ResetPasswordComponent {
@Input()
public email: string;
@Input()
public errorMessage: string;
constructor(private router: Router, private userService: UserService) {
}
resetPassword(): void {
this.userService.resetPassword(this.email)
.then(() => this.router.navigateByUrl("/"),
(reason: any) => {
this.errorMessage =
'Произошла неизвестная ошибка, обратитесь в службу технической поддержки!';
});
}
}

View file

@ -0,0 +1,47 @@
import {
ActivatedRouteSnapshot,
CanActivate,
Router,
RouterStateSnapshot,
UrlTree
} from "@angular/router";
import {Injectable} from "@angular/core";
import {AuthorizationService} from "../service/authorization.service";
import {TokenProvider} from "../provider/token.provider";
@Injectable({providedIn: 'root'})
export class RolesGuard implements CanActivate{
protected readonly allowedRoles: string[] = [];
constructor(protected authService: AuthorizationService,
protected tokenProvider: TokenProvider,
protected router: Router) {
}
async canActivate(
route: ActivatedRouteSnapshot, state: RouterStateSnapshot
): Promise<boolean | UrlTree> {
if (!await this.tokenProvider.getToken()) {
return this.getUrlOnFailure()
}
if (!this.authService.isAuthorized()) {
return this.authService.getCurrentSession()
.then(() => this.checkRoles() ? true : this.getUrlOnFailure())
.catch(() => this.getUrlOnFailure());
}
else {
return this.checkRoles();
}
}
protected getUrlOnFailure(): UrlTree {
return null;
}
protected checkRoles(): boolean {
return this.allowedRoles.length === 0
|| this.authService.hasAnyRole(this.allowedRoles);
}
}

View file

@ -0,0 +1,21 @@
import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from "@angular/common/http";
import {from, Observable} from "rxjs";
import {TokenProvider} from "../provider/token.provider";
import {Injectable} from "@angular/core";
@Injectable({providedIn: 'root'})
export class TokenInterceptor implements HttpInterceptor{
constructor(protected tokenProvider: TokenProvider) { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return from(this.handle(request, next))
}
private async handle(request: HttpRequest<any>, next: HttpHandler): Promise<HttpEvent<any>> {
const token = await this.tokenProvider.getToken();
request = request.clone({
setHeaders: {Authorization: `Bearer ${token}`}
});
return next.handle(request).toPromise();
}
}

View file

@ -0,0 +1,3 @@
export class TokenProvider {
public getToken(): Promise<string> { return null }
}

View file

@ -10,16 +10,16 @@ export class AppProgressIndicationService {
event.stopPropagation();
};
private counter: number = 0;
private focused: any;
private ngbModalRef: NgbModalRef;
private options: NgbModalOptions = {
protected counter: number = 0;
protected focused: any;
protected ngbModalRef: NgbModalRef;
protected options: NgbModalOptions = {
backdrop: 'static',
keyboard: false,
windowClass: 'modal-center loader'
};
constructor(private ngbModal: NgbModal) {
constructor(protected ngbModal: NgbModal) {
}
public showProgressBar(): boolean {
@ -58,11 +58,11 @@ export class AppProgressIndicationService {
}
}
private showProgressIndicator() {
protected showProgressIndicator() {
this.ngbModalRef = this.ngbModal.open(AppProgressIndicationComponent, this.options);
}
private hideProgressIndicator() {
protected hideProgressIndicator() {
this.ngbModalRef.dismiss('cancel');
this.ngbModalRef = null;
}

View file

@ -0,0 +1,64 @@
import {Injectable} from "@angular/core";
import {Subject} from "rxjs";
import {HttpClient} from "@angular/common/http";
export interface UserSession {
userId: string,
name: string,
realm: string,
domainId: string,
roles: string[]
}
@Injectable({providedIn: 'root'})
export class AuthorizationService {
private session: UserSession;
public onSessionUpdate: Subject<UserSession> = new Subject<UserSession>();
constructor(protected httpClient: HttpClient) {}
public getCurrentSession(): Promise<any> {
if (this.session) return new Promise(resolve => resolve(this.session))
return this.httpClient.get('session')
.toPromise()
.then((session: UserSession) => {
this.session = session;
this.onSessionUpdate.next(session);
return session;
})
}
isAuthorized(): boolean {
return !!this.session;
}
hasAnyRole(roles: string[]): boolean {
return this.isAuthorized() && roles.some(role => this.getRoles().includes(role));
}
hasRole(role: string): boolean {
return this.isAuthorized() && this.getRoles().includes(role);
}
getUserId(): string{
return this.isAuthorized() ? this.session.userId: null;
}
getName(): string {
return this.isAuthorized() ? this.session.name : null;
}
getRealm(): string {
return this.isAuthorized() ? this.session.realm : null;
}
getDomainId(): string {
return this.isAuthorized() ? this.session.domainId : null;
}
getRoles(): string[] {
return this.isAuthorized() ? this.session.roles : null;
}
}

View file

@ -0,0 +1,37 @@
import {Component, ViewEncapsulation} from "@angular/core";
import {
Event,
NavigationCancel,
NavigationEnd,
NavigationError,
NavigationStart,
Router
} from "@angular/router";
import {ProgressIndicationService} from "@webbpm/base-package";
@Component({
moduleId: module.id,
encapsulation: ViewEncapsulation.ShadowDom,
selector: 'mfe-webbpm',
templateUrl: './../../../../../src/resources/template/webbpm/mfe-webbpm.html',
styleUrls: ['./../../../../../src/resources/css/style.css'],
})
export class MfeWebbpmComponent {
public headerVisible: boolean = true;
public footerVisible: boolean = true;
constructor(private router: Router,
private progressIndicationService: ProgressIndicationService) {
router.events.subscribe((event: Event) => {
if (event instanceof NavigationStart) {
progressIndicationService.showProgressBar();
}
else if (event instanceof NavigationEnd
|| event instanceof NavigationError
|| event instanceof NavigationCancel) {
progressIndicationService.hideProgressBar();
}
})
}
}

View file

@ -0,0 +1,13 @@
import {Component} from "@angular/core";
import {MfeConfigurationProvider} from "../provider/mfe-configuration.provider";
@Component({
moduleId: module.id,
selector: `[${MfeConfigurationProvider.BASE_COMPONENT_ATTRIBUTE}]`,
templateUrl: './../../../../../src/resources/template/webbpm/mfe-wrapper.html',
styleUrls: ['./../../../../../src/resources/css/font-faces.css']
})
export class MfeWrapperComponent {
}

View file

@ -0,0 +1,10 @@
import {RolesGuard} from "../../app/guard/RolesGuard";
import {UrlTree} from "@angular/router";
import {Injectable} from "@angular/core";
@Injectable({providedIn: 'root'})
export class MfeRolesGuard extends RolesGuard {
protected getUrlOnFailure(): UrlTree {
return this.router.createUrlTree(['access-denied']);
}
}

View file

@ -0,0 +1,15 @@
import {HTTP_INTERCEPTORS} from "@angular/common/http";
import {
FormDirtyInterceptor,
HttpSecurityErrorInterceptor
} from "@webbpm/base-package";
import {MfeHttpBackendInterceptor} from "./mfe-http-backend-interceptor";
import {TokenInterceptor} from "../../app/interceptor/token.interceptor.service";
export const DEFAULT_HTTP_INTERCEPTOR_PROVIDERS = [
{provide: HTTP_INTERCEPTORS, useClass: MfeHttpBackendInterceptor, multi: true},
{provide: HTTP_INTERCEPTORS, useClass: HttpSecurityErrorInterceptor, multi: true},
{provide: HTTP_INTERCEPTORS, useClass: FormDirtyInterceptor, multi: true},
{provide: HTTP_INTERCEPTORS, useClass: TokenInterceptor, multi: true}
];

View file

@ -0,0 +1,62 @@
import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from "@angular/common/http";
import {
AppConfigService,
ApplicationSettingsProvider,
AppVersionService,
TokenHeaderUtil
} from "@webbpm/base-package";
import {Observable} from "rxjs";
import {MfeConfigurationProvider} from "../provider/mfe-configuration.provider";
import {joinPath} from "../../../mfe-app-tools";
export class MfeHttpBackendInterceptor implements HttpInterceptor {
private static readonly CONTENT_TYPE_HEADER = 'Content-Type';
private static readonly ENABLE_VERSION_IN_URL: string = "enable.version.in.url";
private static readonly BACKEND_URL: string = "backend.url";
private static readonly BACKEND_CONTEXT: string = "backend.context";
constructor(private appConfigService: AppConfigService,
private appVersionService: AppVersionService) {
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
req = TokenHeaderUtil.addHeader(
req, MfeHttpBackendInterceptor.CONTENT_TYPE_HEADER, 'application/json;charset=UTF-8'
);
let overrideObj
if (!req.url.startsWith(ApplicationSettingsProvider.RESOURCES_PATH)
&& !req.url.startsWith('http:') && !req.url.startsWith('https:')) {
let appVersionInUrl = this.getVersion();
let backendUrl = this.appConfigService.getParamValue(MfeHttpBackendInterceptor.BACKEND_URL);
let backendContext = this.appConfigService.getParamValue(
MfeHttpBackendInterceptor.BACKEND_CONTEXT);
let url;
if (backendUrl) {
url = backendUrl;
}
else if (backendContext) {
url = joinPath(
MfeConfigurationProvider.MFE_BASE_URL,
backendContext
);
}
else {
url = ApplicationSettingsProvider.BACKEND_URL;
}
overrideObj = {url: `${url}${appVersionInUrl}/${req.url}`};
}
return next.handle(req.clone(overrideObj));
}
private getVersion(): string {
return this.appConfigService.getParamValue(MfeHttpBackendInterceptor.ENABLE_VERSION_IN_URL) ==
"true" ? "-" + this.appVersionService.getAppVersion() : "";
}
}

View file

@ -0,0 +1,38 @@
import {ConfirmExitGuard} from "@webbpm/base-package";
import {RolesGuard} from "../app/guard/RolesGuard";
import {RouterModule, Routes} from "@angular/router";
import {AccessDeniedComponent} from "../app/component/access-denied.component";
import {NgModule} from "@angular/core";
import {APP_BASE_HREF} from "@angular/common";
import {MfeConfigurationProvider} from "./provider/mfe-configuration.provider";
const webbpmRoutes: Routes = [
{
path: 'access-denied',
component: AccessDeniedComponent,
},
{
path: '',
loadChildren: 'generated-sources/page-home.module#PagehomeModule',
canActivate: [ConfirmExitGuard, RolesGuard],
pathMatch: 'full',
},
{
path: '**',
redirectTo: '',
}
];
@NgModule({
providers: [
{provide: APP_BASE_HREF, useFactory: () => MfeConfigurationProvider.getPageBaseUrl()}
],
imports: [RouterModule.forRoot(webbpmRoutes, {
useHash: false,
onSameUrlNavigation: "reload"
})],
exports: [RouterModule]
})
export class MfeWebbpmRoutingModule {
}

View file

@ -0,0 +1,69 @@
import {BrowserAnimationsModule} from "@angular/platform-browser/animations";
import {BrowserModule} from "@angular/platform-browser";
import {FormsModule} from "@angular/forms";
import {NgbModule} from "@ng-bootstrap/ng-bootstrap";
import {ToastNoAnimationModule} from "ngx-toastr";
import {AgGridModule} from "ag-grid-angular";
import {AppRoutingModule} from "../app/app-routing.module";
import {
AppConfigService,
AppVersionService,
BpmnModule,
ComponentsModule,
CoreModule, ProgressIndicationService
} from "@webbpm/base-package";
import {AppModule} from "../app/app.module";
import {MfeWebbpmRoutingModule} from "./mfe-webbpm-routing.module";
import {ErrorHandler, NgModule} from "@angular/core";
import {MfeWrapperComponent} from "./component/mfe-wrapper.component";
import {MfeWebbpmComponent} from "./component/mfe-webbpm.component";
import {AccessDeniedComponent} from "../app/component/access-denied.component";
import {MfeAppVersionService} from "./service/mfe-app-version.service";
import {MfeAppConfigService} from "./service/mfe-app-config.service";
import {GlobalErrorHandler} from "../webbpm/handler/global-error.handler.prod";
import {MfeProgressIndicationService} from "./service/mfe-progress-indication.service";
import {MfeRolesGuard} from "./guard/MfeRolesGuard";
import {RolesGuard} from "../app/guard/RolesGuard";
import {TokenProvider} from "../app/provider/token.provider";
import {MfeTokenProvider} from "./provider/mfe-token.provider";
import {DEFAULT_HTTP_INTERCEPTOR_PROVIDERS} from "./interceptor/mfe-default-interceptors.prod";
let IMPORTS = [
BrowserAnimationsModule,
BrowserModule,
FormsModule,
NgbModule,
ToastNoAnimationModule.forRoot(),
AgGridModule,
AppRoutingModule,
BpmnModule,
CoreModule,
ComponentsModule,
AppModule,
MfeWebbpmRoutingModule
];
@NgModule({
imports: IMPORTS,
declarations: [
MfeWrapperComponent,
MfeWebbpmComponent,
AccessDeniedComponent
],
exports: [],
providers: [
{provide: AppVersionService, useClass: MfeAppVersionService},
{provide: AppConfigService, useClass: MfeAppConfigService},
{provide: ErrorHandler, useClass: GlobalErrorHandler},
{provide: ProgressIndicationService, useClass: MfeProgressIndicationService},
{provide: RolesGuard, useClass: MfeRolesGuard},
{provide: TokenProvider, useClass: MfeTokenProvider},
DEFAULT_HTTP_INTERCEPTOR_PROVIDERS
],
bootstrap: [
MfeWrapperComponent
]
})
export class MfeWebbpmModule {
}

View file

@ -0,0 +1,14 @@
export class MfeConfigurationProvider {
private static config; // way to avoid webpack optimization
public static MFE_BASE_URL = process.env.MFE_BASE_URL || '';
public static BASE_COMPONENT_ATTRIBUTE = 'mfe-webbpm-account-applications';
public static getPageBaseUrl(): string {
return this.config.PAGE_BASE_URL
}
public static setPageBaseUrl(pageBaseUrl: string) {
if (!this.config) this.config = {};
this.config.PAGE_BASE_URL = pageBaseUrl;
}
}

View file

@ -0,0 +1,9 @@
import {TokenProvider} from "../../app/provider/token.provider";
import {fireMfeEventToContainer} from "../../../mfe-app-tools";
export class MfeTokenProvider extends TokenProvider {
getToken(): Promise<string> {
return fireMfeEventToContainer('token-request', {});
}
}

View file

@ -0,0 +1,29 @@
import {Injectable} from "@angular/core";
import {AppConfigService, ApplicationSettingsProvider} from "@webbpm/base-package";
import {HttpClient} from "@angular/common/http";
import {MfeConfigurationProvider} from "../provider/mfe-configuration.provider";
import {joinPath} from "../../../mfe-app-tools";
@Injectable({providedIn:'root'})
export class MfeAppConfigService extends AppConfigService {
load(): Promise<any> {
let http: HttpClient = this['http'];
let url = joinPath(
MfeConfigurationProvider.MFE_BASE_URL,
ApplicationSettingsProvider.RESOURCES_PATH,
'app-config.json'
)
return http
.get(url)
.toPromise()
.then(configData => {
this['mapParam'] = configData;
})
.catch((error: any): any => {
console.error('Account Applications configuration file "app-config.json" could not be read');
return Promise.reject(error);
});
}
}

View file

@ -0,0 +1,30 @@
import {Injectable} from "@angular/core";
import {ApplicationSettingsProvider, AppVersionService} from "@webbpm/base-package";
import {HttpClient} from "@angular/common/http";
import {MfeConfigurationProvider} from "../provider/mfe-configuration.provider";
import {joinPath} from "../../../mfe-app-tools";
@Injectable({providedIn:'root'})
export class MfeAppVersionService extends AppVersionService {
load(): Promise<any> {
let http: HttpClient = this['http'];
let url = joinPath(
MfeConfigurationProvider.MFE_BASE_URL,
ApplicationSettingsProvider.RESOURCES_PATH,
'app.version'
)
return http
.get(url, {responseType: 'text'})
.toPromise()
.then(version => {
this['appVersion'] = version;
console.log(`Account Applications application version = ${version}`);
})
.catch((error: any): any => {
console.error('Account Applications file "app.version" could not be read');
return Promise.reject(error);
});
}
}

View file

@ -0,0 +1,21 @@
import {Injectable} from "@angular/core";
import {AppProgressIndicationService} from "../../app/service/app-progress-indication.service";
import {
AppProgressIndicationComponent
} from "../../app/component/app-progress-indication.component";
@Injectable({providedIn: 'root'})
export class MfeProgressIndicationService extends AppProgressIndicationService {
protected showProgressIndicator() {
const options = {...this.options};
options.container = this.getContainerForProgressIndication();
this.ngbModalRef = this.ngbModal.open(AppProgressIndicationComponent, options);
}
getContainerForProgressIndication(): HTMLElement {
return document.querySelector('mfe-webbpm')
.shadowRoot.querySelector('[webbpm]');
}
}

View file

@ -8,7 +8,12 @@ import {PreviewContainerComponent} from "./component/preview-container.component
import {NgbModule} from "@ng-bootstrap/ng-bootstrap";
import {ToastNoAnimationModule} from "ngx-toastr";
import {AppModule} from "../app/app.module";
import {ComponentsModule, CoreModule, SecurityModule} from "@webbpm/base-package";
import {
ComponentsModule,
CoreModule,
SecurityModule,
TaskParamsProvider
} from "@webbpm/base-package";
import {HTTP_INTERCEPTORS} from "@angular/common/http";
import {HttpPreviewInterceptor} from "./service/http-preview-interceptor.service";
@ -37,6 +42,7 @@ let IMPORTS = [
],
exports: [],
providers: [
TaskParamsProvider,
HTTP_INTERCEPTOR_PROVIDERS
],
bootstrap: [

View file

@ -0,0 +1,49 @@
import {Component} from "@angular/core";
import {Router} from "@angular/router";
import {WebbpmTokenProvider} from "../provider/webbpm-token-provider";
@Component({
moduleId: module.id,
selector: 'token-form',
templateUrl: '../../../../../src/resources/template/webbpm/jwt-form.html'
})
export class TokenFormComponent {
name: string = '';
realm: string = '';
domainId: string = '';
role: string = '';
private readonly encodedHeader = this.encodeBase64Url(JSON.stringify({
kid: "69d4a060-4053-4056-ae69-5e9bcf41125f",
typ: "JWT",
alg: "RS512"
}));
constructor(private router: Router) {
}
public enter() {
localStorage.setItem(WebbpmTokenProvider.ACCESS_TOKEN_STORAGE_KEY, this.generateToken());
this.router.navigateByUrl('');
}
private generateToken(): string {
let claims = {
name: this.name,
realm: this.realm,
domain_id: this.domainId,
roles: [this.role]
};
return `${this.encodedHeader}.${this.encodeBase64Url(JSON.stringify(claims))}.`
}
private encodeBase64Url(input: string): string {
let bytes = new TextEncoder().encode(input);
const byteArray = Array.from(bytes);
const binString = String.fromCharCode(...byteArray);
return btoa(binString).replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=+$/, '');
}
}

View file

@ -0,0 +1,11 @@
import {Injectable} from "@angular/core";
import {RolesGuard} from "../../app/guard/RolesGuard";
import {UrlTree} from "@angular/router";
@Injectable({providedIn: 'root'})
export class WebbpmRolesGuard extends RolesGuard {
protected getUrlOnFailure(): UrlTree {
return this.router.createUrlTree(['token-form']);
}
}

View file

@ -4,9 +4,11 @@ import {
HttpSecurityErrorInterceptor,
HttpSecurityInterceptor
} from "@webbpm/base-package";
import {TokenInterceptor} from "../../app/interceptor/token.interceptor.service";
export const DEFAULT_HTTP_INTERCEPTOR_PROVIDERS = [
{provide: HTTP_INTERCEPTORS, useClass: HttpSecurityInterceptor, multi: true},
{provide: HTTP_INTERCEPTORS, useClass: HttpSecurityErrorInterceptor, multi: true},
{provide: HTTP_INTERCEPTORS, useClass: FormDirtyInterceptor, multi: true}
{provide: HTTP_INTERCEPTORS, useClass: FormDirtyInterceptor, multi: true},
{provide: HTTP_INTERCEPTORS, useClass: TokenInterceptor, multi: true}
];

View file

@ -1,9 +1,11 @@
import {HTTP_INTERCEPTORS} from "@angular/common/http";
import {FormDirtyInterceptor, HttpSecurityInterceptor} from "@webbpm/base-package";
import {DevHttpSecurityErrorInterceptor} from "./http-security-error-interceptor.dev";
import {TokenInterceptor} from "../../app/interceptor/token.interceptor.service";
export const DEFAULT_HTTP_INTERCEPTOR_PROVIDERS = [
{provide: HTTP_INTERCEPTORS, useClass: HttpSecurityInterceptor, multi: true},
{provide: HTTP_INTERCEPTORS, useClass: DevHttpSecurityErrorInterceptor, multi: true},
{provide: HTTP_INTERCEPTORS, useClass: FormDirtyInterceptor, multi: true}
{provide: HTTP_INTERCEPTORS, useClass: FormDirtyInterceptor, multi: true},
{provide: HTTP_INTERCEPTORS, useClass: TokenInterceptor, multi: true}
];

View file

@ -0,0 +1,12 @@
import {TokenProvider} from "../../app/provider/token.provider";
export class WebbpmTokenProvider implements TokenProvider {
public static readonly ACCESS_TOKEN_STORAGE_KEY = 'accessToken'
getToken(): Promise<string> {
return new Promise(resolve => {
resolve(localStorage.getItem(WebbpmTokenProvider.ACCESS_TOKEN_STORAGE_KEY));
});
}
}

View file

@ -1,88 +0,0 @@
import {RouterModule, Routes} from "@angular/router";
import {NgModule} from "@angular/core";
import {
AuthenticationGuard,
ConfirmExitGuard
} from "@webbpm/base-package";
const routes: Routes = [
{
path: 'user-management',
canActivate: [AuthenticationGuard],
children: [
{
path: 'users',
loadChildren: 'generated-sources/page-user-management-users.module#PageusermanagementusersModule',
canActivate: [ConfirmExitGuard]
},
{
path: 'users/new',
loadChildren: 'generated-sources/page-user-management-user-create.module#PageusermanagementusercreateModule',
canActivate: [ConfirmExitGuard]
},
{
path: 'users/:id',
loadChildren: 'generated-sources/page-user-management-user-edit.module#PageusermanagementusereditModule',
canActivate: [ConfirmExitGuard]
},
{
path: 'org-units',
loadChildren: 'generated-sources/page-user-management-org-units.module#PageusermanagementorgunitsModule',
canActivate: [ConfirmExitGuard]
},
{
path: 'org-units/new',
loadChildren: 'generated-sources/page-user-management-org-unit.module#PageusermanagementorgunitModule',
canActivate: [ConfirmExitGuard]
},
{
path: 'org-units/:id',
loadChildren: 'generated-sources/page-user-management-org-unit.module#PageusermanagementorgunitModule',
canActivate: [ConfirmExitGuard]
},
{
path: 'roles',
loadChildren: 'generated-sources/page-user-management-roles.module#PageusermanagementrolesModule',
canActivate: [ConfirmExitGuard]
},
{
path: 'roles/new',
loadChildren: 'generated-sources/page-user-management-role.module#PageusermanagementroleModule',
canActivate: [ConfirmExitGuard]
},
{
path: 'roles/:id',
loadChildren: 'generated-sources/page-user-management-role.module#PageusermanagementroleModule',
canActivate: [ConfirmExitGuard]
},
{
path: 'groups',
loadChildren: 'generated-sources/page-user-management-groups.module#PageusermanagementgroupsModule',
canActivate: [ConfirmExitGuard]
},
{
path: 'groups/new',
loadChildren: 'generated-sources/page-user-management-group-create.module#PageusermanagementgroupcreateModule',
canActivate: [ConfirmExitGuard]
},
{
path: 'groups/:id',
loadChildren: 'generated-sources/page-user-management-group-edit.module#PageusermanagementgroupeditModule',
canActivate: [ConfirmExitGuard]
},
{
path: 'authorities',
loadChildren: 'generated-sources/page-user-management-authorities.module#PageusermanagementauthoritiesModule',
canActivate: [ConfirmExitGuard]
}
]
}
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class UserManagementRoutingModule {
}

View file

@ -1,15 +1,20 @@
import {NgModule} from "@angular/core";
import {RouterModule, Routes} from "@angular/router";
import {
AuthenticationGuard,
ConfirmExitGuard
} from "@webbpm/base-package";
import {TokenFormComponent} from "./component/token-form.component";
import {RolesGuard} from "../app/guard/RolesGuard";
const webbpmRoutes: Routes = [
{
path: 'token-form',
component: TokenFormComponent
},
{
path: '',
loadChildren: 'generated-sources/page-home.module#PagehomeModule',
canActivate: [AuthenticationGuard, ConfirmExitGuard],
canActivate: [ConfirmExitGuard, RolesGuard],
pathMatch: 'full',
},
{

View file

@ -13,12 +13,15 @@ import {
BpmnModule,
ComponentsModule,
CoreModule,
SecurityModule,
} from "@webbpm/base-package";
import {AppRoutingModule} from "../app/app-routing.module";
import {UserManagementRoutingModule} from "./user-management-routing.module";
import {GlobalErrorHandler} from "./handler/global-error.handler.prod";
import {DEFAULT_HTTP_INTERCEPTOR_PROVIDERS} from "./interceptor/default-interceptors.prod";
import {TokenFormComponent} from "./component/token-form.component";
import {WebbpmTokenProvider} from "./provider/webbpm-token-provider";
import {RolesGuard} from "../app/guard/RolesGuard";
import {TokenProvider} from "../app/provider/token.provider";
import {WebbpmRolesGuard} from "./guard/WebbpmRolesGuard";
let IMPORTS = [
BrowserAnimationsModule,
@ -28,11 +31,9 @@ let IMPORTS = [
ToastNoAnimationModule.forRoot(),
AgGridModule,
AppRoutingModule,
UserManagementRoutingModule,
BpmnModule,
CoreModule,
ComponentsModule,
SecurityModule,
AppModule,
WebbpmRoutingModule
];
@ -41,11 +42,14 @@ let IMPORTS = [
imports: IMPORTS,
declarations: [
WebbpmComponent,
HomeComponent
HomeComponent,
TokenFormComponent
],
exports: [],
providers: [
{provide: ErrorHandler, useClass: GlobalErrorHandler},
{provide: TokenProvider, useClass: WebbpmTokenProvider},
{provide: RolesGuard, useClass: WebbpmRolesGuard},
DEFAULT_HTTP_INTERCEPTOR_PROVIDERS
],
bootstrap: [

View file

@ -5,11 +5,19 @@ const CopyWebpackPlugin = require('copy-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const TerserPlugin = require('terser-webpack-plugin');
const Dotenv = require('dotenv-webpack');
const {config} = require('dotenv')
const {
container: {ModuleFederationPlugin}
} = webpack;
const {normalizeCssPaths} = require("./normalize-css-path");
function _path(p) {
return path.join(__dirname, p);
}
config();
module.exports = {
mode: 'production',
entry: {
@ -90,6 +98,14 @@ module.exports = {
},
plugins: [
new Dotenv(),
() => normalizeCssPaths({
paths: [
'./build/resources/css/font-faces.css.shim.ngstyle.js',
'./build/resources/css/style.css.ngstyle.js'
],
outDir: `${process.env.MFE_BASE_URL || ''}/src/resources`,
}),
new HtmlWebpackPlugin({
template: 'index.webpack.html',
filename: 'index.html',
@ -111,6 +127,13 @@ module.exports = {
jQuery: "jquery",
"window.jQuery": "jquery",
Popper: ['popper.js', 'default']
}),
new ModuleFederationPlugin({
name: 'account_applications',
filename: 'remoteEntry.js',
exposes: {
"./account-applications": "./build/scripts/mfe-main.aot",
},
})
],

28
pom.xml
View file

@ -93,6 +93,14 @@
<artifactId>security-esia</artifactId>
<groupId>ru.cg.webbpm.modules.security</groupId>
</exclusion>
<exclusion>
<groupId>ru.cg.webbpm.modules.security</groupId>
<artifactId>security-api</artifactId>
</exclusion>
<exclusion>
<groupId>ru.cg.webbpm.modules.security</groupId>
<artifactId>security-beans</artifactId>
</exclusion>
<exclusion>
<artifactId>security-db-synchronization-api</artifactId>
<groupId>ru.cg.webbpm.modules.security</groupId>
@ -188,16 +196,6 @@
<version>${webbpm-platform.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>ru.cg.webbpm.modules.security</groupId>
<artifactId>security-beans</artifactId>
<version>${webbpm-platform.version}</version>
</dependency>
<dependency>
<groupId>ru.cg.webbpm.modules.security</groupId>
<artifactId>security-api</artifactId>
<version>${webbpm-platform.version}</version>
</dependency>
<dependency>
<groupId>ru.cg.webbpm.modules</groupId>
<artifactId>webkit-rpc</artifactId>
@ -288,16 +286,6 @@
<version>${webbpm-platform.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>ru.cg.webbpm.modules.security</groupId>
<artifactId>security-db-synchronization-api</artifactId>
<version>${webbpm-platform.version}</version>
</dependency>
<dependency>
<groupId>ru.cg.webbpm.modules.security</groupId>
<artifactId>security-db-synchronization-ldap-impl</artifactId>
<version>${webbpm-platform.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<repositories>

View file

@ -39,6 +39,7 @@
<componentRootId>240c9b7b-b6a5-40c9-82f3-c54924205a32</componentRootId>
<name>Vbox</name>
<container>true</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
@ -69,6 +70,7 @@
<componentRootId>5ace6303-ecf8-40a2-ad53-3dc08b46c1e0</componentRootId>
<name>Список заявок</name>
<container>false</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f">
<properties>

View file

@ -1,278 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xmlPage>
<id>user-management-group-edit</id>
<versions>
<studioVersion>3.192.3</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.192.3</value>
</entry>
</packageVersions>
</versions>
<rootObjects id="1011fa6a-8730-41f1-836a-928dc32f1786">
<prototypeId>ed47cfae-64da-4360-8f61-1087179ad78b</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>GroupsEdit</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="88379f0a-c2bf-40d7-81fd-9470ad4ca71e">
<prototypeId>a18909dd-64ee-433f-82b3-70e1917f1b8d</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>Text</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="737b67e2-295f-4356-a1e1-9419344d8c85"/>
<scripts id="a6ccccd9-354c-4725-9d34-c716cf626048"/>
<scripts id="d38c1af5-2bfe-41cd-ab0f-67040f498127"/>
<scripts id="f203f156-be32-4131-9c86-4d6bac6d5d56"/>
</children>
<children id="416cf037-bb57-4fcd-82ed-13f2cd10ce63">
<prototypeId>e2c223a4-377d-49e3-904f-375ca30a08d5</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>Form</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="c4b18ad6-092d-4913-bb1f-1b3b007e632d"/>
<scripts id="c9290870-7915-4826-89ba-1fb86da57701"/>
<scripts id="57779237-6bd7-4f73-ab62-efc79cc249b9"/>
<scripts id="ad6ccafe-914e-4e13-a351-88bf107a5007"/>
<scripts id="9ad247a3-9c46-4f12-9949-b1c905bd73bc"/>
<scripts id="79188cdc-d646-433e-9751-1482b9247ee6"/>
<children id="a9e90772-99a7-42b5-9ca8-c36bec6564eb">
<prototypeId>c629e7bd-878a-4411-9e29-bb44f4c11ba7</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>Горизонтальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0"/>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="e68cd489-ed18-4eab-9d39-5fd5482e8c6e">
<prototypeId>075ead72-0b6f-411f-88b4-69f5ab4a4052</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>Вертикальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="a582ea6f-f0ff-4b3e-906d-3a5a1307b648">
<prototypeId>389e2f20-104b-4136-aba0-3a0ccd45f96e</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>Текст</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="737b67e2-295f-4356-a1e1-9419344d8c85"/>
<scripts id="a6ccccd9-354c-4725-9d34-c716cf626048"/>
<scripts id="d38c1af5-2bfe-41cd-ab0f-67040f498127"/>
<scripts id="f203f156-be32-4131-9c86-4d6bac6d5d56"/>
</children>
<children id="428a6d51-0834-4bd6-b684-7fcf98acc76a">
<prototypeId>d2a08a08-2807-4471-a2b5-f7a78fd1bb0d</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>name</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="2afb923f-8d5a-4159-92e1-36e29eecf796"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
</children>
<children id="ea085755-0129-496a-b0c1-c2927c2a422c">
<prototypeId>76cc68cf-575a-46a0-8ca2-31109c3963c4</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>created</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="5274357c-ce77-4621-8965-bd9c80700008"/>
<scripts id="b3e71640-b543-46be-a190-c6d177d1831b"/>
<scripts id="f45759cb-b51a-4ba8-9608-6393ca82d8ae"/>
<scripts id="65fc388a-1f45-42ac-91d0-6b8b8b6d1f94"/>
<scripts id="8bd1dd61-b5ba-4ba4-8abb-2af9efd5380f"/>
<scripts id="0d25bd04-4c45-4cb3-8e9a-b13ff7118a07"/>
</children>
<children id="40d996a3-c4d2-496e-91ca-57be92216c6d">
<prototypeId>0a47e758-c21e-4f8a-92bf-150c872b58ed</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>updated</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="5274357c-ce77-4621-8965-bd9c80700008"/>
<scripts id="f5c00722-9832-479d-bbe4-3c1295889a49"/>
<scripts id="65fc388a-1f45-42ac-91d0-6b8b8b6d1f94"/>
<scripts id="8bd1dd61-b5ba-4ba4-8abb-2af9efd5380f"/>
<scripts id="0d25bd04-4c45-4cb3-8e9a-b13ff7118a07"/>
</children>
<children id="37ad6604-73e5-441d-aca5-26b58329fea0">
<prototypeId>ae991562-f703-4403-8d49-a0e5e540bc6c</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>access_level</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="23992f0e-94ed-4fb4-b4d1-dc6ad7f13227"/>
<scripts id="efb0fec7-9951-4b36-bbda-fa17aa002d74"/>
<scripts id="4d028ea6-e4a3-4acf-bd60-de7aa1a78f71"/>
<scripts id="9f543b36-92e3-4a63-b8db-a4d7e852113e"/>
<scripts id="47f307b6-79a7-4c9a-96d6-6ee423565f02"/>
<scripts id="fc2918be-82e7-46af-b195-8c7e2e809e76"/>
</children>
</children>
<children id="3d388cd2-79ad-4613-aeec-5f1af3811a20">
<prototypeId>41774d7b-90c5-4bc0-a563-509d036206e3</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>Вертикальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="4e5d7521-ffee-4fab-a14c-5c6c3dc1fc88">
<prototypeId>4eb50f01-cccc-4f3a-b66d-4d57dde0a212</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>Text</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="737b67e2-295f-4356-a1e1-9419344d8c85"/>
<scripts id="a6ccccd9-354c-4725-9d34-c716cf626048"/>
<scripts id="d38c1af5-2bfe-41cd-ab0f-67040f498127"/>
<scripts id="f203f156-be32-4131-9c86-4d6bac6d5d56"/>
</children>
<children id="3509049c-0a5f-4c61-ae9f-fd8eca34c540">
<prototypeId>704d07af-1823-48d6-acad-83771428be38</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>HBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0"/>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="e1dd4cec-c17d-47bf-9d51-efbbf0b30118">
<prototypeId>528504db-2727-4750-92a9-5f09dacc781d</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>AvailableRecordsGrid</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="53cc1ea5-3feb-4a45-b8cd-44f010fa2800"/>
<scripts id="5a788014-f258-4cf9-890d-1ae696047a8b"/>
<scripts id="1996166f-7922-4f28-a571-9646d956ef37"/>
<scripts id="bd96fb29-7063-450a-aa4d-a0cf4945de61"/>
<scripts id="d56d612f-ce74-4a1c-9a7e-1d9bfb77360c"/>
<scripts id="067f1a83-dd56-4884-91ac-52bb91d69a58"/>
<scripts id="d7448a99-b5e2-413b-b0f0-68efd4b4c189"/>
</children>
<children id="02cebd3f-b9ee-49f0-8a69-a29aacc6de0e">
<prototypeId>e791675f-a1d1-402b-afe1-556b434b1248</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>Buttons</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="490e497c-1ab3-4663-8825-9df069772ce2">
<prototypeId>6731261c-f859-489e-9ca9-08b33aa77b58</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>Add</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b06faf2e-48d8-4094-ae08-5dad718007d3"/>
</children>
<children id="c9c6a534-d10b-42b3-9036-875c9cc8311c">
<prototypeId>639fa2da-bdb2-4d26-97db-4a2bef4cfb81</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>AddAll</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="cd544d24-e341-43a2-8a47-01115e200e08"/>
</children>
<children id="f36f1926-a477-4f1f-920f-74acbef4488e">
<prototypeId>291de4f8-51a4-4331-b26c-5994e9de5697</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>Remove</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="7b247053-e690-44e7-ad8b-82f574bc7d6d"/>
</children>
<children id="f1938d22-176a-4a8a-8b0b-058f8a9e33e1">
<prototypeId>366c5745-c04f-4d11-a652-54abe1a5d4ca</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>RemoveAll</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="5bb38c78-84e3-4c42-9fef-5183111ad1aa"/>
</children>
</children>
<children id="c872b8da-dd07-4dcf-a34b-bb8623ec9f86">
<prototypeId>76735e43-2b8f-440a-abd1-80c556326763</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>LinkFieldDialog</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="4bb5549d-f484-40da-99d1-998c8c963789"/>
<scripts id="a3fe02c2-a871-481f-bbed-a278b2ce8b13"/>
<scripts id="b500faf2-33d5-47ba-8bd0-b17670edc9df"/>
<scripts id="603631c2-ddf5-400f-8238-7844782ed5fb"/>
<scripts id="01009323-fac3-43d6-9c9c-d40ddd537cfe"/>
<scripts id="e8d7e9c0-afbd-4e9e-a475-00e5ad024d6d"/>
<scripts id="39608513-f2fe-47d8-83ae-f4e34ee43cdb"/>
<scripts id="1f62bddb-0b1c-4da1-bfa2-c1ac10d82734"/>
</children>
</children>
</children>
</children>
</children>
<children id="04a93467-aba1-4e58-9fe2-d3896b1970b4">
<prototypeId>fb5e15d6-c838-4fa7-b20d-714a2abd03a6</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>HBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0"/>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="45eb6d3b-413f-46aa-b090-8c6bb4711706">
<prototypeId>3a2c64e6-edcf-4058-9a02-897b6dc9704e</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>save-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
</children>
<children id="1e6e1037-43c2-40a6-b891-932efa9f3f43">
<prototypeId>29e058b0-bc2a-45bb-8422-2922881db1be</prototypeId>
<componentRootId>1011fa6a-8730-41f1-836a-928dc32f1786</componentRootId>
<name>exit-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf66c344-2cff-4d84-9c6c-d4405c2bfb02"/>
</children>
</children>
</rootObjects>
</xmlPage>

View file

@ -1,280 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xmlPage>
<id>user-management-group-create</id>
<versions>
<studioVersion>3.192.3</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.192.3</value>
</entry>
</packageVersions>
</versions>
<rootObjects id="deab5d8f-591d-41b4-8485-1c5d3ef48a16">
<prototypeId>ca7390f1-1891-4161-b8ae-ef66de5776b7</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>GroupsCreate</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="f4f2612c-1d3a-4549-8172-ac6dc1c3ee16">
<prototypeId>fa5b05d3-871d-4be9-b8f5-8912dfb35d45</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>Text</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="737b67e2-295f-4356-a1e1-9419344d8c85"/>
<scripts id="a6ccccd9-354c-4725-9d34-c716cf626048"/>
<scripts id="d38c1af5-2bfe-41cd-ab0f-67040f498127"/>
<scripts id="f203f156-be32-4131-9c86-4d6bac6d5d56"/>
</children>
<children id="cf877d06-80d5-4759-8b98-45dc72b50aec">
<prototypeId>bcb8e5ad-b8e7-44b0-a145-13de809dbf33</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>Form</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="c4b18ad6-092d-4913-bb1f-1b3b007e632d"/>
<scripts id="c9290870-7915-4826-89ba-1fb86da57701"/>
<scripts id="57779237-6bd7-4f73-ab62-efc79cc249b9"/>
<scripts id="ad6ccafe-914e-4e13-a351-88bf107a5007"/>
<scripts id="9ad247a3-9c46-4f12-9949-b1c905bd73bc"/>
<scripts id="79188cdc-d646-433e-9751-1482b9247ee6"/>
<children id="b36d01d8-b90a-4fe0-861c-f422d28c8b9c">
<prototypeId>ff9f35ed-bf7f-42c0-8479-068abaa39911</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>Горизонтальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0"/>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="06b7502f-af4e-48b0-b70b-cad24916ed08">
<prototypeId>624bdc70-52da-4c81-8033-316b3309260e</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>Вертикальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="a93da22c-cecb-46f5-99d9-0ee513a5af9b">
<prototypeId>4cde8573-92ae-4c4c-9428-d7d852e78c62</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>Текст</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="737b67e2-295f-4356-a1e1-9419344d8c85"/>
<scripts id="a6ccccd9-354c-4725-9d34-c716cf626048"/>
<scripts id="d38c1af5-2bfe-41cd-ab0f-67040f498127"/>
<scripts id="f203f156-be32-4131-9c86-4d6bac6d5d56"/>
</children>
<children id="22193dbb-84ba-4975-a330-c39f0f0c6081">
<prototypeId>485b6e35-2b31-4d0e-8ce8-fe03980ea0d8</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>name</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="2afb923f-8d5a-4159-92e1-36e29eecf796"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
</children>
<children id="92482f1c-3d46-4ea4-8325-33aad15c1f6e">
<prototypeId>0233b718-9edb-4650-863d-298d21d16aee</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>created</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="5274357c-ce77-4621-8965-bd9c80700008"/>
<scripts id="b3e71640-b543-46be-a190-c6d177d1831b"/>
<scripts id="f45759cb-b51a-4ba8-9608-6393ca82d8ae"/>
<scripts id="65fc388a-1f45-42ac-91d0-6b8b8b6d1f94"/>
<scripts id="8bd1dd61-b5ba-4ba4-8abb-2af9efd5380f"/>
<scripts id="0d25bd04-4c45-4cb3-8e9a-b13ff7118a07"/>
</children>
<children id="4179724d-9475-48fe-aa61-406e711de868">
<prototypeId>5b38db22-58c4-4d64-b5ee-b252e7b0bd66</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>updated</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="5274357c-ce77-4621-8965-bd9c80700008"/>
<scripts id="f5c00722-9832-479d-bbe4-3c1295889a49"/>
<scripts id="65fc388a-1f45-42ac-91d0-6b8b8b6d1f94"/>
<scripts id="8bd1dd61-b5ba-4ba4-8abb-2af9efd5380f"/>
<scripts id="0d25bd04-4c45-4cb3-8e9a-b13ff7118a07"/>
</children>
<children id="23f22090-1e2a-46d5-b864-a780b83cd6f7">
<prototypeId>1aa93ca2-3ba3-4ac8-bcae-4307ceb4d3cf</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>access_level</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="23992f0e-94ed-4fb4-b4d1-dc6ad7f13227"/>
<scripts id="efb0fec7-9951-4b36-bbda-fa17aa002d74"/>
<scripts id="4d028ea6-e4a3-4acf-bd60-de7aa1a78f71"/>
<scripts id="9f543b36-92e3-4a63-b8db-a4d7e852113e"/>
<scripts id="47f307b6-79a7-4c9a-96d6-6ee423565f02"/>
<scripts id="fc2918be-82e7-46af-b195-8c7e2e809e76"/>
</children>
</children>
<children id="fc8959f2-cc4e-486a-a6c9-a09aa8e6bde8">
<prototypeId>8e395fd7-a9b5-4eae-8c95-72e594ee3357</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>Вертикальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="bfd36a70-07f7-4f5c-b5f6-ff081362efa4">
<prototypeId>91956fb3-8832-4572-9823-df2e83ab8922</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>Text</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="737b67e2-295f-4356-a1e1-9419344d8c85"/>
<scripts id="a6ccccd9-354c-4725-9d34-c716cf626048"/>
<scripts id="d38c1af5-2bfe-41cd-ab0f-67040f498127"/>
<scripts id="f203f156-be32-4131-9c86-4d6bac6d5d56"/>
</children>
<children id="ada5c559-9fbb-4a01-9771-e373daadd1d8">
<prototypeId>7d4e83a4-45d2-45a5-a778-40d0c0f4aa3a</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>HBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0"/>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="0946ea72-2204-49eb-ad5e-27e5b841af74">
<prototypeId>ed5afd59-d3c6-42b1-8744-687909c3f2dc</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>AvailableRecordsGrid</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="53cc1ea5-3feb-4a45-b8cd-44f010fa2800"/>
<scripts id="5a788014-f258-4cf9-890d-1ae696047a8b"/>
<scripts id="1996166f-7922-4f28-a571-9646d956ef37"/>
<scripts id="bd96fb29-7063-450a-aa4d-a0cf4945de61"/>
<scripts id="d56d612f-ce74-4a1c-9a7e-1d9bfb77360c"/>
<scripts id="067f1a83-dd56-4884-91ac-52bb91d69a58"/>
<scripts id="d7448a99-b5e2-413b-b0f0-68efd4b4c189"/>
</children>
<children id="0c89ba47-95ae-429e-9578-3fb08a768abf">
<prototypeId>2272444f-bb2b-4c87-a54e-7c44a5cdc67a</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>Buttons</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="157d1023-a926-4598-b6a4-368fba814637">
<prototypeId>b33d3f9b-74a1-4c30-a5a6-da14bf2b8c7d</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>Add</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b06faf2e-48d8-4094-ae08-5dad718007d3"/>
</children>
<children id="e946836f-5e7c-42b8-9af7-5dce0ceab519">
<prototypeId>bc429b81-de76-48e1-834f-7757ab4c97a1</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>AddAll</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="cd544d24-e341-43a2-8a47-01115e200e08"/>
</children>
<children id="7ba0d1e9-e12c-404d-a13f-9d10f1c8b5c4">
<prototypeId>84165e8b-829a-4656-a2e9-4ca87cfd217e</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>Remove</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="7b247053-e690-44e7-ad8b-82f574bc7d6d"/>
</children>
<children id="0269bd1e-5848-4f41-91d0-7a9dca2ab66b">
<prototypeId>49906463-bdeb-424c-aa70-afec7bc4da20</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>RemoveAll</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="5bb38c78-84e3-4c42-9fef-5183111ad1aa"/>
</children>
</children>
<children id="df161b5c-9a26-4129-a047-827e2cd4e8b2">
<prototypeId>ed375b71-5f95-43af-ae69-5a5eacb3f479</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>LinkFieldDialog</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="4bb5549d-f484-40da-99d1-998c8c963789"/>
<scripts id="a3fe02c2-a871-481f-bbed-a278b2ce8b13"/>
<scripts id="b500faf2-33d5-47ba-8bd0-b17670edc9df"/>
<scripts id="603631c2-ddf5-400f-8238-7844782ed5fb"/>
<scripts id="01009323-fac3-43d6-9c9c-d40ddd537cfe"/>
<scripts id="e8d7e9c0-afbd-4e9e-a475-00e5ad024d6d">
<enabled>false</enabled>
</scripts>
<scripts id="39608513-f2fe-47d8-83ae-f4e34ee43cdb"/>
<scripts id="a35eb2bb-94e7-4903-bb1c-a045d93782ba"/>
</children>
</children>
</children>
</children>
</children>
<children id="560e796d-14ba-489a-9e0a-1a648cf73e3a">
<prototypeId>a65dbf74-aa81-4b28-b008-2df11395b9f8</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>HBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0"/>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="5e246e93-5fb6-4c2c-8eed-e792e6ad5735">
<prototypeId>b9463b17-97c1-4c49-9fc7-e4ee9bb621dd</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>save-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
</children>
<children id="1c0dc06e-76c8-4a6b-b73e-d5b9eae9b2cd">
<prototypeId>0b170e2b-a865-4aca-a9da-c7da77d9b0fd</prototypeId>
<componentRootId>deab5d8f-591d-41b4-8485-1c5d3ef48a16</componentRootId>
<name>exit-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf66c344-2cff-4d84-9c6c-d4405c2bfb02"/>
</children>
</children>
</rootObjects>
</xmlPage>

View file

@ -1,229 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xmlPage>
<id>user-management-groups</id>
<versions>
<studioVersion>3.192.3</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.192.3</value>
</entry>
</packageVersions>
</versions>
<rootObjects id="edc984f0-039d-4fa6-93d2-df03bf6dc08c">
<prototypeId>0f8d0a8b-8014-4367-8ff3-7f049c284978</prototypeId>
<componentRootId>edc984f0-039d-4fa6-93d2-df03bf6dc08c</componentRootId>
<name>Groups</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>DefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="4edaccaa-ce4f-4703-a698-f4170aa9df5f">
<prototypeId>7a7ae21a-2c01-49ee-a2d4-22f933d9445c</prototypeId>
<componentRootId>edc984f0-039d-4fa6-93d2-df03bf6dc08c</componentRootId>
<name>Text</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="737b67e2-295f-4356-a1e1-9419344d8c85"/>
<scripts id="a6ccccd9-354c-4725-9d34-c716cf626048"/>
<scripts id="d38c1af5-2bfe-41cd-ab0f-67040f498127"/>
<scripts id="f203f156-be32-4131-9c86-4d6bac6d5d56"/>
</children>
<children id="a81d3587-d5b7-44f1-8cdd-af797162f818">
<prototypeId>9055eba3-0243-4746-9890-70b486c3fb8d</prototypeId>
<componentRootId>edc984f0-039d-4fa6-93d2-df03bf6dc08c</componentRootId>
<name>FilterGroup</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="3f5f352c-1a86-4702-a914-6c163c903157">
<properties>
<entry>
<key>filterableComp</key>
<value>
<simple>null</simple>
</value>
</entry>
</properties>
</scripts>
<scripts id="b5dcccfd-643a-4c8c-aa3b-a44da851a86a">
<properties>
<entry>
<key>filterable</key>
<value>
<simple>{"objectId":"1ddc006e-75b2-4103-87e1-7991c9f3520d","packageName":"rpc","className":"GridRpcService","type":"JAVA"}</simple>
</value>
</entry>
</properties>
</scripts>
<scripts id="f3aff680-1783-45ac-9dcc-fc7f76fd8110">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>DefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="7176bfcf-d736-48a3-b620-6a77412d4026"/>
<scripts id="21c9994a-3743-4adb-ae52-130f48aeab83"/>
<scripts id="fc0d4368-d207-4b1f-b9e9-4bb06ae7291f"/>
<children id="96fa1a5d-b031-477c-ba1b-467b84479a5e">
<prototypeId>9c81110c-d0d5-4d2a-afa8-e5b093ad47ba</prototypeId>
<componentRootId>edc984f0-039d-4fa6-93d2-df03bf6dc08c</componentRootId>
<name>search</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="734c5516-d349-4b42-a92a-4469760104fe"/>
<scripts id="03303cda-9195-45db-8a93-4b3e9340d506"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
</children>
</children>
<children id="ab666d58-a9b4-417c-9da9-eab2e0b6a958">
<prototypeId>1ddc006e-75b2-4103-87e1-7991c9f3520d</prototypeId>
<componentRootId>edc984f0-039d-4fa6-93d2-df03bf6dc08c</componentRootId>
<name>Grid</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="1996166f-7922-4f28-a571-9646d956ef37"/>
<scripts id="c3c97f9e-5b9a-488b-ae19-6e4cb8fd0835"/>
<scripts id="7f3a1500-8834-4e0b-ac07-1e3ca79893b8"/>
<scripts id="0e46c03a-886b-47bb-8ac0-ebd6c4e1fed8"/>
</children>
<children id="e244a39f-355f-4e67-9794-7d831a70fbd2">
<prototypeId>3ae192dd-d45b-4c23-bd8d-b386abda0273</prototypeId>
<componentRootId>edc984f0-039d-4fa6-93d2-df03bf6dc08c</componentRootId>
<name>HBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>DefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="d47c01f2-6c2e-46f9-a793-1303e9f4cc6c">
<prototypeId>18b01c4c-1c1d-4436-870d-7541a72648b6</prototypeId>
<componentRootId>edc984f0-039d-4fa6-93d2-df03bf6dc08c</componentRootId>
<name>create-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf66c344-2cff-4d84-9c6c-d4405c2bfb02"/>
<scripts id="6ff714a8-34a6-405c-a8de-2a309a2eb1d2"/>
</children>
<children id="7cf8274b-2beb-4353-9769-f3fe63829de0">
<prototypeId>5c8de2f4-6849-48bc-b8dd-36e649ad2540</prototypeId>
<componentRootId>edc984f0-039d-4fa6-93d2-df03bf6dc08c</componentRootId>
<name>edit-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="d9f3e73e-a18c-4ff6-80f5-0698f90db0c3"/>
<scripts id="a6cc52aa-12b6-4324-bac9-4119103f77b2"/>
</children>
<children id="3556a56a-df79-4417-8ab5-9bd428c13911">
<prototypeId>4a9e9ed8-9936-428d-8ddd-4502e2a55700</prototypeId>
<componentRootId>edc984f0-039d-4fa6-93d2-df03bf6dc08c</componentRootId>
<name>delete-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0d"/>
<scripts id="3b670fbf-d046-4d08-9bbe-c9cc320b5473"/>
</children>
<children id="a6183d73-802d-4d37-91d4-24bc28bc115c">
<prototypeId>26d4430f-ddf1-4997-83c5-0009edf32719</prototypeId>
<componentRootId>edc984f0-039d-4fa6-93d2-df03bf6dc08c</componentRootId>
<name>ac-create</name>
<container>false</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
<children id="9b918034-46dc-4509-ac72-88fa885261ef">
<prototypeId>15964601-92db-4da1-a279-5664844a0bf5</prototypeId>
<componentRootId>edc984f0-039d-4fa6-93d2-df03bf6dc08c</componentRootId>
<name>ac-edit</name>
<container>false</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
<children id="16e939af-7075-4ca1-99a6-ff426217a9df">
<prototypeId>c4317a56-f9f6-4ea1-90bc-776c3bfaa8c0</prototypeId>
<componentRootId>edc984f0-039d-4fa6-93d2-df03bf6dc08c</componentRootId>
<name>ac-delete</name>
<container>false</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
</children>
<children id="d04b2db6-18f5-4f6a-b786-93d2350ade81">
<prototypeId>6c034de2-0633-4f45-9ba1-625a00421718</prototypeId>
<componentRootId>edc984f0-039d-4fa6-93d2-df03bf6dc08c</componentRootId>
<name>Roles</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="737b67e2-295f-4356-a1e1-9419344d8c85"/>
<scripts id="a6ccccd9-354c-4725-9d34-c716cf626048"/>
<scripts id="d38c1af5-2bfe-41cd-ab0f-67040f498127"/>
<scripts id="f203f156-be32-4131-9c86-4d6bac6d5d56"/>
</children>
<children id="81c443eb-55f8-4504-b5d9-4a71d3c70a3a">
<prototypeId>3acecb3c-c1d3-4a1e-9873-1c6050ff74f0</prototypeId>
<componentRootId>edc984f0-039d-4fa6-93d2-df03bf6dc08c</componentRootId>
<name>RolesGrid</name>
<container>false</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="1996166f-7922-4f28-a571-9646d956ef37"/>
<scripts id="c3c97f9e-5b9a-488b-ae19-6e4cb8fd0835"/>
<scripts id="9ce2d664-4bee-41cb-b226-77bd8322ede1"/>
<scripts id="8338dd50-04dc-497c-bfaf-720a8c7509ff"/>
</children>
</rootObjects>
</xmlPage>

View file

@ -1,168 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xmlPage>
<id>user-management-org-units</id>
<versions>
<studioVersion>3.192.3</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.192.3</value>
</entry>
</packageVersions>
</versions>
<rootObjects id="73bf62ed-7cbe-4b46-be5e-5669e5e3f2f3">
<prototypeId>5cc0e63d-f697-47a8-a9dc-3170f1a99721</prototypeId>
<componentRootId>73bf62ed-7cbe-4b46-be5e-5669e5e3f2f3</componentRootId>
<name>Organizations</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="886ac172-506a-4fa4-8206-1a96f32d354d">
<prototypeId>c262a5da-38cb-4739-9d59-3bb7fdf55e26</prototypeId>
<componentRootId>73bf62ed-7cbe-4b46-be5e-5669e5e3f2f3</componentRootId>
<name>Текст</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="737b67e2-295f-4356-a1e1-9419344d8c85"/>
<scripts id="a6ccccd9-354c-4725-9d34-c716cf626048"/>
<scripts id="d38c1af5-2bfe-41cd-ab0f-67040f498127"/>
<scripts id="f203f156-be32-4131-9c86-4d6bac6d5d56"/>
</children>
<children id="87577f03-906e-427a-bce4-316a575c5c43">
<prototypeId>2c143f13-f25f-49e2-8615-aa76a1dac394</prototypeId>
<componentRootId>73bf62ed-7cbe-4b46-be5e-5669e5e3f2f3</componentRootId>
<name>Группа фильтров</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="3f5f352c-1a86-4702-a914-6c163c903157">
<properties>
<entry>
<key>filterableComp</key>
<value>
<simple>null</simple>
</value>
</entry>
</properties>
</scripts>
<scripts id="b5dcccfd-643a-4c8c-aa3b-a44da851a86a">
<properties>
<entry>
<key>filterable</key>
<value>
<simple>{"objectId":"2db7e240-3978-4826-aa2d-4d031cb0e7a0","packageName":"rpc","className":"TreeGridRpcService","type":"JAVA"}</simple>
</value>
</entry>
</properties>
</scripts>
<scripts id="f3aff680-1783-45ac-9dcc-fc7f76fd8110"/>
<scripts id="7176bfcf-d736-48a3-b620-6a77412d4026"/>
<scripts id="21c9994a-3743-4adb-ae52-130f48aeab83"/>
<scripts id="fc0d4368-d207-4b1f-b9e9-4bb06ae7291f"/>
<children id="8255eac9-f9c8-4f58-96e0-a8f377f6066f">
<prototypeId>d64cc9e2-4e33-4a5d-9792-d4ac8f5a5754</prototypeId>
<componentRootId>73bf62ed-7cbe-4b46-be5e-5669e5e3f2f3</componentRootId>
<name>Фильтр по текстовому полю</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="734c5516-d349-4b42-a92a-4469760104fe"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="2132ba87-abe7-4551-b54e-fe5ea10ef290"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
</children>
</children>
<children id="9484883a-3a6b-45d5-93c6-695ee47912db">
<prototypeId>2db7e240-3978-4826-aa2d-4d031cb0e7a0</prototypeId>
<componentRootId>73bf62ed-7cbe-4b46-be5e-5669e5e3f2f3</componentRootId>
<name>Древовидная таблица</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="a01d4d82-4ab0-4fa0-8e33-a241da64767e"/>
<scripts id="9d216075-d5a5-4313-a8b2-ba32d8b9a84b"/>
<scripts id="a5fa4588-3c5f-4c17-9a11-82180ed166cc"/>
</children>
<children id="5427dd68-37d7-42e4-bf21-805f9b9b9b98">
<prototypeId>e3ca31f5-4ec1-45a9-b195-94806048ba3f</prototypeId>
<componentRootId>73bf62ed-7cbe-4b46-be5e-5669e5e3f2f3</componentRootId>
<name>Горизонтальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0"/>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="8ab6ea3a-d30f-4057-ae3a-9a694183cee8">
<prototypeId>480a06a2-f4b1-46eb-bf3f-0e4097460719</prototypeId>
<componentRootId>73bf62ed-7cbe-4b46-be5e-5669e5e3f2f3</componentRootId>
<name>create-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf66c344-2cff-4d84-9c6c-d4405c2bfb02"/>
<scripts id="6ff714a8-34a6-405c-a8de-2a309a2eb1d2"/>
</children>
<children id="25ec66d2-6da6-4db8-94a5-d50486864135">
<prototypeId>653b6b0c-072c-40d1-bcc0-41157a888fad</prototypeId>
<componentRootId>73bf62ed-7cbe-4b46-be5e-5669e5e3f2f3</componentRootId>
<name>edit-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="d9f3e73e-a18c-4ff6-80f5-0698f90db0c3"/>
<scripts id="a6cc52aa-12b6-4324-bac9-4119103f77b2"/>
</children>
<children id="122b0f68-53c9-4d94-8c69-e83df0ed665f">
<prototypeId>e61b659b-d293-4005-a1c2-0d110d058c52</prototypeId>
<componentRootId>73bf62ed-7cbe-4b46-be5e-5669e5e3f2f3</componentRootId>
<name>delete-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0d"/>
<scripts id="3b670fbf-d046-4d08-9bbe-c9cc320b5473"/>
</children>
<children id="804d0b5e-0d3c-4421-9e9c-de178b0e5f71">
<prototypeId>a01d154c-55fe-4a77-97b0-e2e90ce5e370</prototypeId>
<componentRootId>73bf62ed-7cbe-4b46-be5e-5669e5e3f2f3</componentRootId>
<name>ac-create</name>
<container>false</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
<children id="3e721c29-8137-489c-a318-5b50e517db42">
<prototypeId>8ec15acd-7973-4f09-8723-3c69ec829f78</prototypeId>
<componentRootId>73bf62ed-7cbe-4b46-be5e-5669e5e3f2f3</componentRootId>
<name>ac-edit</name>
<container>false</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
<children id="6477da51-5f38-4128-88c6-ce5cf72b1c9a">
<prototypeId>885a70ad-e6fd-4a17-a9ac-66c326c117fe</prototypeId>
<componentRootId>73bf62ed-7cbe-4b46-be5e-5669e5e3f2f3</componentRootId>
<name>ac-delete</name>
<container>false</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
</children>
</rootObjects>
</xmlPage>

View file

@ -1,225 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xmlPage>
<id>user-management-org-unit</id>
<versions>
<studioVersion>3.192.3</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.192.3</value>
</entry>
</packageVersions>
</versions>
<rootObjects id="0e7f6825-534f-4eba-9ec6-c43cbad07636">
<prototypeId>63022aff-e117-4b58-88ac-8e230b0e9b22</prototypeId>
<componentRootId>0e7f6825-534f-4eba-9ec6-c43cbad07636</componentRootId>
<name>OrganizationEdit</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>BpmnDefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="4396436c-370e-48df-bea2-589b57874947">
<prototypeId>2b44d4d9-20e0-49be-8a98-993fd14f7be5</prototypeId>
<componentRootId>0e7f6825-534f-4eba-9ec6-c43cbad07636</componentRootId>
<name>Текст</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="737b67e2-295f-4356-a1e1-9419344d8c85"/>
<scripts id="a6ccccd9-354c-4725-9d34-c716cf626048"/>
<scripts id="d38c1af5-2bfe-41cd-ab0f-67040f498127"/>
<scripts id="f203f156-be32-4131-9c86-4d6bac6d5d56"/>
</children>
<children id="65d273bf-d2a9-45a7-a84d-a88de09b4ad6">
<prototypeId>ff113441-2a31-440c-9c81-a987176bff61</prototypeId>
<componentRootId>0e7f6825-534f-4eba-9ec6-c43cbad07636</componentRootId>
<name>Форма</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="c4b18ad6-092d-4913-bb1f-1b3b007e632d"/>
<scripts id="c9290870-7915-4826-89ba-1fb86da57701"/>
<scripts id="57779237-6bd7-4f73-ab62-efc79cc249b9">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>BpmnDefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="ad6ccafe-914e-4e13-a351-88bf107a5007"/>
<scripts id="9ad247a3-9c46-4f12-9949-b1c905bd73bc"/>
<scripts id="79188cdc-d646-433e-9751-1482b9247ee6"/>
<children id="0880b7bf-45bc-4be7-bb35-41099723257b">
<prototypeId>bd8deb9b-95ce-4849-b214-19cb36d94830</prototypeId>
<componentRootId>0e7f6825-534f-4eba-9ec6-c43cbad07636</componentRootId>
<name>Горизонтальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>BpmnDefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="ba4f580e-2f2d-4617-bb7b-0126f5aa5f61">
<prototypeId>b994094c-96bb-476f-8f92-f5fa3c2961bd</prototypeId>
<componentRootId>0e7f6825-534f-4eba-9ec6-c43cbad07636</componentRootId>
<name>Вертикальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>BpmnDefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="ce6f98f4-039b-4f06-9b14-7311856a8fbc">
<prototypeId>51b5145b-92ca-42be-9aa4-9402abe670c7</prototypeId>
<componentRootId>0e7f6825-534f-4eba-9ec6-c43cbad07636</componentRootId>
<name>Выпадающий список (с возможностью сохранения)</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="23992f0e-94ed-4fb4-b4d1-dc6ad7f13227"/>
<scripts id="efb0fec7-9951-4b36-bbda-fa17aa002d74"/>
<scripts id="c00949dd-0091-483c-bbf1-6e8f7f091869"/>
<scripts id="4d028ea6-e4a3-4acf-bd60-de7aa1a78f71"/>
<scripts id="9f543b36-92e3-4a63-b8db-a4d7e852113e"/>
<scripts id="47f307b6-79a7-4c9a-96d6-6ee423565f02"/>
</children>
<children id="f09552c8-353c-4d4b-b48b-437e5bc3df1c">
<prototypeId>64e9908e-1afc-4ae1-adb3-512576ea8ff4</prototypeId>
<componentRootId>0e7f6825-534f-4eba-9ec6-c43cbad07636</componentRootId>
<name>Текстовое поле (с возможностью сохранения)</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="319aadc0-25fa-45fb-a2a5-3f27c6590bfe"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
</children>
<children id="db2b1414-6f6e-43c7-8e39-143c058bf7f5">
<prototypeId>f8640cfc-d68c-4596-80a5-0ecb2c6ce5a4</prototypeId>
<componentRootId>0e7f6825-534f-4eba-9ec6-c43cbad07636</componentRootId>
<name>Текстовое поле (с возможностью сохранения)</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="2731eb56-349b-437c-8fae-363aef0659d1"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
</children>
</children>
<children id="4444efaf-aaa4-4c35-88a7-5fa0ec778948">
<prototypeId>10165a7a-48db-42dc-882e-afcfad67717a</prototypeId>
<componentRootId>0e7f6825-534f-4eba-9ec6-c43cbad07636</componentRootId>
<name>Вертикальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>BpmnDefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
</children>
</children>
</children>
<children id="dcf31202-99b5-4867-b220-d75b18292462">
<prototypeId>1bb8d3bb-5e09-49ba-8169-488e55f2285a</prototypeId>
<componentRootId>0e7f6825-534f-4eba-9ec6-c43cbad07636</componentRootId>
<name>Горизонтальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>BpmnDefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="32d9efda-4f8e-416b-880f-66df6b279b5e">
<prototypeId>e426c18f-190b-4dac-be54-dad7a39d2000</prototypeId>
<componentRootId>0e7f6825-534f-4eba-9ec6-c43cbad07636</componentRootId>
<name>save-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
</children>
<children id="3eca6d40-ee3d-4460-a0c1-f21aa1d6cf2c">
<prototypeId>7ca91a23-0453-4875-9288-312d051defcd</prototypeId>
<componentRootId>0e7f6825-534f-4eba-9ec6-c43cbad07636</componentRootId>
<name>exit-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf66c344-2cff-4d84-9c6c-d4405c2bfb02"/>
</children>
</children>
</rootObjects>
</xmlPage>

View file

@ -1,531 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xmlPage>
<id>user-management-user-edit</id>
<versions>
<studioVersion>3.192.3</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.192.3</value>
</entry>
</packageVersions>
</versions>
<rootObjects id="77d9d4a8-d9a5-47a3-b614-4f4f66893c98">
<prototypeId>c4b48815-f449-48fe-9ae0-dec9b6f4c53c</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>UsersEdit</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="1b290108-e35f-4958-a398-2990c5af7cd3">
<prototypeId>10b97eb7-30d3-4af1-877c-7870d5178172</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>Text</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="737b67e2-295f-4356-a1e1-9419344d8c85"/>
<scripts id="a6ccccd9-354c-4725-9d34-c716cf626048"/>
<scripts id="d38c1af5-2bfe-41cd-ab0f-67040f498127"/>
<scripts id="f203f156-be32-4131-9c86-4d6bac6d5d56"/>
</children>
<children id="fa3bd49f-fe20-427f-8d2e-d36d8adaa0f0">
<prototypeId>9d2fca5f-4354-46fc-a743-2644fbb9699d</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>Form</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="5b65252f-09a6-4998-bf36-36816961fa2d"/>
<scripts id="6b160b6e-7f5d-46d3-8e42-e16045c135b2"/>
<scripts id="57779237-6bd7-4f73-ab62-efc79cc249b9"/>
<scripts id="ad6ccafe-914e-4e13-a351-88bf107a5007"/>
<scripts id="9ad247a3-9c46-4f12-9949-b1c905bd73bc"/>
<scripts id="79188cdc-d646-433e-9751-1482b9247ee6"/>
<scripts id="513a1b43-dd9c-433b-8033-2c66896106c9"/>
<children id="087daffe-e0a5-4d19-b56f-a85f9f87f134">
<prototypeId>b538ab89-381a-4c01-b8f6-77cb61a2b3f6</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>HBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0"/>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="55c26a33-c071-401a-a679-569d463abd2e">
<prototypeId>2f2b7ec7-dfd8-4789-b27b-5d72f509314c</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>VBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="b2b64253-9d0a-4c10-a74f-322043c9947c">
<prototypeId>2837d2f5-2a60-400e-ab3f-68556cce3981</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>Text</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="737b67e2-295f-4356-a1e1-9419344d8c85"/>
<scripts id="a6ccccd9-354c-4725-9d34-c716cf626048"/>
<scripts id="d38c1af5-2bfe-41cd-ab0f-67040f498127"/>
<scripts id="f203f156-be32-4131-9c86-4d6bac6d5d56"/>
</children>
<children id="63fd6e7d-191c-42ed-a32f-1ca9398df4d2">
<prototypeId>51ad723f-1b70-49ca-96be-137e51e907bb</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>HBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0"/>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="0d9b977a-91d1-4ed0-8d53-413c144a78f1">
<prototypeId>2adc0c45-dd66-4398-b21b-27a008756228</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>VBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
</children>
<children id="b1140e34-1132-447b-a8a5-1b4ed0fbfe05">
<prototypeId>80de32f7-e75d-44c4-9c5a-8fa9e9563ebf</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>VBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
</children>
</children>
<children id="f78f73a6-d5b2-41fc-8bef-dc52c07fd487">
<prototypeId>c4ce09bf-b91d-4025-8715-e76925202713</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>last-name</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="f133b0b6-1bd8-4e05-875f-fbf35eb539ca"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
</children>
<children id="927dc6c0-60aa-4bef-adbc-c8c1a6e8ca34">
<prototypeId>bc4815fd-2f8d-4545-b6f8-7a651beef2f6</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>first-name</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="c3ecbf19-dd91-4fe9-97e6-2988b0f041bf"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
</children>
<children id="5580c8c1-bcf4-409e-9a7e-c60b75abdb83">
<prototypeId>778d3b64-d52f-48ff-b854-7df244f20d55</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>middleName</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="1e1f0789-d5a4-4e04-8c0c-89a0040b62b7"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
</children>
<children id="8dbf053a-d82b-431e-8f34-25136214e958">
<prototypeId>7c66e464-2e75-4774-93ae-fbd88633fab7</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>phone</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="1e1f0789-d5a4-4e04-8c0c-89a0040b62b7"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
</children>
<children id="cdc51773-8fc5-48b2-ae54-0973e04faf2e">
<prototypeId>a014b3b3-1cd2-46cd-b317-74fa0dbf5733</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>created</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="5274357c-ce77-4621-8965-bd9c80700008"/>
<scripts id="275a5858-ae67-4b09-ba44-2a1df8a9c524"/>
<scripts id="a1f7e57b-164c-4cbe-ae25-7feb9819009f"/>
<scripts id="65fc388a-1f45-42ac-91d0-6b8b8b6d1f94"/>
<scripts id="8bd1dd61-b5ba-4ba4-8abb-2af9efd5380f"/>
<scripts id="0d25bd04-4c45-4cb3-8e9a-b13ff7118a07"/>
</children>
<children id="376f7f67-7053-4095-91f8-94d1c8fb9871">
<prototypeId>627b604f-8102-4df7-932a-ac88b410ed1b</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>updated</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="5274357c-ce77-4621-8965-bd9c80700008"/>
<scripts id="460e2787-a41a-4eeb-baf1-f7b9b16e927f"/>
<scripts id="65fc388a-1f45-42ac-91d0-6b8b8b6d1f94"/>
<scripts id="8bd1dd61-b5ba-4ba4-8abb-2af9efd5380f"/>
<scripts id="0d25bd04-4c45-4cb3-8e9a-b13ff7118a07"/>
</children>
</children>
<children id="cbbc94b8-712f-45fc-b63d-fae9a2c52741">
<prototypeId>b5373d18-ea29-428e-be37-62016f619693</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>VBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="bfccbac2-a419-4e3f-856a-17354b7d7d87">
<prototypeId>0507914c-bc97-4e76-8ef5-4617c868b50a</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>Text</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="737b67e2-295f-4356-a1e1-9419344d8c85"/>
<scripts id="a6ccccd9-354c-4725-9d34-c716cf626048"/>
<scripts id="d38c1af5-2bfe-41cd-ab0f-67040f498127"/>
<scripts id="f203f156-be32-4131-9c86-4d6bac6d5d56"/>
</children>
<children id="8c625dbf-7225-45a8-89ed-b9a96e56b78e">
<prototypeId>749b6444-6ba3-4ca5-a6f7-eaef9641e644</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>HBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0"/>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="ec59850c-2739-4705-af7f-0dd0143a7df7">
<prototypeId>00688380-2458-43bc-96ca-6b3b775bcce0</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>VBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
</children>
<children id="08757906-5087-4173-acc3-699cb2d96194">
<prototypeId>ed515db1-d2d0-495e-ab83-4a66431b311d</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>VBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
</children>
</children>
<children id="5cbe97aa-e7ff-4966-a248-0e1976aae7b6">
<prototypeId>77dc7647-69d5-4f7c-9f75-14eaa4609671</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>login</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="d9cc59a5-1aa7-4475-92d2-4e80fc2666e1"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
</children>
<children id="a4a646d6-1691-4786-8bc7-e20451263e21">
<prototypeId>bbb1fc4f-922e-46e4-8ceb-b911af24a32f</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>password</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="1d0f9d8e-1669-454a-a11e-2602b37d010a"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
<scripts id="cd632c24-f994-46fd-a0fd-3d113f9c81c1"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
</children>
<children id="09688b16-ca1f-4e44-8e22-b4a870c63bd1">
<prototypeId>84ef055e-dd0d-446e-87d4-9c25a3fc86e0</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>password-repeat</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
</children>
<children id="d8073293-b8c0-4296-b613-43565ae62e6a">
<prototypeId>04c23030-0c55-414a-9228-77ce8046deac</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>email</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c">
<properties>
<entry>
<key>required</key>
<value>
<simple>false</simple>
</value>
</entry>
</properties>
</scripts>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="65a2fd7d-1842-48ed-a297-6f1aa1a6b3d2"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
</children>
<children id="cc8b3cca-f614-49f4-97fc-35691b17fac4">
<prototypeId>5486199d-c932-413c-8ab6-e674633898af</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>blocked</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="b7c451ce-53e4-45be-8fec-2bcd67fac11c"/>
<scripts id="514bc2c8-5fa9-4a6d-bf18-e37d109c757b"/>
<scripts id="4273d23d-add7-483f-95a5-0849005c975b"/>
<scripts id="d4e0342b-e32a-415c-8d45-83b71f074db2"/>
<scripts id="cf967f04-f483-4815-b84e-8d502546c07e"/>
</children>
<children id="c4bf2477-c900-439e-be3c-590457ecf820">
<prototypeId>3c84ea2f-68bb-4cba-a32a-da97a043e84c</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>password-changed</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="5274357c-ce77-4621-8965-bd9c80700008"/>
<scripts id="d52f78ff-4dbe-43ad-b9c8-212904229482"/>
<scripts id="65fc388a-1f45-42ac-91d0-6b8b8b6d1f94"/>
<scripts id="8bd1dd61-b5ba-4ba4-8abb-2af9efd5380f"/>
<scripts id="0d25bd04-4c45-4cb3-8e9a-b13ff7118a07"/>
</children>
<children id="48faa0ef-1aa4-4f07-80c3-fb44f95da823">
<prototypeId>7cde5b9a-404d-4654-ae17-f0c753c64518</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>password-expires</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="5274357c-ce77-4621-8965-bd9c80700008"/>
<scripts id="0b481b9a-aaaa-4302-9591-21061c2b7f0e"/>
<scripts id="65fc388a-1f45-42ac-91d0-6b8b8b6d1f94"/>
<scripts id="8bd1dd61-b5ba-4ba4-8abb-2af9efd5380f"/>
<scripts id="0d25bd04-4c45-4cb3-8e9a-b13ff7118a07"/>
</children>
<children id="d6689963-5770-4785-902d-2607c1792bf4">
<prototypeId>ad491899-f407-4067-a0fe-d59e528b7470</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>org_unit_id</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="23992f0e-94ed-4fb4-b4d1-dc6ad7f13227"/>
<scripts id="efb0fec7-9951-4b36-bbda-fa17aa002d74"/>
<scripts id="4d028ea6-e4a3-4acf-bd60-de7aa1a78f71"/>
<scripts id="9f543b36-92e3-4a63-b8db-a4d7e852113e"/>
<scripts id="47f307b6-79a7-4c9a-96d6-6ee423565f02"/>
<scripts id="ec1e9370-303a-4a7e-948f-27ef7687cd03"/>
<scripts id="a2bcda6f-0d7a-4438-a3bc-39407f6b504f"/>
</children>
<children id="6d377c43-560b-434c-b573-f7edd4a2d74b">
<prototypeId>a9e6fbb2-4bb7-40af-966a-b22e6074e31c</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>password-validate</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="ca52740b-c0d9-4544-bbbb-f083877e384f"/>
</children>
</children>
<children id="5213ab96-5011-4811-b2ee-0dc906fb9d60">
<prototypeId>2142f803-011b-44cb-834b-a71c16debb88</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>VBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="9aeb7354-96b3-4a8f-91e4-ecb3022d7724">
<prototypeId>fe1ee732-1a3f-44ec-a6c4-caa6b0ee5151</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>Text</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="737b67e2-295f-4356-a1e1-9419344d8c85"/>
<scripts id="a6ccccd9-354c-4725-9d34-c716cf626048"/>
<scripts id="d38c1af5-2bfe-41cd-ab0f-67040f498127"/>
<scripts id="f203f156-be32-4131-9c86-4d6bac6d5d56"/>
</children>
<children id="804b17fe-6512-4abe-be30-2642d139b188">
<prototypeId>dd4366b6-b12e-4426-8004-22b9d1cf5db8</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>HBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0"/>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="6fc04db2-b6fb-4385-8d2a-8a3c31613e1d">
<prototypeId>db2236ac-ab9e-403c-bc96-3b4b6882ddf3</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>AvailableRecordsGrid</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="53cc1ea5-3feb-4a45-b8cd-44f010fa2800"/>
<scripts id="5a788014-f258-4cf9-890d-1ae696047a8b"/>
<scripts id="1996166f-7922-4f28-a571-9646d956ef37"/>
<scripts id="bd96fb29-7063-450a-aa4d-a0cf4945de61"/>
<scripts id="80fb96da-9b1a-4ca7-8f6d-136d4a1d0c90"/>
<scripts id="ddf99c78-3db1-4a4e-b132-12410eddfe45"/>
<scripts id="c336dd67-ff0a-4b10-92f0-1e81972a6b6d"/>
</children>
<children id="6ff38e35-a1b1-4a2f-8de1-b12bbeafd5bd">
<prototypeId>9ac36b9c-2c4e-46dc-9f62-e713bc4dac7c</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>Buttons</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="a9ab20b8-fd5d-446d-add0-e07444c6bf41">
<prototypeId>6b850ea5-255b-418c-be2d-5ec96d31e2bd</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>Add</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b06faf2e-48d8-4094-ae08-5dad718007d3"/>
</children>
<children id="5138a472-b603-4f75-a40d-791e897183d5">
<prototypeId>3b902822-cad9-4f06-9ddc-48d48378a06e</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>AddAll</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="cd544d24-e341-43a2-8a47-01115e200e08"/>
</children>
<children id="a396a845-386d-4a9a-8d73-05231cf859cd">
<prototypeId>35c8b7b8-4527-4c67-b0cb-2755cd40ee5a</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>Remove</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="7b247053-e690-44e7-ad8b-82f574bc7d6d"/>
</children>
<children id="6f332b45-ec43-4836-90ee-aeaa1cf6252d">
<prototypeId>0263acc1-f1e9-44a6-b175-f679838a5d4a</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>RemoveAll</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="5bb38c78-84e3-4c42-9fef-5183111ad1aa"/>
</children>
</children>
<children id="8e068cdd-b7f0-4273-8875-d65be75302de">
<prototypeId>05d0feb4-fd4a-49c4-bd75-54866a194c49</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>LinkFieldDialog for save</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="4bb5549d-f484-40da-99d1-998c8c963789"/>
<scripts id="a3fe02c2-a871-481f-bbed-a278b2ce8b13"/>
<scripts id="b500faf2-33d5-47ba-8bd0-b17670edc9df"/>
<scripts id="f388a0d0-e14b-4700-b24b-86e392ed935c"/>
<scripts id="3ef16eb9-959a-433c-8c47-88286526ae55"/>
<scripts id="e8d7e9c0-afbd-4e9e-a475-00e5ad024d6d"/>
<scripts id="39608513-f2fe-47d8-83ae-f4e34ee43cdb"/>
<scripts id="ec1b3693-4777-486a-9d73-473ea2024995"/>
</children>
</children>
</children>
</children>
<children id="09a8ab92-ea55-4d32-955e-11497980078e">
<prototypeId>c34de737-90e6-4db0-a417-186a7ee0b8ad</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>HBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0"/>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="72a27b92-951b-493b-80d8-f7dd55bb46a3">
<prototypeId>41b7094b-17d2-46cc-b2c3-a2ab5823a01a</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>save-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
</children>
<children id="e0eef911-21ff-481e-a76a-1e26684f958e">
<prototypeId>f70c25d7-0dcf-4d00-bec4-44a059217558</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>cancel-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf66c344-2cff-4d84-9c6c-d4405c2bfb02"/>
</children>
</children>
</children>
<children id="3de7e10b-0439-4aca-bb63-84bdc0d1ce40">
<prototypeId>94939abc-6c57-464e-b480-c86ea7a689e9</prototypeId>
<componentRootId>77d9d4a8-d9a5-47a3-b614-4f4f66893c98</componentRootId>
<name>Скрыть и сделать неактивным</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
</rootObjects>
</xmlPage>

View file

@ -1,455 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xmlPage>
<id>user-management-user-create</id>
<versions>
<studioVersion>3.192.3</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.192.3</value>
</entry>
</packageVersions>
</versions>
<rootObjects id="42a604ab-8830-4fb9-bd8b-b3ca06ebdd46">
<prototypeId>5f9c58f8-9ee1-4df3-b93c-e48534e798db</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>UsersCreate</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="56c16669-eb25-4e5a-b3b4-226d1ec016d3">
<prototypeId>e44fca88-2550-43a5-acc6-8b3d8a320f54</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>Text</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="737b67e2-295f-4356-a1e1-9419344d8c85"/>
<scripts id="a6ccccd9-354c-4725-9d34-c716cf626048"/>
<scripts id="d38c1af5-2bfe-41cd-ab0f-67040f498127"/>
<scripts id="f203f156-be32-4131-9c86-4d6bac6d5d56"/>
</children>
<children id="1112b0b9-7641-449e-b27e-7b954c6a49fa">
<prototypeId>dd8d4f7a-d682-4ad5-b912-2f893c80286c</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>Form</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="5b65252f-09a6-4998-bf36-36816961fa2d"/>
<scripts id="6b160b6e-7f5d-46d3-8e42-e16045c135b2"/>
<scripts id="57779237-6bd7-4f73-ab62-efc79cc249b9"/>
<scripts id="ad6ccafe-914e-4e13-a351-88bf107a5007"/>
<scripts id="9ad247a3-9c46-4f12-9949-b1c905bd73bc"/>
<scripts id="79188cdc-d646-433e-9751-1482b9247ee6"/>
<children id="383d1c14-43d2-4822-87ed-11949a71731a">
<prototypeId>2d7ce830-8c41-45b4-ae68-65aa13bfd73d</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>HBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0"/>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="159cf81a-72e4-436d-bb8a-f5c83543ab63">
<prototypeId>93142136-1c5f-48ee-bbed-735568f4dc5a</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>VBox</name>
<container>true</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="b4ccfdba-cf8d-4313-94f8-a9d741bf00e0">
<prototypeId>262f4f43-1fce-4db7-a1e8-79cec29d193d</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>Text</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="737b67e2-295f-4356-a1e1-9419344d8c85"/>
<scripts id="a6ccccd9-354c-4725-9d34-c716cf626048"/>
<scripts id="d38c1af5-2bfe-41cd-ab0f-67040f498127"/>
<scripts id="f203f156-be32-4131-9c86-4d6bac6d5d56"/>
</children>
<children id="d2749eae-4940-46cb-afd5-a3f59ae8a50b">
<prototypeId>ef93e007-1dca-4b4b-9214-55e4206139f3</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>last-name</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="f133b0b6-1bd8-4e05-875f-fbf35eb539ca"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
</children>
<children id="71c74fa2-bf44-4b13-927e-4c581ddff9b5">
<prototypeId>3267256f-78bd-46ca-ad92-e25f41660ec0</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>first-name</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="c3ecbf19-dd91-4fe9-97e6-2988b0f041bf"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
</children>
<children id="477583e1-1674-40fe-845c-98374152cae3">
<prototypeId>f8710d37-2fb4-4a70-aae6-065e039c6456</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>middleName</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="1e1f0789-d5a4-4e04-8c0c-89a0040b62b7"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
</children>
<children id="d8111745-5794-4862-9d22-c867031b7cef">
<prototypeId>d561dee7-1216-4969-9e83-4c45ed4116cf</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>phone</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="1e1f0789-d5a4-4e04-8c0c-89a0040b62b7"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
</children>
<children id="be9d4614-725a-43e8-b8de-a94253d6b0bd">
<prototypeId>47505972-bba3-481f-8c60-573a3060ff51</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>created</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="5274357c-ce77-4621-8965-bd9c80700008"/>
<scripts id="275a5858-ae67-4b09-ba44-2a1df8a9c524"/>
<scripts id="65fc388a-1f45-42ac-91d0-6b8b8b6d1f94"/>
<scripts id="8bd1dd61-b5ba-4ba4-8abb-2af9efd5380f"/>
<scripts id="0d25bd04-4c45-4cb3-8e9a-b13ff7118a07"/>
</children>
<children id="d4cb659b-a052-4cbf-bc4d-043853c5557f">
<prototypeId>38387d09-b753-4ca7-9916-6e2745a913b6</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>updated</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="5274357c-ce77-4621-8965-bd9c80700008"/>
<scripts id="460e2787-a41a-4eeb-baf1-f7b9b16e927f"/>
<scripts id="65fc388a-1f45-42ac-91d0-6b8b8b6d1f94"/>
<scripts id="8bd1dd61-b5ba-4ba4-8abb-2af9efd5380f"/>
<scripts id="0d25bd04-4c45-4cb3-8e9a-b13ff7118a07"/>
</children>
</children>
<children id="f12be901-2347-4f20-b537-214272fff89f">
<prototypeId>b8f86b7b-bbfb-453d-b5d2-85fb75b89ce7</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>VBox</name>
<container>true</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="4a6f7f54-124d-4408-9093-94ace8e023e5">
<prototypeId>63ea4fcf-b2ea-493a-9127-7a4aa14b5a0b</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>Text</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="737b67e2-295f-4356-a1e1-9419344d8c85"/>
<scripts id="a6ccccd9-354c-4725-9d34-c716cf626048"/>
<scripts id="d38c1af5-2bfe-41cd-ab0f-67040f498127"/>
<scripts id="f203f156-be32-4131-9c86-4d6bac6d5d56"/>
</children>
<children id="deefef2b-0844-4788-bc1f-eb825e8ba7e0">
<prototypeId>7d28a15a-bf1a-4dac-8637-a72b13595e78</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>login</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="d9cc59a5-1aa7-4475-92d2-4e80fc2666e1"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
</children>
<children id="3972d563-31b9-4367-8d52-a9f4da03d0e5">
<prototypeId>4a616993-de8f-4b2f-b3e6-86f09cf6447c</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>password</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="1d0f9d8e-1669-454a-a11e-2602b37d010a"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
<scripts id="cd632c24-f994-46fd-a0fd-3d113f9c81c1"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
</children>
<children id="08fb4dad-b287-4f5a-88f7-e8df2bd22021">
<prototypeId>040f3580-a20b-449c-8587-c9e399b5e6a2</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>password-repeat</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
</children>
<children id="afdb682c-4b78-4dfc-a647-114fd0d582b8">
<prototypeId>7d626425-0b20-4e2f-a3b3-7452f1a5df9e</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>email</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c">
<properties>
<entry>
<key>required</key>
<value>
<simple>false</simple>
</value>
</entry>
</properties>
</scripts>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="65a2fd7d-1842-48ed-a297-6f1aa1a6b3d2"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
</children>
<children id="4a33fc06-ce99-41d6-968f-c60998fc2f41">
<prototypeId>09c340df-f4bb-4cc6-9a9f-76b78dca7143</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>password-changed</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="5274357c-ce77-4621-8965-bd9c80700008"/>
<scripts id="d52f78ff-4dbe-43ad-b9c8-212904229482"/>
<scripts id="65fc388a-1f45-42ac-91d0-6b8b8b6d1f94"/>
<scripts id="8bd1dd61-b5ba-4ba4-8abb-2af9efd5380f"/>
<scripts id="0d25bd04-4c45-4cb3-8e9a-b13ff7118a07"/>
</children>
<children id="201f6530-6a34-4a9b-a942-0519a9efdf3c">
<prototypeId>4d56ec4a-6df8-4a6c-8c44-d77c1a8099df</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>password-expires</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="5274357c-ce77-4621-8965-bd9c80700008"/>
<scripts id="0b481b9a-aaaa-4302-9591-21061c2b7f0e"/>
<scripts id="65fc388a-1f45-42ac-91d0-6b8b8b6d1f94"/>
<scripts id="8bd1dd61-b5ba-4ba4-8abb-2af9efd5380f"/>
<scripts id="0d25bd04-4c45-4cb3-8e9a-b13ff7118a07"/>
</children>
<children id="beb2e4be-4381-4cff-bf5a-34d772451888">
<prototypeId>dad3e113-6fc0-4577-a730-a99af433b70b</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>org_unit_id</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="23992f0e-94ed-4fb4-b4d1-dc6ad7f13227"/>
<scripts id="efb0fec7-9951-4b36-bbda-fa17aa002d74"/>
<scripts id="4d028ea6-e4a3-4acf-bd60-de7aa1a78f71"/>
<scripts id="9f543b36-92e3-4a63-b8db-a4d7e852113e"/>
<scripts id="47f307b6-79a7-4c9a-96d6-6ee423565f02"/>
<scripts id="fbee16c2-a234-49c5-9ee5-379c256fa95e"/>
</children>
<children id="452550b3-145a-4213-aaac-2b663a4d50cf">
<prototypeId>e1b037cb-0008-450f-8719-621422b6e155</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>password-validate</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="ca52740b-c0d9-4544-bbbb-f083877e384f"/>
</children>
</children>
<children id="21b4a639-6459-4261-a7f9-7ac0e6d7a355">
<prototypeId>f414d74e-2247-4e41-8280-638063712186</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>VBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="13ca007c-f560-4369-9a2a-4f30277add84">
<prototypeId>0b9b0cf3-55c1-4108-bea2-f70100ab92f2</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>Text</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="737b67e2-295f-4356-a1e1-9419344d8c85"/>
<scripts id="a6ccccd9-354c-4725-9d34-c716cf626048"/>
<scripts id="d38c1af5-2bfe-41cd-ab0f-67040f498127"/>
<scripts id="f203f156-be32-4131-9c86-4d6bac6d5d56"/>
</children>
<children id="51eb150c-2375-4759-9dce-1d5ce5002827">
<prototypeId>d148dfe4-0c8a-4bb2-94da-336d4399a7c4</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>HBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0"/>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="f80a1669-4c6d-4513-900b-8dccfa932f2c">
<prototypeId>7c06a3a6-1040-4bc0-bf3c-4760cd70335a</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>AvailableRecordsGrid</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="53cc1ea5-3feb-4a45-b8cd-44f010fa2800"/>
<scripts id="5a788014-f258-4cf9-890d-1ae696047a8b">
<enabled>false</enabled>
</scripts>
<scripts id="1996166f-7922-4f28-a571-9646d956ef37"/>
<scripts id="bd96fb29-7063-450a-aa4d-a0cf4945de61"/>
<scripts id="80fb96da-9b1a-4ca7-8f6d-136d4a1d0c90"/>
<scripts id="0e1ff3d7-ebc6-4706-9baa-3ed434b70dd8"/>
<scripts id="a5049bea-9fc0-447f-a49f-ae8470b9543a"/>
<scripts id="17f15dbe-2516-43d4-b261-6fe16afebaa4">
<classRef type="TS">
<className>ErvuAvailableGridFilter</className>
<packageName>account_applications.component.filter</packageName>
</classRef>
<enabled>true</enabled>
<expanded>true</expanded>
<properties>
<entry>
<key>existingRowsField</key>
<value>
<simple>{"objectId":"5691688f-b132-46b2-8ee9-2641d0c8b4f0","packageName":"modules.user-management.component","className":"StaticColumnLinkField","type":"TS"}</simple>
</value>
</entry>
</properties>
</scripts>
</children>
<children id="9a73b8fe-47dc-497e-8f0b-b97376e61ea1">
<prototypeId>8bf9cb9b-edc5-4009-be41-c838c5d8e63d</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>Buttons</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="2a9b2511-9c11-46f6-861c-ff2643b58128">
<prototypeId>18cdf07c-f772-4be3-8eea-2ca5d3f651eb</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>Add</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b06faf2e-48d8-4094-ae08-5dad718007d3"/>
</children>
<children id="7c82e163-4e0e-4420-afbf-99fc179b9b3f">
<prototypeId>3074285f-453f-4ad2-8ae2-6cddaf5e8e0f</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>AddAll</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="cd544d24-e341-43a2-8a47-01115e200e08"/>
</children>
<children id="70323de2-66b6-4c6e-b007-72a2a2386966">
<prototypeId>1498ef4e-0a51-4dac-9b06-8d83263f03b4</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>Remove</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="7b247053-e690-44e7-ad8b-82f574bc7d6d"/>
</children>
<children id="5e9ed3d5-f5a2-4613-83d9-f95a5bd73458">
<prototypeId>407e4d1d-7adf-415c-9ff6-19c4f2a8223f</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>RemoveAll</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="5bb38c78-84e3-4c42-9fef-5183111ad1aa"/>
</children>
</children>
<children id="5691688f-b132-46b2-8ee9-2641d0c8b4f0">
<prototypeId>379fd159-d5a5-4b96-805b-0bae71b3f495</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>LinkFieldDialog for save</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="4bb5549d-f484-40da-99d1-998c8c963789"/>
<scripts id="a3fe02c2-a871-481f-bbed-a278b2ce8b13"/>
<scripts id="b500faf2-33d5-47ba-8bd0-b17670edc9df"/>
<scripts id="f388a0d0-e14b-4700-b24b-86e392ed935c"/>
<scripts id="3ef16eb9-959a-433c-8c47-88286526ae55"/>
<scripts id="e8d7e9c0-afbd-4e9e-a475-00e5ad024d6d">
<enabled>false</enabled>
</scripts>
<scripts id="39608513-f2fe-47d8-83ae-f4e34ee43cdb"/>
<scripts id="c55450df-af8c-4c60-b5b3-7ceccda4853e"/>
</children>
</children>
</children>
</children>
<children id="5a790a1e-0f04-4eda-b774-34de77c19a90">
<prototypeId>8766dbfa-3bf8-4e80-9662-c9a9865ad15c</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>HBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0"/>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="09496747-a880-49a7-879a-49788dc9a85d">
<prototypeId>796756c2-02da-4f18-9ab0-cae55047227a</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>save-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
</children>
<children id="cbc3cdd7-9dc3-4753-88b9-4c18aaf99d91">
<prototypeId>95e88b88-64d3-482b-bc59-de692c3a44f6</prototypeId>
<componentRootId>42a604ab-8830-4fb9-bd8b-b3ca06ebdd46</componentRootId>
<name>cancel-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf66c344-2cff-4d84-9c6c-d4405c2bfb02"/>
</children>
</children>
</children>
</rootObjects>
</xmlPage>

View file

@ -1,723 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xmlPage>
<id>user-management-users</id>
<versions>
<studioVersion>3.192.3</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.192.3</value>
</entry>
</packageVersions>
</versions>
<rootObjects id="245a43c7-6af2-45d7-ac76-9195075586a7">
<prototypeId>0f470331-dfb0-4f10-b748-c9a7f33d31d9</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>Users</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>DefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="eae3f5cb-920e-4d77-a11c-34df92eadac0">
<prototypeId>ea5eba30-e9c2-4b22-a31e-1f96336aba5a</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>Text</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="737b67e2-295f-4356-a1e1-9419344d8c85"/>
<scripts id="a6ccccd9-354c-4725-9d34-c716cf626048"/>
<scripts id="d38c1af5-2bfe-41cd-ab0f-67040f498127"/>
<scripts id="f203f156-be32-4131-9c86-4d6bac6d5d56"/>
</children>
<children id="ea9c1af5-3409-4750-b691-5692bae00794">
<prototypeId>ce583acc-4291-4ca5-9b8c-d1830f568763</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>Сворачиваемая панель</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="65283686-768f-44f9-9621-0c8327d90f11"/>
<scripts id="59a83c24-bbe6-4720-8184-9223bcd866bb">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>DefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="809e4238-8d84-4bcd-941c-5d1d3332a852"/>
<scripts id="14f340e5-5106-4780-8358-6f292054689f"/>
<scripts id="7d2046c5-502d-474f-b2c9-fa8e2b7cfe7c"/>
<children id="dccb6762-0a28-4155-a1d2-13ce4f6ca177">
<prototypeId>91582081-f678-4d59-aa8c-4461b9cf9041</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>FilterGroup</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="3f5f352c-1a86-4702-a914-6c163c903157">
<properties>
<entry>
<key>filterableComp</key>
<value>
<simple>null</simple>
</value>
</entry>
</properties>
</scripts>
<scripts id="b5dcccfd-643a-4c8c-aa3b-a44da851a86a">
<properties>
<entry>
<key>filterable</key>
<value>
<simple>{"objectId":"d7266db0-3d4e-4e8c-9f63-19deb4c12ee3","packageName":"rpc","className":"GridRpcService","type":"JAVA"}</simple>
</value>
</entry>
</properties>
</scripts>
<scripts id="f3aff680-1783-45ac-9dcc-fc7f76fd8110">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>DefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="7176bfcf-d736-48a3-b620-6a77412d4026"/>
<scripts id="21c9994a-3743-4adb-ae52-130f48aeab83"/>
<scripts id="fc0d4368-d207-4b1f-b9e9-4bb06ae7291f"/>
<children id="87c2f0cf-1a50-48cf-9b05-dd6c8fbd700c">
<prototypeId>40211a7d-fa00-4355-9840-c79db51c1266</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>HBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>DefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="221139a0-6933-419a-9fd4-f9c89225b730">
<prototypeId>982ee732-78fb-4937-8049-802b92307e41</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>VBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>DefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="c49eb0f7-b6f6-4d2a-989c-6231195dc4aa">
<prototypeId>5f640a94-630c-4b5d-93de-ca4693859901</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>last-name</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="734c5516-d349-4b42-a92a-4469760104fe"/>
<scripts id="3c042081-dc6c-46ff-aef8-8263a8186fb6"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
</children>
<children id="4d6051d1-6e0b-4289-aca5-413cf3711ca8">
<prototypeId>aa610427-b2e3-4f3f-a8df-ee1aded6fe37</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>first-name</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="734c5516-d349-4b42-a92a-4469760104fe"/>
<scripts id="5be8720c-507a-459e-95c5-22fa1960ebeb"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
</children>
<children id="0e257ac6-c8c2-452f-94cc-1012ad6c64c4">
<prototypeId>1d7465e8-260a-4581-9e37-77d8a5158b8f</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>middle-name</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="734c5516-d349-4b42-a92a-4469760104fe"/>
<scripts id="1dd44898-ee1c-4e7d-af77-b9f1aba73246"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
</children>
</children>
<children id="8db76b82-8b69-411c-8cad-d6f4927e4964">
<prototypeId>9c945c9c-4b2d-408b-a525-0c0d35e73d40</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>VBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>DefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="ba01915d-bf65-4583-ad7b-89beed38b486">
<prototypeId>bed574e8-73e4-45e3-857c-ce7cd7c8156b</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>login</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="734c5516-d349-4b42-a92a-4469760104fe"/>
<scripts id="2cb90b93-db56-4c48-8f62-b4f916783d35"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
</children>
<children id="77b30db9-73fd-4331-a0b1-56c9fdd336f4">
<prototypeId>840e4e3e-c178-404e-815e-16429e0b484d</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>phone</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="734c5516-d349-4b42-a92a-4469760104fe"/>
<scripts id="2cb90b93-db56-4c48-8f62-b4f916783d35"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
</children>
<children id="05e4023a-c83b-4aaf-b250-6a7d93b4dc44">
<prototypeId>104b37e8-9b20-4738-a978-a1f890c0d986</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>org_unit_id</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="859913ec-9a30-439c-afc2-3c83cddcfe03"/>
<scripts id="44ef54e2-ee96-4239-9e10-7d3e50e1ce4e"/>
<scripts id="a9671ca3-e400-4848-ae6e-b3ff5b5fa732"/>
<scripts id="0b478949-71f8-4a8c-bcfc-8407265d231c"/>
<scripts id="2d8e021b-77e9-4d5c-a3e7-36fa9f8f1c42"/>
<scripts id="5c1508fe-b7fe-44cb-bec9-11eb7b09570f"/>
<scripts id="b26e8065-5cb8-40d4-b160-61e2ccc0cb14"/>
</children>
<children id="f82f9f1e-e3bf-40c9-bf7a-8452762a681d">
<prototypeId>ddbdddc4-09d7-45fc-91ce-a66bf6a7c3eb</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>blocked</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="b7c451ce-53e4-45be-8fec-2bcd67fac11c"/>
<scripts id="609d3d73-3afc-43ab-ac23-182b192c3173"/>
<scripts id="e5a8326d-43f2-421f-9c82-2b8ef02e430f"/>
<scripts id="4273d23d-add7-483f-95a5-0849005c975b"/>
<scripts id="d4e0342b-e32a-415c-8d45-83b71f074db2"/>
<scripts id="cf967f04-f483-4815-b84e-8d502546c07e"/>
</children>
</children>
</children>
</children>
</children>
<children id="c7bdb5d1-29b3-474e-917f-ba33a9efe4d1">
<prototypeId>4e5e921a-39ed-40e4-90a6-5087ae66c6c9</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>Form</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="0b1f2457-d665-428d-bb80-d0d1e7dca08d"/>
<scripts id="17e3e745-fac5-4955-a974-28e381faee42"/>
<scripts id="57779237-6bd7-4f73-ab62-efc79cc249b9">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>DefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="ad6ccafe-914e-4e13-a351-88bf107a5007"/>
<scripts id="9ad247a3-9c46-4f12-9949-b1c905bd73bc"/>
<scripts id="79188cdc-d646-433e-9751-1482b9247ee6"/>
<children id="955a3a9f-3628-41f8-8e96-85dae51121a6">
<prototypeId>98868f0f-1d43-40a4-ad6d-ba2961e6cff4</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>Горизонтальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>DefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="8ec96a55-db09-4e59-8942-84cde039f7fc">
<prototypeId>959d104a-1e3f-4ac2-be5e-7d7b90f66a5f</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>Вертикальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>DefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="61d7d613-6dc7-442d-95b2-6f41748b2fe5">
<prototypeId>e5be7900-dfec-4748-91da-c715fee6cac4</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>full-name</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="de43e6d3-693d-443e-b132-077d35e15302"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
</children>
<children id="9b2ebff3-c5fa-4210-b091-8783d23a67e0">
<prototypeId>0c9190f0-0784-4f04-9859-4f0fbaf00f74</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>blocked</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="b7c451ce-53e4-45be-8fec-2bcd67fac11c"/>
<scripts id="68d40d81-63c5-4700-9135-7425eb5256f7"/>
<scripts id="4273d23d-add7-483f-95a5-0849005c975b"/>
<scripts id="d4e0342b-e32a-415c-8d45-83b71f074db2"/>
<scripts id="cf967f04-f483-4815-b84e-8d502546c07e"/>
</children>
</children>
<children id="54f90fb4-3c81-4ddf-aaa0-a7af7c1cff24">
<prototypeId>0c4e9e51-0ee4-479f-8f09-c7e46909ff44</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>Вертикальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>DefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="894ad41c-9ce5-4b2d-ad09-ef95d4dccb74">
<prototypeId>8b2e2c4f-6b66-4d6f-bd0c-a89e539356bb</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>password-expires</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="5274357c-ce77-4621-8965-bd9c80700008"/>
<scripts id="ecfc371b-de42-4266-b002-8368c7c9a70e"/>
<scripts id="65fc388a-1f45-42ac-91d0-6b8b8b6d1f94"/>
<scripts id="8bd1dd61-b5ba-4ba4-8abb-2af9efd5380f"/>
<scripts id="0d25bd04-4c45-4cb3-8e9a-b13ff7118a07"/>
</children>
<children id="da3dff3d-7a33-4068-9aba-fc10a67c9309">
<prototypeId>d042fd93-60b2-4efe-86b0-f38023bb9a7f</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>created</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="5274357c-ce77-4621-8965-bd9c80700008"/>
<scripts id="fadb8459-7e47-4dfe-86a1-c309f4a37ef4"/>
<scripts id="65fc388a-1f45-42ac-91d0-6b8b8b6d1f94"/>
<scripts id="8bd1dd61-b5ba-4ba4-8abb-2af9efd5380f"/>
<scripts id="0d25bd04-4c45-4cb3-8e9a-b13ff7118a07"/>
</children>
</children>
</children>
</children>
<children id="c02b27a2-2ccc-4aec-abef-b6772e676fde">
<prototypeId>9e35c92d-2741-4d9d-867f-4c8b83166638</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>HBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>DefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="9a66e05e-b83e-4be1-a32f-ea562d3bbf13">
<prototypeId>66b422e9-0f90-4114-ba87-4a235cbf7648</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>VBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>DefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="e6bfd54d-b9b3-47ed-86a8-9bda7e5bea08">
<prototypeId>d7266db0-3d4e-4e8c-9f63-19deb4c12ee3</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>Grid</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="1996166f-7922-4f28-a571-9646d956ef37"/>
<scripts id="dec398bf-a79f-4d84-92f2-667795915d2b"/>
<scripts id="87e83fd0-6ac2-449f-96ae-51dd2cbe6eac"/>
<scripts id="a39d2f2a-e0e5-47ff-94b6-06c505b4821c"/>
</children>
</children>
<children id="884effb6-5f88-406f-bb93-6ee54c5b3fab">
<prototypeId>c7ac179d-9577-4703-8313-1c2c4c90ac36</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>VBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>DefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="64031d30-2f05-4ef0-bac4-73c2246de170">
<prototypeId>d3f54b16-ae69-4685-a071-4f781c3f9b61</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>DependentGrid</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="1996166f-7922-4f28-a571-9646d956ef37"/>
<scripts id="2499531e-c31f-4368-8718-544b23e50d30"/>
<scripts id="5b5f4919-6401-470a-80c8-4eeeac07bc35"/>
<scripts id="a39d2f2a-e0e5-47ff-94b6-06c505b4821c"/>
<scripts id="272be1c9-b121-4e00-aeb9-bf3f6c3152a7"/>
</children>
<children id="39d75668-05ad-4f8f-9f38-ea9b5f81f5d6">
<prototypeId>4d7361c8-5071-4d62-b50e-e79ee636fa57</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>ac-dependent-grid</name>
<container>false</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
</children>
</children>
<children id="a53dd92f-63ea-4b7d-835e-7c7e85afaf53">
<prototypeId>c4f7ba4d-03b3-4948-86ed-2ca4b8a6631b</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>HBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>DefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<scripts id="1942d69d-8e28-4622-9b82-eb3f16a4d120"/>
<children id="328aad2c-1a09-4554-bbd1-cbadf75a0012">
<prototypeId>a034e0fd-82dd-40c8-bada-c3a0d6eebeb5</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>create-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf66c344-2cff-4d84-9c6c-d4405c2bfb02"/>
<scripts id="8161015a-5295-487e-a24f-7fa4a3daee5a"/>
<scripts id="5087febe-68e5-45dc-aeec-c945277baea9"/>
</children>
<children id="0e3820bc-9411-4561-9ab5-a244f159a438">
<prototypeId>d45bf7b0-dcab-48f6-a53b-26723524b371</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>edit-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="d9f3e73e-a18c-4ff6-80f5-0698f90db0c3"/>
<scripts id="1c7b477c-4fca-4cf1-af3d-9838577d32c3"/>
<scripts id="6e5fb061-a990-440b-82c8-ed514ca43846"/>
</children>
<children id="42a6ab09-17dd-4667-b213-6dfc1cb73635">
<prototypeId>3d6e68c8-b745-49bb-a5d5-d27f5fdad72d</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>delete-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0d"/>
<scripts id="df910ff7-f70a-4a6f-b334-e7787dcfefbd"/>
<scripts id="a273863f-3976-4eff-9833-a62c019bd96d"/>
</children>
<children id="2a01996b-5951-434d-b107-e57eecab63ce">
<prototypeId>98d7a384-bac4-4b95-9d8f-9245d91927c1</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>ldap-sync-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="c8992c28-e60c-40fd-8cd5-2d8354e0463e"/>
<scripts id="999406f0-fab7-49ff-9ce4-7909e6822382"/>
</children>
<children id="af8f0253-cd19-4d29-8a28-7fd64168ca79">
<prototypeId>dacfb992-f471-468a-b8bc-2fe3b916a2f7</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>clear-security-cache-btn</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="0e096119-d47f-4798-be4e-088af8a4f9d5"/>
<scripts id="3530df78-99a1-4e53-8f4a-82d81c0c4078"/>
</children>
<children id="7e580e19-0b91-484a-83f5-b127513b8382">
<prototypeId>a72d531c-3c9f-4390-8b7a-1f6bb3fa0e9d</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>ac-edit</name>
<container>false</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
<children id="2c717833-5a89-4b71-96e4-4ab7470e21cc">
<prototypeId>250006ff-42d5-4c45-87f3-183857d7a13b</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>ac-remove</name>
<container>false</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
<children id="9bb72342-09a1-42b1-b526-3cfed7263a64">
<prototypeId>696aaf8c-3075-4d6a-b58b-c7c79394affe</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>ac-create-button-hide-if-kerberos-or-no-authority</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
<children id="44c5eae9-c55d-48e3-8249-f93daf4b11f3">
<prototypeId>8b27dfb0-9d38-492b-8ee2-100d6c5a58d7</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>ac-edit-button-hide-if-kerberos-or-no-authority</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
<children id="aa709cae-f833-47e3-8d7e-50ac2c21e515">
<prototypeId>6377bc60-5a59-42d9-b5f1-3ccefac4ffe4</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>ac-edit-button-enabled-if-has-authority</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
<children id="9d5c1109-236a-472e-9d91-85f7ac471d37">
<prototypeId>7b63ea1b-1c51-4237-8946-14cc474d5eb0</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>ac-delete-button-hide-if-kerberos-or-no-authority</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
<children id="7def372f-5945-439e-98a1-9cf250f26768">
<prototypeId>7af3269d-369f-4a2a-85e7-8e4b621da324</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>ac-delete-button-enabled-if-has-authority</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
<children id="4526eb55-d9db-4020-b0f0-e32a879aa03b">
<prototypeId>3f2cb52c-a805-4bbd-a893-48506a2ee1cf</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>ac-ldap-sync-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
<children id="c75da0da-cf02-4967-a36d-98af2855193c">
<prototypeId>af550f44-c563-4e73-9703-a8dfd73f4627</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>ac-clear-security-cache-btn</name>
<container>false</container>
<expanded>true</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
<children id="412382cf-3acd-4bfc-8376-078c06f032ab">
<prototypeId>e3ed2a20-be7f-4ee3-a85c-29bcffad04dc</prototypeId>
<componentRootId>245a43c7-6af2-45d7-ac76-9195075586a7</componentRootId>
<name>hide-if-kerberos</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
</children>
</rootObjects>
</xmlPage>

View file

@ -1,224 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xmlPage>
<id>user-management-role</id>
<versions>
<studioVersion>3.192.3</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.192.3</value>
</entry>
</packageVersions>
</versions>
<rootObjects id="72f6fc40-525b-466c-86f8-3dc4e1c21bb7">
<prototypeId>a6f1a48d-fc19-46fd-9cad-e7fe0d9f29c6</prototypeId>
<componentRootId>72f6fc40-525b-466c-86f8-3dc4e1c21bb7</componentRootId>
<name>RolesEdit</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>BpmnDefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="07e1abe6-4a1d-4875-bfd9-a42f9998a25e">
<prototypeId>90fc7ebc-3819-4bc5-b2a4-b0dae9b151ea</prototypeId>
<componentRootId>72f6fc40-525b-466c-86f8-3dc4e1c21bb7</componentRootId>
<name>Текст</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="737b67e2-295f-4356-a1e1-9419344d8c85"/>
<scripts id="a6ccccd9-354c-4725-9d34-c716cf626048"/>
<scripts id="d38c1af5-2bfe-41cd-ab0f-67040f498127"/>
<scripts id="f203f156-be32-4131-9c86-4d6bac6d5d56"/>
</children>
<children id="3779f868-2615-43ed-8f18-eeb65e77fd4f">
<prototypeId>183f1b4b-6c93-4858-ad6e-1d3ac3d3d6f1</prototypeId>
<componentRootId>72f6fc40-525b-466c-86f8-3dc4e1c21bb7</componentRootId>
<name>Form</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="8efd6752-250d-4585-bd3b-c10893634eb6"/>
<scripts id="3be2858b-2abd-4a9b-8b3c-4247b38a1ea5"/>
<scripts id="57779237-6bd7-4f73-ab62-efc79cc249b9">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>BpmnDefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="ad6ccafe-914e-4e13-a351-88bf107a5007"/>
<scripts id="9ad247a3-9c46-4f12-9949-b1c905bd73bc"/>
<scripts id="79188cdc-d646-433e-9751-1482b9247ee6"/>
<children id="565b1668-01eb-4764-9e28-7ed170990f25">
<prototypeId>61750ac1-fa74-4c35-9057-d0bead8241cc</prototypeId>
<componentRootId>72f6fc40-525b-466c-86f8-3dc4e1c21bb7</componentRootId>
<name>Горизонтальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>BpmnDefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="c54c46f6-e78e-4f99-a6b2-dcd583be8672">
<prototypeId>5047ac15-2114-48db-b457-3cca811df6f4</prototypeId>
<componentRootId>72f6fc40-525b-466c-86f8-3dc4e1c21bb7</componentRootId>
<name>Вертикальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>BpmnDefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="ddec9003-ffe4-4743-9752-898840fd28c4">
<prototypeId>b8514208-f422-488a-82ab-fc8eca271a82</prototypeId>
<componentRootId>72f6fc40-525b-466c-86f8-3dc4e1c21bb7</componentRootId>
<name>name</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="a5d1b355-52f3-4911-aec4-065cdc3bb9e4"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
</children>
<children id="bbd3987c-e516-4490-94f9-d96534f6adf8">
<prototypeId>be586ede-3dcb-4ef9-a5ac-4ecdaff22d42</prototypeId>
<componentRootId>72f6fc40-525b-466c-86f8-3dc4e1c21bb7</componentRootId>
<name>created</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="5274357c-ce77-4621-8965-bd9c80700008"/>
<scripts id="63ce08fa-9663-4e3e-9cf3-deef40413104"/>
<scripts id="f672c801-b76c-4080-bdab-e0e8dd43eb72"/>
<scripts id="65fc388a-1f45-42ac-91d0-6b8b8b6d1f94"/>
<scripts id="8bd1dd61-b5ba-4ba4-8abb-2af9efd5380f"/>
<scripts id="0d25bd04-4c45-4cb3-8e9a-b13ff7118a07"/>
</children>
<children id="fec7e405-d6df-4e10-9357-cdaff42e73c2">
<prototypeId>01a7320b-31b6-4809-bc2e-aafeefcc2bdb</prototypeId>
<componentRootId>72f6fc40-525b-466c-86f8-3dc4e1c21bb7</componentRootId>
<name>updated</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="5274357c-ce77-4621-8965-bd9c80700008"/>
<scripts id="27fc7bfc-97fb-452d-87db-3813a8aad62e"/>
<scripts id="65fc388a-1f45-42ac-91d0-6b8b8b6d1f94"/>
<scripts id="8bd1dd61-b5ba-4ba4-8abb-2af9efd5380f"/>
<scripts id="0d25bd04-4c45-4cb3-8e9a-b13ff7118a07"/>
</children>
</children>
<children id="65cc1bcc-495e-475e-980d-72cfec22ab53">
<prototypeId>50797ba0-3422-4b3c-95d8-924cd5160d2f</prototypeId>
<componentRootId>72f6fc40-525b-466c-86f8-3dc4e1c21bb7</componentRootId>
<name>Вертикальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>BpmnDefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
</children>
</children>
</children>
<children id="5d9c9441-3c9f-42c0-9f70-412042b62082">
<prototypeId>9a80540c-888a-46cf-94d0-6aa060704cdf</prototypeId>
<componentRootId>72f6fc40-525b-466c-86f8-3dc4e1c21bb7</componentRootId>
<name>HBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>BpmnDefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="b55e66a5-0e03-4baf-8a9f-7cbccd2d54e0">
<prototypeId>0e3729c9-6ec2-4d22-8146-1e6c4f69e132</prototypeId>
<componentRootId>72f6fc40-525b-466c-86f8-3dc4e1c21bb7</componentRootId>
<name>save-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
</children>
<children id="7a061667-f3bf-4d4b-bdfc-a9b7654666ca">
<prototypeId>0bfe5e99-bdcd-475a-a524-17e0603b3845</prototypeId>
<componentRootId>72f6fc40-525b-466c-86f8-3dc4e1c21bb7</componentRootId>
<name>cancel-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf66c344-2cff-4d84-9c6c-d4405c2bfb02"/>
</children>
</children>
</rootObjects>
</xmlPage>

View file

@ -1,228 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xmlPage>
<id>user-management-roles</id>
<versions>
<studioVersion>3.192.3</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.192.3</value>
</entry>
</packageVersions>
</versions>
<rootObjects id="3ada7790-8f63-4750-be1b-965cb607bc17">
<prototypeId>38c2de2f-c5dd-413e-babf-ce54cb4e5279</prototypeId>
<componentRootId>3ada7790-8f63-4750-be1b-965cb607bc17</componentRootId>
<name>Roles</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>DefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="4edaccaa-ce4f-4703-a698-f4170aa9df5f">
<prototypeId>47e95cb8-ec90-4d23-bdbc-02a993cba433</prototypeId>
<componentRootId>3ada7790-8f63-4750-be1b-965cb607bc17</componentRootId>
<name>Text</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="737b67e2-295f-4356-a1e1-9419344d8c85"/>
<scripts id="a6ccccd9-354c-4725-9d34-c716cf626048"/>
<scripts id="d38c1af5-2bfe-41cd-ab0f-67040f498127"/>
<scripts id="f203f156-be32-4131-9c86-4d6bac6d5d56"/>
</children>
<children id="f569bfab-30e2-4edc-9018-36ea66ec6994">
<prototypeId>5caea80b-ba43-4d5a-ae62-cf1aa1b5e8de</prototypeId>
<componentRootId>3ada7790-8f63-4750-be1b-965cb607bc17</componentRootId>
<name>FilterGroup</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="3f5f352c-1a86-4702-a914-6c163c903157">
<properties>
<entry>
<key>filterableComp</key>
<value>
<simple>null</simple>
</value>
</entry>
</properties>
</scripts>
<scripts id="b5dcccfd-643a-4c8c-aa3b-a44da851a86a">
<properties>
<entry>
<key>filterable</key>
<value>
<simple>{"objectId":"a56dd87e-02e2-4dd5-9dc7-ec94e3758511","packageName":"rpc","className":"GridRpcService","type":"JAVA"}</simple>
</value>
</entry>
</properties>
</scripts>
<scripts id="f3aff680-1783-45ac-9dcc-fc7f76fd8110">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>DefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="7176bfcf-d736-48a3-b620-6a77412d4026"/>
<scripts id="21c9994a-3743-4adb-ae52-130f48aeab83"/>
<scripts id="fc0d4368-d207-4b1f-b9e9-4bb06ae7291f"/>
<children id="8444357f-e4f7-4d8f-a827-a6df7f2d79f3">
<prototypeId>4c6be823-5f06-4a7c-b965-944a778f96b4</prototypeId>
<componentRootId>3ada7790-8f63-4750-be1b-965cb607bc17</componentRootId>
<name>search</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="734c5516-d349-4b42-a92a-4469760104fe"/>
<scripts id="c44bd869-45de-4809-98ca-bc2ebfc75c44"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
</children>
</children>
<children id="341e78e5-b55f-4922-890a-2fd52426c25d">
<prototypeId>a56dd87e-02e2-4dd5-9dc7-ec94e3758511</prototypeId>
<componentRootId>3ada7790-8f63-4750-be1b-965cb607bc17</componentRootId>
<name>Grid</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="1996166f-7922-4f28-a571-9646d956ef37"/>
<scripts id="9cf56526-910a-4c4a-ae40-50949d1252dc"/>
<scripts id="1d5d6fbf-1f4d-4117-81cb-11735fcb89bc"/>
<scripts id="ffe0cfdf-d7df-4838-b188-35a6d214181b"/>
</children>
<children id="b5d15d44-765e-42a6-bad9-71e2eee768ce">
<prototypeId>9a8e1a6b-5cd8-4b6e-b3ec-8da88c6018a2</prototypeId>
<componentRootId>3ada7790-8f63-4750-be1b-965cb607bc17</componentRootId>
<name>HBox</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0">
<properties>
<entry>
<key>service</key>
<value>
<implRef type="JAVA">
<className>DefaultValueLoaderServiceImpl</className>
<packageName>service.loading</packageName>
</implRef>
</value>
</entry>
</properties>
</scripts>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="8994c632-2f2d-4399-b33a-250c537687f3">
<prototypeId>d5af9dbe-a63f-4420-a109-dcd5d6894355</prototypeId>
<componentRootId>3ada7790-8f63-4750-be1b-965cb607bc17</componentRootId>
<name>create-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf66c344-2cff-4d84-9c6c-d4405c2bfb02"/>
<scripts id="898d41b4-f7d6-4c19-b0d1-e2ca8a1227ab"/>
</children>
<children id="2f27ed97-28ef-4d53-88ea-ed48a8b45307">
<prototypeId>29d2fdef-ff61-4689-bded-2c34bff0de72</prototypeId>
<componentRootId>3ada7790-8f63-4750-be1b-965cb607bc17</componentRootId>
<name>edit-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="d9f3e73e-a18c-4ff6-80f5-0698f90db0c3"/>
<scripts id="8bfc8b0c-7e2e-453d-8c24-0497807b83d3"/>
</children>
<children id="f37323b5-4806-44f9-884f-e71eddd891a5">
<prototypeId>7fbf947c-b03a-42f1-881d-0f0d449cb1d2</prototypeId>
<componentRootId>3ada7790-8f63-4750-be1b-965cb607bc17</componentRootId>
<name>delete-button</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0d"/>
<scripts id="ab90e604-ecf6-4d68-b101-2d8de98a6c05"/>
</children>
<children id="11c54831-6e00-493d-90d3-cf2b3a14e076">
<prototypeId>fca14225-0522-4cc8-ad0d-1126644cf028</prototypeId>
<componentRootId>3ada7790-8f63-4750-be1b-965cb607bc17</componentRootId>
<name>ac-create</name>
<container>false</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
<children id="cd21ea88-c666-43e9-b574-e5269a128e34">
<prototypeId>b801dc2c-9067-4669-8bba-620bdde0be51</prototypeId>
<componentRootId>3ada7790-8f63-4750-be1b-965cb607bc17</componentRootId>
<name>ac-edit</name>
<container>false</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
<children id="eaa4f037-97b4-424a-b991-e06e4aaa02db">
<prototypeId>eedf3b3b-c42c-4b81-94ce-3b5cc3c6bd07</prototypeId>
<componentRootId>3ada7790-8f63-4750-be1b-965cb607bc17</componentRootId>
<name>ac-remove</name>
<container>false</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
</children>
<children id="f74b197c-6bfa-4552-8535-9f55907e2725">
<prototypeId>86bc12ae-bb9f-42d6-b111-63f7521fedb6</prototypeId>
<componentRootId>3ada7790-8f63-4750-be1b-965cb607bc17</componentRootId>
<name>Groups</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="737b67e2-295f-4356-a1e1-9419344d8c85"/>
<scripts id="a6ccccd9-354c-4725-9d34-c716cf626048"/>
<scripts id="d38c1af5-2bfe-41cd-ab0f-67040f498127"/>
<scripts id="f203f156-be32-4131-9c86-4d6bac6d5d56"/>
</children>
<children id="be1190c8-2fcf-4df8-b721-594ee57da248">
<prototypeId>ab666d58-a9b4-417c-9da9-eab2e0b6a958</prototypeId>
<componentRootId>3ada7790-8f63-4750-be1b-965cb607bc17</componentRootId>
<name>GroupsGrid</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="1996166f-7922-4f28-a571-9646d956ef37"/>
<scripts id="c3c97f9e-5b9a-488b-ae19-6e4cb8fd0835"/>
<scripts id="9ce2d664-4bee-41cb-b226-77bd8322ede1"/>
<scripts id="8338dd50-04dc-497c-bfaf-720a8c7509ff"/>
</children>
</rootObjects>
</xmlPage>

View file

@ -1,276 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xmlPage>
<id>user-management-authorities</id>
<versions>
<studioVersion>3.192.3</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.192.3</value>
</entry>
</packageVersions>
</versions>
<rootObjects id="44886585-d33e-4203-840a-e788653e923a">
<prototypeId>a4d442cf-72a8-431e-815a-490959083787</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>SecurityFeatures</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0"/>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="099f9561-2e56-43a8-8e00-fe2cab075eed">
<prototypeId>202de44d-f77d-43fb-88fd-2a3f36ced2f1</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>Вертикальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="4e5c999a-27e9-4f91-aa2a-988955c78aaf">
<prototypeId>2abf5d6a-d876-4fc5-bae1-d04e41cb7229</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>authorities</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="a01d4d82-4ab0-4fa0-8e33-a241da64767e"/>
<scripts id="f9499259-f787-45c7-aa20-a6dd038b7139"/>
<scripts id="0b38ad88-9d25-4dbf-8076-aae8218abb2e"/>
</children>
</children>
<children id="6f7d4ce5-3c8a-4f0d-9bfd-bb69dc27ee6f">
<prototypeId>d084be86-0037-4780-893d-959b975b9058</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>Вертикальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="e3feef74-3f17-420c-bacc-ce68dfc8efdb">
<prototypeId>753dd01d-822b-4533-b2aa-f086edb81702</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>bound-roles</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="1996166f-7922-4f28-a571-9646d956ef37"/>
<scripts id="701724ee-3499-412f-8908-3245f90d31ee"/>
<scripts id="933abff7-f07a-4fbe-bcbc-d182a75fe4e6"/>
<scripts id="a39d2f2a-e0e5-47ff-94b6-06c505b4821c"/>
</children>
<children id="099c3987-a684-4ee1-8cb5-ba4c61b8bb61">
<prototypeId>c0460450-a21e-42f2-b9f6-f29e63a909eb</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>Горизонтальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0"/>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="cae6ec6f-f216-40d2-987f-777097fcc6fa">
<prototypeId>67f2e8a8-e32b-4bf0-940b-ab505be146f9</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>delete</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0d"/>
<scripts id="63146005-9c88-408e-acff-bbb3e3171673"/>
</children>
<children id="a571c021-a01a-41eb-8520-0b07730c84ed">
<prototypeId>c4751b6c-abb3-44e7-9f4d-7b1887d736d1</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>Горизонтальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0"/>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="58523375-d13c-44ea-9089-98ffc88a96b9">
<prototypeId>d6b561b0-cf80-493f-8499-1c4646a12848</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>show-dialog</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="4c1ee010-2fb2-4260-897b-75a3b6947b68"/>
</children>
<children id="6c235e54-db0a-4d55-9cf3-199fe3d510c3">
<prototypeId>1704b964-7410-4909-81af-baa39019103c</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>Диалог</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="48d405ee-5991-4027-bfee-113a895bf8f8"/>
<scripts id="b463917a-16fc-42db-9c92-9c1027e9232e"/>
<scripts id="24a13b10-fec4-420e-aa2e-5af0ec41326a"/>
<scripts id="5f57bb31-85b0-4692-9f1f-d6369dea6e95"/>
<children id="de80fbff-9a75-4ac9-b95e-7cb10370641d">
<prototypeId>2aecaba7-557f-4628-abf9-2ae64d9c136d</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>Вертикальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="72befe90-1915-483f-b88c-d1ec5d4bdc8e"/>
<scripts id="87f3fefa-b77b-4137-aab6-b2bcd83ce380"/>
<scripts id="ef21ca22-3f81-4484-ba6f-58d670c12d4f"/>
<scripts id="277e6fbc-9e2e-4080-bf20-5d8be18e6764"/>
<children id="7f5e7039-96b1-49af-9110-6a004ff7b1d1">
<prototypeId>a07d0119-b9d5-465f-a8e5-991fb0ae5dd3</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>Форма</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="e265a56c-f122-46ac-9e66-d603a1c8a0f9"/>
<scripts id="7de9427f-76dd-49ea-ab4f-fa3f1d0cf0a2"/>
<scripts id="57779237-6bd7-4f73-ab62-efc79cc249b9"/>
<scripts id="ad6ccafe-914e-4e13-a351-88bf107a5007"/>
<scripts id="9ad247a3-9c46-4f12-9949-b1c905bd73bc"/>
<scripts id="79188cdc-d646-433e-9751-1482b9247ee6"/>
<children id="1f623eae-4b8f-4eab-92d0-325350e946d0">
<prototypeId>5d81f881-411c-40b7-8eba-9ebb880ce4ab</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>authority-id</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="cf4526a1-96ab-4820-8aa9-62fb54c2b64c"/>
<scripts id="d9ac3145-9d66-42bd-9f24-1c3d0d2e31d0"/>
<scripts id="761c7d60-f685-4dd6-afe6-c63265242e80"/>
<scripts id="5ba072f6-3017-4f32-9a6a-1ca5e690e1dd"/>
<scripts id="ef53357a-6f68-4479-9a05-d37cfb44b6ba"/>
<scripts id="2e66508a-de36-4816-b32c-18f8c7c39830"/>
</children>
<children id="f8e12033-c0d1-43b8-9874-b94d5763ea43">
<prototypeId>a413592c-bd84-48e5-a6f0-af87cd075640</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>Action controller</name>
<container>false</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
<children id="d63a9f27-3de2-418b-8a91-eab239f6fa56">
<prototypeId>9e81c3a0-4b1c-46af-a28f-78510fac789f</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>role</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="23992f0e-94ed-4fb4-b4d1-dc6ad7f13227"/>
<scripts id="efb0fec7-9951-4b36-bbda-fa17aa002d74"/>
<scripts id="44c9430b-11a8-4644-91e2-12affaa6510a"/>
<scripts id="4d028ea6-e4a3-4acf-bd60-de7aa1a78f71"/>
<scripts id="9f543b36-92e3-4a63-b8db-a4d7e852113e"/>
<scripts id="47f307b6-79a7-4c9a-96d6-6ee423565f02"/>
</children>
</children>
<children id="934cbe00-16e8-40c2-8a40-04386e089f08">
<prototypeId>2b2ae47e-ec3a-48bd-a4cf-77a3a817ebe6</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>Горизонтальный контейнер</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="b6068710-0f31-48ec-8e03-c0c1480a40c0"/>
<scripts id="fe04d7fb-6c5b-46c4-b723-667732d81f4f"/>
<scripts id="5c566210-2a60-4048-a2d1-84c7dd023248"/>
<scripts id="3171b2e1-b4af-4335-95fa-1b2592604b84"/>
<children id="2f994f9e-ec39-4ae1-a921-9808784159a8">
<prototypeId>1f65aebc-3112-4336-8339-db6aae6574cf</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>save</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
</children>
<children id="afc99798-ff35-4f96-b591-c4622d8cfba2">
<prototypeId>c3f258bb-9843-4f97-acbf-492ddd583a5b</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>cancel</name>
<container>false</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
</children>
<children id="97d81971-f73b-4966-a9f6-5bb47fc41900">
<prototypeId>5f3abfc2-545a-4e30-961b-e5ae5388a5d6</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>show-action</name>
<container>false</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
</children>
</children>
</children>
<children id="96aaa41a-7374-4566-a776-390eb5959270">
<prototypeId>828a292b-3fd3-46da-b0af-22c7dbbffa4f</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>hide-on-cancel-action</name>
<container>false</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
<children id="24bdcc7f-5a70-40da-aba0-bdd6f61eae81">
<prototypeId>1e99095a-60eb-4612-be43-e8dacad53e49</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>on-save-action</name>
<container>false</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
<children id="1b653660-0bc0-4c64-a702-b31cb2755bc6">
<prototypeId>b5722d45-1042-4ea0-a94f-aed3ad0f11ea</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>ac-role-unbind</name>
<container>false</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
<children id="759b009f-75a3-4ab0-8e6c-2fa498add692">
<prototypeId>255d2278-be77-4af9-b599-48dba63695bf</prototypeId>
<componentRootId>44886585-d33e-4203-840a-e788653e923a</componentRootId>
<name>ac-role-bind</name>
<container>false</container>
<expanded>false</expanded>
<childrenReordered>false</childrenReordered>
<scripts id="1d700a6b-96bb-4c9b-96d5-231017316f05">
<removed>true</removed>
</scripts>
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e"/>
</children>
</children>
</children>
</children>
</rootObjects>
</xmlPage>

View file

@ -1,24 +1,15 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:roles xmlns:ns2="http://cg.ru/web-bpm/bpm-role">
<role>
<name>Ответственный за ЗИ</name>
<name>security_administrator</name>
<description>Администратор ПОИБ</description>
</role>
<role>
<name>Администратор ПОИБ</name>
<name>Responsible_for_internal_control</name>
<description>Ответственный за ЗИ СВК</description>
</role>
<role>
<name>Ответственный за ЗИ СВК</name>
</role>
<role>
<name>Военный комиссар</name>
</role>
<role>
<name>Сотрудник ВК</name>
</role>
<role>
<name>Управления параметрами информационной безопасности</name>
</role>
<role>
<name>Список пользователей</name>
<name>Responsible_for_information_security</name>
<description>Ответственный за ЗИ</description>
</role>
</ns2:roles>