Merge branch 'feature/SUPPORT-8427_new' into feature/SUPPORT-8474_id_ervu

# Conflicts:
#	Dockerfile
#	backend/src/main/java/AppConfig.java
#	backend/src/main/java/esia/config/EsiaConfig.java
#	backend/src/main/java/esia/controller/EsiaController.java
#	backend/src/main/java/esia/model/EmployeeModel.java
#	backend/src/main/java/esia/model/PersonModel.java
#	backend/src/main/java/esia/service/EsiaAuthService.java
#	backend/src/main/java/esia/service/UlDataServiceImpl.java
This commit is contained in:
Eduard Tihomirov 2024-09-04 11:22:30 +03:00
commit b27eb092f8
184 changed files with 8328 additions and 2392 deletions

View file

@ -1,22 +1,22 @@
FROM tomee:8.0.15-jre17-webprofile
FROM maven:3-openjdk-17-slim AS build
RUN apt update \
&& apt upgrade -y \
&& curl -fsSL https://deb.nodesource.com/setup_14.x | bash - \
&& apt install -y git nodejs \
&& rm -rf /var/lib/apt/lists/*
RUN \
rm -rf /usr/local/tomee/webapps/ROOT && \
echo "fias.enable=false" >> /usr/local/tomee/conf/catalina.properties && \
echo "webbpm.jbpm.hibernate_statistics.enabled=false" >> /usr/local/tomee/conf/catalina.properties && \
echo "webbpm.mode=production" >> /usr/local/tomee/conf/catalina.properties && \
echo "authentication.method=form" >> /usr/local/tomee/conf/catalina.properties && \
echo "webbpm.cache.hazelcast.hosts=127.0.0.1" >> /usr/local/tomee/conf/catalina.properties && \
echo "webbpm.cache.hazelcast.outbound_port_definitions=5801-5820" >> /usr/local/tomee/conf/catalina.properties && \
echo "gar.enable=false" >> /usr/local/tomee/conf/catalina.properties && \
echo "reset_password.mail.template.path=mail/reset_password.html" >> /usr/local/tomee/conf/catalina.properties && \
echo "security.password.regex=^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]+$" >> /usr/local/tomee/conf/catalina.properties && \
echo "bpmn.enable=false" >> /usr/local/tomee/conf/catalina.properties
COPY config/linux-amd64_deb.tgz .
RUN tar -xf linux-amd64_deb.tgz && linux-amd64_deb/install.sh && rm linux-amd64_deb.tgz && rm -rf linux-amd64_deb
COPY config/7h96bfno.000/ /var/opt/cprocsp/keys/root/7h96bfno.000/
COPY config/context.xml /usr/local/tomee/conf/
#COPY config/tomcat-users.xml /usr/local/tomee/conf/
COPY backend/libs/ /usr/local/tomee/lib/
COPY frontend/dist/ /usr/local/tomee/webapps/ROOT
COPY backend/target/*.war /usr/local/tomee/webapps/ul.war
WORKDIR /app
COPY . .
RUN mvn clean && mvn package -T4C
FROM gitlab.micord.ru:5050/common/base/webbpm/webbpm-tomcat-cprocsp:8.0.15-jre17-webprofile
ARG ADMIN_PASSWORD=Secr3t
COPY config/tomcat/tomee /usr/local/tomee
RUN rm -rf /usr/local/tomee/webapps/ROOT \
&& cat /usr/local/tomee/conf/webbpm.properties >> /usr/local/tomee/conf/catalina.properties \
&& sed -i -r "s/<must-be-changed>/$ADMIN_PASSWORD/g" /usr/local/tomee/conf/tomcat-users.xml
COPY --from=build /app/frontend/target/*.war /usr/local/tomee/webapps/ROOT.war
COPY --from=build /app/backend/target/*.war /usr/local/tomee/webapps/ul.war

18
Dockerfile.old Normal file
View file

@ -0,0 +1,18 @@
FROM tomee:8.0.15-jre17-webprofile
RUN \
rm -rf /usr/local/tomee/webapps/ROOT && \
echo "fias.enable=false" >> /usr/local/tomee/conf/catalina.properties && \
echo "webbpm.jbpm.hibernate_statistics.enabled=false" >> /usr/local/tomee/conf/catalina.properties && \
echo "webbpm.mode=production" >> /usr/local/tomee/conf/catalina.properties && \
echo "authentication.method=form" >> /usr/local/tomee/conf/catalina.properties && \
echo "webbpm.cache.hazelcast.hosts=127.0.0.1" >> /usr/local/tomee/conf/catalina.properties && \
echo "webbpm.cache.hazelcast.outbound_port_definitions=5801-5820" >> /usr/local/tomee/conf/catalina.properties && \
echo "gar.enable=false" >> /usr/local/tomee/conf/catalina.properties && \
echo "reset_password.mail.template.path=mail/reset_password.html" >> /usr/local/tomee/conf/catalina.properties && \
echo "security.password.regex=^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]+$" >> /usr/local/tomee/conf/catalina.properties && \
echo "bpmn.enable=false" >> /usr/local/tomee/conf/catalina.properties
COPY config/context.xml /usr/local/tomee/conf/
#COPY config/tomcat-users.xml /usr/local/tomee/conf/
COPY frontend/dist/ /usr/local/tomee/webapps/ROOT
COPY backend/target/*.war /usr/local/tomee/webapps/ul.war

View file

@ -13,6 +13,7 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.retry.annotation.EnableRetry;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@ -35,7 +36,6 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc;
"gen",
"ru.cg",
"ru.micord",
"crypto",
"esia"
}, excludeFilters = {
@ComponentScan.Filter(type = FilterType.REGEX, pattern = "security.WebSecurityConfig")
@ -43,6 +43,7 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@EnableAspectJAutoProxy(proxyTargetClass = true)
@EnableWebMvc
@EnableScheduling
@EnableRetry
public class AppConfig {
@Bean

View file

@ -1,6 +1,9 @@
import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import org.springframework.web.util.IntrospectorCleanupListener;
@ -10,6 +13,13 @@ import org.springframework.web.util.IntrospectorCleanupListener;
*/
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Value("${ervu.fileupload.max_file_size}")
private int maxFileSize;
@Value("${ervu.fileupload.max_request_size}")
private int maxRequestSize;
@Value("${ervu.fileupload.file_size_threshold}")
private int fileSizeThreshold;
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
servletContext.addListener(new IntrospectorCleanupListener());
@ -28,4 +38,14 @@ public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServlet
protected Class<?>[] getServletConfigClasses() {
return new Class[0];
}
@Override
protected void customizeRegistration(ServletRegistration.Dynamic registration) {
MultipartConfigElement multipartConfigElement = new MultipartConfigElement(
"/tmp",
maxFileSize,
maxRequestSize,
fileSizeThreshold);
registration.setMultipartConfig(multipartConfigElement);
}
}

View file

@ -0,0 +1,48 @@
package ervu.client.fileupload;
import java.io.IOException;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
/**
* @author Alexandr Shalaginov
*/
@Component
public class FileUploadWebDavClient {
private static final Logger logger = LoggerFactory.getLogger(FileUploadWebDavClient.class);
@Retryable(value = {IOException.class, InterruptedException.class}, backoff = @Backoff(delay = 500L))
public boolean webDavUploadFile(String url, String username, String password, MultipartFile multipartFile) {
try {
HttpClient httpClient = HttpClient.newBuilder()
.authenticator(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password.toCharArray());
}
})
.build();
HttpRequest httpRequest = HttpRequest.newBuilder().uri(URI.create(url))
.PUT(HttpRequest.BodyPublishers.ofByteArray(multipartFile.getBytes())).build();
HttpResponse<String> response = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
logger.debug("Response starus code: {}", response.statusCode());
return (response.statusCode() >= 200) && (response.statusCode() <= 202);
}
catch (IOException | InterruptedException e) {
throw new RuntimeException(e);
}
}
}

View file

