Merge branch 'master' into develop
# Conflicts: # backend/pom.xml # backend/src/main/java/ru/micord/ervu/kafka/service/impl/BaseReplyingKafkaService.java # backend/src/main/java/ru/micord/ervu/security/esia/service/EsiaAuthService.java # backend/src/main/java/ru/micord/ervu/security/esia/service/EsiaPersonalDataService.java # backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/service/JwtTokenService.java # config/local.env # distribution/pom.xml # frontend/pom.xml # pom.xml # resources/pom.xml
This commit is contained in:
commit
0069dcfa5a
22 changed files with 357 additions and 406 deletions
|
|
@ -3,6 +3,7 @@ package ru.micord.ervu.controller;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
import com.google.protobuf.ByteString;
|
||||||
import com.google.protobuf.InvalidProtocolBufferException;
|
import com.google.protobuf.InvalidProtocolBufferException;
|
||||||
import org.apache.kafka.common.utils.Bytes;
|
import org.apache.kafka.common.utils.Bytes;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
|
@ -16,9 +17,14 @@ import org.springframework.web.bind.annotation.PathVariable;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import rtl.pgs.ervu.proto.ExtractRegistry;
|
import rtl.pgs.ervu.proto.ExtractRegistry;
|
||||||
import rtl.pgs.ervu.proto.ResponseData;
|
import rtl.pgs.ervu.proto.ResponseData;
|
||||||
|
import ru.micord.ervu.dto.ExtractEmptyRequestDto;
|
||||||
import ru.micord.ervu.dto.ExtractRequestDto;
|
import ru.micord.ervu.dto.ExtractRequestDto;
|
||||||
import ru.micord.ervu.exception.ProtobufParsingException;
|
import ru.micord.ervu.exception.ProtobufParsingException;
|
||||||
import ru.micord.ervu.kafka.service.ReplyingKafkaService;
|
import ru.micord.ervu.kafka.service.ReplyingKafkaService;
|
||||||
|
import ru.micord.ervu.security.esia.model.PersonModel;
|
||||||
|
import ru.micord.ervu.security.esia.service.PersonalDataService;
|
||||||
|
import ru.micord.ervu.security.esia.token.EsiaTokensStore;
|
||||||
|
import ru.micord.ervu.security.webbpm.jwt.UserIdsPair;
|
||||||
import ru.micord.ervu.security.webbpm.jwt.util.SecurityUtil;
|
import ru.micord.ervu.security.webbpm.jwt.util.SecurityUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -26,35 +32,62 @@ import ru.micord.ervu.security.webbpm.jwt.util.SecurityUtil;
|
||||||
*/
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
public class ExtractController {
|
public class ExtractController {
|
||||||
|
private final PersonalDataService personalDataService;
|
||||||
private final ReplyingKafkaService<Object, Bytes> replyingKafkaService;
|
private final ReplyingKafkaService<Object, Bytes> replyingKafkaService;
|
||||||
|
|
||||||
|
@Value("${ervu.kafka.registry.extract.empty.request.topic}")
|
||||||
|
private String registryExtractEmptyRequestTopic;
|
||||||
@Value("${ervu.kafka.registry.extract.request.topic}")
|
@Value("${ervu.kafka.registry.extract.request.topic}")
|
||||||
private String registryExtractRequestTopic;
|
private String registryExtractRequestTopic;
|
||||||
@Value("${ervu.kafka.registry.extract.reply.topic}")
|
@Value("${ervu.kafka.registry.extract.reply.topic}")
|
||||||
private String registryExtractReplyTopic;
|
private String registryExtractReplyTopic;
|
||||||
|
|
||||||
public ExtractController(ReplyingKafkaService<Object, Bytes> replyingKafkaService) {
|
public ExtractController(PersonalDataService personalDataService, ReplyingKafkaService<Object, Bytes> replyingKafkaService) {
|
||||||
|
this.personalDataService = personalDataService;
|
||||||
this.replyingKafkaService = replyingKafkaService;
|
this.replyingKafkaService = replyingKafkaService;
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping(value = "/extract/{formatRegistry}")
|
@GetMapping(value = "/extract/{formatRegistry}")
|
||||||
public ResponseEntity<Resource> getExtract(@PathVariable String formatRegistry) {
|
public ResponseEntity<Resource> getExtract(@PathVariable String formatRegistry) {
|
||||||
String ervuId = SecurityUtil.getErvuId();
|
UserIdsPair userIdsPair = SecurityUtil.getUserIdsPair();
|
||||||
|
String ervuId = userIdsPair.getErvuId();
|
||||||
|
String fileName;
|
||||||
|
ByteString file;
|
||||||
|
|
||||||
if (ervuId == null) {
|
try {
|
||||||
return ResponseEntity.noContent().build();
|
if (ervuId != null) {
|
||||||
}
|
|
||||||
ExtractRequestDto request = new ExtractRequestDto(ervuId, formatRegistry);
|
ExtractRequestDto request = new ExtractRequestDto(ervuId, formatRegistry);
|
||||||
byte[] reply = replyingKafkaService.sendMessageAndGetReply(registryExtractRequestTopic,
|
byte[] reply = replyingKafkaService.sendMessageAndGetReply(registryExtractRequestTopic,
|
||||||
registryExtractReplyTopic, request).get();
|
registryExtractReplyTopic, request).get();
|
||||||
|
|
||||||
try {
|
|
||||||
ResponseData responseData = ResponseData.parseFrom(reply);
|
ResponseData responseData = ResponseData.parseFrom(reply);
|
||||||
ExtractRegistry extractRegistry = responseData.getDataRegistryInformation()
|
ExtractRegistry extractRegistry = responseData.getDataRegistryInformation()
|
||||||
.getExtractRegistry();
|
.getExtractRegistry();
|
||||||
String encodedFilename = URLEncoder.encode(extractRegistry.getFileName(), StandardCharsets.UTF_8);
|
fileName = extractRegistry.getFileName();
|
||||||
InputStreamResource resource = new InputStreamResource(extractRegistry.getFile().newInput());
|
file = extractRegistry.getFile();
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
String esiaUserId = userIdsPair.getEsiaUserId(); // esiaUserid is not null here
|
||||||
|
String esiaAccessToken = EsiaTokensStore.getAccessToken(esiaUserId);
|
||||||
|
PersonModel personModel = personalDataService.getPersonModel(esiaAccessToken);
|
||||||
|
|
||||||
|
ExtractEmptyRequestDto emptyRequest = new ExtractEmptyRequestDto(
|
||||||
|
personModel.getLastName(),
|
||||||
|
personModel.getFirstName(), personModel.getMiddleName(), personModel.getBirthDate(),
|
||||||
|
personModel.getSnils(), formatRegistry
|
||||||
|
);
|
||||||
|
byte[] reply = replyingKafkaService.sendMessageAndGetReply(registryExtractEmptyRequestTopic,
|
||||||
|
registryExtractReplyTopic, emptyRequest).get();
|
||||||
|
rtl.pgs.ervu.proto.emptyrequest.ResponseData responseData = rtl.pgs.ervu.proto.emptyrequest.ResponseData
|
||||||
|
.parseFrom(reply);
|
||||||
|
rtl.pgs.ervu.proto.emptyrequest.ExtractRegistry extractRegistry = responseData.getDataRegistryInformation()
|
||||||
|
.getExtractRegistry();
|
||||||
|
fileName = extractRegistry.getFileName();
|
||||||
|
file = extractRegistry.getFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
String encodedFilename = URLEncoder.encode(fileName, StandardCharsets.UTF_8);
|
||||||
|
InputStreamResource resource = new InputStreamResource(file.newInput());
|
||||||
return ResponseEntity.ok()
|
return ResponseEntity.ok()
|
||||||
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''" + encodedFilename)
|
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''" + encodedFilename)
|
||||||
.contentType(MediaType.APPLICATION_OCTET_STREAM)
|
.contentType(MediaType.APPLICATION_OCTET_STREAM)
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,8 @@ import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
import proto.ervu.rp.summons.RecruitmentInfo;
|
||||||
import ru.micord.ervu.dto.Restriction;
|
import ru.micord.ervu.dto.Restriction;
|
||||||
import ru.micord.ervu.dto.SubpoenaResponseDto;
|
import ru.micord.ervu.dto.SubpoenaResponseDto;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
@ -29,6 +31,7 @@ public class SummonsResponseDataConverter {
|
||||||
private static final String ACTUAL_ADDRESS_CODE = "_3";
|
private static final String ACTUAL_ADDRESS_CODE = "_3";
|
||||||
|
|
||||||
public SubpoenaResponseDto convert(SummonsResponseData responseData) {
|
public SubpoenaResponseDto convert(SummonsResponseData responseData) {
|
||||||
|
RecruitmentInfo recruitmentInfo = responseData.getRecruitmentInfo();
|
||||||
SubpoenaResponseDto.Builder builder = new SubpoenaResponseDto.Builder()
|
SubpoenaResponseDto.Builder builder = new SubpoenaResponseDto.Builder()
|
||||||
.personName(responseData.getFirstName(), responseData.getMiddleName(),
|
.personName(responseData.getFirstName(), responseData.getMiddleName(),
|
||||||
responseData.getLastName()
|
responseData.getLastName()
|
||||||
|
|
@ -40,10 +43,11 @@ public class SummonsResponseDataConverter {
|
||||||
.issueOrg(responseData.getIssueOrg())
|
.issueOrg(responseData.getIssueOrg())
|
||||||
.issueIdCode(responseData.getIssueIdCode())
|
.issueIdCode(responseData.getIssueIdCode())
|
||||||
|
|
||||||
.militaryCommissariatName(responseData.getRecruitmentInfo().getMilitaryCommissariatName())
|
.militaryCommissariatName(recruitmentInfo.getMilitaryCommissariatName())
|
||||||
.recruitmentStatusCode(
|
.recruitmentStatusCode(StringUtils.hasText(recruitmentInfo.getRecruitmentStatusCode())
|
||||||
Integer.parseInt(responseData.getRecruitmentInfo().getRecruitmentStatusCode()))
|
? Integer.parseInt(recruitmentInfo.getRecruitmentStatusCode())
|
||||||
.recruitmentStartDate(responseData.getRecruitmentInfo().getRecruitmentStart())
|
: 0)
|
||||||
|
.recruitmentStartDate(recruitmentInfo.getRecruitmentStart())
|
||||||
|
|
||||||
.residenceAddress(getAddressByCode(responseData.getAddressesList(), RESIDENCE_ADDRESS_CODE))
|
.residenceAddress(getAddressByCode(responseData.getAddressesList(), RESIDENCE_ADDRESS_CODE))
|
||||||
.stayAddress(getAddressByCode(responseData.getAddressesList(), STAY_ADDRESS_CODE))
|
.stayAddress(getAddressByCode(responseData.getAddressesList(), STAY_ADDRESS_CODE))
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
package ru.micord.ervu.dto;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author r.latypov
|
||||||
|
*/
|
||||||
|
public record ExtractEmptyRequestDto(String lastName, String firstName, String middleName,
|
||||||
|
String birthDate, String snils, String formatExtractRegistry) {
|
||||||
|
}
|
||||||
|
|
@ -1,10 +1,13 @@
|
||||||
package ru.micord.ervu.kafka.service.impl;
|
package ru.micord.ervu.kafka.service.impl;
|
||||||
|
|
||||||
|
import java.lang.invoke.MethodHandles;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
|
|
||||||
import org.apache.kafka.clients.consumer.ConsumerRecord;
|
import org.apache.kafka.clients.consumer.ConsumerRecord;
|
||||||
import org.apache.kafka.clients.producer.ProducerRecord;
|
import org.apache.kafka.clients.producer.ProducerRecord;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.kafka.requestreply.ReplyingKafkaTemplate;
|
import org.springframework.kafka.requestreply.ReplyingKafkaTemplate;
|
||||||
import org.springframework.kafka.requestreply.RequestReplyFuture;
|
import org.springframework.kafka.requestreply.RequestReplyFuture;
|
||||||
import ru.micord.ervu.kafka.exception.KafkaMessageException;
|
import ru.micord.ervu.kafka.exception.KafkaMessageException;
|
||||||
|
|
@ -15,18 +18,25 @@ import ru.micord.ervu.kafka.service.ReplyingKafkaService;
|
||||||
* @author gulnaz
|
* @author gulnaz
|
||||||
*/
|
*/
|
||||||
public abstract class BaseReplyingKafkaService<T, V> implements ReplyingKafkaService<T, V> {
|
public abstract class BaseReplyingKafkaService<T, V> implements ReplyingKafkaService<T, V> {
|
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public V sendMessageAndGetReply(String requestTopic, String replyTopic, T requestMessage) {
|
public V sendMessageAndGetReply(String requestTopic, String replyTopic, T requestMessage) {
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
RequestReplyFuture<String, T, V> replyFuture = getTemplate().sendAndReceive(
|
RequestReplyFuture<String, T, V> replyFuture = getTemplate().sendAndReceive(
|
||||||
getProducerRecord(requestTopic, replyTopic, requestMessage));
|
getProducerRecord(requestTopic, replyTopic, requestMessage));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return Optional.ofNullable(replyFuture.get())
|
V result = Optional.ofNullable(replyFuture.get())
|
||||||
.map(ConsumerRecord::value)
|
.map(ConsumerRecord::value)
|
||||||
.orElseThrow(() -> new KafkaMessageException("Kafka return result is null"));
|
.orElseThrow(() -> new KafkaMessageException("Kafka return result is null"));
|
||||||
|
LOGGER.info("Thread {} - KafkaSendMessageAndGetReply: {} ms",
|
||||||
|
Thread.currentThread().getId(), System.currentTimeMillis() - startTime);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
catch (InterruptedException | ExecutionException e) {
|
catch (InterruptedException | ExecutionException e) {
|
||||||
|
LOGGER.error("Thread {} - KafkaSendMessageAndGetReply: {} ms",
|
||||||
|
Thread.currentThread().getId(), System.currentTimeMillis() - startTime);
|
||||||
throw new KafkaMessageReplyTimeoutException(e);
|
throw new KafkaMessageReplyTimeoutException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,10 +32,10 @@ public class EsiaConfig {
|
||||||
@Value("${esia.client.cert.hash}")
|
@Value("${esia.client.cert.hash}")
|
||||||
private String clientCertHash;
|
private String clientCertHash;
|
||||||
|
|
||||||
@Value("${esia.request.timeout:60}")
|
@Value("${request.timeout:20}")
|
||||||
private long requestTimeout;
|
private long requestTimeout;
|
||||||
|
|
||||||
@Value("${esia.connection.timeout:30}")
|
@Value("${connection.timeout:10}")
|
||||||
private long connectionTimeout;
|
private long connectionTimeout;
|
||||||
|
|
||||||
@Value("${esia.logout.url:idp/ext/Logout}")
|
@Value("${esia.logout.url:idp/ext/Logout}")
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ import ru.micord.ervu.security.webbpm.jwt.model.Token;
|
||||||
|
|
||||||
import ru.cg.webbpm.modules.core.runtime.api.MessageBundleUtils;
|
import ru.cg.webbpm.modules.core.runtime.api.MessageBundleUtils;
|
||||||
|
|
||||||
import static ru.micord.ervu.security.webbpm.jwt.util.SecurityUtil.getCurrentUsername;
|
import static ru.micord.ervu.security.webbpm.jwt.util.SecurityUtil.getCurrentUserEsiaId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Eduard Tihomirov
|
* @author Eduard Tihomirov
|
||||||
|
|
@ -234,12 +234,14 @@ public class EsiaAuthService {
|
||||||
throw new EsiaException(e);
|
throw new EsiaException(e);
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
LOGGER.info("Thread {}: SignSecret: {}ms RequestAccessToken: {}ms VerifySecret: {}ms",
|
LOGGER.info("Thread {} - SignSecret: {} ms RequestAccessToken: {} ms VerifySecret: {} ms",
|
||||||
Thread.currentThread().getId(), signSecret, requestAccessToken, verifySecret);
|
Thread.currentThread().getId(), signSecret, requestAccessToken, verifySecret);
|
||||||
}
|
}
|
||||||
|
PersonModel personModel = null;
|
||||||
String ervuId = null;
|
String ervuId = null;
|
||||||
try {
|
try {
|
||||||
Response ervuIdResponse = getErvuIdResponse(esiaAccessTokenStr);
|
personModel = personalDataService.getPersonModel(esiaAccessTokenStr);
|
||||||
|
Response ervuIdResponse = getErvuIdResponse(personModel);
|
||||||
ervuId = ervuIdResponse.getErvuId();
|
ervuId = ervuIdResponse.getErvuId();
|
||||||
}
|
}
|
||||||
catch (EsiaException | JsonProcessingException e) {
|
catch (EsiaException | JsonProcessingException e) {
|
||||||
|
|
@ -309,7 +311,8 @@ public class EsiaAuthService {
|
||||||
Long expiresIn = tokenResponse.getExpiresIn();
|
Long expiresIn = tokenResponse.getExpiresIn();
|
||||||
EsiaTokensStore.addAccessToken(prnOid, esiaAccessTokenStr, expiresIn);
|
EsiaTokensStore.addAccessToken(prnOid, esiaAccessTokenStr, expiresIn);
|
||||||
EsiaTokensStore.addRefreshToken(prnOid, esiaNewRefreshTokenStr, expiresIn);
|
EsiaTokensStore.addRefreshToken(prnOid, esiaNewRefreshTokenStr, expiresIn);
|
||||||
Response ervuIdResponse = getErvuIdResponse(esiaAccessTokenStr);
|
PersonModel personModel = personalDataService.getPersonModel(esiaAccessTokenStr);
|
||||||
|
Response ervuIdResponse = getErvuIdResponse(personModel);
|
||||||
createTokenAndAddCookie(response, esiaAccessToken.getSbjId(), ervuIdResponse.getErvuId(), expiresIn);
|
createTokenAndAddCookie(response, esiaAccessToken.getSbjId(), ervuIdResponse.getErvuId(), expiresIn);
|
||||||
}
|
}
|
||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
|
|
@ -329,6 +332,7 @@ public class EsiaAuthService {
|
||||||
.uri(URI.create(esiaConfig.getSignUrl()))
|
.uri(URI.create(esiaConfig.getSignUrl()))
|
||||||
.header("Content-Type", "text/plain")
|
.header("Content-Type", "text/plain")
|
||||||
.POST(HttpRequest.BodyPublishers.ofString(requestBody, StandardCharsets.UTF_8))
|
.POST(HttpRequest.BodyPublishers.ofString(requestBody, StandardCharsets.UTF_8))
|
||||||
|
.timeout(Duration.ofSeconds(esiaConfig.getRequestTimeout()))
|
||||||
.build();
|
.build();
|
||||||
HttpResponse<String> response = HttpClient.newBuilder()
|
HttpResponse<String> response = HttpClient.newBuilder()
|
||||||
.connectTimeout(Duration.ofSeconds(esiaConfig.getConnectionTimeout()))
|
.connectTimeout(Duration.ofSeconds(esiaConfig.getConnectionTimeout()))
|
||||||
|
|
@ -368,25 +372,13 @@ public class EsiaAuthService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Response getErvuIdResponse(String accessToken) throws JsonProcessingException {
|
public Response getErvuIdResponse(PersonModel personModel) throws JsonProcessingException {
|
||||||
long requestPersonData = 0, requestIdERVU = 0;
|
|
||||||
try {
|
|
||||||
long startTime = System.currentTimeMillis();
|
|
||||||
PersonModel personModel = personalDataService.getPersonModel(accessToken);
|
|
||||||
requestPersonData = System.currentTimeMillis() - startTime;
|
|
||||||
Person person = copyToPerson(personModel);
|
Person person = copyToPerson(personModel);
|
||||||
startTime = System.currentTimeMillis();
|
|
||||||
String kafkaResponse = replyingKafkaService.sendMessageAndGetReply(requestTopic,
|
String kafkaResponse = replyingKafkaService.sendMessageAndGetReply(requestTopic,
|
||||||
requestReplyTopic, objectMapper.writeValueAsString(person)
|
requestReplyTopic, objectMapper.writeValueAsString(person)
|
||||||
);
|
);
|
||||||
requestIdERVU = System.currentTimeMillis() - startTime;
|
|
||||||
return objectMapper.readValue(kafkaResponse, Response.class);
|
return objectMapper.readValue(kafkaResponse, Response.class);
|
||||||
}
|
}
|
||||||
finally {
|
|
||||||
LOGGER.info("Thread {}: RequestPersonData: {}ms RequestIdERVU: {}ms",
|
|
||||||
Thread.currentThread().getId(), requestPersonData, requestIdERVU);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Person copyToPerson(PersonModel personModel) {
|
private Person copyToPerson(PersonModel personModel) {
|
||||||
Person person = new Person();
|
Person person = new Person();
|
||||||
|
|
@ -405,7 +397,7 @@ public class EsiaAuthService {
|
||||||
|
|
||||||
private String getMessageId(Exception exception) {
|
private String getMessageId(Exception exception) {
|
||||||
return Integer.toUnsignedString(Objects
|
return Integer.toUnsignedString(Objects
|
||||||
.hashCode(getCurrentUsername()), 36)
|
.hashCode(getCurrentUserEsiaId()), 36)
|
||||||
+ "-"
|
+ "-"
|
||||||
+ Integer.toUnsignedString(exception.hashCode(), 36);
|
+ Integer.toUnsignedString(exception.hashCode(), 36);
|
||||||
}
|
}
|
||||||
|
|
@ -465,6 +457,7 @@ public class EsiaAuthService {
|
||||||
.uri(URI.create(esiaConfig.getSignVerifyUrl()))
|
.uri(URI.create(esiaConfig.getSignVerifyUrl()))
|
||||||
.header("Content-Type", "text/plain")
|
.header("Content-Type", "text/plain")
|
||||||
.POST(HttpRequest.BodyPublishers.ofString(accessToken, StandardCharsets.UTF_8))
|
.POST(HttpRequest.BodyPublishers.ofString(accessToken, StandardCharsets.UTF_8))
|
||||||
|
.timeout(Duration.ofSeconds(esiaConfig.getRequestTimeout()))
|
||||||
.build();
|
.build();
|
||||||
return HttpClient.newBuilder()
|
return HttpClient.newBuilder()
|
||||||
.connectTimeout(Duration.ofSeconds(esiaConfig.getConnectionTimeout()))
|
.connectTimeout(Duration.ofSeconds(esiaConfig.getConnectionTimeout()))
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package ru.micord.ervu.security.esia.service;
|
package ru.micord.ervu.security.esia.service;
|
||||||
|
|
||||||
|
import java.lang.invoke.MethodHandles;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.http.HttpClient;
|
import java.net.http.HttpClient;
|
||||||
import java.net.http.HttpRequest;
|
import java.net.http.HttpRequest;
|
||||||
|
|
@ -8,6 +9,8 @@ import java.time.Duration;
|
||||||
import java.util.Base64;
|
import java.util.Base64;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import ru.micord.ervu.security.esia.exception.EsiaException;
|
import ru.micord.ervu.security.esia.exception.EsiaException;
|
||||||
import ru.micord.ervu.security.esia.config.EsiaConfig;
|
import ru.micord.ervu.security.esia.config.EsiaConfig;
|
||||||
import ru.micord.ervu.security.esia.model.EsiaAccessToken;
|
import ru.micord.ervu.security.esia.model.EsiaAccessToken;
|
||||||
|
|
@ -23,6 +26,7 @@ import org.springframework.stereotype.Service;
|
||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
public class EsiaPersonalDataService implements PersonalDataService {
|
public class EsiaPersonalDataService implements PersonalDataService {
|
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private EsiaConfig esiaConfig;
|
private EsiaConfig esiaConfig;
|
||||||
|
|
@ -32,6 +36,7 @@ public class EsiaPersonalDataService implements PersonalDataService {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PersonModel getPersonModel(String accessToken) {
|
public PersonModel getPersonModel(String accessToken) {
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
try {
|
try {
|
||||||
EsiaAccessToken esiaAccessToken = readToken(accessToken);
|
EsiaAccessToken esiaAccessToken = readToken(accessToken);
|
||||||
String prnsId = esiaAccessToken.getSbjId();
|
String prnsId = esiaAccessToken.getSbjId();
|
||||||
|
|
@ -39,9 +44,11 @@ public class EsiaPersonalDataService implements PersonalDataService {
|
||||||
personModel.setPassportModel(
|
personModel.setPassportModel(
|
||||||
getPassportModel(prnsId, accessToken, personModel.getrIdDoc()));
|
getPassportModel(prnsId, accessToken, personModel.getrIdDoc()));
|
||||||
personModel.setPrnsId(prnsId);
|
personModel.setPrnsId(prnsId);
|
||||||
|
LOGGER.info("Thread {} - RequestPersonData: {} ms", Thread.currentThread().getId(), System.currentTimeMillis() - startTime);
|
||||||
return personModel;
|
return personModel;
|
||||||
}
|
}
|
||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
|
LOGGER.error("Thread {} - RequestPersonData: {} ms", Thread.currentThread().getId(), System.currentTimeMillis() - startTime);
|
||||||
throw new EsiaException(e);
|
throw new EsiaException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,8 +17,11 @@ public class JwtAuthentication implements Authentication {
|
||||||
private final Authentication authentication;
|
private final Authentication authentication;
|
||||||
private final String token;
|
private final String token;
|
||||||
|
|
||||||
|
private final UserIdsPair userIdsPair;
|
||||||
|
|
||||||
public JwtAuthentication(Authentication authentication, String userAccountId, String token) {
|
public JwtAuthentication(Authentication authentication, String userAccountId, String token) {
|
||||||
this.userAccountId = userAccountId;
|
this.userAccountId = userAccountId;
|
||||||
|
this.userIdsPair = new UserIdsPair(userAccountId);
|
||||||
this.authentication = authentication;
|
this.authentication = authentication;
|
||||||
this.token = token;
|
this.token = token;
|
||||||
}
|
}
|
||||||
|
|
@ -31,6 +34,10 @@ public class JwtAuthentication implements Authentication {
|
||||||
return userAccountId;
|
return userAccountId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public UserIdsPair getUserIdsPair() {
|
||||||
|
return userIdsPair;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<? extends GrantedAuthority> getAuthorities() {
|
public Collection<? extends GrantedAuthority> getAuthorities() {
|
||||||
return authentication.getAuthorities();
|
return authentication.getAuthorities();
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
package ru.micord.ervu.security.webbpm.jwt;
|
||||||
|
|
||||||
|
public class UserIdsPair {
|
||||||
|
private final String esiaUserId;
|
||||||
|
private final String ervuId;
|
||||||
|
|
||||||
|
public UserIdsPair(String idsConcatenated) {
|
||||||
|
|
||||||
|
if (idsConcatenated == null) {
|
||||||
|
this.esiaUserId = null;
|
||||||
|
this.ervuId = null;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
String[] ids = idsConcatenated.split(":");
|
||||||
|
this.esiaUserId = ids[0];
|
||||||
|
this.ervuId = ids.length == 2 ? ids[1] : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public UserIdsPair(String esiaUserId, String ervuId) {
|
||||||
|
this.esiaUserId = esiaUserId;
|
||||||
|
this.ervuId = ervuId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEsiaUserId() {
|
||||||
|
return esiaUserId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getErvuId() {
|
||||||
|
return ervuId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getIdsConcatenated() {
|
||||||
|
return esiaUserId + (ervuId == null ? "" : ":" + ervuId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import ru.micord.ervu.security.esia.token.EsiaTokensStore;
|
import ru.micord.ervu.security.esia.token.EsiaTokensStore;
|
||||||
import ru.micord.ervu.security.exception.UnauthorizedException;
|
import ru.micord.ervu.security.exception.UnauthorizedException;
|
||||||
|
import ru.micord.ervu.security.webbpm.jwt.UserIdsPair;
|
||||||
import ru.micord.ervu.security.webbpm.jwt.model.Token;
|
import ru.micord.ervu.security.webbpm.jwt.model.Token;
|
||||||
|
|
||||||
import ru.cg.webbpm.modules.resources.api.ResourceMetadataUtils;
|
import ru.cg.webbpm.modules.resources.api.ResourceMetadataUtils;
|
||||||
|
|
@ -43,16 +44,17 @@ public class JwtTokenService {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Token createAccessToken(String userAccountId, Long expiresIn, String ervuId) {
|
public Token createAccessToken(String userAccountId, Long expiresIn, String ervuId) {
|
||||||
|
String idsConcatenated = new UserIdsPair(userAccountId, ervuId).getIdsConcatenated();
|
||||||
|
|
||||||
Date expirationDate = new Date(System.currentTimeMillis() + 1000L * expiresIn);
|
Date expirationDate = new Date(System.currentTimeMillis() + 1000L * expiresIn);
|
||||||
String value = Jwts.builder()
|
String value = Jwts.builder()
|
||||||
.setSubject(userAccountId + ":" + ervuId)
|
.setSubject(idsConcatenated)
|
||||||
.setIssuer(tokenIssuerName)
|
.setIssuer(tokenIssuerName)
|
||||||
.setIssuedAt(new Date(System.currentTimeMillis()))
|
.setIssuedAt(new Date(System.currentTimeMillis()))
|
||||||
.setExpiration(expirationDate)
|
.setExpiration(expirationDate)
|
||||||
.signWith(signingKey)
|
.signWith(signingKey)
|
||||||
.compact();
|
.compact();
|
||||||
return new Token(userAccountId + ":" + ervuId, tokenIssuerName, expirationDate, value);
|
return new Token(idsConcatenated, tokenIssuerName, expirationDate, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isValid(Token token) {
|
public boolean isValid(Token token) {
|
||||||
|
|
@ -65,8 +67,8 @@ public class JwtTokenService {
|
||||||
LOGGER.info("Token {} is expired ", token.getValue());
|
LOGGER.info("Token {} is expired ", token.getValue());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
String[] ids = token.getUserAccountId().split(":");
|
String esiaUserId = new UserIdsPair(token.getUserAccountId()).getEsiaUserId();
|
||||||
return EsiaTokensStore.validateAccessToken(ids[0]);
|
return EsiaTokensStore.validateAccessToken(esiaUserId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Token getToken(String token) {
|
public Token getToken(String token) {
|
||||||
|
|
@ -90,8 +92,8 @@ public class JwtTokenService {
|
||||||
String authToken = extractAuthToken(request);
|
String authToken = extractAuthToken(request);
|
||||||
|
|
||||||
if (authToken != null) {
|
if (authToken != null) {
|
||||||
String[] ids = getToken(authToken).getUserAccountId().split(":");
|
String esiaUserId = new UserIdsPair(getToken(authToken).getUserAccountId()).getEsiaUserId();
|
||||||
return ids[0];
|
return esiaUserId;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
throw new UnauthorizedException("Failed to get auth data. User unauthorized.");
|
throw new UnauthorizedException("Failed to get auth data. User unauthorized.");
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ import org.springframework.security.core.Authentication;
|
||||||
import org.springframework.security.core.context.SecurityContextHolder;
|
import org.springframework.security.core.context.SecurityContextHolder;
|
||||||
import org.springframework.web.util.WebUtils;
|
import org.springframework.web.util.WebUtils;
|
||||||
import ru.micord.ervu.security.webbpm.jwt.JwtAuthentication;
|
import ru.micord.ervu.security.webbpm.jwt.JwtAuthentication;
|
||||||
|
import ru.micord.ervu.security.webbpm.jwt.UserIdsPair;
|
||||||
|
|
||||||
public final class SecurityUtil {
|
public final class SecurityUtil {
|
||||||
public static final String AUTH_TOKEN = "auth_token";
|
public static final String AUTH_TOKEN = "auth_token";
|
||||||
|
|
@ -23,17 +24,13 @@ public final class SecurityUtil {
|
||||||
return cookie != null ? cookie.getValue() : null;
|
return cookie != null ? cookie.getValue() : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getErvuId() {
|
public static UserIdsPair getUserIdsPair() {
|
||||||
return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication())
|
return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication())
|
||||||
.map(a -> ((JwtAuthentication) a).getUserAccountId())
|
.map(a -> ((JwtAuthentication) a).getUserIdsPair())
|
||||||
.map(userAccountId -> {
|
|
||||||
String ervuId = userAccountId.split(":")[1];
|
|
||||||
return "null".equals(ervuId) ? null : ervuId;
|
|
||||||
})
|
|
||||||
.orElse(null);
|
.orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getCurrentUsername() {
|
public static String getCurrentUserEsiaId() {
|
||||||
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
|
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
|
||||||
if (auth != null && auth.isAuthenticated()) {
|
if (auth != null && auth.isAuthenticated()) {
|
||||||
return auth.getName();
|
return auth.getName();
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,9 @@ public class SubpoenaService {
|
||||||
}
|
}
|
||||||
|
|
||||||
public SubpoenaResponseDto getSubpoenaData() {
|
public SubpoenaResponseDto getSubpoenaData() {
|
||||||
String ervuId = SecurityUtil.getErvuId();
|
String ervuId = SecurityUtil.getUserIdsPair() == null
|
||||||
|
? null
|
||||||
|
: SecurityUtil.getUserIdsPair().getErvuId();
|
||||||
|
|
||||||
if (ervuId == null) {
|
if (ervuId == null) {
|
||||||
return new SubpoenaResponseDto.Builder().build();
|
return new SubpoenaResponseDto.Builder().build();
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package rtl.pgs.ervu.proto.emptyrequest;
|
||||||
|
import "google/protobuf/timestamp.proto";
|
||||||
|
|
||||||
|
option java_multiple_files = true;
|
||||||
|
option java_outer_classname = "LkrpUnknownRecruitResponse";
|
||||||
|
option java_package = "rtl.pgs.ervu.proto.emptyrequest";
|
||||||
|
|
||||||
|
message ExtractRegistry {
|
||||||
|
string fileName = 1;
|
||||||
|
string fileType = 2;
|
||||||
|
string fileDatetime = 3;
|
||||||
|
bytes file = 4;
|
||||||
|
};
|
||||||
|
|
||||||
|
message DataRegistryInformation {
|
||||||
|
ExtractRegistry extractRegistry = 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
message ResponseData {
|
||||||
|
string lastName = 1;
|
||||||
|
string firstName = 2;
|
||||||
|
string middleName = 3;
|
||||||
|
string birthDate = 4;
|
||||||
|
DataRegistryInformation dataRegistryInformation = 5;
|
||||||
|
};
|
||||||
|
|
@ -784,7 +784,8 @@ JBPM использует 3 корневых категории логирова
|
||||||
- `ERVU_KAFKA_RECRUIT_HEADER_CLASS` - класс для идентификации в заголовке запроса на получение данных о повестке, временных мерах и воинском учете
|
- `ERVU_KAFKA_RECRUIT_HEADER_CLASS` - класс для идентификации в заголовке запроса на получение данных о повестке, временных мерах и воинском учете
|
||||||
- `ERVU_KAFKA_SUBPOENA_EXTRACT_REQUEST_TOPIC` - топик для отправки запроса на получение выписки из Реестра повесток
|
- `ERVU_KAFKA_SUBPOENA_EXTRACT_REQUEST_TOPIC` - топик для отправки запроса на получение выписки из Реестра повесток
|
||||||
- `ERVU_KAFKA_SUBPOENA_EXTRACT_REPLY_TOPIC` - топик для получения выписки из Реестра повесток
|
- `ERVU_KAFKA_SUBPOENA_EXTRACT_REPLY_TOPIC` - топик для получения выписки из Реестра повесток
|
||||||
- `ERVU_KAFKA_REGISTRY_EXTRACT_REQUEST_TOPIC` - топик для отправки запроса на получение выписки из Реестра воинского учета
|
- `ERVU_KAFKA_REGISTRY_EXTRACT_EMPTY_REQUEST_TOPIC` - топик для отправки запроса на получение выписки из Реестра воинского учета при отсутствии ErvuId
|
||||||
|
- `ERVU_KAFKA_REGISTRY_EXTRACT_REQUEST_TOPIC` - топик для отправки запроса на получение выписки из Реестра воинского учета при наличии ErvuId
|
||||||
- `ERVU_KAFKA_REGISTRY_EXTRACT_REPLY_TOPIC` - топик для получения выписки из Реестра воинского учета
|
- `ERVU_KAFKA_REGISTRY_EXTRACT_REPLY_TOPIC` - топик для получения выписки из Реестра воинского учета
|
||||||
- `ERVU_KAFKA_EXTRACT_HEADER_CLASS` - класс для идентификации в заголовке запроса на получение выписки из Реестра повесток/Реестра воинского учета
|
- `ERVU_KAFKA_EXTRACT_HEADER_CLASS` - класс для идентификации в заголовке запроса на получение выписки из Реестра повесток/Реестра воинского учета
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ ERVU_KAFKA_REPLY_TIMEOUT=5
|
||||||
ERVU_KAFKA_RECRUIT_REQUEST_TOPIC=ervu.recruit.info.request
|
ERVU_KAFKA_RECRUIT_REQUEST_TOPIC=ervu.recruit.info.request
|
||||||
ERVU_KAFKA_RECRUIT_REPLY_TOPIC=ervu.recruit.info.response
|
ERVU_KAFKA_RECRUIT_REPLY_TOPIC=ervu.recruit.info.response
|
||||||
ERVU_KAFKA_RECRUIT_HEADER_CLASS=Request@urn://rostelekom.ru/RP-SummonsTR/1.0.5
|
ERVU_KAFKA_RECRUIT_HEADER_CLASS=Request@urn://rostelekom.ru/RP-SummonsTR/1.0.5
|
||||||
|
ERVU_KAFKA_REGISTRY_EXTRACT_EMPTY_REQUEST_TOPIC=ervu.extract.empty.request
|
||||||
ERVU_KAFKA_REGISTRY_EXTRACT_REQUEST_TOPIC=ervu.extract.info.request
|
ERVU_KAFKA_REGISTRY_EXTRACT_REQUEST_TOPIC=ervu.extract.info.request
|
||||||
ERVU_KAFKA_REGISTRY_EXTRACT_REPLY_TOPIC=ervu.extract.info.response
|
ERVU_KAFKA_REGISTRY_EXTRACT_REPLY_TOPIC=ervu.extract.info.response
|
||||||
ERVU_KAFKA_EXTRACT_HEADER_CLASS=request@urn://rostelekom.ru/ERVU-extractFromRegistryTR/1.0.3
|
ERVU_KAFKA_EXTRACT_HEADER_CLASS=request@urn://rostelekom.ru/ERVU-extractFromRegistryTR/1.0.3
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ ERVU_KAFKA_REPLY_TIMEOUT=30
|
||||||
ERVU_KAFKA_RECRUIT_REQUEST_TOPIC=ervu.recruit.info.request
|
ERVU_KAFKA_RECRUIT_REQUEST_TOPIC=ervu.recruit.info.request
|
||||||
ERVU_KAFKA_RECRUIT_REPLY_TOPIC=ervu.recruit.info.response
|
ERVU_KAFKA_RECRUIT_REPLY_TOPIC=ervu.recruit.info.response
|
||||||
ERVU_KAFKA_RECRUIT_HEADER_CLASS=Request@urn://rostelekom.ru/RP-SummonsTR/1.0.5
|
ERVU_KAFKA_RECRUIT_HEADER_CLASS=Request@urn://rostelekom.ru/RP-SummonsTR/1.0.5
|
||||||
|
ERVU_KAFKA_REGISTRY_EXTRACT_EMPTY_REQUEST_TOPIC=ervu.extract.empty.request
|
||||||
ERVU_KAFKA_REGISTRY_EXTRACT_REQUEST_TOPIC=ervu.extract.info.request
|
ERVU_KAFKA_REGISTRY_EXTRACT_REQUEST_TOPIC=ervu.extract.info.request
|
||||||
ERVU_KAFKA_REGISTRY_EXTRACT_REPLY_TOPIC=ervu.extract.info.response
|
ERVU_KAFKA_REGISTRY_EXTRACT_REPLY_TOPIC=ervu.extract.info.response
|
||||||
ERVU_KAFKA_EXTRACT_HEADER_CLASS=request@urn://rostelekom.ru/ERVU-extractFromRegistryTR/1.0.3
|
ERVU_KAFKA_EXTRACT_HEADER_CLASS=request@urn://rostelekom.ru/ERVU-extractFromRegistryTR/1.0.3
|
||||||
|
|
|
||||||
|
|
@ -76,6 +76,7 @@
|
||||||
<property name="ervu.kafka.recruit.request.topic" value="ervu.recruit.info.request"/>
|
<property name="ervu.kafka.recruit.request.topic" value="ervu.recruit.info.request"/>
|
||||||
<property name="ervu.kafka.recruit.reply.topic" value="ervu.recruit.info.response"/>
|
<property name="ervu.kafka.recruit.reply.topic" value="ervu.recruit.info.response"/>
|
||||||
<property name="ervu.kafka.recruit.header.class" value="Request@urn://rostelekom.ru/RP-SummonsTR/1.0.5"/>
|
<property name="ervu.kafka.recruit.header.class" value="Request@urn://rostelekom.ru/RP-SummonsTR/1.0.5"/>
|
||||||
|
<property name="ervu.kafka.registry.extract.empty.request.topic" value="ervu.extract.empty.request"/>
|
||||||
<property name="ervu.kafka.registry.extract.request.topic" value="ervu.extract.info.request"/>
|
<property name="ervu.kafka.registry.extract.request.topic" value="ervu.extract.info.request"/>
|
||||||
<property name="ervu.kafka.registry.extract.reply.topic" value="ervu.extract.info.response"/>
|
<property name="ervu.kafka.registry.extract.reply.topic" value="ervu.extract.info.response"/>
|
||||||
<property name="ervu.kafka.extract.header.class" value="request@urn://rostelekom.ru/ERVU-extractFromRegistryTR/1.0.3"/>
|
<property name="ervu.kafka.extract.header.class" value="request@urn://rostelekom.ru/ERVU-extractFromRegistryTR/1.0.3"/>
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
<nav class="header" id="webbpm-header" [ngClass]="{'header-landing': isLanding}">
|
<nav class="header" id="webbpm-header" [ngClass]="{'header-landing': isLanding}">
|
||||||
<div *ngIf="isLanding">
|
<div *ngIf="isLanding">
|
||||||
<div class="header-logo"></div>
|
<div class="header-logo"></div>
|
||||||
<div class="header-title">Реестр повесток юридических лиц</div>
|
<div class="header-title">Реестр повесток физических лиц</div>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="!isLanding" class="header-logo">
|
<div *ngIf="!isLanding" class="header-logo">
|
||||||
<div class="logo"><a routerLink="/"></a></div>
|
<div class="logo"><a routerLink="/"></a></div>
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,9 @@ export class ExtractLoadService extends Behavior {
|
||||||
super.initialize();
|
super.initialize();
|
||||||
this.button = this.getScript(AbstractButton);
|
this.button = this.getScript(AbstractButton);
|
||||||
this.httpClient = this.injector.get(HttpClient);
|
this.httpClient = this.injector.get(HttpClient);
|
||||||
|
this.errorEvent.subscribe(() => console.log("error event occurred", this.errorEvent));
|
||||||
this.onClickFunction = () => {
|
this.onClickFunction = () => {
|
||||||
|
console.log("click event occurred");
|
||||||
this.httpClient.get('extract/' + this.formatRegistry, {
|
this.httpClient.get('extract/' + this.formatRegistry, {
|
||||||
responseType: 'blob',
|
responseType: 'blob',
|
||||||
observe: 'response'
|
observe: 'response'
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ export class LoadForm extends Container {
|
||||||
private ervuDataService: ErvuDataService;
|
private ervuDataService: ErvuDataService;
|
||||||
private subscription: Subscription;
|
private subscription: Subscription;
|
||||||
private fields: any[];
|
private fields: any[];
|
||||||
private fieldDataList: FieldData[] = [];
|
private fieldDataList: FieldData[];
|
||||||
|
|
||||||
constructor(el: ElementRef, cd: ChangeDetectorRef) {
|
constructor(el: ElementRef, cd: ChangeDetectorRef) {
|
||||||
super(el, cd);
|
super(el, cd);
|
||||||
|
|
@ -30,7 +30,7 @@ export class LoadForm extends Container {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected loadContainer(): Promise<any> {
|
protected loadContainer(): Promise<any> {
|
||||||
return Promise.resolve(this.loadData());
|
return this.fieldDataList ? this.loadData() : Promise.resolve();
|
||||||
}
|
}
|
||||||
|
|
||||||
initialize() {
|
initialize() {
|
||||||
|
|
@ -39,6 +39,7 @@ export class LoadForm extends Container {
|
||||||
this.ervuDataService = this.injector.get(ErvuDataService);
|
this.ervuDataService = this.injector.get(ErvuDataService);
|
||||||
this.subscription = this.ervuDataService.message.subscribe(value => {
|
this.subscription = this.ervuDataService.message.subscribe(value => {
|
||||||
if (value) {
|
if (value) {
|
||||||
|
this.fieldDataList = [];
|
||||||
this.fields.forEach(field => {
|
this.fields.forEach(field => {
|
||||||
let fieldData: FieldData = new FieldData();
|
let fieldData: FieldData = new FieldData();
|
||||||
fieldData.componentGuid = field.objectId;
|
fieldData.componentGuid = field.objectId;
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,10 @@ export class InMemoryStaticGrid extends GridV2 {
|
||||||
protected initGrid() {
|
protected initGrid() {
|
||||||
super.initGrid();
|
super.initGrid();
|
||||||
this.subscription = this.injector.get(ErvuDataService).message.subscribe(value => {
|
this.subscription = this.injector.get(ErvuDataService).message.subscribe(value => {
|
||||||
this.rowData = value ? value[this.dataList] : null;
|
this.rowData = value[this.dataList];
|
||||||
|
this.initDeferred.promise.then(() => {
|
||||||
|
this.refreshData();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1013,12 +1013,6 @@
|
||||||
</value>
|
</value>
|
||||||
</item>
|
</item>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>visible</key>
|
|
||||||
<value>
|
|
||||||
<simple>false</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
</entry>
|
||||||
</properties>
|
</properties>
|
||||||
</scripts>
|
</scripts>
|
||||||
|
|
@ -1329,6 +1323,57 @@
|
||||||
</entry>
|
</entry>
|
||||||
</complex>
|
</complex>
|
||||||
</value>
|
</value>
|
||||||
|
</entry>
|
||||||
|
</complex>
|
||||||
|
</value>
|
||||||
|
</item>
|
||||||
|
<item id="57305b6c-cb1c-4d2f-8922-94b08469dab2" removed="false">
|
||||||
|
<value>
|
||||||
|
<complex>
|
||||||
|
<entry>
|
||||||
|
<key>_isGroupSelected</key>
|
||||||
|
<value>
|
||||||
|
<simple>false</simple>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<key>one</key>
|
||||||
|
<value>
|
||||||
|
<complex>
|
||||||
|
<entry>
|
||||||
|
<key>conditionFirstPart</key>
|
||||||
|
<value>
|
||||||
|
<complex>
|
||||||
|
<entry>
|
||||||
|
<key>objectValue</key>
|
||||||
|
<value>
|
||||||
|
<complex>
|
||||||
|
<entry>
|
||||||
|
<key>behavior</key>
|
||||||
|
<value>
|
||||||
|
<simple>{"objectId":"a28b93c3-fbbc-43d2-ab0c-9b0abcae5106","packageName":"component.field","className":"TextField","type":"TS"}</simple>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<key>method</key>
|
||||||
|
<value>
|
||||||
|
<simple>"getValue"</simple>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</complex>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</complex>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<key>operation</key>
|
||||||
|
<value>
|
||||||
|
<simple>"IS_NOT_EMPTY"</simple>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</complex>
|
||||||
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
</complex>
|
</complex>
|
||||||
</value>
|
</value>
|
||||||
|
|
@ -1826,12 +1871,6 @@
|
||||||
<value>
|
<value>
|
||||||
<simple>"Запросить выписку"</simple>
|
<simple>"Запросить выписку"</simple>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>visible</key>
|
|
||||||
<value>
|
|
||||||
<simple>false</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
</entry>
|
||||||
</properties>
|
</properties>
|
||||||
</scripts>
|
</scripts>
|
||||||
|
|
@ -4049,7 +4088,6 @@
|
||||||
<componentRootId>304824d5-9f9f-4af9-9b08-6232f7536774</componentRootId>
|
<componentRootId>304824d5-9f9f-4af9-9b08-6232f7536774</componentRootId>
|
||||||
<name>FS - 1.1.3 (Воинский учёт)</name>
|
<name>FS - 1.1.3 (Воинский учёт)</name>
|
||||||
<container>true</container>
|
<container>true</container>
|
||||||
<expanded>false</expanded>
|
|
||||||
<childrenReordered>false</childrenReordered>
|
<childrenReordered>false</childrenReordered>
|
||||||
<scripts id="46f20297-81d1-4786-bb17-2a78ca6fda6f">
|
<scripts id="46f20297-81d1-4786-bb17-2a78ca6fda6f">
|
||||||
<properties>
|
<properties>
|
||||||
|
|
@ -4139,6 +4177,7 @@
|
||||||
<componentRootId>8ae57bdb-4acb-4f34-9641-9b5031b408d3</componentRootId>
|
<componentRootId>8ae57bdb-4acb-4f34-9641-9b5031b408d3</componentRootId>
|
||||||
<name>VB - 1.1.3.1 (вы состоите на учете) сценаций</name>
|
<name>VB - 1.1.3.1 (вы состоите на учете) сценаций</name>
|
||||||
<container>true</container>
|
<container>true</container>
|
||||||
|
<expanded>false</expanded>
|
||||||
<childrenReordered>false</childrenReordered>
|
<childrenReordered>false</childrenReordered>
|
||||||
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f">
|
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f">
|
||||||
<properties>
|
<properties>
|
||||||
|
|
@ -4643,12 +4682,6 @@
|
||||||
</value>
|
</value>
|
||||||
</item>
|
</item>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>visible</key>
|
|
||||||
<value>
|
|
||||||
<simple>false</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
</entry>
|
||||||
</properties>
|
</properties>
|
||||||
</scripts>
|
</scripts>
|
||||||
|
|
@ -4764,12 +4797,6 @@
|
||||||
<value>
|
<value>
|
||||||
<simple>null</simple>
|
<simple>null</simple>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>visible</key>
|
|
||||||
<value>
|
|
||||||
<simple>false</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
</entry>
|
||||||
</properties>
|
</properties>
|
||||||
</scripts>
|
</scripts>
|
||||||
|
|
@ -4929,12 +4956,6 @@
|
||||||
<value>
|
<value>
|
||||||
<simple>"Запросить выписку"</simple>
|
<simple>"Запросить выписку"</simple>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>visible</key>
|
|
||||||
<value>
|
|
||||||
<simple>false</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
</entry>
|
||||||
</properties>
|
</properties>
|
||||||
</scripts>
|
</scripts>
|
||||||
|
|
@ -5710,7 +5731,7 @@
|
||||||
<entry>
|
<entry>
|
||||||
<key>behavior</key>
|
<key>behavior</key>
|
||||||
<value>
|
<value>
|
||||||
<simple>{"objectId":"63871032-9206-4f76-8c93-c8ab1b8200d2","packageName":"component.field","className":"NumberField","type":"TS"}</simple>
|
<simple>{"objectId":"a28b93c3-fbbc-43d2-ab0c-9b0abcae5106","packageName":"component.field","className":"TextField","type":"TS"}</simple>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
<entry>
|
<entry>
|
||||||
|
|
@ -5733,7 +5754,7 @@
|
||||||
<key>staticValue</key>
|
<key>staticValue</key>
|
||||||
<value>
|
<value>
|
||||||
<implRef type="TS">
|
<implRef type="TS">
|
||||||
<className>number</className>
|
<className>string</className>
|
||||||
<packageName></packageName>
|
<packageName></packageName>
|
||||||
</implRef>
|
</implRef>
|
||||||
<simple>0.0</simple>
|
<simple>0.0</simple>
|
||||||
|
|
@ -5745,7 +5766,7 @@
|
||||||
<entry>
|
<entry>
|
||||||
<key>operation</key>
|
<key>operation</key>
|
||||||
<value>
|
<value>
|
||||||
<simple>"EQUALS"</simple>
|
<simple>"IS_NOT_EMPTY"</simple>
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
</complex>
|
</complex>
|
||||||
|
|
@ -5754,7 +5775,24 @@
|
||||||
</complex>
|
</complex>
|
||||||
</value>
|
</value>
|
||||||
</item>
|
</item>
|
||||||
<item id="7d9187ca-f2e5-48ff-8670-93d9fc8bcf85" removed="false">
|
<item id="7d9187ca-f2e5-48ff-8670-93d9fc8bcf85" removed="true"/>
|
||||||
|
<item id="94f9c8a4-2825-4ab1-874f-b7141e206799" removed="false">
|
||||||
|
<value>
|
||||||
|
<complex>
|
||||||
|
<entry>
|
||||||
|
<key>_isGroupSelected</key>
|
||||||
|
<value>
|
||||||
|
<simple>true</simple>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<key>group</key>
|
||||||
|
<value>
|
||||||
|
<complex>
|
||||||
|
<entry>
|
||||||
|
<key>conditions</key>
|
||||||
|
<value>
|
||||||
|
<item id="9f0c2f9b-3ee6-48fe-88be-b42fb236e578" removed="false">
|
||||||
<value>
|
<value>
|
||||||
<complex>
|
<complex>
|
||||||
<entry>
|
<entry>
|
||||||
|
|
@ -5801,6 +5839,74 @@
|
||||||
</entry>
|
</entry>
|
||||||
</complex>
|
</complex>
|
||||||
</value>
|
</value>
|
||||||
|
</entry>
|
||||||
|
</complex>
|
||||||
|
</value>
|
||||||
|
</item>
|
||||||
|
<item id="9159dca3-746f-49f0-bc84-db0ee17ed9cb" removed="false">
|
||||||
|
<value>
|
||||||
|
<complex>
|
||||||
|
<entry>
|
||||||
|
<key>_isGroupSelected</key>
|
||||||
|
<value>
|
||||||
|
<simple>false</simple>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<key>one</key>
|
||||||
|
<value>
|
||||||
|
<complex>
|
||||||
|
<entry>
|
||||||
|
<key>conditionFirstPart</key>
|
||||||
|
<value>
|
||||||
|
<complex>
|
||||||
|
<entry>
|
||||||
|
<key>objectValue</key>
|
||||||
|
<value>
|
||||||
|
<complex>
|
||||||
|
<entry>
|
||||||
|
<key>behavior</key>
|
||||||
|
<value>
|
||||||
|
<simple>{"objectId":"63871032-9206-4f76-8c93-c8ab1b8200d2","packageName":"component.field","className":"NumberField","type":"TS"}</simple>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<key>method</key>
|
||||||
|
<value>
|
||||||
|
<simple>"getValue"</simple>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</complex>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</complex>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<key>conditionSecondPart</key>
|
||||||
|
<value>
|
||||||
|
<complex>
|
||||||
|
<entry>
|
||||||
|
<key>staticValue</key>
|
||||||
|
<value>
|
||||||
|
<implRef type="TS">
|
||||||
|
<className>number</className>
|
||||||
|
<packageName></packageName>
|
||||||
|
</implRef>
|
||||||
|
<simple>0.0</simple>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</complex>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<key>operation</key>
|
||||||
|
<value>
|
||||||
|
<simple>"EQUALS"</simple>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</complex>
|
||||||
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
</complex>
|
</complex>
|
||||||
</value>
|
</value>
|
||||||
|
|
@ -5815,6 +5921,22 @@
|
||||||
</entry>
|
</entry>
|
||||||
</complex>
|
</complex>
|
||||||
</value>
|
</value>
|
||||||
|
</entry>
|
||||||
|
</complex>
|
||||||
|
</value>
|
||||||
|
</item>
|
||||||
|
<item id="aed64e39-e66a-44b0-bd2a-7afe960e78d3" removed="true"/>
|
||||||
|
<item id="3404b012-e85d-4507-b479-ba8720fb7e98" removed="true"/>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
<entry>
|
||||||
|
<key>logicalOperation</key>
|
||||||
|
<value>
|
||||||
|
<simple>"AND"</simple>
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</complex>
|
||||||
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
<entry>
|
<entry>
|
||||||
<key>thenActions</key>
|
<key>thenActions</key>
|
||||||
|
|
@ -7173,313 +7295,6 @@
|
||||||
</value>
|
</value>
|
||||||
</entry>
|
</entry>
|
||||||
</complex>
|
</complex>
|
||||||
</value>
|
|
||||||
</item>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
</properties>
|
|
||||||
</scripts>
|
|
||||||
</children>
|
|
||||||
<children id="315c5087-825a-4ade-99d9-7dbe09f87226">
|
|
||||||
<prototypeId>98594cec-0a9b-4cef-af09-e1b71cb2ad9e</prototypeId>
|
|
||||||
<componentRootId>315c5087-825a-4ade-99d9-7dbe09f87226</componentRootId>
|
|
||||||
<name>AC - для найденного пользователя в ерву</name>
|
|
||||||
<container>false</container>
|
|
||||||
<childrenReordered>false</childrenReordered>
|
|
||||||
<scripts id="37dff5c8-1599-4984-b107-c44a87b6da2e">
|
|
||||||
<properties>
|
|
||||||
<entry>
|
|
||||||
<key>elseActions</key>
|
|
||||||
<value>
|
|
||||||
<item id="15082312-b39c-473a-b08a-f0690c5d37d2" removed="true"/>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>eventRefs</key>
|
|
||||||
<value>
|
|
||||||
<item id="ca97a9f3-5f25-4f75-b4a0-c98aac1b1e57" removed="false">
|
|
||||||
<value>
|
|
||||||
<complex>
|
|
||||||
<entry>
|
|
||||||
<key>behavior</key>
|
|
||||||
<value>
|
|
||||||
<simple>{"objectId":"a28b93c3-fbbc-43d2-ab0c-9b0abcae5106","packageName":"component.field","className":"TextField","type":"TS"}</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>propertyName</key>
|
|
||||||
<value>
|
|
||||||
<simple>"valueChangeEvent"</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
</complex>
|
|
||||||
</value>
|
|
||||||
</item>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>ifCondition</key>
|
|
||||||
<value>
|
|
||||||
<complex>
|
|
||||||
<entry>
|
|
||||||
<key>conditions</key>
|
|
||||||
<value>
|
|
||||||
<item id="ff5d074b-77d4-48c6-a7c4-3ca7e585d8c9" removed="false">
|
|
||||||
<value>
|
|
||||||
<complex>
|
|
||||||
<entry>
|
|
||||||
<key>_isGroupSelected</key>
|
|
||||||
<value>
|
|
||||||
<simple>false</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>one</key>
|
|
||||||
<value>
|
|
||||||
<complex>
|
|
||||||
<entry>
|
|
||||||
<key>conditionFirstPart</key>
|
|
||||||
<value>
|
|
||||||
<complex>
|
|
||||||
<entry>
|
|
||||||
<key>objectValue</key>
|
|
||||||
<value>
|
|
||||||
<complex>
|
|
||||||
<entry>
|
|
||||||
<key>behavior</key>
|
|
||||||
<value>
|
|
||||||
<simple>{"objectId":"a28b93c3-fbbc-43d2-ab0c-9b0abcae5106","packageName":"component.field","className":"TextField","type":"TS"}</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>method</key>
|
|
||||||
<value>
|
|
||||||
<simple>"getValue"</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
</complex>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
</complex>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>conditionSecondPart</key>
|
|
||||||
<value>
|
|
||||||
<complex>
|
|
||||||
<entry>
|
|
||||||
<key>staticValue</key>
|
|
||||||
<value>
|
|
||||||
<implRef type="TS">
|
|
||||||
<className>string</className>
|
|
||||||
<packageName></packageName>
|
|
||||||
</implRef>
|
|
||||||
<simple>"null"</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
</complex>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>operation</key>
|
|
||||||
<value>
|
|
||||||
<simple>"IS_NOT_EMPTY"</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
</complex>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
</complex>
|
|
||||||
</value>
|
|
||||||
</item>
|
|
||||||
<item id="af4102d7-698c-420e-a7fe-ca9bf69a29a7" removed="true"/>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>logicalOperation</key>
|
|
||||||
<value>
|
|
||||||
<simple>null</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
</complex>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>thenActions</key>
|
|
||||||
<value>
|
|
||||||
<item id="7654b087-130d-4441-9acf-cdd831c65374" removed="false">
|
|
||||||
<value>
|
|
||||||
<complex>
|
|
||||||
<entry>
|
|
||||||
<key>behavior</key>
|
|
||||||
<value>
|
|
||||||
<simple>{"objectId":"cfb60860-1b04-4eb5-9ccf-1e6436c27b09","packageName":"component.button","className":"Button","type":"TS"}</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>method</key>
|
|
||||||
<value>
|
|
||||||
<simple>"setVisible"</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>value</key>
|
|
||||||
<value>
|
|
||||||
<complex>
|
|
||||||
<entry>
|
|
||||||
<key>staticValue</key>
|
|
||||||
<value>
|
|
||||||
<implRef type="TS">
|
|
||||||
<className>boolean</className>
|
|
||||||
<packageName></packageName>
|
|
||||||
</implRef>
|
|
||||||
<simple>true</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
</complex>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
</complex>
|
|
||||||
</value>
|
|
||||||
</item>
|
|
||||||
<item id="83e45626-89e0-4dd6-9caf-a17d6c474a72" removed="false">
|
|
||||||
<value>
|
|
||||||
<complex>
|
|
||||||
<entry>
|
|
||||||
<key>behavior</key>
|
|
||||||
<value>
|
|
||||||
<simple>{"objectId":"dd701bad-b22d-40c9-b00b-b92f070890db","packageName":"ervu.component.textwithdialoglinks","className":"TextWithDialogLinks","type":"TS"}</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>method</key>
|
|
||||||
<value>
|
|
||||||
<simple>"setVisible"</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>value</key>
|
|
||||||
<value>
|
|
||||||
<complex>
|
|
||||||
<entry>
|
|
||||||
<key>staticValue</key>
|
|
||||||
<value>
|
|
||||||
<implRef type="TS">
|
|
||||||
<className>boolean</className>
|
|
||||||
<packageName></packageName>
|
|
||||||
</implRef>
|
|
||||||
<simple>true</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
</complex>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
</complex>
|
|
||||||
</value>
|
|
||||||
</item>
|
|
||||||
<item id="8d08e1aa-8fdc-4c49-b995-f1e1f40452d1" removed="false">
|
|
||||||
<value>
|
|
||||||
<complex>
|
|
||||||
<entry>
|
|
||||||
<key>behavior</key>
|
|
||||||
<value>
|
|
||||||
<simple>{"objectId":"d68b5c38-9ed6-4596-9b0c-dd1dc542c5ef","packageName":"component.button","className":"Button","type":"TS"}</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>method</key>
|
|
||||||
<value>
|
|
||||||
<simple>"setVisible"</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>value</key>
|
|
||||||
<value>
|
|
||||||
<complex>
|
|
||||||
<entry>
|
|
||||||
<key>staticValue</key>
|
|
||||||
<value>
|
|
||||||
<implRef type="TS">
|
|
||||||
<className>boolean</className>
|
|
||||||
<packageName></packageName>
|
|
||||||
</implRef>
|
|
||||||
<simple>true</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
</complex>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
</complex>
|
|
||||||
</value>
|
|
||||||
</item>
|
|
||||||
<item id="d0250c79-e72e-4997-8d8e-0dcd9ea93f42" removed="false">
|
|
||||||
<value>
|
|
||||||
<complex>
|
|
||||||
<entry>
|
|
||||||
<key>behavior</key>
|
|
||||||
<value>
|
|
||||||
<simple>{"objectId":"fea5aebc-c206-48bc-a613-ab31813fd639","packageName":"component.container","className":"HBox","type":"TS"}</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>method</key>
|
|
||||||
<value>
|
|
||||||
<simple>"setVisible"</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>value</key>
|
|
||||||
<value>
|
|
||||||
<complex>
|
|
||||||
<entry>
|
|
||||||
<key>staticValue</key>
|
|
||||||
<value>
|
|
||||||
<implRef type="TS">
|
|
||||||
<className>boolean</className>
|
|
||||||
<packageName></packageName>
|
|
||||||
</implRef>
|
|
||||||
<simple>true</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
</complex>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
</complex>
|
|
||||||
</value>
|
|
||||||
</item>
|
|
||||||
<item id="9d3d9d9b-772e-4db7-841d-63d12caa1422" removed="false">
|
|
||||||
<value>
|
|
||||||
<complex>
|
|
||||||
<entry>
|
|
||||||
<key>behavior</key>
|
|
||||||
<value>
|
|
||||||
<simple>{"objectId":"d5fa2655-8dd8-4004-9dec-217a41e5b9ed","packageName":"component","className":"Text","type":"TS"}</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>method</key>
|
|
||||||
<value>
|
|
||||||
<simple>"setVisible"</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry>
|
|
||||||
<key>value</key>
|
|
||||||
<value>
|
|
||||||
<complex>
|
|
||||||
<entry>
|
|
||||||
<key>staticValue</key>
|
|
||||||
<value>
|
|
||||||
<implRef type="TS">
|
|
||||||
<className>boolean</className>
|
|
||||||
<packageName></packageName>
|
|
||||||
</implRef>
|
|
||||||
<simple>true</simple>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
</complex>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
</complex>
|
|
||||||
</value>
|
</value>
|
||||||
</item>
|
</item>
|
||||||
</value>
|
</value>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue