Merge branch 'master' into develop

This commit is contained in:
Eduard Tihomirov 2025-03-21 11:54:46 +03:00
commit 198f01641f
148 changed files with 557 additions and 376 deletions

View file

@ -0,0 +1,19 @@
package ru.micord.ervu.audit.config;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* @author Adel Kalimullin
*/
public class AuditDisabledCondition implements Condition {
private static final String AUDIT_ENABLED_PROPERTY_NAME = "audit.kafka.enabled";
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment env = context.getEnvironment();
return !Boolean.parseBoolean(env.getProperty(AUDIT_ENABLED_PROPERTY_NAME));
}
}

View file

@ -0,0 +1,20 @@
package ru.micord.ervu.audit.config;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* @author Adel Kalimullin
*/
public class AuditEnabledCondition implements Condition {
private static final String AUDIT_ENABLED_PROPERTY_NAME = "audit.kafka.enabled";
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment env = context.getEnvironment();
return Boolean.parseBoolean(env.getProperty(AUDIT_ENABLED_PROPERTY_NAME));
}
}

View file

@ -11,6 +11,7 @@ import org.apache.kafka.common.config.SaslConfigs;
import org.apache.kafka.common.serialization.StringSerializer; import org.apache.kafka.common.serialization.StringSerializer;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.config.TopicBuilder; import org.springframework.kafka.config.TopicBuilder;
import org.springframework.kafka.core.DefaultKafkaProducerFactory; import org.springframework.kafka.core.DefaultKafkaProducerFactory;
@ -22,6 +23,7 @@ import org.springframework.kafka.core.ProducerFactory;
* @author Adel Kalimullin * @author Adel Kalimullin
*/ */
@Configuration @Configuration
@Conditional(AuditEnabledCondition.class)
public class AuditKafkaConfig { public class AuditKafkaConfig {
@Value("${audit.kafka.bootstrap.servers}") @Value("${audit.kafka.bootstrap.servers}")
private String bootstrapServers; private String bootstrapServers;
@ -35,11 +37,11 @@ public class AuditKafkaConfig {
private String password; private String password;
@Value("${audit.kafka.sasl.mechanism}") @Value("${audit.kafka.sasl.mechanism}")
private String saslMechanism; private String saslMechanism;
@Value("${audit.kafka.authorization.topic}") @Value("${audit.kafka.authorization.topic:ervu.lkrp.auth.events}")
private String authorizationTopic; private String authorizationTopic;
@Value("${audit.kafka.action.topic}") @Value("${audit.kafka.action.topic:ervu.lkrp.action.events}")
private String actionTopic; private String actionTopic;
@Value("${audit.kafka.file.download.topic}") @Value("${audit.kafka.file.download.topic:ervu.lkrp.import.file}")
private String fileDownloadTopic; private String fileDownloadTopic;
@Bean("auditProducerFactory") @Bean("auditProducerFactory")

View file

@ -3,20 +3,20 @@ package ru.micord.ervu.audit.service.impl;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Conditional;
import org.springframework.kafka.core.KafkaTemplate; import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import ru.micord.ervu.audit.config.AuditEnabledCondition;
import ru.micord.ervu.audit.service.AuditKafkaPublisher; import ru.micord.ervu.audit.service.AuditKafkaPublisher;
/** /**
* @author Adel Kalimullin * @author Adel Kalimullin
*/ */
@Service @Service
@Conditional(AuditEnabledCondition.class)
public class BaseAuditKafkaPublisher implements AuditKafkaPublisher { public class BaseAuditKafkaPublisher implements AuditKafkaPublisher {
private static final Logger LOGGER = LoggerFactory.getLogger(BaseAuditKafkaPublisher.class); private static final Logger LOGGER = LoggerFactory.getLogger(BaseAuditKafkaPublisher.class);
private final KafkaTemplate<String, String> kafkaTemplate; private final KafkaTemplate<String, String> kafkaTemplate;
@Value("${audit.kafka.enabled}")
private boolean auditEnabled;
public BaseAuditKafkaPublisher( public BaseAuditKafkaPublisher(
@Qualifier("auditTemplate") KafkaTemplate<String, String> kafkaTemplate) { @Qualifier("auditTemplate") KafkaTemplate<String, String> kafkaTemplate) {
@ -25,7 +25,6 @@ public class BaseAuditKafkaPublisher implements AuditKafkaPublisher {
@Override @Override
public void publishEvent(String topic, String message) { public void publishEvent(String topic, String message) {
if (auditEnabled) {
kafkaTemplate.send(topic, message) kafkaTemplate.send(topic, message)
.addCallback( .addCallback(
result -> { result -> {
@ -35,8 +34,4 @@ public class BaseAuditKafkaPublisher implements AuditKafkaPublisher {
) )
); );
} }
else {
LOGGER.info("Audit is disabled. Event not published.");
}
}
} }

View file

@ -5,7 +5,9 @@ import javax.servlet.http.HttpServletRequest;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Conditional;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import ru.micord.ervu.audit.config.AuditEnabledCondition;
import ru.micord.ervu.audit.constants.AuditConstants; import ru.micord.ervu.audit.constants.AuditConstants;
import ru.micord.ervu.audit.model.AuditActionEvent; import ru.micord.ervu.audit.model.AuditActionEvent;
import ru.micord.ervu.audit.model.AuditActionRequest; import ru.micord.ervu.audit.model.AuditActionRequest;
@ -22,15 +24,16 @@ import ru.micord.ervu.util.NetworkUtils;
* @author Adel Kalimullin * @author Adel Kalimullin
*/ */
@Service @Service
@Conditional(AuditEnabledCondition.class)
public class BaseAuditService implements AuditService { public class BaseAuditService implements AuditService {
private final AuditKafkaPublisher auditPublisher; private final AuditKafkaPublisher auditPublisher;
private final JwtTokenService jwtTokenService; private final JwtTokenService jwtTokenService;
private final ObjectMapper objectMapper; private final ObjectMapper objectMapper;
@Value("${audit.kafka.authorization.topic}") @Value("${audit.kafka.authorization.topic:ervu.lkrp.auth.events}")
private String authorizationTopic; private String authorizationTopic;
@Value("${audit.kafka.action.topic}") @Value("${audit.kafka.action.topic:ervu.lkrp.action.events}")
private String actionTopic; private String actionTopic;
@Value("${audit.kafka.file.download.topic}") @Value("${audit.kafka.file.download.topic:ervu.lkrp.import.file}")
private String fileDownloadTopic; private String fileDownloadTopic;
public BaseAuditService(AuditKafkaPublisher auditPublisher, JwtTokenService jwtTokenService, public BaseAuditService(AuditKafkaPublisher auditPublisher, JwtTokenService jwtTokenService,

View file

@ -0,0 +1,32 @@
package ru.micord.ervu.audit.service.impl;
import javax.servlet.http.HttpServletRequest;
import org.springframework.context.annotation.Conditional;
import org.springframework.stereotype.Service;
import ru.micord.ervu.audit.config.AuditDisabledCondition;
import ru.micord.ervu.audit.model.AuditActionRequest;
import ru.micord.ervu.audit.service.AuditService;
import ru.micord.ervu.security.esia.model.PersonModel;
/**
* @author Adel Kalimullin
*/
@Service
@Conditional(AuditDisabledCondition.class)
public class StubAuditService implements AuditService {
@Override
public void processActionEvent(HttpServletRequest request,
AuditActionRequest auditActionRequest) {}
@Override
public void processAuthEvent(HttpServletRequest request, PersonModel personModel, String status,
String eventType) {
}
@Override
public void processDownloadEvent(HttpServletRequest request, int fileSize, String fileName,
String formatRegistry, String status) {
}
}

View file

@ -1,11 +1,14 @@
package ru.micord.ervu.security.esia; package ru.micord.ervu.security.esia;
import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import ru.micord.ervu.security.esia.exception.EsiaException;
import ru.micord.ervu.security.esia.model.ExpiringState; import ru.micord.ervu.security.esia.model.ExpiringState;
import ru.micord.ervu.security.esia.model.ExpiringToken; import ru.micord.ervu.security.esia.model.ExpiringToken;
@ -16,7 +19,7 @@ public class EsiaAuthInfoStore {
private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private static final Map<String, ExpiringToken> ACCESS_TOKENS_MAP = new ConcurrentHashMap<>(); private static final Map<String, ExpiringToken> ACCESS_TOKENS_MAP = new ConcurrentHashMap<>();
private static final Map<String, ExpiringToken> REFRESH_TOKENS_MAP = new ConcurrentHashMap<>(); private static final Map<String, ExpiringToken> REFRESH_TOKENS_MAP = new ConcurrentHashMap<>();
private static final Map<String, ExpiringState> PRNS_UUID_STATE_MAP = new ConcurrentHashMap<>(); private static final Map<String, List<ExpiringState>> PRNS_UUID_STATE_MAP = new ConcurrentHashMap<>();
public static void addAccessToken(String prnOid, String token, long expiresIn) { public static void addAccessToken(String prnOid, String token, long expiresIn) {
if (token != null) { if (token != null) {
@ -79,13 +82,34 @@ public class EsiaAuthInfoStore {
REFRESH_TOKENS_MAP.remove(prnOid); REFRESH_TOKENS_MAP.remove(prnOid);
} }
public static void addState(String prnsUUID, String state, long expiresIn) { public static void addState(String prnsUUID, String state, long expiresIn, long attemptsCount) {
long expiryTime = System.currentTimeMillis() + expiresIn * 1000L; long expiryTime = System.currentTimeMillis() + expiresIn * 1000L;
PRNS_UUID_STATE_MAP.put(prnsUUID, new ExpiringState(state, expiryTime)); ExpiringState newState = new ExpiringState(state, expiryTime);
PRNS_UUID_STATE_MAP.compute(prnsUUID, (key, states) -> {
if (states == null) {
states = new CopyOnWriteArrayList<>();
}
if (states.size() >= attemptsCount) {
throw new EsiaException("The number of login attempts has been exceeded.");
}
states.add(newState);
return states;
});
} }
public static String getState(String prnsUUID) { public static boolean containsState(String prnsUUID, String state) {
return PRNS_UUID_STATE_MAP.get(prnsUUID).getState(); List<ExpiringState> states = PRNS_UUID_STATE_MAP.get(prnsUUID);
if (states == null) {
return false;
}
long currentTime = System.currentTimeMillis();
states.removeIf(expiringState -> expiringState.getExpiryTime() < currentTime);
for (ExpiringState expiringState : states) {
if (expiringState.getState().equals(state)) {
return true;
}
}
return false;
} }
public static void removeState(String prnsUUID) { public static void removeState(String prnsUUID) {
@ -94,10 +118,10 @@ public class EsiaAuthInfoStore {
public static void removeExpiredState() { public static void removeExpiredState() {
for (String key : PRNS_UUID_STATE_MAP.keySet()) { for (String key : PRNS_UUID_STATE_MAP.keySet()) {
ExpiringState state = PRNS_UUID_STATE_MAP.get(key); PRNS_UUID_STATE_MAP.computeIfPresent(key, (k, states) -> {
if (state != null && state.isExpired()) { states.removeIf(ExpiringState::isExpired);
PRNS_UUID_STATE_MAP.remove(key); return states.isEmpty() ? null : states;
} });
} }
} }
} }

View file

@ -59,6 +59,9 @@ public class EsiaConfig {
@Value("${esia.state.cookie.life.time:300}") @Value("${esia.state.cookie.life.time:300}")
private long esiaStateCookieLifeTime; private long esiaStateCookieLifeTime;
@Value("${esia.login.attempts.count:5}")
private long esiaLoginAttemptsCount;
public String getEsiaScopes() { public String getEsiaScopes() {
String[] scopeItems = esiaScopes.split(","); String[] scopeItems = esiaScopes.split(",");
@ -123,4 +126,8 @@ public class EsiaConfig {
public long getEsiaStateCookieLifeTime() { public long getEsiaStateCookieLifeTime() {
return esiaStateCookieLifeTime; return esiaStateCookieLifeTime;
} }
public long getEsiaLoginAttemptsCount() {
return esiaLoginAttemptsCount;
}
} }

View file

@ -32,8 +32,8 @@ public class EsiaController {
private JwtTokenService jwtTokenService; private JwtTokenService jwtTokenService;
@RequestMapping(value = "/esia/url") @RequestMapping(value = "/esia/url")
public String getEsiaUrl(HttpServletResponse response) { public String getEsiaUrl(HttpServletResponse response, HttpServletRequest request) {
return esiaAuthService.generateAuthCodeUrl(response); return esiaAuthService.generateAuthCodeUrl(response, request);
} }
@GetMapping(value = "/esia/auth") @GetMapping(value = "/esia/auth")

View file

@ -14,6 +14,7 @@ import java.time.LocalDateTime;
import java.time.ZoneId; import java.time.ZoneId;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
@ -30,6 +31,8 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.support.MessageSourceAccessor; import org.springframework.context.support.MessageSourceAccessor;
import org.springframework.http.ResponseCookie; import org.springframework.http.ResponseCookie;
import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContext;
import ru.micord.ervu.audit.constants.AuditConstants;
import ru.micord.ervu.audit.service.AuditService;
import org.springframework.web.util.WebUtils; import org.springframework.web.util.WebUtils;
import ru.micord.ervu.audit.constants.AuditConstants; import ru.micord.ervu.audit.constants.AuditConstants;
import ru.micord.ervu.audit.service.AuditService; import ru.micord.ervu.audit.service.AuditService;
@ -97,7 +100,7 @@ public class EsiaAuthService {
@Value("${ervu.kafka.request.topic}") @Value("${ervu.kafka.request.topic}")
private String requestTopic; private String requestTopic;
public String generateAuthCodeUrl(HttpServletResponse response) { public String generateAuthCodeUrl(HttpServletResponse response, HttpServletRequest request) {
try { try {
String clientId = esiaConfig.getClientId(); String clientId = esiaConfig.getClientId();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss xx"); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss xx");
@ -105,6 +108,10 @@ public class EsiaAuthService {
String timestamp = dt.format(formatter); String timestamp = dt.format(formatter);
String state = UUID.randomUUID().toString(); String state = UUID.randomUUID().toString();
String prnsUUID = UUID.randomUUID().toString(); String prnsUUID = UUID.randomUUID().toString();
Cookie oldPrnsCookie = WebUtils.getCookie(request, PRNS_UUID);
if (oldPrnsCookie != null) {
prnsUUID = oldPrnsCookie.getValue();
}
String redirectUrl = esiaConfig.getRedirectUrl(); String redirectUrl = esiaConfig.getRedirectUrl();
String redirectUrlEncoded = redirectUrl.replaceAll(":", "%3A") String redirectUrlEncoded = redirectUrl.replaceAll(":", "%3A")
.replaceAll("/", "%2F"); .replaceAll("/", "%2F");
@ -118,7 +125,7 @@ public class EsiaAuthService {
parameters.put("redirect_uri", esiaConfig.getRedirectUrl()); parameters.put("redirect_uri", esiaConfig.getRedirectUrl());
String clientSecret = signMap(parameters); String clientSecret = signMap(parameters);
EsiaAuthInfoStore.addState(prnsUUID, state, esiaConfig.getEsiaStateCookieLifeTime()); EsiaAuthInfoStore.addState(prnsUUID, state, esiaConfig.getEsiaStateCookieLifeTime(), esiaConfig.getEsiaLoginAttemptsCount());
ResponseCookie prnsCookie = securityHelper.createCookie(PRNS_UUID, prnsUUID, "/") ResponseCookie prnsCookie = securityHelper.createCookie(PRNS_UUID, prnsUUID, "/")
.maxAge(esiaConfig.getEsiaStateCookieLifeTime()) .maxAge(esiaConfig.getEsiaStateCookieLifeTime())
.build(); .build();
@ -330,6 +337,9 @@ public class EsiaAuthService {
tokenResponse != null ? tokenResponse.getErrorDescription() : "response is empty"; tokenResponse != null ? tokenResponse.getErrorDescription() : "response is empty";
throw new IllegalStateException("Esia response error. " + errMsg); throw new IllegalStateException("Esia response error. " + errMsg);
} }
if (!tokenResponse.getState().equals(state)) {
throw new EsiaException("Token invalid. State from request not equals with state from response.");
}
String esiaAccessTokenStr = tokenResponse.getAccessToken(); String esiaAccessTokenStr = tokenResponse.getAccessToken();
String verifyResult = verifyToken(esiaAccessTokenStr); String verifyResult = verifyToken(esiaAccessTokenStr);
if (verifyResult != null) { if (verifyResult != null) {
@ -385,6 +395,7 @@ public class EsiaAuthService {
public String logout(HttpServletRequest request, HttpServletResponse response) { public String logout(HttpServletRequest request, HttpServletResponse response) {
PersonModel personModel = null; PersonModel personModel = null;
String status = null;
try { try {
String userId = jwtTokenService.getUserAccountId(request); String userId = jwtTokenService.getUserAccountId(request);
String accessToken = EsiaAuthInfoStore.getAccessToken(userId); String accessToken = EsiaAuthInfoStore.getAccessToken(userId);
@ -399,18 +410,19 @@ public class EsiaAuthService {
"client_id", esiaConfig.getClientId(), "client_id", esiaConfig.getClientId(),
"redirect_url", redirectUrl "redirect_url", redirectUrl
); );
auditService.processAuthEvent( status = AuditConstants.SUCCESS_STATUS;
request, personModel, AuditConstants.SUCCESS_STATUS, AuditConstants.LOGOUT_EVENT_TYPE
);
return buildUrl(url, params); return buildUrl(url, params);
} }
catch (Exception e) { catch (Exception e) {
status = AuditConstants.FAILURE_STATUS;
throw new EsiaException(e);
}
finally {
if (personModel != null){ if (personModel != null){
auditService.processAuthEvent( auditService.processAuthEvent(
request, personModel, AuditConstants.FAILURE_STATUS, AuditConstants.LOGOUT_EVENT_TYPE request, personModel, status, AuditConstants.LOGOUT_EVENT_TYPE
); );
} }
throw new EsiaException(e);
} }
} }
@ -475,8 +487,11 @@ public class EsiaAuthService {
ZoneId.systemDefault() ZoneId.systemDefault()
); );
LocalDateTime currentTime = LocalDateTime.now(); LocalDateTime currentTime = LocalDateTime.now();
if (!currentTime.isAfter(iatTime) || !expTime.isAfter(iatTime)) { if (currentTime.getNano() > 0) {
return "Token invalid. Token expired"; currentTime = currentTime.plusSeconds(1).truncatedTo(ChronoUnit.SECONDS);
}
if (currentTime.isBefore(iatTime) || expTime.isBefore(iatTime) || currentTime.isAfter(expTime)) {
return "Token invalid. Token expired, current: " + currentTime + " iat: " + iatTime + " exp: " + expTime;
} }
HttpResponse<String> response = signVerify(accessToken); HttpResponse<String> response = signVerify(accessToken);
if (response.statusCode() != 200) { if (response.statusCode() != 200) {
@ -512,8 +527,7 @@ public class EsiaAuthService {
return "State invalid. Cookie not found"; return "State invalid. Cookie not found";
} }
String prnsUUID = cookie.getValue(); String prnsUUID = cookie.getValue();
String oldState = EsiaAuthInfoStore.getState(prnsUUID); if (!EsiaAuthInfoStore.containsState(prnsUUID, state)) {
if (oldState == null || !oldState.equals(state)) {
return "State invalid. State from ESIA not equals with state before"; return "State invalid. State from ESIA not equals with state before";
} }
EsiaAuthInfoStore.removeState(prnsUUID); EsiaAuthInfoStore.removeState(prnsUUID);

View file

@ -1 +1 @@
error.unknown=The system is temporarily unavailable. Please try again later. error.unknown=The system is temporarily unavailable. Please try again later.

View file

@ -81,7 +81,7 @@ http {
index index.html; index index.html;
try_files $uri @index; try_files $uri @index;
add_header Content-Security-Policy "frame-ancestors 'none'; default-src 'self'; connect-src 'self' https://www.sberbank.ru; script-src 'self'; style-src 'unsafe-inline' 'self' data:; font-src 'self' data:; img-src 'self' data:;"; add_header Content-Security-Policy "frame-ancestors 'none'; default-src 'self'; connect-src 'self' https://xn--1-6tb.xn--b1afabzvcegckfhg.xn--p1ai/ https://xn--2-6tb.xn--b1afbulhcegckfhg.xn--p1ai/; script-src 'self'; style-src 'unsafe-inline' 'self' data:; font-src 'self' data:; img-src 'self' data:;";
#Application config #Application config
location = /src/resources/app-config.json { location = /src/resources/app-config.json {
@ -106,7 +106,7 @@ http {
location @index { location @index {
root /frontend; root /frontend;
add_header Cache-Control "no-cache"; add_header Cache-Control "no-cache";
add_header Content-Security-Policy "frame-ancestors 'none'; default-src 'self'; connect-src 'self' https://www.sberbank.ru; script-src 'self'; style-src 'unsafe-inline' 'self' data:; font-src 'self' data:; img-src 'self' data:;"; add_header Content-Security-Policy "frame-ancestors 'none'; default-src 'self'; connect-src 'self' https://xn--1-6tb.xn--b1afabzvcegckfhg.xn--p1ai/ https://xn--2-6tb.xn--b1afbulhcegckfhg.xn--p1ai/; script-src 'self'; style-src 'unsafe-inline' 'self' data:; font-src 'self' data:; img-src 'self' data:;";
expires 0; expires 0;
try_files /index.html =404; try_files /index.html =404;
} }

View file

@ -5,7 +5,7 @@
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Security-Policy" <meta http-equiv="Content-Security-Policy"
content="default-src 'self'; connect-src 'self' https://www.sberbank.ru; script-src 'self'; style-src 'unsafe-inline' 'self' data:; font-src 'self' data:; img-src 'self' data:"/> content="default-src 'self'; connect-src 'self' https://xn--1-6tb.xn--b1afabzvcegckfhg.xn--p1ai/ https://xn--2-6tb.xn--b1afbulhcegckfhg.xn--p1ai/; script-src 'self'; style-src 'unsafe-inline' 'self' data:; font-src 'self' data:; img-src 'self' data:"/>
<meta name="referrer" content="strict-origin-when-cross-origin"/> <meta name="referrer" content="strict-origin-when-cross-origin"/>
<link rel="icon" type="image/png" href="src/resources/img/logo.png"/> <link rel="icon" type="image/png" href="src/resources/img/logo.png"/>
</head> </head>

View file

@ -1748,9 +1748,9 @@
} }
}, },
"@webbpm/base-package": { "@webbpm/base-package": {
"version": "3.187.2", "version": "3.187.4",
"resolved": "https://repo.micord.ru/repository/npm-all/@webbpm/base-package/-/base-package-3.187.2.tgz", "resolved": "https://repo.micord.ru/repository/npm-all/@webbpm/base-package/-/base-package-3.187.4.tgz",
"integrity": "sha512-qDW+Yjm/gyTIM/4N7uQasQR1zk2tGGAF6rJFpSUSb1A7PYreXPqSAShzWJJJ1YZ9CCz2dAXSQzm6JjUJKu2VUg==", "integrity": "sha512-2MrVersJ+No7/DMDxJPuBXGoy3NmLNPtTsa4Ua0kooZmR1er7w7YnrIUtkakEXrWSODt0ki7XB9w3f1RFVAGtg==",
"requires": { "requires": {
"tslib": "^1.9.0" "tslib": "^1.9.0"
} }

View file

@ -26,7 +26,7 @@
"@angular/platform-browser-dynamic": "7.2.15", "@angular/platform-browser-dynamic": "7.2.15",
"@angular/router": "7.2.15", "@angular/router": "7.2.15",
"@ng-bootstrap/ng-bootstrap": "4.2.2-micord.1", "@ng-bootstrap/ng-bootstrap": "4.2.2-micord.1",
"@webbpm/base-package": "3.187.2", "@webbpm/base-package": "3.187.4",
"ag-grid-angular": "29.0.0-micord.4", "ag-grid-angular": "29.0.0-micord.4",
"ag-grid-community": "29.0.0-micord.4", "ag-grid-community": "29.0.0-micord.4",
"angular-calendar": "0.28.28", "angular-calendar": "0.28.28",

View file

@ -17,5 +17,6 @@
"password_pattern_error": "Пароль должен содержать заглавные или прописные буквы и как минимум 1 цифру", "password_pattern_error": "Пароль должен содержать заглавные или прописные буквы и как минимум 1 цифру",
"show.client.errors": false, "show.client.errors": false,
"available_task.single_fetch": true, "available_task.single_fetch": true,
"cert_check_url": "https://lkrp-dev2.micord.ru" "cert_check_url": "https://xn--1-6tb.xn--b1afabzvcegckfhg.xn--p1ai/",
"unknown.error.msg": "Система временно недоступна. Пожалуйста, повторите попытку позже."
} }

View file

@ -211,6 +211,8 @@ body.webbpm.ervu_lkrp_fl {
} }
.webbpm.ervu_lkrp_fl .container { .webbpm.ervu_lkrp_fl .container {
display: flex;
flex-direction: column;
padding-top: var(--h-header); padding-top: var(--h-header);
bottom: 0; bottom: 0;
} }
@ -226,6 +228,9 @@ body.webbpm.ervu_lkrp_fl {
flex: 1; flex: 1;
padding: var(--indent-huge) var(--w-screen); padding: var(--indent-huge) var(--w-screen);
} }
.webbpm.ervu_lkrp_ul .container-inside home-landing + app-footer {
display: none;
}
/*@media ((max-width: 780px) or ((orientation: landscape) and (max-device-width : 1024px))) {*/ /*@media ((max-width: 780px) or ((orientation: landscape) and (max-device-width : 1024px))) {*/
@media (max-width: 1024px) { @media (max-width: 1024px) {

View file

@ -1,6 +1,7 @@
import {Injectable} from "@angular/core"; import {Injectable} from "@angular/core";
import {HttpClient} from "@angular/common/http"; import {HttpClient} from "@angular/common/http";
import {Router} from "@angular/router"; import {Router} from "@angular/router";
import {AuthenticationService} from "../../modules/security/authentication.service";
@Injectable({ @Injectable({
@ -8,26 +9,30 @@ import {Router} from "@angular/router";
}) })
export class AuditService { export class AuditService {
constructor(private httpClient: HttpClient, private router: Router) { constructor(private httpClient: HttpClient,
private router: Router,
private authService: AuthenticationService) {
} }
public logActionAudit(eventType: string, fileName?: string): void { public logActionAudit(eventType: string, fileName?: string): void {
const currentRoute = this.router.url; if (this.authService.isAuthenticated()) {
const sourceUrl = window.location.href; const currentRoute = this.router.url;
const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; const sourceUrl = window.location.href;
const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
const data: AuditAction = { const data: AuditAction = {
eventType: eventType, eventType: eventType,
sourceUrl: sourceUrl, sourceUrl: sourceUrl,
route: currentRoute, route: currentRoute,
fileName: fileName fileName: fileName
}; };
this.httpClient.post("audit/action", data, { this.httpClient.post("audit/action", data, {
headers: { headers: {
"Client-Time-Zone": timeZone, "Client-Time-Zone": timeZone,
} }
}).toPromise(); }).toPromise();
}
} }
} }

View file

@ -2,6 +2,7 @@ import {Injectable} from '@angular/core';
import {HttpClient} from '@angular/common/http'; import {HttpClient} from '@angular/common/http';
import {CookieService} from "ngx-cookie"; import {CookieService} from "ngx-cookie";
import {AppConfigService} from "@webbpm/base-package"; import {AppConfigService} from "@webbpm/base-package";
import {map, tap} from "rxjs/operators";
@Injectable({providedIn: 'root'}) @Injectable({providedIn: 'root'})
export class AuthenticationService { export class AuthenticationService {
@ -22,4 +23,13 @@ export class AuthenticationService {
public isAuthenticated(): boolean { public isAuthenticated(): boolean {
return this.cookieService.get('webbpm.ervu-lkrp-fl') != null; return this.cookieService.get('webbpm.ervu-lkrp-fl') != null;
} }
public redirectToEsia() {
return this.http.get<string>("esia/url").pipe(
tap(url => {
window.open(url, "_self");
}),
map(() => true)
);
}
} }

View file

@ -33,7 +33,7 @@ export abstract class AuthGuard implements CanActivate {
} }
if (error) { if (error) {
let errorMessage = let errorMessage =
'Произошла неизвестная ошибка. Обратитесь к системному администратору'; this.messageService.getUnknowErrorMessage();
let errorCode = this.extractCode(errorDescription); let errorCode = this.extractCode(errorDescription);
if (errorCode) { if (errorCode) {
errorMessage = EsiaErrorDetail.getDescription(errorCode); errorMessage = EsiaErrorDetail.getDescription(errorCode);
@ -49,24 +49,28 @@ export abstract class AuthGuard implements CanActivate {
params: params, params: params,
responseType: 'text', responseType: 'text',
observe: 'response', observe: 'response',
headers: {
"Error-intercept-skip":"true"
}
}) })
.toPromise() .toPromise()
.then( .then(
() => { () => {
window.open(url.origin + url.pathname, "_self"); window.open(url.origin + url.pathname, "_self");
}); })
.catch(reason => {
const json = JSON.parse(reason.error);
json.messages.forEach((errorMessage) => {
this.messageService.error(errorMessage, json);
})
});
return false; return false;
} }
else { else {
return this.httpClient.get<string>("esia/url") return this.authenticationService.redirectToEsia().toPromise().catch((reason) => {
.toPromise() console.error(reason);
.then(url => { return false;
window.open(url, "_self"); });
return true;
}).catch((reason)=> {
console.error(reason);
return false;
});
} }
}).catch((reason) => { }).catch((reason) => {
console.error(reason); console.error(reason);

View file

@ -34,12 +34,7 @@ export class WebbpmComponent {
|| event instanceof NavigationError || event instanceof NavigationError
|| event instanceof NavigationCancel) { || event instanceof NavigationCancel) {
progressIndicationService.hideProgressBar(); progressIndicationService.hideProgressBar();
this.auditService.logActionAudit(AuditConstants.OPEN_PAGE_EVENT);
if (event instanceof NavigationEnd
&& event.url != '/home'
&& event.url != '/access-denied') {
this.auditService.logActionAudit(AuditConstants.OPEN_PAGE_EVENT);
}
} }
}) })
} }

View file

@ -1,14 +1,14 @@
import {HTTP_INTERCEPTORS} from "@angular/common/http"; import {HTTP_INTERCEPTORS} from "@angular/common/http";
import { import {
FormDirtyInterceptor, FormDirtyInterceptor,
HttpSecurityErrorInterceptor,
HttpSecurityInterceptor HttpSecurityInterceptor
} from "@webbpm/base-package"; } from "@webbpm/base-package";
import {AbsoluteUrlCsrfInterceptor} from "./absolute-url-csrf.interceptor"; import {AbsoluteUrlCsrfInterceptor} from "./absolute-url-csrf.interceptor";
import {ErvuHttpSecurityErrorInterceptor} from "./ervu-http-security-error-interceptor";
export const DEFAULT_HTTP_INTERCEPTOR_PROVIDERS = [ export const DEFAULT_HTTP_INTERCEPTOR_PROVIDERS = [
{provide: HTTP_INTERCEPTORS, useClass: HttpSecurityInterceptor, multi: true}, {provide: HTTP_INTERCEPTORS, useClass: HttpSecurityInterceptor, multi: true},
{provide: HTTP_INTERCEPTORS, useClass: HttpSecurityErrorInterceptor, multi: true}, {provide: HTTP_INTERCEPTORS, useClass: ErvuHttpSecurityErrorInterceptor, multi: true},
{provide: HTTP_INTERCEPTORS, useClass: FormDirtyInterceptor, multi: true}, {provide: HTTP_INTERCEPTORS, useClass: FormDirtyInterceptor, multi: true},
{provide: HTTP_INTERCEPTORS, useClass: AbsoluteUrlCsrfInterceptor, multi: true} {provide: HTTP_INTERCEPTORS, useClass: AbsoluteUrlCsrfInterceptor, multi: true}
]; ];

View file

@ -2,10 +2,11 @@ import {HTTP_INTERCEPTORS} from "@angular/common/http";
import {FormDirtyInterceptor, HttpSecurityInterceptor} from "@webbpm/base-package"; import {FormDirtyInterceptor, HttpSecurityInterceptor} from "@webbpm/base-package";
import {DevHttpSecurityErrorInterceptor} from "./http-security-error-interceptor.dev"; import {DevHttpSecurityErrorInterceptor} from "./http-security-error-interceptor.dev";
import {AbsoluteUrlCsrfInterceptor} from "./absolute-url-csrf.interceptor"; import {AbsoluteUrlCsrfInterceptor} from "./absolute-url-csrf.interceptor";
import {ErvuHttpSecurityErrorInterceptor} from "./ervu-http-security-error-interceptor";
export const DEFAULT_HTTP_INTERCEPTOR_PROVIDERS = [ export const DEFAULT_HTTP_INTERCEPTOR_PROVIDERS = [
{provide: HTTP_INTERCEPTORS, useClass: HttpSecurityInterceptor, multi: true}, {provide: HTTP_INTERCEPTORS, useClass: HttpSecurityInterceptor, multi: true},
{provide: HTTP_INTERCEPTORS, useClass: DevHttpSecurityErrorInterceptor, multi: true}, {provide: HTTP_INTERCEPTORS, useClass: ErvuHttpSecurityErrorInterceptor, multi: true},
{provide: HTTP_INTERCEPTORS, useClass: FormDirtyInterceptor, multi: true}, {provide: HTTP_INTERCEPTORS, useClass: FormDirtyInterceptor, multi: true},
{provide: HTTP_INTERCEPTORS, useClass: AbsoluteUrlCsrfInterceptor, multi: true}, {provide: HTTP_INTERCEPTORS, useClass: AbsoluteUrlCsrfInterceptor, multi: true},
]; ];

View file

@ -0,0 +1,43 @@
import {
HttpEvent,
HttpHandler,
HttpInterceptor,
HttpRequest, HttpResponse
} from "@angular/common/http";
import {
HttpSecurityErrorInterceptor,
MessagesService,
UserService
} from "@webbpm/base-package";
import {Injectable} from "@angular/core";
import {Router} from "@angular/router";
import {from, Observable} from "rxjs";
import {catchError, map} from "rxjs/operators";
import {AuthenticationService} from "../../security/authentication.service";
@Injectable()
export class ErvuHttpSecurityErrorInterceptor extends HttpSecurityErrorInterceptor
implements HttpInterceptor {
private authService: AuthenticationService;
constructor(router: Router, messagesService: MessagesService, userService: UserService,
authService: AuthenticationService) {
super(router, messagesService, userService);
this.authService = authService;
}
protected processAuthError(req: HttpRequest<any>, next: HttpHandler,
error: any): Observable<HttpEvent<any>> {
if (this.authService.isAuthenticated()) {
return super.processAuthError(req, next, error);
}
else {
return from(this.authService.redirectToEsia()).pipe(
map(() => new HttpResponse<any>()),
catchError((err) => {
throw err;
})
);
}
}
}

View file

@ -1,19 +1,20 @@
import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from "@angular/common/http"; import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from "@angular/common/http";
import {HttpSecurityErrorInterceptor, MessagesService, UserService} from "@webbpm/base-package"; import {MessagesService, UserService} from "@webbpm/base-package";
import {Injectable} from "@angular/core"; import {Injectable} from "@angular/core";
import {Router} from "@angular/router"; import {Router} from "@angular/router";
import {EMPTY, Observable} from "rxjs"; import {EMPTY, Observable} from "rxjs";
import {catchError} from "rxjs/operators"; import {catchError} from "rxjs/operators";
import {ErvuHttpSecurityErrorInterceptor} from "./ervu-http-security-error-interceptor";
import {AuthenticationService} from "../../security/authentication.service";
@Injectable() @Injectable()
export class DevHttpSecurityErrorInterceptor extends HttpSecurityErrorInterceptor export class DevHttpSecurityErrorInterceptor extends ErvuHttpSecurityErrorInterceptor
implements HttpInterceptor { implements HttpInterceptor {
private router: Router;
constructor(router: Router, messagesService: MessagesService, userService: UserService) { constructor(router: Router, messagesService: MessagesService, userService: UserService,
super(router, messagesService, userService); authService: AuthenticationService) {
this.router = router; super(router, messagesService, userService, authService);
} }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

View file

@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>ru.cg.webbpm.packages.base</groupId> <groupId>ru.cg.webbpm.packages.base</groupId>
<artifactId>resources</artifactId> <artifactId>resources</artifactId>
<version>3.187.2</version> <version>3.187.4</version>
<organization> <organization>
<name>Micord</name> <name>Micord</name>
</organization> </organization>
@ -28,13 +28,13 @@
<jooq.version>3.19.3</jooq.version> <jooq.version>3.19.3</jooq.version>
<jupiter.version>5.10.2</jupiter.version> <jupiter.version>5.10.2</jupiter.version>
<enforcer.manageVersions>true</enforcer.manageVersions> <enforcer.manageVersions>true</enforcer.manageVersions>
<webbpm-platform.version>3.187.2</webbpm-platform.version> <webbpm-platform.version>3.187.4</webbpm-platform.version>
<h2.version>1.4.200</h2.version> <h2.version>1.4.200</h2.version>
<build.timestamp>0115092226</build.timestamp> <build.timestamp>0226064041</build.timestamp>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<junit.platform.version>1.10.0</junit.platform.version> <junit.platform.version>1.10.0</junit.platform.version>
<enforcer.manageExclusions>true</enforcer.manageExclusions> <enforcer.manageExclusions>true</enforcer.manageExclusions>
<revision>3.187.2</revision> <revision>3.187.4</revision>
<metadata.ts.filename>typescript.metadata.json</metadata.ts.filename> <metadata.ts.filename>typescript.metadata.json</metadata.ts.filename>
<package.repository.url>https://repo.micord.ru</package.repository.url> <package.repository.url>https://repo.micord.ru</package.repository.url>
<maven.build.timestamp.format>MMddHHmmss</maven.build.timestamp.format> <maven.build.timestamp.format>MMddHHmmss</maven.build.timestamp.format>
@ -47,19 +47,19 @@
<dependency> <dependency>
<groupId>ru.cg.webbpm.packages.base</groupId> <groupId>ru.cg.webbpm.packages.base</groupId>
<artifactId>converters</artifactId> <artifactId>converters</artifactId>
<version>3.187.2</version> <version>3.187.4</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>ru.cg.webbpm.packages.base</groupId> <groupId>ru.cg.webbpm.packages.base</groupId>
<artifactId>backend</artifactId> <artifactId>backend</artifactId>
<version>3.187.2</version> <version>3.187.4</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>ru.cg.webbpm.packages.base</groupId> <groupId>ru.cg.webbpm.packages.base</groupId>
<artifactId>frontend</artifactId> <artifactId>frontend</artifactId>
<version>3.187.2</version> <version>3.187.4</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
</dependencies> </dependencies>

View file

@ -60,7 +60,7 @@
<ul> <ul>
<li>&#x41e;&#x431;&#x440;&#x430;&#x437;&#x435;&#x446; &#x432;&#x43d;&#x435;&#x448;&#x43d;&#x435;&#x439; &#x441;&#x441;&#x44b;&#x43b;&#x43a;&#x438;: <code>https://www.wildberries.ru/catalog/${sku}/detail.aspx</code></li> <li>&#x41e;&#x431;&#x440;&#x430;&#x437;&#x435;&#x446; &#x432;&#x43d;&#x435;&#x448;&#x43d;&#x435;&#x439; &#x441;&#x441;&#x44b;&#x43b;&#x43a;&#x438;: <code>https://www.wildberries.ru/catalog/${sku}/detail.aspx</code></li>
<li>&#x41e;&#x431;&#x440;&#x430;&#x437;&#x435;&#x446; &#x432;&#x43d;&#x443;&#x442;&#x440;&#x435;&#x43d;&#x43d;&#x435;&#x439; &#x441;&#x441;&#x44b;&#x43b;&#x43a;&#x438;: <code>products/ru.cg.webbpm.packages.base:resources:jar:3.187.2</code></li> <li>&#x41e;&#x431;&#x440;&#x430;&#x437;&#x435;&#x446; &#x432;&#x43d;&#x443;&#x442;&#x440;&#x435;&#x43d;&#x43d;&#x435;&#x439; &#x441;&#x441;&#x44b;&#x43b;&#x43a;&#x438;: <code>products/ru.cg.webbpm.packages.base:resources:jar:3.187.4</code></li>
</ul> </ul>
</li> </li>
<li> <li>

View file

@ -4,17 +4,17 @@
<description>Base webbpm package</description> <description>Base webbpm package</description>
<groupId>ru.cg.webbpm.packages.base</groupId> <groupId>ru.cg.webbpm.packages.base</groupId>
<artifactId>resources</artifactId> <artifactId>resources</artifactId>
<version>3.187.2</version> <version>3.187.4</version>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<backendModule> <backendModule>
<groupId>ru.cg.webbpm.packages.base</groupId> <groupId>ru.cg.webbpm.packages.base</groupId>
<artifactId>backend</artifactId> <artifactId>backend</artifactId>
<version>3.187.2</version> <version>3.187.4</version>
</backendModule> </backendModule>
<frontendModule> <frontendModule>
<packageName>@webbpm/base-package</packageName> <packageName>@webbpm/base-package</packageName>
<version>3.187.2</version> <version>3.187.4</version>
</frontendModule> </frontendModule>
</packageInfo> </packageInfo>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопка.html</documentation> <documentation>component/buttons/Кнопка.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопка_отмены.html</documentation> <documentation>component/buttons/Кнопка_отмены.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопка_очистки_фильтра.html</documentation> <documentation>component/buttons/Кнопка_очистки_фильтра.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопка_удаления.html</documentation> <documentation>component/buttons/Кнопка_удаления.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопкаагрузки.html</documentation> <documentation>component/buttons/Кнопкаагрузки.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопка_вызова_ошибки.html</documentation> <documentation>component/buttons/Кнопка_вызова_ошибки.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<documentation>component/buttons/Кнопка_выполнения_бизнес-процесса.html</documentation> <documentation>component/buttons/Кнопка_выполнения_бизнес-процесса.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопка_выполнения_SQL.html</documentation> <documentation>component/buttons/Кнопка_выполнения_SQL.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопка_для_фильтрации.html</documentation> <documentation>component/buttons/Кнопка_для_фильтрации.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопкаавигации.html</documentation> <documentation>component/buttons/Кнопкаавигации.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопка_сохранения.html</documentation> <documentation>component/buttons/Кнопка_сохранения.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопка_выбора.html</documentation> <documentation>component/buttons/Кнопка_выбора.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопка_подписи.html</documentation> <documentation>component/buttons/Кнопка_подписи.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопкаапуска_бизнес-процесса.html</documentation> <documentation>component/buttons/Кнопкаапуска_бизнес-процесса.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/reporting/Кнопка_печати_из_графа_сущности.html</documentation> <documentation>component/buttons/reporting/Кнопка_печати_из_графа_сущности.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/reporting/Кнопка_печати_отчета_из_формы.html</documentation> <documentation>component/buttons/reporting/Кнопка_печати_отчета_из_формы.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/containers/Сворачиваемая_панель.html</documentation> <documentation>component/containers/Сворачиваемая_панель.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/containers/Диалог.html</documentation> <documentation>component/containers/Диалог.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/containers/Контейнер_с_кнопками.html</documentation> <documentation>component/containers/Контейнер_с_кнопками.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/containers/Группа_полей.html</documentation> <documentation>component/containers/Группа_полей.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/containers/Набор_фильтров.html</documentation> <documentation>component/containers/Набор_фильтров.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/containers/Форма.html</documentation> <documentation>component/containers/Форма.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/containers/Горизонтальный_контейнер.html</documentation> <documentation>component/containers/Горизонтальный_контейнер.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/containers/Контейнер_вкладок.html</documentation> <documentation>component/containers/Контейнер_вкладок.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/containers/Вкладка.html</documentation> <documentation>component/containers/Вкладка.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/containers/Вертикальный_контейнер.html</documentation> <documentation>component/containers/Вертикальный_контейнер.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/containers/Окно.html</documentation> <documentation>component/containers/Окно.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/editable-grids/EditableGrid.html</documentation> <documentation>component/editable-grids/EditableGrid.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<localization>META-INF/components/localization/editable-grids/autocomplete</localization> <localization>META-INF/components/localization/editable-grids/autocomplete</localization>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<localization>META-INF/components/localization/editable-grids/check-box</localization> <localization>META-INF/components/localization/editable-grids/check-box</localization>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<localization>META-INF/components/localization/editable-grids/combo-box</localization> <localization>META-INF/components/localization/editable-grids/combo-box</localization>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<localization>META-INF/components/localization/editable-grids/date-time-picker</localization> <localization>META-INF/components/localization/editable-grids/date-time-picker</localization>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<localization>META-INF/components/localization/editable-grids/money-field</localization> <localization>META-INF/components/localization/editable-grids/money-field</localization>
<internal>true</internal> <internal>true</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<localization>META-INF/components/localization/editable-grids/number-field</localization> <localization>META-INF/components/localization/editable-grids/number-field</localization>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<localization>META-INF/components/localization/editable-grids/one-to-many</localization> <localization>META-INF/components/localization/editable-grids/one-to-many</localization>
<internal>true</internal> <internal>true</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<localization>META-INF/components/localization/editable-grids/one-to-many</localization> <localization>META-INF/components/localization/editable-grids/one-to-many</localization>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -6,11 +6,11 @@
<localization>META-INF/components/localization/editable-grids/read-only</localization> <localization>META-INF/components/localization/editable-grids/read-only</localization>
<internal>true</internal> <internal>true</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -5,11 +5,11 @@
<category>editable-grids</category> <category>editable-grids</category>
<internal>true</internal> <internal>true</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>Статичный_выпадающий_список_колонки_таблицы.html</documentation> <documentation>Статичный_выпадающий_список_колонки_таблицы.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<localization>META-INF/components/localization/editable-grids/text-area</localization> <localization>META-INF/components/localization/editable-grids/text-area</localization>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<localization>META-INF/components/localization/editable-grids/text-field</localization> <localization>META-INF/components/localization/editable-grids/text-field</localization>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<localization>META-INF/components/localization/editable-grids/time-picker</localization> <localization>META-INF/components/localization/editable-grids/time-picker</localization>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/ФИАС.html</documentation> <documentation>component/fields/ФИАС.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Поле_ввода_с_подбором_значения.html</documentation> <documentation>component/fields/Поле_ввода_с_подбором_значения.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Флаг.html</documentation> <documentation>component/fields/Флаг.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Выпадающий_список.html</documentation> <documentation>component/fields/Выпадающий_список.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Дата.html</documentation> <documentation>component/fields/Дата.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/EditableOneToMany.html</documentation> <documentation>component/fields/EditableOneToMany.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Файл.html</documentation> <documentation>component/fields/Файл.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Файл.html</documentation> <documentation>component/fields/Файл.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/ManyToMany.html</documentation> <documentation>component/fields/ManyToMany.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/ManyToManyField.html</documentation> <documentation>component/fields/ManyToManyField.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Денежное_поле.html</documentation> <documentation>component/fields/Денежное_поле.html</documentation>
<internal>true</internal> <internal>true</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Числовое_поле.html</documentation> <documentation>component/fields/Числовое_поле.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/OneToMany.html</documentation> <documentation>component/fields/OneToMany.html</documentation>
<internal>true</internal> <internal>true</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/OneToMany.html</documentation> <documentation>component/fields/OneToMany.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Переключатель.html</documentation> <documentation>component/fields/Переключатель.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/SignVerification.html</documentation> <documentation>component/fields/SignVerification.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Статичный_выпадающий_список.html</documentation> <documentation>component/fields/Статичный_выпадающий_список.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Статичный_переключатель.html</documentation> <documentation>component/fields/Статичный_переключатель.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Текст.html</documentation> <documentation>component/fields/Текст.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Многострочное_поле.html</documentation> <documentation>component/fields/Многострочное_поле.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Текстовое_поле.html</documentation> <documentation>component/fields/Текстовое_поле.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Время.html</documentation> <documentation>component/fields/Время.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/TreeField.html</documentation> <documentation>component/fields/TreeField.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -5,11 +5,11 @@
<localization>META-INF/components/localization/editable-grid</localization> <localization>META-INF/components/localization/editable-grid</localization>
<internal>true</internal> <internal>true</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -4,11 +4,11 @@
<name>EditableOneToManyForm</name> <name>EditableOneToManyForm</name>
<internal>true</internal> <internal>true</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -5,11 +5,11 @@
<localization>META-INF/components/localization/fields/file-upload-field</localization> <localization>META-INF/components/localization/fields/file-upload-field</localization>
<internal>true</internal> <internal>true</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/filters/Фильтр_по_полю_адреса.html</documentation> <documentation>component/fields/filters/Фильтр_по_полю_адреса.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/filters/Поле_ввода_с_подбором_значения.html</documentation> <documentation>component/fields/filters/Поле_ввода_с_подбором_значения.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/filters/Фильтр_поомпоненте_Флаг.html</documentation> <documentation>component/fields/filters/Фильтр_поомпоненте_Флаг.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/filters/Флаг.html</documentation> <documentation>component/fields/filters/Флаг.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.2</studioVersion> <studioVersion>3.187.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.2</value> <value>3.187.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

Some files were not shown because too many files have changed in this diff Show more