@ -0,0 +1,29 @@
package ervu.controller;
import ervu.service.fileupload.EmployeeInfoFileUploadService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
/**
* @author Alexandr Shalaginov
*/
@RestController
public class EmployeeInfoFileUploadController {
private final EmployeeInfoFileUploadService fileUploadService;
public EmployeeInfoFileUploadController(EmployeeInfoFileUploadService fileUploadService) {
this.fileUploadService = fileUploadService;
}
@RequestMapping(value = "/employee/document", method = RequestMethod.POST)
public ResponseEntity<?> saveEmployeeInformationFile(@RequestParam("file") MultipartFile multipartFile,
@RequestHeader("X-Employee-Info-File-Form-Type") String formType) {
if (this.fileUploadService.saveEmployeeInformationFile(multipartFile, formType)) {
return ResponseEntity.ok("File successfully uploaded.");
}
else {
return ResponseEntity.internalServerError().body("An error occurred while uploading file.");
}
}
}

View file

@ -0,0 +1,28 @@
package ervu.service.fileupload;
/**
* @author Alexandr Shalaginov
*/
public enum EmployeeInfoFileFormType {
FORM_2("2", "Изменения сведений сотрудников, необходимых для ведения воинского учета"),
FORM_9("9", "Сведение о приеме на работу (увольнении), зачислении в образовательное учреждение (отчислении)"),
FORM_10("10", "Сообщение о гражданах, не состоящих, но обязанных состоять на воинском учете"),
FORM_11("11", "Ежегодное предоставление списка граждан мужского пола, подлежащих постановке на воинский учет в следующем году по достижении 17-летнего возраста"),
FORM_12("12", "Ежегодное предоставление списка сотрудников/обучающихся в организации, подлежащих воинскому учету");
private String filePatternCode;
private String filePatternName;
EmployeeInfoFileFormType(String filePatternCode, String filePatternName) {
this.filePatternCode = filePatternCode;
this.filePatternName = filePatternName;
}
public String getFilePatternCode() {
return filePatternCode;
}
public String getFilePatternName() {
return filePatternName;
}
}

View file

@ -0,0 +1,106 @@
package ervu.service.fileupload;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import ervu.client.fileupload.FileUploadWebDavClient;
import ervu.service.fileupload.model.EmployeeInfoKafkaMessage;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
/**
* @author Alexandr Shalaginov
*/
@Service
public class EmployeeInfoFileUploadService {
private static final Logger logger = LoggerFactory.getLogger(EmployeeInfoFileUploadService.class);
private final FileUploadWebDavClient fileWebDavUploadClient;
private final EmployeeInfoKafkaMessageService employeeInfoKafkaMessageService;
private final KafkaTemplate<String, String> kafkaTemplate;
@Value("${kafka.send.message.topic.name:employee-files}")
private String kafkaTopicName;
@Value("${file.webdav.upload.url:http://localhost:5757}")
private String url;
@Value("${file.webdav.upload.username}")
private String username;
@Value("${file.webdav.upload.password}")
private String password;
public EmployeeInfoFileUploadService(
FileUploadWebDavClient fileWebDavUploadClient,
EmployeeInfoKafkaMessageService employeeInfoKafkaMessageService, KafkaTemplate<String, String> kafkaTemplate) {
this.fileWebDavUploadClient = fileWebDavUploadClient;
this.employeeInfoKafkaMessageService = employeeInfoKafkaMessageService;
this.kafkaTemplate = kafkaTemplate;
}
public boolean saveEmployeeInformationFile(MultipartFile multipartFile, String formType) {
String fileUploadUrl = this.url + "/" + getNewFilename(multipartFile.getOriginalFilename());
String departureDateTime = getDepartureDateTime();
if (this.fileWebDavUploadClient.webDavUploadFile(fileUploadUrl, username, password, multipartFile)) {
String jsonMessage = getJsonKafkaMessage(
employeeInfoKafkaMessageService.getKafkaMessage(
fileUploadUrl,
multipartFile.getOriginalFilename(),
EmployeeInfoFileFormType.valueOf(formType),
departureDateTime
)
);
return sendMessage(jsonMessage);
}
else {
logger.error("Fail upload file: {}", multipartFile.getOriginalFilename());
return false;
}
}
private boolean sendMessage(String message) {
ProducerRecord<String, String> record = new ProducerRecord<>(this.kafkaTopicName, message);
try {
this.kafkaTemplate.send(record).get();
logger.debug("Success send record: {}", record);
return true;
}
catch (Exception exception) {
logger.error("Fail send message.", exception);
return false;
}
}
private String getNewFilename(String oldFilename) {
return UUID.randomUUID() + getFileExtension(oldFilename);
}
private String getFileExtension(String filename) {
int lastIndexOf = filename.lastIndexOf(".");
if (lastIndexOf == -1) {
return "";
}
return filename.substring(lastIndexOf);
}
private String getJsonKafkaMessage(EmployeeInfoKafkaMessage employeeInfoKafkaMessage) {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.writeValueAsString(employeeInfoKafkaMessage);
}
catch (JsonProcessingException e) {
throw new RuntimeException(String.format("Fail get json from: %s", employeeInfoKafkaMessage), e);
}
}
private String getDepartureDateTime() {
return LocalDateTime.now().format(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm"));
}
}

View file

@ -0,0 +1,78 @@
package ervu.service.fileupload;
import ervu.service.fileupload.model.EmployeeInfoKafkaMessage;
import ervu.service.fileupload.model.FileInfo;
import ervu.service.fileupload.model.OrgInfo;
import ervu.service.fileupload.model.SenderInfo;
import esia.service.UlDataService;
import org.springframework.stereotype.Service;
/**
* @author Alexandr Shalaginov
*/
@Service
public class EmployeeInfoKafkaMessageService {
private final UlDataService ulDataService;
public EmployeeInfoKafkaMessageService(UlDataService ulDataService) {
this.ulDataService = ulDataService;
}
public EmployeeInfoKafkaMessage getKafkaMessage(String fileNameBase, String fileName,
EmployeeInfoFileFormType formType, String departureDateTime) {
return new EmployeeInfoKafkaMessage(
getOrgInfo(),
getSenderInfo(),
getFileInfo(
fileNameBase,
fileName,
formType,
departureDateTime
)
);
}
private OrgInfo getOrgInfo() {
// OrganizationModel organizationModel = ulDataService.getOrganizationModel();
// return new OrgInfo(
// organizationModel.getShortName(),
// organizationModel.getLeg(),
// organizationModel.getLegName(),
// organizationModel.getOgrn(),
// organizationModel.getInn(),
// organizationModel.getKpp()
// );
return null;
}
private SenderInfo getSenderInfo() {
// MillitaryRegistrationPersonModel personModel = ulDataService.getPersonModel();
// return new SenderInfo(
// personModel.getLastName(),
// personModel.getFirstName(),
// personModel.getMiddleName(),
// personModel.getBirthday(),
// personModel.getRoleCode(),
// personModel.getRoleName(),
// personModel.getSnils(),
// personModel.getIdERN(),
// new PassportInfo(
// personModel.getPassportSeries(),
// personModel.getPassportNumber(),
// personModel.getPassportIssueDate()
// )
// );
return null;
}
private FileInfo getFileInfo(String fileNameBase, String fileName,
EmployeeInfoFileFormType formType, String departureDateTime) {
return new FileInfo(
fileNameBase,
fileName,
formType.getFilePatternCode(),
formType.getFilePatternName(),
departureDateTime
);
}
}

View file

@ -0,0 +1,54 @@
package ervu.service.fileupload.model;
import java.util.Objects;
/**
* @author Alexandr Shalaginov
*/
public class EmployeeInfoKafkaMessage {
private final OrgInfo orgInfo;
private final SenderInfo senderInfo;
private final FileInfo fileInfo;
public EmployeeInfoKafkaMessage(OrgInfo orgInfo, SenderInfo senderInfo, FileInfo fileInfo) {
this.orgInfo = orgInfo;
this.senderInfo = senderInfo;
this.fileInfo = fileInfo;
}
public OrgInfo getOrgInfo() {
return orgInfo;
}
public SenderInfo getSenderInfo() {
return senderInfo;
}
public FileInfo getFileInfo() {
return fileInfo;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
EmployeeInfoKafkaMessage that = (EmployeeInfoKafkaMessage) o;
return Objects.equals(orgInfo, that.orgInfo) && Objects.equals(senderInfo,
that.senderInfo
) && Objects.equals(fileInfo, that.fileInfo);
}
@Override
public int hashCode() {
return Objects.hash(orgInfo, senderInfo, fileInfo);
}
@Override
public String toString() {
return "KafkaMessage{" +
"orgInfo=" + orgInfo +
", senderInfo=" + senderInfo +
", fileInfo=" + fileInfo +
'}';
}
}

View file

@ -0,0 +1,73 @@
package ervu.service.fileupload.model;
import java.util.Objects;
/**
* @author Alexandr Shalaginov
*/
public class FileInfo {
private final String fileNameBase;
private final String fileName;
private final String filePatternCode;
private final String filePatternName;
private final String departureDateTime;
public FileInfo(String fileNameBase, String fileName, String filePatternCode,
String filePatternName, String departureDateTime) {
this.fileNameBase = fileNameBase;
this.fileName = fileName;
this.filePatternCode = filePatternCode;
this.filePatternName = filePatternName;
this.departureDateTime = departureDateTime;
}
public String getFileNameBase() {
return fileNameBase;
}
public String getFileName() {
return fileName;
}
public String getFilePatternCode() {
return filePatternCode;
}
public String getFilePatternName() {
return filePatternName;
}
public String getDepartureDateTime() {
return departureDateTime;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
FileInfo fileInfo = (FileInfo) o;
return Objects.equals(fileNameBase, fileInfo.fileNameBase) && Objects.equals(
fileName, fileInfo.fileName) && Objects.equals(filePatternCode,
fileInfo.filePatternCode
) && Objects.equals(filePatternName, fileInfo.filePatternName)
&& Objects.equals(departureDateTime, fileInfo.departureDateTime);
}
@Override
public int hashCode() {
return Objects.hash(fileNameBase, fileName, filePatternCode, filePatternName,
departureDateTime
);
}
@Override
public String toString() {
return "FileInfo{" +
"fileNameBase='" + fileNameBase + '\'' +
", fileName='" + fileName + '\'' +
", filePatternCode='" + filePatternCode + '\'' +
", filePatternName='" + filePatternName + '\'' +
", departureDateTime='" + departureDateTime + '\'' +
'}';
}
}

View file

@ -0,0 +1,78 @@
package ervu.service.fileupload.model;
import java.util.Objects;
/**
* @author Alexandr Shalaginov
*/
public class OrgInfo {
private final String orgName;
private final String orgTypeCode;
private final String orgTypeName;
private final String ogrn;
private final String inn;
private final String kpp;
public OrgInfo(String orgName, String orgTypeCode, String orgTypeName, String ogrn, String inn,
String kpp) {
this.orgName = orgName;
this.orgTypeCode = orgTypeCode;
this.orgTypeName = orgTypeName;
this.ogrn = ogrn;
this.inn = inn;
this.kpp = kpp;
}
public String getOrgName() {
return orgName;
}
public String getOrgTypeCode() {
return orgTypeCode;
}
public String getOrgTypeName() {
return orgTypeName;
}
public String getOgrn() {
return ogrn;
}
public String getInn() {
return inn;
}
public String getKpp() {
return kpp;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
OrgInfo orgInfo = (OrgInfo) o;
return Objects.equals(orgName, orgInfo.orgName) && Objects.equals(orgTypeCode,
orgInfo.orgTypeCode
) && Objects.equals(orgTypeName, orgInfo.orgTypeName) && Objects.equals(ogrn,
orgInfo.ogrn
) && Objects.equals(inn, orgInfo.inn) && Objects.equals(kpp, orgInfo.kpp);
}
@Override
public int hashCode() {
return Objects.hash(orgName, orgTypeCode, orgTypeName, ogrn, inn, kpp);
}
@Override
public String toString() {
return "OrgInfo{" +
"orgName='" + orgName + '\'' +
", orgTypeCode='" + orgTypeCode + '\'' +
", orgTypeName='" + orgTypeName + '\'' +
", ogrn='" + ogrn + '\'' +
", inn='" + inn + '\'' +
", kpp='" + kpp + '\'' +
'}';
}
}

View file

@ -0,0 +1,54 @@
package ervu.service.fileupload.model;
import java.util.Objects;
/**
* @author Alexandr Shalaginov
*/
public class PassportInfo {
private final String series;
private final String number;
private final String issueDate;
public PassportInfo(String series, String number, String issueDate) {
this.series = series;
this.number = number;
this.issueDate = issueDate;
}
public String getSeries() {
return series;
}
public String getNumber() {
return number;
}
public String getIssueDate() {
return issueDate;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PassportInfo that = (PassportInfo) o;
return Objects.equals(series, that.series) && Objects.equals(number,
that.number
) && Objects.equals(issueDate, that.issueDate);
}
@Override
public int hashCode() {
return Objects.hash(series, number, issueDate);
}
@Override
public String toString() {
return "PassportInfo{" +
"series='" + series + '\'' +
", number='" + number + '\'' +
", issueDate='" + issueDate + '\'' +
'}';
}
}

View file

@ -0,0 +1,106 @@
package ervu.service.fileupload.model;
import java.util.Objects;
/**
* @author Alexandr Shalaginov
*/
public class SenderInfo {
private final String senderLastName;
private final String senderFirstName;
private final String senderMiddleName;
private final String birthDate;
private final String senderRoleCode;
private final String senderRoleName;
private final String snils;
private final String idERN;
private final PassportInfo document;
public SenderInfo(String senderLastName, String senderFirstName, String senderMiddleName,
String birthDate, String senderRoleCode, String senderRoleName, String snils, String idERN,
PassportInfo document) {
this.senderLastName = senderLastName;
this.senderFirstName = senderFirstName;
this.senderMiddleName = senderMiddleName;
this.birthDate = birthDate;
this.senderRoleCode = senderRoleCode;
this.senderRoleName = senderRoleName;
this.snils = snils;
this.idERN = idERN;
this.document = document;
}
public String getSenderLastName() {
return senderLastName;
}
public String getSenderFirstName() {
return senderFirstName;
}
public String getSenderMiddleName() {
return senderMiddleName;
}
public String getBirthDate() {
return birthDate;
}
public String getSenderRoleCode() {
return senderRoleCode;
}
public String getSenderRoleName() {
return senderRoleName;
}
public String getSnils() {
return snils;
}
public String getIdERN() {
return idERN;
}
public PassportInfo getDocument() {
return document;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SenderInfo that = (SenderInfo) o;
return Objects.equals(senderLastName, that.senderLastName) && Objects.equals(
senderFirstName, that.senderFirstName) && Objects.equals(senderMiddleName,
that.senderMiddleName
) && Objects.equals(birthDate, that.birthDate) && Objects.equals(
senderRoleCode, that.senderRoleCode) && Objects.equals(senderRoleName,
that.senderRoleName
) && Objects.equals(snils, that.snils) && Objects.equals(idERN, that.idERN)
&& Objects.equals(document, that.document);
}
@Override
public int hashCode() {
return Objects.hash(senderLastName, senderFirstName, senderMiddleName, birthDate,
senderRoleCode,
senderRoleName, snils, idERN, document
);
}
@Override
public String toString() {
return "SenderInfo{" +
"senderLastName='" + senderLastName + '\'' +
", senderFirstName='" + senderFirstName + '\'' +
", senderMiddleName='" + senderMiddleName + '\'' +
", birthDate='" + birthDate + '\'' +
", senderRoleCode='" + senderRoleCode + '\'' +
", senderRoleName='" + senderRoleName + '\'' +
", snils='" + snils + '\'' +
", idERN='" + idERN + '\'' +
", document=" + document +
'}';
}
}

View file

@ -30,6 +30,9 @@ public class EsiaConfig {
@Value("${esia-redirect-url:#{null}}")
private String redirectUrl;
@Value("${sign-url:#{null}}")
private String signUrl;
public String getEsiaCodeUri() {
// return esiaBaseUri + esiaCodePath;
return "https://esia-portal1.test.gosuslugi.ru/aas/oauth2/v2/ac";
@ -63,4 +66,8 @@ public class EsiaConfig {
public String getEsiaBaseUri() {
return "https://esia-portal1.test.gosuslugi.ru/";
}
public String getSignUrl() {
return "https://ervu-sign-dev.k8s.micord.ru/sign";
}
}

View file

@ -1,9 +1,17 @@
package esia.controller;
import java.util.Arrays;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import esia.model.Addresses;
import esia.model.Contacts;
import esia.model.EmployeeModel;
import esia.model.OrgInfoModel;
import esia.model.OrganizationModel;
import esia.service.EsiaAuthService;
import esia.service.UlDataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@ -19,6 +27,9 @@ public class EsiaController {
@Autowired
private EsiaAuthService esiaAuthService;
@Autowired
private UlDataService ulDataService;
@RequestMapping(value = "/esia/url")
public String getEsiaUrl() {
return esiaAuthService.generateAuthCodeUrl();
@ -33,4 +44,61 @@ public class EsiaController {
public void refreshToken(HttpServletRequest request, HttpServletResponse response) {
esiaAuthService.getEsiaTokensByRefreshToken(request, response);
}
@RequestMapping(value = "/esia/org")
public OrgInfoModel getOrgInfo(HttpServletRequest request) {
String accessToken = null;
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("access_token")) {
accessToken = cookie.getValue();
}
}
}
if (accessToken == null) {
return null;
}
OrganizationModel organizationModel = ulDataService.getOrganizationModel(accessToken);
EmployeeModel chiefEmployeeModel = ulDataService.getChiefEmployeeModel(accessToken);
EmployeeModel employeeModel = ulDataService.getEmployeeModel(accessToken);
OrgInfoModel orgInfoModel = new OrgInfoModel();
orgInfoModel.empFullname =
employeeModel.getPerson().getLastName() + " " + employeeModel.getPerson().getFirstName()
+ " " + employeeModel.getPerson().getMiddleName();
orgInfoModel.empPosition = employeeModel.getPosition();
orgInfoModel.fullName = organizationModel.getFullName();
orgInfoModel.shortName = organizationModel.getShortName();
Addresses addresses = organizationModel.getAddresses();
if (addresses != null) {
Arrays.stream(addresses.getElements()).forEach(addressModel -> {
if (addressModel.getType().equals("OLG")) {
orgInfoModel.olgAddress = addressModel.getAddressStr();
}
else if (addressModel.getType().equals("OPS")) {
orgInfoModel.opsAddress = addressModel.getAddressStr();
}
} );
}
orgInfoModel.chiefFullname =
chiefEmployeeModel.getPerson().getLastName() + " " + chiefEmployeeModel.getPerson()
.getFirstName() + " " + chiefEmployeeModel.getPerson().getMiddleName();
orgInfoModel.chiefPosition = chiefEmployeeModel.getPosition();
orgInfoModel.ogrn = organizationModel.getOgrn();
orgInfoModel.kpp = organizationModel.getKpp();
orgInfoModel.inn = organizationModel.getInn();
Contacts contacts = organizationModel.getContacts();
if (contacts != null) {
Arrays.stream(contacts.getElements()).forEach(contactModel -> {
if (contactModel.getType().equals("OPH") && contactModel.getVrfStu().equals("VERIFIED")) {
orgInfoModel.mobile = contactModel.getValue();
}
else if (contactModel.getType().equals("OEM") && contactModel.getVrfStu().equals("VERIFIED")) {
orgInfoModel.email = contactModel.getValue();
}
} );
}
return orgInfoModel;
}
}

View file

@ -10,7 +10,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)
public class EmployeeModel implements Serializable {
private String prsId;
private String prnOid;
private String orgOid;
@ -22,12 +22,12 @@ public class EmployeeModel implements Serializable {
private PersonModel person;
public String getPrsId() {
return prsId;
public String getPrnOid() {
return prnOid;
}
public void setPrsId(String prsId) {
this.prsId = prsId;
public void setPrnOid(String prnOid) {
this.prnOid = prnOid;
}
public String getOrgOid() {

View file

@ -0,0 +1,25 @@
package esia.model;
import java.util.Arrays;
import ru.cg.webbpm.modules.webkit.annotations.Model;
/**
* @author Eduard Tihomirov
*/
@Model
public class OrgInfoModel {
public String empFullname;
public String fullName;
public String shortName;
public String olgAddress;
public String opsAddress;
public String chiefFullname;
public String chiefPosition;
public String ogrn;
public String kpp;
public String inn;
public String empPosition;
public String mobile;
public String email;
}

View file

@ -3,6 +3,7 @@ package esia.model;
import java.io.Serializable;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
/**
@ -23,6 +24,7 @@ public class PersonModel implements Serializable {
private String middleName;
@JsonFormat(pattern = "dd.MM.yyyy")
private Date birthDate;
private String gender;

View file

@ -177,23 +177,18 @@ public class EsiaAuthService {
}
Cookie cookie = new Cookie("access_token", accessToken);
cookie.setHttpOnly(true);
cookie.setSecure(true);
cookie.setPath("/");
response.addCookie(cookie);
String refreshToken = tokenResponse.getRefresh_token();
Cookie cookieRefresh = new Cookie("refresh_token", refreshToken);
cookieRefresh.setHttpOnly(true);
cookieRefresh.setSecure(true);
cookieRefresh.setPath("/");
response.addCookie(cookieRefresh);
Cookie isAuthToken = new Cookie("is_auth", "true");
isAuthToken.setPath("/");
response.addCookie(isAuthToken);
EmployeeModel employeeModel = ulDataService.getEmployeeModel(accessToken);
OrganizationModel organizationModel = ulDataService.getOrganizationModel(accessToken);
return true;
}
catch (Exception e) {
@ -262,14 +257,12 @@ public class EsiaAuthService {
String accessToken = tokenResponse.getAccess_token();
Cookie cookie = new Cookie("access_token", accessToken);
cookie.setHttpOnly(true);
cookie.setSecure(true);
cookie.setPath("/");
response.addCookie(cookie);
String newRefreshToken = tokenResponse.getRefresh_token();
Cookie cookieRefresh = new Cookie("refresh_token", newRefreshToken);
cookieRefresh.setHttpOnly(true);
cookieRefresh.setSecure(true);
cookieRefresh.setPath("/");
response.addCookie(cookieRefresh);
@ -291,7 +284,7 @@ public class EsiaAuthService {
String requestBody = toSign.toString();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://ervu-sign-dev.k8s.micord.ru/sign"))
.uri(URI.create(esiaConfig.getSignUrl()))
.header("Content-Type", "text/plain")
.POST(HttpRequest.BodyPublishers.ofString(requestBody, StandardCharsets.UTF_8))
.build();

View file

@ -4,11 +4,9 @@ import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.Arrays;
import java.util.Base64;
import java.util.Map;
import java.util.Optional;
import com.fasterxml.jackson.databind.ObjectMapper;
@ -65,7 +63,7 @@ public class UlDataServiceImpl implements UlDataService {
.findFirst();
if (chief.isPresent()) {
EmployeeModel chiefModel = chief.get();
PersonModel personModel = getPersonData(chiefModel.getPrsId(), accessToken);
PersonModel personModel = getPersonData(chiefModel.getPrnOid(), accessToken);
chiefModel.setPerson(personModel);
return chiefModel;
}

View file

@ -28,3 +28,15 @@ xa-data-source add \
/system-property=security.password.regex:add(value="^((?=(.*\\d){1,})(?=.*[a-zа-яё])(?=.*[A-ZА-ЯЁ]).{8,})$")
/system-property=fias.enable:add(value=false)
/system-property=bpmn.enable:add(value=false)
/system-property=file.webdav.upload.url:add(value="https://ervu-webdav.k8s.micord.ru")
/system-property=file.webdav.upload.username:add(value="test")
/system-property=file.webdav.upload.password:add(value="test")
/system-property=kafka.send.message.topic.name:add(value="file-upload-v2")
/system-property=kafka.send.url:add(value="http://10.10.31.11:32609")
/system-property=kafka.send.security.protocol:add(value="SASL_PLAINTEXT")
/system-property=kafka.sasl.mechanism:add(value="SCRAM-SHA-256")
/system-property=kafka.send.username:add(value="user1")
/system-property=kafka.send.password:add(value="Blfi9d2OFG")
/system-property=ervu.fileupload.max_file_size:add(value="5242880")
/system-property=ervu.fileupload.max_request_size:add(value="6291456")
/system-property=ervu.fileupload.file_size_threshold:add(value="0")

View file

@ -54,6 +54,18 @@
<property name="security.password.regex" value="^((?=(.*\d){1,})(?=.*[a-zа-яё])(?=.*[A-ZА-ЯЁ]).{8,})$"/>
<property name="fias.enable" value="false"/>
<property name="com.arjuna.ats.arjuna.allowMultipleLastResources" value="true"/>
<property name="file.webdav.upload.url" value="https://ervu-webdav.k8s.micord.ru"/>
<property name="file.webdav.upload.username" value="test"/>
<property name="file.webdav.upload.password" value="test"/>
<property name="kafka.send.message.topic.name" value="file-upload-v2"/>
<property name="kafka.send.url" value="http://10.10.31.11:32609"/>
<property name="kafka.send.security.protocol" value="SASL_PLAINTEXT"/>
<property name="kafka.sasl.mechanism" value="SCRAM-SHA-256"/>
<property name="kafka.send.username" value="user1"/>
<property name="kafka.send.password" value="Blfi9d2OFG"/>
<property name="ervu.fileupload.max_file_size" value="5242880"/>
<property name="ervu.fileupload.max_request_size" value="6291456"/>
<property name="ervu.fileupload.file_size_threshold" value="0"/>
</system-properties>
<management>
<audit-log>

View file

@ -0,0 +1,9 @@
#!/usr/bin/env bash
export JAVA_OPTS="$JAVA_OPTS \
-Ddb.app.host=${DB_APP_HOST:-db} \
-Ddb.app.port=${DB_APP_PORT:-5432} \
-Ddb.app.name=${DB_APP_NAME:-app} \
-Ddb.app.username=${DB_APP_USERNAME:-app_user} \
-Ddb.app.password=${DB_APP_PASSWORD:-apppassword} \
"

View file

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- The contents of this file will be loaded for each web application -->
<Context>
<!-- Default set of monitored resources. If one of these changes, the -->
<!-- web application will be reloaded. -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
<Resource name="java:/webbpm/AppDS" auth="Container"
type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://${db.app.host}:${db.app.port}/${db.app.name}"
username="${db.app.username}" password="${db.app.password}" maxTotal="20" maxIdle="10" maxWaitMillis="-1"/>
</Context>

View file

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<!--
By default, no user is included in the "manager-gui" role required
to operate the "/manager/html" web application. If you wish to use this app,
you must define such a user - the username and password are arbitrary.
Built-in Tomcat manager roles:
- manager-gui - allows access to the HTML GUI and the status pages
- manager-script - allows access to the HTTP API and the status pages
- manager-jmx - allows access to the JMX proxy and the status pages
- manager-status - allows access to the status pages only
The users below are wrapped in a comment and are therefore ignored. If you
wish to configure one or more of these users for use with the manager web
application, do not forget to remove the <!.. ..> that surrounds them. You
will also need to set the passwords to something appropriate.
-->
<user username="admin" password="<must-be-changed>" roles="manager-gui"/>
</tomcat-users>

View file

@ -0,0 +1,15 @@
# WebBPM properties
authentication.method=form
bpmn.enable=false
fias.enable=false
gar.enable=false
reset_password.mail.template.path=mail/reset_password.html
security.password.regex=^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]+$
webbpm.mode=production
webbpm.jbpm.hibernate_statistics.enabled=false
webbpm.cache.hazelcast.hosts=127.0.0.1
webbpm.cache.hazelcast.outbound_port_definitions=5801-5820

View file

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<Context antiResourceLocking="false" privileged="true" >
<CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
sameSiteCookies="strict" />
<!--
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="d+\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>

View file

@ -1,5 +1,5 @@
{
"name": "ervu_lkrp_ul",
"name": "webbpm-frontend",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
@ -1624,9 +1624,9 @@
}
},
"@webbpm/base-package": {
"version": "3.177.0-9188-SNAPSHOT-0801192452",
"resolved": "https://repo.micord.ru/repository/npm-all/@webbpm/base-package/-/base-package-3.177.0-9188-SNAPSHOT-0801192452.tgz",
"integrity": "sha512-pdq3VNitlvQGWC8yYt7oBxpx8x1hE5AR+HrOaRBmoiDUj8/wmbIADJBisUTaRr0n8Bp4J2+q0a2YtPpIZJX5nQ==",
"version": "3.178.2",
"resolved": "https://repo.micord.ru/repository/npm-all/@webbpm/base-package/-/base-package-3.178.2.tgz",
"integrity": "sha512-ShqAmiaGCvrg7ffrhntshwcZJVW8cK10JsMy/OT36p7iK6B/IR0YCJZZ+GIhakLo0CZsEokhcpKBdORvfOI55g==",
"requires": {
"tslib": "^1.9.0"
}
@ -6980,6 +6980,11 @@
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
"dev": true
},
"ng2-file-upload": {
"version": "1.3.0",
"resolved": "https://repo.micord.ru/repository/npm-all/ng2-file-upload/-/ng2-file-upload-1.3.0.tgz",
"integrity": "sha512-Pudxik6LWYsT8hNiEW7RfjgGWAnvfQywxwJYMdt1snTUe+KnlRc/QqPv3QEQW6plXTanuLkYz/TbqilSfSHOsw=="
},
"ngx-cookie": {
"version": "3.0.1",
"resolved": "https://repo.micord.ru/repository/npm-all/ngx-cookie/-/ngx-cookie-3.0.1.tgz",

View file

@ -27,7 +27,7 @@
"@angular/platform-browser-dynamic": "7.2.15",
"@angular/router": "7.2.15",
"@ng-bootstrap/ng-bootstrap": "4.1.1",
"@webbpm/base-package": "3.177.0-9188-SNAPSHOT-0801192452",
"@webbpm/base-package": "3.178.2",
"ag-grid-angular": "29.0.0-micord.4",
"ag-grid-community": "29.0.0-micord.4",
"angular-calendar": "0.28.28",
@ -50,6 +50,7 @@
"jsgantt-improved": "2.0.10-cg",
"moment": "2.17.1",
"moment-timezone": "0.5.11",
"ng2-file-upload": "1.3.0",
"ngx-cookie": "3.0.1",
"ngx-international-phone-number": "1.0.6",
"ngx-toastr": "10.2.0-cg",

File diff suppressed because it is too large Load diff

View file

@ -69,11 +69,9 @@ body.webbpm.ervu_lkrp_ul {
.webbpm.ervu_lkrp_ul a {
color: var(--color-link);
text-decoration: none;
&:hover,
&:focus,
&:active {
color: var(--color-link-hover);
}
}
.webbpm.ervu_lkrp_ul a:is(:hover, :focus, :active) {
color: var(--color-link-hover);
}
.webbpm.ervu_lkrp_ul .header {
@ -81,96 +79,89 @@ body.webbpm.ervu_lkrp_ul {
min-height: var(--h-header);
border: 0;
background-color: var(--color-bg-main);
.header-logo {
margin-left: var(--w-screen);
a {
color: var(--white);
}
.logo a {
width: 62px;
height: 40px;
background: url(../img/svg/logo.svg) no-repeat 0 50%;
}
.main-page {
font-family: 'InterSB';
margin-left: calc(62px + 16px);
}
.header-menu-left {
font-family: 'InterL';
margin-left: 24px;
}
}
.header-menu {
margin-right: var(--w-screen);
.logout.show {
max-width: max-content;
}
.user-info {
flex-direction: row;
align-items: center;
color: var(--white);
height: 24px;
padding: 0;
border: 0;
outline: none;
cursor: pointer;
&.dropdown-toggle::before {
display: inline-block;
content: "";
width: 24px;
height: 24px;
margin-right: 8px;
background-image: url(../img/svg/user-wt.svg);
}
&.dropdown-toggle::after {
width: 24px;
height: 24px;
border: 0;
background-image: url(../img/svg/arrow-down-wt.svg);
}
}
.dropdown-menu.show {
top: var(--h-header) !important;
padding: 8px 0;
border-radius: 4px;
background-color: var(--white);
box-shadow: 0 6px 16px 0 rgba(230, 230, 230, 0.11), 0 1px 4px 0 #f3f3f3;
.user-department {
color: var(--color-text-primary);
font-family: 'InterB';
padding: 8px 16px;
}
& > button, & > a {
position: relative;
display: flex;
color: var(--color-text-primary);
padding: 8px 16px 8px calc(16px + 32px);
&:hover,
&:focus,
&:active {
color: var(--color-link-hover);
}
&::before {
content: "";
position: absolute;
left: 16px;
width: 24px;
height: 24px;
}
&.exit::before {
background-image: url(../img/svg/exit.svg);
}
&.data::before {
background-image: url(../img/svg/data.svg);
}
}
}
}
}
.webbpm.ervu_lkrp_ul .header .header-logo {
margin-left: var(--w-screen);
}
.webbpm.ervu_lkrp_ul .header .header-logo a {
color: var(--white);
}
.webbpm.ervu_lkrp_ul .header .header-logo .logo a {
width: 62px;
height: 40px;
background: url(../img/svg/logo.svg) no-repeat 0 50%;
}
.webbpm.ervu_lkrp_ul .header .header-logo .main-page {
font-family: 'InterSB';
margin-left: calc(62px + 16px);
}
.webbpm.ervu_lkrp_ul .header .header-logo .header-menu-left {
font-family: 'InterL';
margin-left: 24px;
}
.webbpm.ervu_lkrp_ul .header .header-menu {
margin-right: var(--w-screen);
}
.webbpm.ervu_lkrp_ul .header .header-menu .logout.show {
max-width: max-content;
}
.webbpm.ervu_lkrp_ul .header .header-menu .user-info {
flex-direction: row;
align-items: center;
color: var(--white);
height: 24px;
padding: 0;
border: 0;
outline: none;
cursor: pointer;
}
.webbpm.ervu_lkrp_ul .header .header-menu .user-info.dropdown-toggle::before {
display: inline-block;
content: "";
width: 24px;
height: 24px;
margin-right: 8px;
background-image: url(../img/svg/user-wt.svg);
}
.webbpm.ervu_lkrp_ul .header .header-menu .user-info.dropdown-toggle::after {
width: 24px;
height: 24px;
border: 0;
background-image: url(../img/svg/arrow-down-wt.svg);
}
.webbpm.ervu_lkrp_ul .header .header-menu .dropdown-menu.show {
top: var(--h-header) !important;
padding: 8px 0;
border-radius: 4px;
background-color: var(--white);
box-shadow: 0 6px 16px 0 rgba(230, 230, 230, 0.11), 0 1px 4px 0 #f3f3f3;
}
.webbpm.ervu_lkrp_ul .header .header-menu .dropdown-menu.show .user-department {
color: var(--color-text-primary);
font-family: 'InterB';
padding: 8px 16px;
}
.webbpm.ervu_lkrp_ul .header .header-menu .dropdown-menu.show > :is(button, a) {
position: relative;
display: flex;
color: var(--color-text-primary);
padding: 8px 16px 8px calc(16px + 32px);
}
.webbpm.ervu_lkrp_ul .header .header-menu .dropdown-menu.show > :is(button, a):is(:hover, :focus, :active) {
color: var(--color-link-hover);
}
.webbpm.ervu_lkrp_ul .header .header-menu .dropdown-menu.show > :is(button, a)::before {
content: "";
position: absolute;
left: 16px;
width: 24px;
height: 24px;
}
.webbpm.ervu_lkrp_ul .header .header-menu .dropdown-menu.show > :is(button, a).exit::before {
background-image: url(../img/svg/exit.svg);
}
.webbpm.ervu_lkrp_ul .header .header-menu .dropdown-menu.show > :is(button, a).data::before {
background-image: url(../img/svg/data.svg);
}
.webbpm.ervu_lkrp_ul footer {
@ -182,11 +173,10 @@ body.webbpm.ervu_lkrp_ul {
.webbpm.ervu_lkrp_ul .container {
padding-top: var(--h-header);
bottom: var(--h-footer);
.container-inside {
font-family: 'Inter';
padding: var(--indent-huge) var(--w-screen);
}
}
.webbpm.ervu_lkrp_ul .container-inside {
font-family: 'Inter';
padding: var(--indent-huge) var(--w-screen);
}
/*@media ((max-width: 780px) or ((orientation: landscape) and (max-device-width : 1024px))) {*/
@ -215,20 +205,18 @@ body.webbpm.ervu_lkrp_ul {
--indent-small: 16px;
}
.webbpm.ervu_lkrp_ul .header .header-logo {
.main-page {
display: none;
}
.header-menu-left {
margin-left: 40px;
a {
white-space: nowrap;
text-overflow: ellipsis;
max-width: 85px;
overflow: hidden;
}
}
.webbpm.ervu_lkrp_ul .header .header-logo .main-page {
display: none;
}
.webbpm.ervu_lkrp_ul .header .header-logo .header-menu-left {
margin-left: 40px;
}
.webbpm.ervu_lkrp_ul .header .header-logo .header-menu-left a {
white-space: nowrap;
text-overflow: ellipsis;
max-width: 85px;
overflow: hidden;
}
}
/*----------------- Login ---------------- */
@ -242,76 +230,72 @@ body.webbpm.ervu_lkrp_ul {
border-radius: 8px;
background-color: var(--white);
box-shadow: var(--bg-shadow);
}
h1, h2 {
color: var(--color-form);
font-family: 'InterB';
font-size: var(--size-text-subtitle);
text-align: left;
margin-bottom: 0;
}
.logo {
position: relative;
display: flex;
justify-content: center;
height: 76px;
padding: 0 0 0 128px;
margin-bottom: 32px;
&::after {
position: absolute;
content: "";
left: 0;
width: 112px;
height: 72px;
background-image: url(../img/svg/form-logo.svg);
}
}
.row {
position: relative;
margin-bottom: 0;
& + .row {
margin-top: 20px;
}
}
input {
height: 56px;
padding-top: 20px;
padding-left: 16px;
border: 0;
border-radius: 8px;
background-color: var(--bg-light);
&[type="password"] {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
& ~ .input-group-append > .input-group-text {
border: 0;
background-color: var(--bg-light);
}
}
& + label {
position: absolute;
top: 16px;
left: 16px;
pointer-events: none;
transition: all 200ms;
}
&:focus + label,
&:not(:placeholder-shown) + label {
top: 4px;
font-size: var(--indent-extra-mini);
z-index: 20;
}
}
.msg-text {
margin-top: 12px;
}
.btn-box {
margin-top: 32px;
}
.webbpm.ervu_lkrp_ul :is(.form-signin, .form-signup, .confirm) :is(h1, h2) {
color: var(--color-form);
font-family: 'InterB';
font-size: var(--size-text-subtitle);
text-align: left;
margin-bottom: 0;
}
.webbpm.ervu_lkrp_ul :is(.form-signin, .form-signup, .confirm) .logo {
position: relative;
display: flex;
justify-content: center;
height: 76px;
padding: 0 0 0 128px;
margin-bottom: 32px;
}
.webbpm.ervu_lkrp_ul :is(.form-signin, .form-signup, .confirm) .logo::after {
position: absolute;
content: "";
left: 0;
width: 112px;
height: 72px;
background-image: url(../img/svg/form-logo.svg);
}
.webbpm.ervu_lkrp_ul :is(.form-signin, .form-signup, .confirm) .row {
position: relative;
margin-bottom: 0;
}
.webbpm.ervu_lkrp_ul :is(.form-signin, .form-signup, .confirm) .row + .row {
margin-top: 20px;
}
.webbpm.ervu_lkrp_ul :is(.form-signin, .form-signup, .confirm) input {
height: 56px;
padding-top: 20px;
padding-left: 16px;
border: 0;
border-radius: 8px;
background-color: var(--bg-light);
}
.webbpm.ervu_lkrp_ul :is(.form-signin, .form-signup, .confirm) input[type="password"] {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.webbpm.ervu_lkrp_ul :is(.form-signin, .form-signup, .confirm) input[type="password"] ~ .input-group-append > .input-group-text {
border: 0;
background-color: var(--bg-light);
}
.webbpm.ervu_lkrp_ul :is(.form-signin, .form-signup, .confirm) input + label {
position: absolute;
top: 16px;
left: 16px;
pointer-events: none;
transition: all 200ms;
}
.webbpm.ervu_lkrp_ul :is(.form-signin, .form-signup, .confirm) input:focus + label,
.webbpm.ervu_lkrp_ul :is(.form-signin, .form-signup, .confirm) input:not(:placeholder-shown) + label {
top: 4px;
font-size: var(--indent-extra-mini);
z-index: 20;
}
.webbpm.ervu_lkrp_ul :is(.form-signin, .form-signup, .confirm) .msg-text {
margin-top: 12px;
}
.webbpm.ervu_lkrp_ul :is(.form-signin, .form-signup, .confirm) .btn-box {
margin-top: 32px;
}
.webbpm.ervu_lkrp_ul .form-signin .row.registration > * + *,

View file

@ -0,0 +1,31 @@
<div [id]="getObjectId()"
class="ervu-file-upload"
[ngbTooltip]="tooltip | emptyIfNull">
<div ng2FileDrop
[uploader]="uploader"
class="file-drop-zone"
*ngIf="(!maxFilesToUpload || uploader.queue.length < maxFilesToUpload) && isDropZoneVisible">
<span class="select-file-field-text">{{selectFileFieldText}}</span>
<button class="select-file-btn" (click)="openFileChooseDialog()">{{selectFileButtonName}}</button>
</div>
<!-- input is out of file-drop-zone because after change ngIf condition input doesn't firing events -->
<input type="file"
class="file-input"
ng2FileSelect
[uploader]="uploader"
[multiple]="!maxFilesToUpload || maxFilesToUpload > 1"
[accept]="getExtensions()"
hidden>
<div class="selected-file-list" *ngIf="isFilesListVisible">
<div class="selected-file" *ngFor="let item of uploader.queue">
<span class="selected-file-name">{{item?.file?.name}}</span>
<span class="selected-file-size" *ngIf="displayFileSize">{{item?.file?.size/1024/1024 | number: '.2'}} MB</span>
<button class="selected-file-delete-btn" (click)="removeFile(item)">{{removeFileButtonName}}</button>
</div>
</div>
<div class="file-upload-progress" *ngIf="displayProgressBar && isProgressBarVisible">
<div class="file-upload-progress-bar"
role="progressbar"
[ngStyle]="{ 'width': uploader.progress + '%' }"></div>
</div>
</div>

View file

@ -0,0 +1,7 @@
export enum EmployeeInfoFileFormType {
FORM_2,
FORM_9,
FORM_10,
FORM_11,
FORM_12
}

View file

@ -0,0 +1,232 @@
import {
InputControl,
NotNull,
Visible,
Event,
MessagesService,
UnsupportedOperationError
} from "@webbpm/base-package";
import {ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef} from "@angular/core";
import {FileItem, FileUploader} from "ng2-file-upload";
import {FileLikeObject} from "ng2-file-upload/file-upload/file-like-object.class";
import {EmployeeInfoFileFormType} from "./EmployeeInfoFileFormType";
@Component({
moduleId: module.id,
selector: "ervu-file-upload",
templateUrl: "./../../../../../src/resources/template/ervu/component/ErvuFileUpload.html",
changeDetection: ChangeDetectionStrategy.OnPush
})
export class ErvuFileUpload extends InputControl {
@NotNull("true")
public selectFileFieldText: string;
@NotNull("true")
public selectFileButtonName: string;
@NotNull("true")
public removeFileButtonName: string;
public maxFileSizeMb: number;
public extensionFilter: string[] = [];
public maxFilesToUpload: number;
@NotNull("true")
public displayFileSize: boolean = false;
@NotNull("true")
public displayProgressBar: boolean = false;
@NotNull("true")
public formType: EmployeeInfoFileFormType;
@Visible("false")
public uploader: FileUploader;
@Visible("false")
public fileAddedEvent: Event<any> = new Event<any>();
@Visible("false")
public fileDeletedEvent: Event<any> = new Event<any>();
@Visible("false")
public fileUploadStartEvent: Event<any> = new Event<any>();
@Visible("false")
public fileUploadEndEvent: Event<any> = new Event<any>();
@Visible("false")
public fileUploadFailedEvent: Event<any> = new Event<any>();
@Visible("false")
public isDropZoneVisible: boolean = true;
@Visible("false")
public isFilesListVisible: boolean = true;
@Visible("false")
public isProgressBarVisible: boolean = false;
private fileInputEl: HTMLInputElement;
private url: string = '/backend/employee/document';
private messagesService: MessagesService;
private isUploadErrorOccurred = false;
constructor(el: ElementRef, cd: ChangeDetectorRef) {
super(el, cd);
this.uploader = new FileUploader({url: this.url});
}
initialize() {
super.initialize();
this.messagesService = this.injector.get(MessagesService);
this.uploader.setOptions({
url: this.url,
autoUpload: false,
filters: [{
name: 'extension',
fn: (item: any): boolean => {
if (!this.extensionFilter.length) {
return true;
}
const fileExtension = item.name.substring(item.name.lastIndexOf('.') + 1, item.name.length);
for (let ext of this.extensionFilter) {
if (ext.toUpperCase() === fileExtension.toUpperCase()) {
return true;
}
}
return false;
}
}],
maxFileSize: this.maxFileSizeMb ? this.maxFileSizeMb * 1024 * 1024 : undefined,
queueLimit: this.maxFilesToUpload ? this.maxFilesToUpload : undefined,
headers: [{
name: "X-Employee-Info-File-Form-Type",
value: EmployeeInfoFileFormType[this.formType]
}]
});
this.setUploaderMethods();
}
ngAfterViewInit() {
super.ngAfterViewInit();
this.fileInputEl = this.el.nativeElement.querySelector('.file-input');
}
openFileChooseDialog() {
this.fileInputEl.click();
}
@Visible()
uploadFiles() {
this.uploader.uploadAll();
}
removeFile(item: FileItem) {
item.remove();
this.fileInputEl.value = null;
this.fileDeletedEvent.trigger();
this.cd.markForCheck();
}
private setUploaderMethods() {
this.uploader.onBeforeUploadItem = (fileItem: FileItem) => {
this.fileUploadStartEvent.trigger();
this.isDropZoneVisible = false;
this.isFilesListVisible = false;
this.isProgressBarVisible = true;
this.cd.markForCheck();
};
this.uploader.onErrorItem = (item: FileItem,
response: string) => {
this.fileUploadFailedEvent.trigger();
this.uploader.cancelAll();
this.messagesService.error(`Не удалось отправить следующие файлы: ${item.file.name},`
+ ` ${this.uploader.getNotUploadedItems()
.map(notUploadeditem => notUploadeditem.file.name)
.join(', ')}.`);
this.uploader.clearQueue();
this.isDropZoneVisible = true;
this.isFilesListVisible = true;
this.isProgressBarVisible = false;
this.isUploadErrorOccurred = true;
this.cd.markForCheck();
};
this.uploader.onCompleteAll = () => {
if (!this.isUploadErrorOccurred) {
this.uploader.clearQueue();
this.fileUploadEndEvent.trigger();
this.isProgressBarVisible = false;
this.cd.markForCheck();
}
};
this.uploader.onAfterAddingFile = (fileItem: FileItem) => {
this.fileAddedEvent.trigger();
}
this.uploader.onWhenAddingFileFailed = (item: FileLikeObject, filter: any, options: any) => {
switch (filter.name) {
case "fileSize":
this.messagesService.error(`Размер файла ${item.name} превышает предельно допустимый = ${this.maxFileSizeMb} MB`);
break;
case "queueLimit":
this.messagesService.error(`Не удалось добавить файл ${item.name}. `
+ `Достигнуто максимальное количество файлов для загрузки = ${this.maxFilesToUpload}`);
break;
case "extension":
this.messagesService.error(`Файл ${item.name} имеет недопустимое расширение.`);
break;
default:
this.messagesService.error(`Не удалось добавить файл ${item.name}.`);
}
this.fileInputEl.value = null;
this.cd.markForCheck();
};
}
@Visible()
getExtensions(): string {
if (this.extensionFilter) {
return this.extensionFilter
.map(s => '.' + s)
.join(',')
}
return undefined;
}
subscribeToModelChange() {
//empty because there is no ngModel here
}
unsubscribeToModelChange() {
//empty because there is no ngModel here
}
@Visible()
getPresentationValue(): string {
let fileNames: string = '';
let fileItems: FileItem[] = this.uploader.queue;
if (fileItems) {
fileItems.forEach((fileItem) => {
fileNames += fileItem.file.name;
});
}
return fileNames;
}
@Visible()
getValue(): File[] {
return this.uploader.queue.map(fileItem => fileItem._file);
}
getValueAsModel(): any {
throw new UnsupportedOperationError("Unsupported operation");
}
setValue(value: any): any {
throw new UnsupportedOperationError("Unsupported operation");
}
@Visible()
public reset() {
//don't use super because there is no ngModel here
this.uploader.clearQueue();
this.fileInputEl.value = null;
this.isDropZoneVisible = true;
this.isFilesListVisible = true;
this.isProgressBarVisible = false;
this.isUploadErrorOccurred = false;
this.cd.markForCheck();
}
}

View file

@ -0,0 +1,7 @@
import {Behavior, NotNull} from "@webbpm/base-package";
export class OrgData extends Behavior{
@NotNull()
public dataId: string;
}

View file

@ -0,0 +1,92 @@
import {AnalyticalScope, Behavior, Container, ControlWithValue} from "@webbpm/base-package";
import {HttpClient} from "@angular/common/http";
import {OrgData} from "./OrgData";
import {OrgInfoModel} from "../generated/esia/model/OrgInfoModel";
@AnalyticalScope(Container)
export class OrgDataRoot extends Behavior{
private container: Container;
initialize() {
super.initialize();
this.container = this.getScript(Container);
let orgScripts: OrgData[] = this.container.getScriptsInThisAndChildren(OrgData);
let httpClient = this.injector.get(HttpClient);
httpClient.get<OrgInfoModel>("esia/org")
.toPromise()
.then(orgInfoModel => {
if (orgInfoModel == null) {
return;
}
for (let orgData of orgScripts) {
if (orgData.dataId == 'empFullname') {
let control: ControlWithValue = orgData.getScriptInObject(orgData.getObjectId(),
'component.ControlWithValue');
control.setValue(orgInfoModel.empFullname)
}
else if (orgData.dataId == 'fullName') {
let control: ControlWithValue = orgData.getScriptInObject(orgData.getObjectId(),
'component.ControlWithValue');
control.setValue(orgInfoModel.fullName)
}
else if (orgData.dataId == 'shortName') {
let control: ControlWithValue = orgData.getScriptInObject(orgData.getObjectId(),
'component.ControlWithValue');
control.setValue(orgInfoModel.shortName)
}
else if (orgData.dataId == 'olgAddress') {
let control: ControlWithValue = orgData.getScriptInObject(orgData.getObjectId(),
'component.ControlWithValue');
control.setValue(orgInfoModel.olgAddress)
}
else if (orgData.dataId == 'opsAddress') {
let control: ControlWithValue = orgData.getScriptInObject(orgData.getObjectId(),
'component.ControlWithValue');
control.setValue(orgInfoModel.opsAddress)
}
else if (orgData.dataId == 'chiefFullname') {
let control: ControlWithValue = orgData.getScriptInObject(orgData.getObjectId(),
'component.ControlWithValue');
control.setValue(orgInfoModel.chiefFullname)
}
else if (orgData.dataId == 'chiefPosition') {
let control: ControlWithValue = orgData.getScriptInObject(orgData.getObjectId(),
'component.ControlWithValue');
control.setValue(orgInfoModel.chiefPosition)
}
else if (orgData.dataId == 'ogrn') {
let control: ControlWithValue = orgData.getScriptInObject(orgData.getObjectId(),
'component.ControlWithValue');
control.setValue(orgInfoModel.ogrn)
}
else if (orgData.dataId == 'kpp') {
let control: ControlWithValue = orgData.getScriptInObject(orgData.getObjectId(),
'component.ControlWithValue');
control.setValue(orgInfoModel.kpp)
}
else if (orgData.dataId == 'inn') {
let control: ControlWithValue = orgData.getScriptInObject(orgData.getObjectId(),
'component.ControlWithValue');
control.setValue(orgInfoModel.inn)
}
else if (orgData.dataId == 'empPosition') {
let control: ControlWithValue = orgData.getScriptInObject(orgData.getObjectId(),
'component.ControlWithValue');
control.setValue(orgInfoModel.empPosition)
}
else if (orgData.dataId == 'mobile') {
let control: ControlWithValue = orgData.getScriptInObject(orgData.getObjectId(),
'component.ControlWithValue');
control.setValue(orgInfoModel.mobile)
}
else if (orgData.dataId == 'email') {
let control: ControlWithValue = orgData.getScriptInObject(orgData.getObjectId(),
'component.ControlWithValue');
control.setValue(orgInfoModel.email)
}
}
});
}
}

View file

@ -20,6 +20,8 @@ import {InternationalPhoneNumberModule} from "ngx-international-phone-number";
import {AppProgressIndicationComponent} from "./component/app-progress-indication.component";
import {AppProgressIndicationService} from "./service/app-progress-indication.service";
import {FileUploadModule} from "ng2-file-upload";
import {ErvuFileUpload} from "../../ervu/component/fileupload/ErvuFileUpload";
registerLocaleData(localeRu);
export const DIRECTIVES = [
@ -28,6 +30,7 @@ export const DIRECTIVES = [
forwardRef(() => ApplicationVersionComponent),
forwardRef(() => AccessDeniedComponent),
forwardRef(() => AppProgressIndicationComponent),
forwardRef(() => ErvuFileUpload)
];
@NgModule({
@ -41,7 +44,8 @@ export const DIRECTIVES = [
ComponentsModule,
AgGridModule,
RouterModule,
InternationalPhoneNumberModule
InternationalPhoneNumberModule,
FileUploadModule
],
declarations: [
DIRECTIVES

View file

@ -62,7 +62,8 @@
'chartjs-adapter-moment': 'npm:chartjs-adapter-moment/dist/chartjs-adapter-moment.js',
'tslib': 'npm:tslib/tslib.js',
'ngx-international-phone-number': 'npm:ngx-international-phone-number/ngx-international-phone-number.umd.js',
'google-libphonenumber': 'npm:google-libphonenumber/dist/libphonenumber.js'
'google-libphonenumber': 'npm:google-libphonenumber/dist/libphonenumber.js',
'ng2-file-upload': 'npm:ng2-file-upload/bundles/ng2-file-upload.umd.js'
},
packages: {
'webbpm': { main: 'main', defaultExtension: 'js'},

View file

@ -62,7 +62,8 @@
'chartjs-adapter-moment': 'npm:chartjs-adapter-moment/dist/chartjs-adapter-moment.js',
'tslib': 'npm:tslib/tslib.js',
'ngx-international-phone-number': 'npm:ngx-international-phone-number/ngx-international-phone-number.umd.js',
'google-libphonenumber': 'npm:google-libphonenumber/dist/libphonenumber.js'
'google-libphonenumber': 'npm:google-libphonenumber/dist/libphonenumber.js',
'ng2-file-upload': 'npm:ng2-file-upload/bundles/ng2-file-upload.umd.js'
},
packages: {
'preview': { main: './modules/preview/preview.main', defaultExtension: 'js'},

View file

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

View file

@ -60,7 +60,7 @@
<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;&#x443;&#x442;&#x440;&#x435;&#x43d;&#x43d;&#x435;&#x439; &#x441;&#x441;&#x44b;&#x43b;&#x43a;&#x438;: <code>products/ru.cg.webbpm.packages.base:resources:jar:3.177.0-9188-SNAPSHOT</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.178.2</code></li>
</ul>
</li>
<li>

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

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