Merge branch 'update/3.178' into feature/WEBBPMNEXT-9188_fixes

# Conflicts:
#	backend/src/main/java/AppConfig.java
#	config/patches/default.cli
#	frontend/package-lock.json
#	frontend/package.json
#	frontend/src/ts/modules/app/app.module.ts
#	packages/ru.cg.webbpm.packages.base.resources/.flattened-pom.xml
#	packages/ru.cg.webbpm.packages.base.resources/META-INF/components/docs/component/grids/NavigateOnGridCellOrRow.html
#	packages/ru.cg.webbpm.packages.base.resources/META-INF/package-descriptor.xml
#	packages/ru.cg.webbpm.packages.base.resources/component/buttons/Button.component
#	packages/ru.cg.webbpm.packages.base.resources/component/buttons/CancelButton.component
#	packages/ru.cg.webbpm.packages.base.resources/component/buttons/ClearFilterButton.component
#	packages/ru.cg.webbpm.packages.base.resources/component/buttons/DeleteButton.component
#	packages/ru.cg.webbpm.packages.base.resources/component/buttons/DownloadButton.component
#	packages/ru.cg.webbpm.packages.base.resources/component/buttons/ErrorButton.component
#	packages/ru.cg.webbpm.packages.base.resources/component/buttons/ExecProcessButton.component
#	packages/ru.cg.webbpm.packages.base.resources/component/buttons/ExecuteSqlButton.component
#	packages/ru.cg.webbpm.packages.base.resources/component/buttons/FilterButton.component
#	packages/ru.cg.webbpm.packages.base.resources/component/buttons/NavigationButton.component
#	packages/ru.cg.webbpm.packages.base.resources/component/buttons/SaveButton.component
#	packages/ru.cg.webbpm.packages.base.resources/component/buttons/SelectButton.component
#	packages/ru.cg.webbpm.packages.base.resources/component/buttons/SignButton.component
#	packages/ru.cg.webbpm.packages.base.resources/component/buttons/StartProcessButton.component
#	packages/ru.cg.webbpm.packages.base.resources/component/buttons/reporting/EntityGraphReportingButton.component
#	packages/ru.cg.webbpm.packages.base.resources/component/buttons/reporting/FormReportingButton.component
#	packages/ru.cg.webbpm.packages.base.resources/component/containers/CollapsiblePanel.component
#	packages/ru.cg.webbpm.packages.base.resources/component/containers/Dialog.component
#	packages/ru.cg.webbpm.packages.base.resources/component/containers/DropDown.component
#	packages/ru.cg.webbpm.packages.base.resources/component/containers/FieldSet.component
#	packages/ru.cg.webbpm.packages.base.resources/component/containers/FilterGroup.component
#	packages/ru.cg.webbpm.packages.base.resources/component/containers/Form.component
#	packages/ru.cg.webbpm.packages.base.resources/component/containers/HBox.component
#	packages/ru.cg.webbpm.packages.base.resources/component/containers/TabContainer.component
#	packages/ru.cg.webbpm.packages.base.resources/component/containers/TabItem.component
#	packages/ru.cg.webbpm.packages.base.resources/component/containers/VBox.component
#	packages/ru.cg.webbpm.packages.base.resources/component/containers/Window.component
#	packages/ru.cg.webbpm.packages.base.resources/component/editable-grids/EditableGrid.component
#	packages/ru.cg.webbpm.packages.base.resources/component/editable-grids/columns/AutocompleteGridColumn.component
#	packages/ru.cg.webbpm.packages.base.resources/component/editable-grids/columns/CheckBoxGridColumn.component
#	packages/ru.cg.webbpm.packages.base.resources/component/editable-grids/columns/ComboBoxGridColumn.component
#	packages/ru.cg.webbpm.packages.base.resources/component/editable-grids/columns/DateTimePickerGridColumn.component
#	packages/ru.cg.webbpm.packages.base.resources/component/editable-grids/columns/MoneyFieldGridColumn.component
#	packages/ru.cg.webbpm.packages.base.resources/component/editable-grids/columns/NumberFieldGridColumn.component
#	packages/ru.cg.webbpm.packages.base.resources/component/editable-grids/columns/OneToManyGridColumn.component
#	packages/ru.cg.webbpm.packages.base.resources/component/editable-grids/columns/OneToManyGridColumnV2.component
#	packages/ru.cg.webbpm.packages.base.resources/component/editable-grids/columns/ReadonlyClientGridColumn.component
#	packages/ru.cg.webbpm.packages.base.resources/component/editable-grids/columns/ReadonlyServerGridColumn.component
#	packages/ru.cg.webbpm.packages.base.resources/component/editable-grids/columns/StaticComboBoxGridColumn.component
#	packages/ru.cg.webbpm.packages.base.resources/component/editable-grids/columns/TextAreaGridColumn.component
#	packages/ru.cg.webbpm.packages.base.resources/component/editable-grids/columns/TextFieldGridColumn.component
#	packages/ru.cg.webbpm.packages.base.resources/component/editable-grids/columns/TimePickerGridColumn.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/Address.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/Autocomplete.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/CheckBox.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/ComboBox.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/DateTimePicker.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/EditableOneToMany.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/FilePreview.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/FileUpload.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/ManyToMany.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/ManyToManyField.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/MoneyField.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/NumberField.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/OneToMany.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/OneToManyV2.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/RadioButton.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/SignVerification.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/StaticComboBox.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/StaticRadioButton.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/Text.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/TextArea.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/TextField.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/TimePicker.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/TreeField.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/editableonetomany/EditableGrid.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/editableonetomany/Form.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/fileupload/FileUploadField.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/filters/FilterAddress.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/filters/FilterAutocomplete.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/filters/FilterBoolean.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/filters/FilterCheckBox.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/filters/FilterComboBox.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/filters/FilterDateTimePicker.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/filters/FilterNumberField.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/filters/FilterRadioButton.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/filters/FilterStaticComboBox.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/filters/FilterTextArea.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/filters/FilterTextField.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/treefield/LinkField.component
#	packages/ru.cg.webbpm.packages.base.resources/component/fields/treefield/MultiValueField.component
#	packages/ru.cg.webbpm.packages.base.resources/component/grids/Grid.component
#	packages/ru.cg.webbpm.packages.base.resources/component/grids/GridV2.component
#	packages/ru.cg.webbpm.packages.base.resources/component/grids/GridV2Column.component
#	packages/ru.cg.webbpm.packages.base.resources/component/grids/GridV2Group.component
#	packages/ru.cg.webbpm.packages.base.resources/component/grids/PagingGrid.component
#	packages/ru.cg.webbpm.packages.base.resources/component/grids/TreeGrid.component
#	packages/ru.cg.webbpm.packages.base.resources/component/uncategorized/ActionController.component
#	packages/ru.cg.webbpm.packages.base.resources/component/uncategorized/Calendar.component
#	packages/ru.cg.webbpm.packages.base.resources/component/uncategorized/Chart.component
#	packages/ru.cg.webbpm.packages.base.resources/component/uncategorized/ChartV2.component
#	packages/ru.cg.webbpm.packages.base.resources/component/uncategorized/EventCalendar.component
#	packages/ru.cg.webbpm.packages.base.resources/component/uncategorized/GanttChart.component
#	packages/ru.cg.webbpm.packages.base.resources/component/uncategorized/HyperLink.component
#	packages/ru.cg.webbpm.packages.base.resources/component/uncategorized/IFrame.component
#	packages/ru.cg.webbpm.packages.base.resources/component/uncategorized/InnerHtml.component
#	packages/ru.cg.webbpm.packages.base.resources/component/uncategorized/MenuGroup.component
#	packages/ru.cg.webbpm.packages.base.resources/component/uncategorized/MenuItem.component
#	packages/ru.cg.webbpm.packages.base.resources/component/uncategorized/ValidationController.component
#	packages/ru.cg.webbpm.packages.base.resources/converters/converters.jar
#	packages/ru.cg.webbpm.packages.base.resources/metadata/java.metadata
#	packages/ru.cg.webbpm.packages.base.resources/metadata/typescript.metadata.json
#	packages/ru.cg.webbpm.packages.base.resources/process-instance/ProcessInstance.component
#	packages/ru.cg.webbpm.packages.base.resources/process-instance/ProcessInstanceDiagram.component
#	packages/ru.cg.webbpm.packages.base.resources/process-instance/ProcessInstanceList.component
#	packages/ru.cg.webbpm.packages.base.resources/user-management/Groups.component
#	packages/ru.cg.webbpm.packages.base.resources/user-management/GroupsCreate.component
#	packages/ru.cg.webbpm.packages.base.resources/user-management/GroupsEdit.component
#	packages/ru.cg.webbpm.packages.base.resources/user-management/OrganizationEdit.component
#	packages/ru.cg.webbpm.packages.base.resources/user-management/Organizations.component
#	packages/ru.cg.webbpm.packages.base.resources/user-management/Roles.component
#	packages/ru.cg.webbpm.packages.base.resources/user-management/RolesEdit.component
#	packages/ru.cg.webbpm.packages.base.resources/user-management/SecurityFeatures.component
#	packages/ru.cg.webbpm.packages.base.resources/user-management/StaticRouteNavigationButton.component
#	packages/ru.cg.webbpm.packages.base.resources/user-management/StaticRouteSelectButton.component
#	packages/ru.cg.webbpm.packages.base.resources/user-management/UserForm.component
#	packages/ru.cg.webbpm.packages.base.resources/user-management/Users.component
#	packages/ru.cg.webbpm.packages.base.resources/user-management/UsersCreate.component
#	packages/ru.cg.webbpm.packages.base.resources/user-management/UsersEdit.component
#	pom.xml
#	resources/src/main/resources/business-model/Журнал взаимодействия.page
#	resources/src/main/resources/business-model/Информация об организации.page
#	resources/src/main/resources/business-model/Личный кабинет юр лица.page
#	resources/src/main/resources/business-model/Процессы/process-instance-list.page
#	resources/src/main/resources/business-model/Процессы/process-instance.page
#	resources/src/main/resources/business-model/Управление пользователями/Группы редактирование.page
#	resources/src/main/resources/business-model/Управление пользователями/Группы создание.page
#	resources/src/main/resources/business-model/Управление пользователями/Группы.page
#	resources/src/main/resources/business-model/Управление пользователями/Организации.page
#	resources/src/main/resources/business-model/Управление пользователями/Организация редактирование(создание).page
#	resources/src/main/resources/business-model/Управление пользователями/Пользователи редактирование.page
#	resources/src/main/resources/business-model/Управление пользователями/Пользователи создание.page
#	resources/src/main/resources/business-model/Управление пользователями/Пользователи.page
#	resources/src/main/resources/business-model/Управление пользователями/Роли редактирование (создание).page
#	resources/src/main/resources/business-model/Управление пользователями/Роли.page
#	resources/src/main/resources/business-model/Управление пользователями/Функции безопасности.page
#	resources/src/main/resources/overrides/0f470331-dfb0-4f10-b748-c9a7f33d31d9.component.override
#	resources/src/main/resources/overrides/0f8d0a8b-8014-4367-8ff3-7f049c284978.component.override
#	resources/src/main/resources/overrides/16071adb-3bdf-4c33-b29b-886876016415.component.override
#	resources/src/main/resources/overrides/38c2de2f-c5dd-413e-babf-ce54cb4e5279.component.override
#	resources/src/main/resources/overrides/4e314e88-02d6-4b0e-b7a7-15a36bdeb682.component.override
#	resources/src/main/resources/overrides/57537dbd-c468-4c2d-99df-924b5ba018d6.component.override
#	resources/src/main/resources/overrides/5cc0e63d-f697-47a8-a9dc-3170f1a99721.component.override
#	resources/src/main/resources/overrides/5f9c58f8-9ee1-4df3-b93c-e48534e798db.component.override
#	resources/src/main/resources/overrides/67605d63-1081-423b-b6b5-727ecfce2ca1.component.override
#	resources/src/main/resources/overrides/76e91ef4-d2ef-4662-96ad-84c0dae0ecff.component.override
#	resources/src/main/resources/overrides/7a57e082-99e3-4453-a2df-d5ffafa2c019.component.override
#	resources/src/main/resources/overrides/8e1d9023-42c0-4960-9c59-02f4f0c2e4dd.component.override
#	resources/src/main/resources/overrides/a4d442cf-72a8-431e-815a-490959083787.component.override
#	resources/src/main/resources/overrides/c4b48815-f449-48fe-9ae0-dec9b6f4c53c.component.override
#	resources/src/main/resources/overrides/ca7390f1-1891-4161-b8ae-ef66de5776b7.component.override
#	resources/src/main/resources/overrides/ed47cfae-64da-4360-8f61-1087179ad78b.component.override
#	resources/src/main/resources/overrides/fe225a1a-1c03-485e-a069-18b92ab4f7f7.component.override
This commit is contained in:
kochetkov 2024-09-03 09:02:56 +03:00
commit 90b7c2c122
189 changed files with 11930 additions and 2237 deletions

View file

@ -99,6 +99,10 @@
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<dependency>
<groupId>ru.cg.webbpm.modules</groupId>
<artifactId>inject</artifactId>

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;
@ -34,13 +35,14 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc;
"component.addresses",
"gen",
"ru.cg",
"ru.micord"
"ru.micord",
}, excludeFilters = {
@ComponentScan.Filter(type = FilterType.REGEX, pattern = "security.WebSecurityConfig")
})
@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,60 @@
package ervu;
import java.util.HashMap;
import java.util.Map;
import org.apache.kafka.clients.CommonClientConfigs;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.config.SaslConfigs;
import org.apache.kafka.common.serialization.StringSerializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;
/**
* @author Alexandr Shalaginov
*/
@Configuration
public class KafkaProducerConfig {
@Value("${kafka.send.url}")
private String kafkaUrl;
@Value("${kafka.send.security.protocol}")
private String securityProtocol;
@Value("${kafka.send.login.module:org.apache.kafka.common.security.scram.ScramLoginModule}")
private String loginModule;
@Value("${kafka.send.username}")
private String username;
@Value("${kafka.send.password}")
private String password;
@Value("${kafka.sasl.mechanism}")
private String saslMechanism;
@Bean
public ProducerFactory<String, String> producerFactory() {
return new DefaultKafkaProducerFactory<>(producerConfigs());
}
@Bean
public Map<String, Object> producerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, this.kafkaUrl);
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, securityProtocol);
props.put(SaslConfigs.SASL_JAAS_CONFIG, loginModule + " required username=\""
+ username + "\" password=\"" + password + "\";");
props.put(SaslConfigs.SASL_MECHANISM, saslMechanism);
return props;
}
@Bean
public KafkaTemplate<String, String> kafkaTemplate() {
return new KafkaTemplate<>(producerFactory());
}
}

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,75 @@
package ervu.service.fileupload;
import ervu.service.fileupload.model.*;
import esia.model.MillitaryRegistrationPersonModel;
import esia.model.OrganizationModel;
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()
);
}
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()
)
);
}
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

@ -0,0 +1,31 @@
package esia.model;
import java.io.Serializable;
/**
* @author Eduard Tihomirov
*/
public class ChiefPersonModel extends PersonModel {
private static final long serialVersionUID = 1L;
private String position;
private String brhOid;
public String getPosition() {
return position;
}
public void setPosition(String position) {
this.position = position;
}
public String getBrhOid() {
return brhOid;
}
public void setBrhOid(String brhOid) {
this.brhOid = brhOid;
}
}

View file

@ -0,0 +1,46 @@
package esia.model;
/**
* @author Eduard Tihomirov
*/
public class MillitaryRegistrationPersonModel extends PersonModel {
private static final long serialVersionUID = 1L;
private String email;
private String mobileNumber;
private String roleCode;
private String roleName;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getMobileNumber() {
return mobileNumber;
}
public void setMobileNumber(String mobileNumber) {
this.mobileNumber = mobileNumber;
}
public String getRoleCode() {
return roleCode;
}
public void setRoleCode(String roleCode) {
this.roleCode = roleCode;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
}

View file

@ -0,0 +1,140 @@
package esia.model;
import java.io.Serializable;
/**
* @author Eduard Tihomirov
*/
public class OrganizationModel implements Serializable {
private static final long serialVersionUID = 1L;
private String orgOid;
private String fullName;
private String shortName;
private String inn;
private String ogrn;
private String leg;
private String legName;
private String kpp;
private String ulAddress;
private String actualAddress;
private String zipCode;
private String mobile;
private String email;
public String getOrgOid() {
return orgOid;
}
public void setOrgOid(String orgOid) {
this.orgOid = orgOid;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public String getShortName() {
return shortName;
}
public void setShortName(String shortName) {
this.shortName = shortName;
}
public String getInn() {
return inn;
}
public void setInn(String inn) {
this.inn = inn;
}
public String getOgrn() {
return ogrn;
}
public void setOgrn(String ogrn) {
this.ogrn = ogrn;
}
public String getLeg() {
return leg;
}
public void setLeg(String leg) {
this.leg = leg;
}
public String getKpp() {
return kpp;
}
public void setKpp(String kpp) {
this.kpp = kpp;
}
public String getUlAddress() {
return ulAddress;
}
public void setUlAddress(String ulAddress) {
this.ulAddress = ulAddress;
}
public String getActualAddress() {
return actualAddress;
}
public void setActualAddress(String actualAddress) {
this.actualAddress = actualAddress;
}
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getLegName() {
return legName;
}
public void setLegName(String legName) {
this.legName = legName;
}
}

View file

@ -0,0 +1,115 @@
package esia.model;
import java.io.Serializable;
/**
* @author Eduard Tihomirov
*/
public class PersonModel implements Serializable {
private static final long serialVersionUID = 1L;
private String prsId;
private String orgOid;
private String lastName;
private String firstName;
private String middleName;
private String birthday;
private String snils;
private String idERN;
private String passportSeries;
private String passportNumber;
private String passportIssueDate;
public String getPrsId() {
return prsId;
}
public void setPrsId(String prsId) {
this.prsId = prsId;
}
public String getOrgOid() {
return orgOid;
}
public void setOrgOid(String orgOid) {
this.orgOid = orgOid;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getMiddleName() {
return middleName;
}
public void setMiddleName(String middleName) {
this.middleName = middleName;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getSnils() {
return snils;
}
public void setSnils(String snils) {
this.snils = snils;
}
public String getIdERN() {
return idERN;
}
public void setIdERN(String idERN) {
this.idERN = idERN;
}
public String getPassportSeries() {
return passportSeries;
}
public void setPassportSeries(String passportSeries) {
this.passportSeries = passportSeries;
}
public String getPassportNumber() {
return passportNumber;
}
public void setPassportNumber(String passportNumber) {
this.passportNumber = passportNumber;
}
public String getPassportIssueDate() {
return passportIssueDate;
}
public void setPassportIssueDate(String passportIssueDate) {
this.passportIssueDate = passportIssueDate;
}
}

View file

@ -0,0 +1,17 @@
package esia.service;
import esia.model.ChiefPersonModel;
import esia.model.MillitaryRegistrationPersonModel;
import esia.model.OrganizationModel;
/**
* @author Eduard Tihomirov
*/
public interface UlDataService {
MillitaryRegistrationPersonModel getPersonModel();
ChiefPersonModel getChiefPersonModel();
OrganizationModel getOrganizationModel();
}

View file

@ -0,0 +1,59 @@
package esia.service.impl;
import esia.model.ChiefPersonModel;
import esia.model.MillitaryRegistrationPersonModel;
import esia.model.OrganizationModel;
import esia.service.UlDataService;
import org.springframework.stereotype.Service;
/**
* @author Alexandr Shalaginov
*/
// TODO: 22.07.2024 delete this after real realisation of UlDataService
@Service
public class DummyUlDataServiceImpl implements UlDataService {
@Override
public MillitaryRegistrationPersonModel getPersonModel() {
MillitaryRegistrationPersonModel personModel = new MillitaryRegistrationPersonModel();
personModel.setPrsId("PrsId");
personModel.setOrgOid("OrgOid");
personModel.setLastName("Максимов");
personModel.setFirstName("Геннадий");
personModel.setMiddleName("Валентинович");
personModel.setBirthday("18.11.1966");
personModel.setSnils("56114152149");
personModel.setIdERN("111666898287");
personModel.setPassportSeries("1151");
personModel.setPassportNumber("166971");
personModel.setPassportIssueDate("13.10.2004");
personModel.setEmail("Email");
personModel.setMobileNumber("");
personModel.setRoleCode("admin_123");
personModel.setRoleName("Администратор 123");
return personModel;
}
@Override
public ChiefPersonModel getChiefPersonModel() {
return new ChiefPersonModel();
}
@Override
public OrganizationModel getOrganizationModel() {
OrganizationModel organizationModel = new OrganizationModel();
organizationModel.setOrgOid("OrgOid");
organizationModel.setFullName("FullName");
organizationModel.setShortName("Звезда");
organizationModel.setInn("123456789012");
organizationModel.setOgrn("1234567890123");
organizationModel.setLeg("2");
organizationModel.setLegName("Общество с ограниченной ответственностью");
organizationModel.setKpp("123456789012");
organizationModel.setUlAddress("UlAddress");
organizationModel.setActualAddress("ActualAddress");
organizationModel.setZipCode("ZipCode");
organizationModel.setMobile("Mobile");
organizationModel.setEmail("Email");
return organizationModel;
}
}

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

@ -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.177.0",
"resolved": "https://repo.micord.ru/repository/npm-all/@webbpm/base-package/-/base-package-3.177.0.tgz",
"integrity": "sha512-YgjHHcIR0m/QHujiU17e4NmGmSRxUg88G609KkTGh8XreTXbpYwRxo+3Vr5ttfjk0ND1NMWt6L2TlTLlaCgpkQ==",
"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.0",
"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",

View file

@ -14,8 +14,8 @@
color: var(--color-link);
padding-left: 40px;
margin-top: 16px;
&::before {
}
.webbpm.ervu_lkrp_ul .error::before {
position: absolute;
content: "";
left: 0;
@ -23,38 +23,30 @@
height: 24px;
background: url(../img/svg/info.svg) no-repeat;
}
}
.webbpm.ervu_lkrp_ul .mute {
color: var(--border-light);
font-family: 'InterL';
font-size: var(--size-text-secondary);
}
.webbpm.ervu_lkrp_ul grid-v2.mute .ag-row .ag-cell {
color: var(--color-text-secondary) !important;
}
.webbpm.ervu_lkrp_ul .file-name {
font-size: var(--size-text-secondary);
}
.webbpm.ervu_lkrp_ul .progress-bar {
display: flex;
justify-content: flex-start;
width: 100%;
height: 15px;
margin-bottom: var(--indent-small);
border-radius: 10px;
background: #fff3e5;
& > div {
.webbpm.ervu_lkrp_ul .file-upload-progress {
width: 100%;
height: 15px;
border-radius: 10px;
background: var(--bg-light);
overflow: hidden;
}
.webbpm.ervu_lkrp_ul .file-upload-progress .file-upload-progress-bar {
height: 100%;
background: var(--color-link);
-webkit-animation: progress-line 10s infinite;
animation: progress-line 10s infinite;
}
}
@keyframes progress-line {
from {width: 0px;}
to {width: 100%;}
}
.webbpm.ervu_lkrp_ul .title {
@ -62,27 +54,26 @@
font-family: 'InterSB';
padding-top: 0;
padding-bottom: var(--indent-big);
.form-group {
}
.webbpm.ervu_lkrp_ul .title .form-group {
display: block;
margin-bottom: 0;
}
}
.webbpm.ervu_lkrp_ul .subtitle {
position: relative;
font-size: var(--size-text-subtitle);
font-family: 'InterSB';
text {
}
.webbpm.ervu_lkrp_ul .subtitle text {
display: flex;
align-items: center;
min-height: 48px;
position: relative;
padding-left: 60px;
margin-bottom: 16px;
&::before {
}
.webbpm.ervu_lkrp_ul .subtitle text::before {
content: "";
position: absolute;
left: 0;
@ -93,32 +84,31 @@
background-repeat: no-repeat;
background-position: 50% 50%;
}
}
text.icon-case::before {
.webbpm.ervu_lkrp_ul .subtitle text.icon-case::before {
background-image: url(../img/svg/case-wt.svg);
}
text.icon-shield::before {
.webbpm.ervu_lkrp_ul .subtitle text.icon-shield::before {
background-image: url(../img/svg/shield-wt.svg);
}
text.icon-clip::before {
.webbpm.ervu_lkrp_ul .subtitle text.icon-clip::before {
background-image: url(../img/svg/clip-wt.svg);
}
text.icon-pers::before {
.webbpm.ervu_lkrp_ul .subtitle text.icon-pers::before {
background-image: url(../img/svg/pers-wt.svg);
}
text.icon-building::before {
.webbpm.ervu_lkrp_ul .subtitle text.icon-building::before {
background-image: url(../img/svg/building-wt.svg);
}
text.icon-doc::before {
.webbpm.ervu_lkrp_ul .subtitle text.icon-doc::before {
background-image: url(../img/svg/doc-wt.svg);
}
text.icon-cross::before {
.webbpm.ervu_lkrp_ul .subtitle text.icon-cross::before {
background-image: url(../img/svg/cross-wt.svg);
}
}
.webbpm.ervu_lkrp_ul .btn,
.webbpm.ervu_lkrp_ul .modal.show button-component.btn-main:not(.info):not(.link) .btn {
.webbpm.ervu_lkrp_ul .modal.show button-component.btn-main:not(.info):not(.link) .btn,
.webbpm.ervu_lkrp_ul .select-file-btn {
font-size: var(--size-text-secondary);
font-family: 'Inter';
color: var(--white);
@ -126,51 +116,45 @@
border: 0;
border-radius: 4px;
background: var(--color-link);
&:not(:disabled):not(.disabled):hover,
&:not(:disabled):not(.disabled):active,
&:not(:disabled):not(.disabled):focus {
}
.webbpm.ervu_lkrp_ul .btn:is(:not(:disabled):not(.disabled):hover, :not(:disabled):not(.disabled):active, :not(:disabled):not(.disabled):focus),
.webbpm.ervu_lkrp_ul .modal.show button-component.btn-main:not(.info):not(.link) .btn:is(:not(:disabled):not(.disabled):hover, :not(:disabled):not(.disabled):active, :not(:disabled):not(.disabled):focus),
.webbpm.ervu_lkrp_ul .select-file-btn:is(:not(:disabled):not(.disabled):hover, :not(:disabled):not(.disabled):active, :not(:disabled):not(.disabled):focus) {
color: var(--white);
background-color: var(--color-link-hover);
}
}
.webbpm.ervu_lkrp_ul [class^="link-"] {
position: relative;
margin-bottom: var(--indent-small);
.btn {
}
.webbpm.ervu_lkrp_ul [class^="link-"] .btn {
font-size: var(--size-text-primary);
padding: 0 0 0 36px;
background-color: transparent !important;
&::before {
}
.webbpm.ervu_lkrp_ul [class^="link-"] .btn::before {
content: "";
position: absolute;
left: 0;
width: 24px;
height: 24px;
}
}
}
.webbpm.ervu_lkrp_ul .link-back .btn {
color: var(--color-text-primary) !important;
&::before {
background-image: url(../img/svg/arrow-left.svg);
}
.webbpm.ervu_lkrp_ul .link-back .btn::before {
background-image: url(../img/svg/arrow-left.svg);
}
.webbpm.ervu_lkrp_ul .link-data .btn {
color: var(--color-link);
&:not(:disabled):not(.disabled):hover,
&:not(:disabled):not(.disabled):active,
&:not(:disabled):not(.disabled):focus {
}
.webbpm.ervu_lkrp_ul .link-data .btn:is(:not(:disabled):not(.disabled):hover, :not(:disabled):not(.disabled):active, :not(:disabled):not(.disabled):focus) {
color: var(--color-link-hover) !important;
}
&::before {
.webbpm.ervu_lkrp_ul .link-data .btn::before {
background-image: url(../img/svg/data.svg);
}
}
.webbpm.ervu_lkrp_ul .left-block {
width: 75%;
@ -185,49 +169,46 @@
background-color: var(--bg-warn);
padding: 16px;
border-radius: 4px;
.pull-right {
}
.webbpm.ervu_lkrp_ul .warning-group .pull-right {
flex: 0;
white-space: nowrap;
}
.form-group {
.webbpm.ervu_lkrp_ul .warning-group .form-group {
margin-bottom: 0;
}
.warn-title {
.webbpm.ervu_lkrp_ul .warning-group .warn-title {
font-family: 'InterSB';
}
& + field-set {
.webbpm.ervu_lkrp_ul .warning-group + field-set {
margin-top: var(--indent-medium);
}
& + .warning-group, & + .data-group {
.webbpm.ervu_lkrp_ul .warning-group + .warning-group,
.webbpm.ervu_lkrp_ul .warning-group + .data-group {
margin-top: var(--indent-small);
}
}
.webbpm.ervu_lkrp_ul :is(.warning-group, .modal.show) button-component:not(.info):not(.link):not(.btn-main),
.webbpm.ervu_lkrp_ul .warning-group static-route-navigation-button:not(.info):not(.link):not(.btn-main) {
padding-top: 0 !important;
margin-top: 16px;
border-top: 0 !important;
.btn {
}
.webbpm.ervu_lkrp_ul :is(.warning-group, .modal.show) button-component:not(.info):not(.link):not(.btn-main) .btn,
.webbpm.ervu_lkrp_ul .warning-group static-route-navigation-button:not(.info):not(.link):not(.btn-main) .btn {
color: var(--color-link);
padding: 13px 39px;
border: 1px solid var(--color-link);
background-color: transparent;
&:not(:disabled):not(.disabled):hover,
&:not(:disabled):not(.disabled):active,
&:not(:disabled):not(.disabled):focus {
}
.webbpm.ervu_lkrp_ul :is(.warning-group, .modal.show) button-component:not(.info):not(.link):not(.btn-main) .btn:is(:not(:disabled):not(.disabled):hover, :not(:disabled):not(.disabled):active, :not(:disabled):not(.disabled):focus),
.webbpm.ervu_lkrp_ul .warning-group static-route-navigation-button:not(.info):not(.link):not(.btn-main) .btn:is(:not(:disabled):not(.disabled):hover, :not(:disabled):not(.disabled):active, :not(:disabled):not(.disabled):focus) {
color: var(--color-link-hover) !important;
border-color: var(--color-link-hover);
background-color: transparent !important;
}
}
}
.webbpm.ervu_lkrp_ul .loader-group {
.loader {
.webbpm.ervu_lkrp_ul .loader-group .loader {
font-size: 5px;
left: 14px;
top: 10px;
@ -236,22 +217,18 @@
padding: 0;
border-radius: 10px;
}
.mute {
.webbpm.ervu_lkrp_ul .loader-group .mute {
color: var(--color-light);
margin-left: 40px;
}
}
.webbpm.ervu_lkrp_ul .link .btn {
color: var(--color-link);
padding: 0;
background: transparent !important;
&:not(:disabled):not(.disabled):hover,
&:not(:disabled):not(.disabled):active,
&:not(:disabled):not(.disabled):focus {
color: var(--color-link-hover) !important;
}
.webbpm.ervu_lkrp_ul .link .btn:is(:not(:disabled):not(.disabled):hover, :not(:disabled):not(.disabled):active, :not(:disabled):not(.disabled):focus) {
color: var(--color-link-hover) !important;
}
.webbpm.ervu_lkrp_ul .info {
@ -259,45 +236,39 @@
display: flex;
justify-content: flex-end;
margin-left: auto;
.btn {
}
.webbpm.ervu_lkrp_ul .info .btn {
width: 24px;
height: 24px;
padding: 0;
background-color: transparent !important;
background-image: url(../img/svg/info.svg);
}
.tooltip-inner {
.webbpm.ervu_lkrp_ul .info .tooltip-inner {
max-width: 600px;
}
}
.webbpm.ervu_lkrp_ul .data-group {
.form-group {
.webbpm.ervu_lkrp_ul .data-group .form-group {
flex-direction: column;
label {
}
.webbpm.ervu_lkrp_ul .data-group .form-group label {
color: var(--color-text-secondary);
font-weight: normal;
padding-top: 0;
white-space: nowrap;
}
}
}
.webbpm.ervu_lkrp_ul .paragraph-group {
& > .vertical-container > * {
.webbpm.ervu_lkrp_ul .paragraph-group > .vertical-container > * {
margin-bottom: 16px;
&:last-child {
}
.webbpm.ervu_lkrp_ul .paragraph-group > .vertical-container > *:last-child {
margin-bottom: 0;
}
}
& + .paragraph-group {
.webbpm.ervu_lkrp_ul .paragraph-group + .paragraph-group {
padding-top: 24px;
margin-top: 24px;
border-top: 1px solid var(--border-light);
}
}
.webbpm.ervu_lkrp_ul .fieldset {
padding: 24px;
@ -306,37 +277,34 @@
border-radius: 4px;
background-color: var(--bg-light);
box-shadow: none;
legend + div {
}
.webbpm.ervu_lkrp_ul .fieldset legend + div {
padding: 0;
}
.form-group {
.webbpm.ervu_lkrp_ul .fieldset .form-group {
margin-bottom: 0;
}
.lined {
.webbpm.ervu_lkrp_ul .fieldset .lined {
padding-top: 16px;
margin-top: 16px;
border-top: 1px solid var(--border-light);
}
.warning-group ~ *:not([hidden]) {
.webbpm.ervu_lkrp_ul .fieldset .warning-group ~ *:not([hidden]) {
margin-top: 16px;
}
}
.webbpm.ervu_lkrp_ul .filter-block {
color: var(--color-light);
font-size: var(--size-text-secondary);
.link .btn {
}
.webbpm.ervu_lkrp_ul .filter-block .link .btn {
color: var(--color-light) !important;
text-decoration: underline;
margin-top: -2px;
&:hover {
}
.webbpm.ervu_lkrp_ul .filter-block .link .btn:hover {
text-decoration: none;
}
}
}
.webbpm.ervu_lkrp_ul :is(.fieldset, .warning-group) hbox:not(.subtitle) > .horizontal-container {
flex-wrap: wrap;
@ -345,38 +313,36 @@
flex-wrap: nowrap !important;
}
.webbpm.ervu_lkrp_ul .left-block {
.link .btn {
.webbpm.ervu_lkrp_ul .left-block .link .btn {
font-size: var(--size-text-primary);
}
.fieldset {
hyper-link .link {
.webbpm.ervu_lkrp_ul .left-block .fieldset hyper-link .link {
color: var(--color-text-primary);
font-size: var(--size-text-secondary);
padding-left: 20px;
background: url(../img/svg/pin.svg) 0 50% no-repeat;
}
hyper-link, button-component:not(.info):not(.link) {
.webbpm.ervu_lkrp_ul .left-block .fieldset hyper-link,
.webbpm.ervu_lkrp_ul .left-block .fieldset button-component:not(.info):not(.link) {
display: block;
padding-top: 24px;
margin-top: 16px;
border-top: 1px solid var(--border-light);
}
hyper-link + hyper-link {
.webbpm.ervu_lkrp_ul .left-block .fieldset hyper-link + hyper-link {
padding-top: 0;
margin-top: 12px;
border: 0;
}
}
}
.webbpm.ervu_lkrp_ul .right-block field-set {
font-size: var(--size-text-secondary);
&:first-child .fieldset {
}
.webbpm.ervu_lkrp_ul .right-block field-set:first-child .fieldset {
padding-top: 52px;
&::before {
}
.webbpm.ervu_lkrp_ul .right-block field-set:first-child .fieldset::before {
content: "";
position: absolute;
top: 20px;
@ -385,8 +351,6 @@
height: 24px;
background-image: url(../img/svg/doc.svg);
}
}
}
.webbpm.ervu_lkrp_ul field-set + field-set {
margin-top: var(--indent-medium);
@ -435,8 +399,8 @@
position: relative;
width: 24px;
height: 24px;
&:is(.ag-icon-small-down, .ag-icon-filter)::before {
}
.webbpm.ervu_lkrp_ul ag-grid-angular .ag-icon:is(.ag-icon-small-down, .ag-icon-filter)::before {
position: absolute;
content: "";
width: 24px;
@ -444,41 +408,37 @@
top: 0;
left: 0;
}
&.ag-icon-small-down::before {
.webbpm.ervu_lkrp_ul ag-grid-angular .ag-icon.ag-icon-small-down::before {
background-image: url(../img/svg/arrow-left.svg);
transform: rotate(-90deg);
}
&.ag-icon-filter::before {
.webbpm.ervu_lkrp_ul ag-grid-angular .ag-icon.ag-icon-filter::before {
background-image: url(../img/svg/filter.svg);
top: -4px;
left: -4px;
}
}
.webbpm.ervu_lkrp_ul ag-grid-angular .ag-filter-select {
font-size: var(--size-text-secondary);
.ag-picker-field-wrapper {
}
.webbpm.ervu_lkrp_ul ag-grid-angular .ag-filter-select .ag-picker-field-wrapper {
font-family: 'InterSB';
border: 0;
box-shadow: none !important;
.ag-picker-field-display {
}
.webbpm.ervu_lkrp_ul ag-grid-angular .ag-filter-select .ag-picker-field-wrapper .ag-picker-field-display {
margin: 0;
}
}
}
.webbpm.ervu_lkrp_ul ag-grid-angular .ag-filter-body {
margin-bottom: 0;
input {
}
.webbpm.ervu_lkrp_ul ag-grid-angular .ag-filter-body input {
color: var(--color-light);
font-size: var(--size-text-secondary);
min-height: auto;
padding: 6px 12px !important;
}
}
.webbpm.ervu_lkrp_ul ag-grid-angular .ag-header-row {
font-family: 'InterSB';
@ -506,49 +466,44 @@
.webbpm.ervu_lkrp_ul .okved-list {
height: auto;
.ag-header {
}
.webbpm.ervu_lkrp_ul .okved-list .ag-header {
display: none;
}
.ag-root-wrapper {
.webbpm.ervu_lkrp_ul .okved-list .ag-root-wrapper {
background-color: transparent;
}
.ag-row, .ag-cell {
.webbpm.ervu_lkrp_ul .okved-list :is(.ag-row, .ag-cell) {
padding: 0;
border: 0;
background-color: transparent;
}
.ag-row.ag-row-hover,
.ag-row.ag-row-hover .ag-cell {
.webbpm.ervu_lkrp_ul .okved-list .ag-row.ag-row-hover,
.webbpm.ervu_lkrp_ul .okved-list .ag-row.ag-row-hover .ag-cell {
color: var(--color-text-primary);
}
}
/*@media ((max-width: 780px) or ((orientation: landscape) and (max-device-width : 1024px))) {*/
@media (max-width: 1024px) {
.webbpm.ervu_lkrp_ul .main-block {
& > .horizontal-container {
.webbpm.ervu_lkrp_ul .main-block > .horizontal-container {
flex-direction: column-reverse;
}
.left-block {
.webbpm.ervu_lkrp_ul .main-block .left-block {
padding-right: 0;
margin-top: var(--indent-medium);
}
}
.webbpm.ervu_lkrp_ul .right-block {
width: 100%;
.fieldset {
}
.webbpm.ervu_lkrp_ul .right-block .fieldset {
padding-top: 20px;
&::before {
}
.webbpm.ervu_lkrp_ul .right-block .fieldset::before {
top: 20px;
left: auto;
right: 20px;
}
}
}
.webbpm.ervu_lkrp_ul .left-block {
width: 100%;
@ -562,108 +517,97 @@
height: 100%;
}
.webbpm.ervu_lkrp_ul .journal {
grid-v2 {
.webbpm.ervu_lkrp_ul .journal grid-v2 {
height: 100px;
flex: 1;
}
.fieldset button-component {
.webbpm.ervu_lkrp_ul .journal .fieldset button-component {
display: block;
margin-top: 16px;
}
}
@media only screen and (max-width: 480px) {
.webbpm.ervu_lkrp_ul .warning-text .horizontal-container {
flex-wrap: wrap !important;
}
.webbpm.ervu_lkrp_ul .left-block {
.subtitle text {
.webbpm.ervu_lkrp_ul .left-block .subtitle text {
width: 100%;
padding: 60px 0 0;
&::before {
}
.webbpm.ervu_lkrp_ul .left-block .subtitle text::before {
top: 0;
left: calc(50% - 48px/2);
}
.form-group {
.webbpm.ervu_lkrp_ul .left-block .subtitle text .form-group {
width: 100%;
& > div:last-child {
}
.webbpm.ervu_lkrp_ul .left-block .subtitle text .form-group > div:last-child {
text-align: center;
width: 100%;
}
}
}
.subtitle text + .link {
.webbpm.ervu_lkrp_ul .left-block .subtitle text + .link {
position: absolute;
right: 0;
}
.fieldset {
button-component:not(.info):not(.link),
static-route-navigation-button:not(.info):not(.link) {
.webbpm.ervu_lkrp_ul .left-block .fieldset button-component:not(.info):not(.link),
.webbpm.ervu_lkrp_ul .left-block .fieldset static-route-navigation-button:not(.info):not(.link) {
display: flex;
justify-content: center;
& > div, .btn {
}
.webbpm.ervu_lkrp_ul .left-block .fieldset button-component:not(.info):not(.link) > div,
.webbpm.ervu_lkrp_ul .left-block .fieldset static-route-navigation-button:not(.info):not(.link) > div,
.webbpm.ervu_lkrp_ul .left-block .fieldset button-component:not(.info):not(.link) .btn,
.webbpm.ervu_lkrp_ul .left-block .fieldset static-route-navigation-button:not(.info):not(.link) .btn {
width: 100%;
}
}
.tooltip-inner {
.webbpm.ervu_lkrp_ul .left-block .fieldset .tooltip-inner {
max-width: 300px;
}
}
:is(.fieldset, .warning-group) button-component.info {
.webbpm.ervu_lkrp_ul .left-block :is(.fieldset, .warning-group) button-component.info {
display: none;
margin-top: 58px;
}
}
.webbpm.ervu_lkrp_ul .modal.show {
padding: 0 !important;
.modal-dialog {
}
.webbpm.ervu_lkrp_ul .modal.show .modal-dialog {
width: calc(100vw - 1rem);
.horizontal-container {
}
.webbpm.ervu_lkrp_ul .modal.show .modal-dialog .horizontal-container {
flex-wrap: wrap !important;
button-component:not(.info):not(.link), .btn {
}
.webbpm.ervu_lkrp_ul .modal.show .modal-dialog .horizontal-container button-component:not(.info):not(.link), .btn {
width: 100%;
padding: 0;
}
}
}
}
}
.webbpm.ervu_lkrp_ul .scroll-dialog .modal-dialog {
display: flex;
height: min-content;
max-height: calc(100vh - 1.75rem* 2);
.modal-body {
}
.webbpm.ervu_lkrp_ul .scroll-dialog .modal-dialog .modal-body {
display: flex;
flex-direction: column;
overflow-y: hidden;
.scroll-block {
}
.webbpm.ervu_lkrp_ul .scroll-dialog .modal-dialog .modal-body .scroll-block {
overflow-y: auto;
margin-bottom: 0;
}
}
}
.webbpm.ervu_lkrp_ul .modal.show {
display: flex !important;
.modal-content {
}
.webbpm.ervu_lkrp_ul .modal.show .modal-content {
padding: var(--indent-medium);
border-radius: 4px;
box-shadow: none;
.modal-header {
}
.webbpm.ervu_lkrp_ul .modal.show .modal-content .modal-header {
display: flex;
justify-content: center;
font-family: 'InterB';
@ -671,26 +615,25 @@
text-align: center;
padding: 0 0 16px 0;
border: 0;
button.close {
}
.webbpm.ervu_lkrp_ul .modal.show .modal-content .modal-header button.close {
display: none;
}
}
.modal-body {
.webbpm.ervu_lkrp_ul .modal.show .modal-content .modal-body {
padding: 0;
}
button-component:not(.info):not(.link) {
.webbpm.ervu_lkrp_ul .modal.show .modal-content button-component:not(.info):not(.link) {
margin: var(--indent-small) 0 0;
}
.subtitle {
.webbpm.ervu_lkrp_ul .modal.show .modal-content .subtitle {
font-size: var(--size-text-primary);
}
.warning-group {
.webbpm.ervu_lkrp_ul .modal.show .modal-content .warning-group {
font-size: var(--size-text-secondary);
padding-left: calc(24px + 16px*2);
margin-bottom: var(--indent-small);
&::before {
}
.webbpm.ervu_lkrp_ul .modal.show .modal-content .warning-group::before {
position: absolute;
content: "";
left: 16px;
@ -698,69 +641,62 @@
height: 24px;
background: url(../img/svg/info.svg) no-repeat;
}
hyper-link {
.webbpm.ervu_lkrp_ul .modal.show .modal-content .warning-group hyper-link {
padding-top: 0;
border: 0;
.link {
}
.webbpm.ervu_lkrp_ul .modal.show .modal-content .warning-group hyper-link .link {
color: var(--color-link);
padding-left: 0;
background: none;
}
}
& > div > * + *:not([hidden]) {
.webbpm.ervu_lkrp_ul .modal.show .modal-content .warning-group > div > * + *:not([hidden]) {
margin-top: 8px;
}
}
hyper-link.btn {
.webbpm.ervu_lkrp_ul .modal.show .modal-content hyper-link.btn {
padding: 0;
margin: var(--indent-small) 0 0;
background: transparent !important;
.hyper-link {
}
.webbpm.ervu_lkrp_ul .modal.show .modal-content hyper-link.btn .hyper-link {
padding: 13px 38px;
border: 1px solid var(--color-link);
border-radius: 4px;
&:hover {
}
.webbpm.ervu_lkrp_ul .modal.show .modal-content hyper-link.btn .hyper-link:hover {
border-color: var(--color-link-hover);
}
}
&.btn-main .hyper-link {
.webbpm.ervu_lkrp_ul .modal.show .modal-content hyper-link.btn.btn-main .hyper-link {
background: var(--color-link) !important;
&:hover {
}
.webbpm.ervu_lkrp_ul .modal.show .modal-content hyper-link.btn.btn-main .hyper-link:hover {
background-color: var(--color-link-hover) !important;
}
a {
.webbpm.ervu_lkrp_ul .modal.show .modal-content hyper-link.btn.btn-main .hyper-link a {
color: var(--white);
}
}
& + button-component {
.webbpm.ervu_lkrp_ul .modal.show .modal-content hyper-link.btn + button-component {
padding-left: 10px;
}
}
.field-email {
.webbpm.ervu_lkrp_ul .modal.show .modal-content .field-email {
margin-top: 16px;
.form-group {
}
.webbpm.ervu_lkrp_ul .modal.show .modal-content .field-email .form-group {
margin-bottom: 0;
div:last-child {
}
.webbpm.ervu_lkrp_ul .modal.show .modal-content .field-email .form-group div:last-child {
width: 100%;
padding: 16px;
border-radius: 4px;
border: 1px solid var(--border-light);
background-color: var(--bg-light);
}
}
}
.warning-message {
.webbpm.ervu_lkrp_ul .modal.show .modal-content .warning-message {
display: block;
font-size: var(--size-text-secondary);
padding-left: calc(24px + 16px);
&::before {
}
.webbpm.ervu_lkrp_ul .modal.show .modal-content .warning-message::before {
position: absolute;
content: "";
left: 0;
@ -768,40 +704,39 @@
height: 24px;
background: url(../img/svg/info.svg) no-repeat;
}
& + .warning-message {
.webbpm.ervu_lkrp_ul .modal.show .modal-content .warning-message + .warning-message {
margin-top: 16px;
}
.form-group {
.webbpm.ervu_lkrp_ul .modal.show .modal-content .warning-message .form-group {
margin-bottom: 0;
}
}
file-upload {
.webbpm.ervu_lkrp_ul .modal.show .modal-content file-upload {
display: block;
margin-top: 16px;
label {
}
.webbpm.ervu_lkrp_ul .modal.show .modal-content file-upload label {
display: none;
}
.file-upload {
.webbpm.ervu_lkrp_ul .modal.show .modal-content file-upload .file-upload {
position: relative;
display: flex !important;
flex-direction: column;
width: 100%;
}
input.file-name {
.webbpm.ervu_lkrp_ul .modal.show .modal-content file-upload input.file-name {
height: 120px;
text-align: center;
padding-bottom: 72px;
border-radius: 12px;
border: 2px dashed var(--border-light);
}
.file-btn {
.webbpm.ervu_lkrp_ul .modal.show .modal-content file-upload .file-btn {
position: absolute;
top: 50%;
left: calc((100% - 80px) / 2);
}
.files-view-item {
.webbpm.ervu_lkrp_ul .modal.show .modal-content file-upload .files-view-item {
display: flex;
flex-direction: row;
align-items: center;
@ -811,27 +746,27 @@
border: 1px solid var(--border-light);
border-radius: 4px;
background-color: var(--bg-light);
& > * {
}
.webbpm.ervu_lkrp_ul .modal.show .modal-content file-upload .files-view-item > * {
margin-right: 12px;
}
.file-icon-preview {
.webbpm.ervu_lkrp_ul .modal.show .modal-content file-upload .files-view-item .file-icon-preview {
width: 48px;
height: 24px;
&::before {
}
.webbpm.ervu_lkrp_ul .modal.show .modal-content file-upload .files-view-item .file-icon-preview::before {
width: 48px;
height: 24px;
background-image: url(../img/svg/file-xlsx.svg);
}
}
.files-view-name {
.webbpm.ervu_lkrp_ul .modal.show .modal-content file-upload .files-view-item .files-view-name {
color: var(--color-text-primary);
font-size: var(--size-text-secondary);
text-align: left;
text-decoration: none;
margin-top: 0;
}
.clear {
.webbpm.ervu_lkrp_ul .modal.show .modal-content file-upload .files-view-item .clear {
position: relative;
top: auto;
right: auto;
@ -840,8 +775,8 @@
padding: 0;
margin: 0;
background: transparent !important;
&::before {
}
.webbpm.ervu_lkrp_ul .modal.show .modal-content file-upload .files-view-item .clear::before {
position: absolute;
content: "";
top: 0;
@ -850,18 +785,15 @@
height: 24px;
background: url(../img/svg/cross.svg) no-repeat;
}
}
}
& ~ button-component:not(.info):not(.link) {
.webbpm.ervu_lkrp_ul .modal.show .modal-content file-upload ~ button-component:not(.info):not(.link) {
padding-top: 0;
}
}
.paragraph-list > .vertical-container > * {
.webbpm.ervu_lkrp_ul .modal.show .modal-content .paragraph-list > .vertical-container > * {
position: relative;
padding-left: var(--indent-small);
&::before {
}
.webbpm.ervu_lkrp_ul .modal.show .modal-content .paragraph-list > .vertical-container > *::before {
position: absolute;
content: "";
left: 0;
@ -871,17 +803,14 @@
border-radius: 10px;
background-color: var(--color-text-primary);
}
.form-group {
.webbpm.ervu_lkrp_ul .modal.show .modal-content .paragraph-list > .vertical-container > * .form-group {
margin-bottom: 0;
}
&:last-child {
.webbpm.ervu_lkrp_ul .modal.show .modal-content .paragraph-list > .vertical-container > *:last-child {
margin-bottom: var(--indent-small);
}
}
}
}
.webbpm.ervu_lkrp_ul [class*="win-"] .modal-content {
&::before {
.webbpm.ervu_lkrp_ul [class*="win-"] .modal-content::before {
content: "";
position: relative;
width: 64px;
@ -890,7 +819,6 @@
margin-bottom: 24px;
background-repeat: no-repeat;
}
}
.webbpm.ervu_lkrp_ul .win-error .modal-content::before {
background-image: url(../img/svg/win-error.svg);
}
@ -904,6 +832,6 @@
margin-top: -2px;
}
.webbpm.ervu_lkrp_fl .dialog-link {
.webbpm.ervu_lkrp_ul .dialog-link {
cursor: pointer;
}

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,33 +79,33 @@ body.webbpm.ervu_lkrp_ul {
min-height: var(--h-header);
border: 0;
background-color: var(--color-bg-main);
.header-logo {
}
.webbpm.ervu_lkrp_ul .header .header-logo {
margin-left: var(--w-screen);
a {
}
.webbpm.ervu_lkrp_ul .header .header-logo a {
color: var(--white);
}
.logo a {
.webbpm.ervu_lkrp_ul .header .header-logo .logo a {
width: 62px;
height: 40px;
background: url(../img/svg/logo.svg) no-repeat 0 50%;
}
.main-page {
.webbpm.ervu_lkrp_ul .header .header-logo .main-page {
font-family: 'InterSB';
margin-left: calc(62px + 16px);
}
.header-menu-left {
.webbpm.ervu_lkrp_ul .header .header-logo .header-menu-left {
font-family: 'InterL';
margin-left: 24px;
}
}
.header-menu {
.webbpm.ervu_lkrp_ul .header .header-menu {
margin-right: var(--w-screen);
.logout.show {
}
.webbpm.ervu_lkrp_ul .header .header-menu .logout.show {
max-width: max-content;
}
.user-info {
.webbpm.ervu_lkrp_ul .header .header-menu .user-info {
flex-direction: row;
align-items: center;
color: var(--white);
@ -116,8 +114,8 @@ body.webbpm.ervu_lkrp_ul {
border: 0;
outline: none;
cursor: pointer;
&.dropdown-toggle::before {
}
.webbpm.ervu_lkrp_ul .header .header-menu .user-info.dropdown-toggle::before {
display: inline-block;
content: "";
width: 24px;
@ -125,53 +123,46 @@ body.webbpm.ervu_lkrp_ul {
margin-right: 8px;
background-image: url(../img/svg/user-wt.svg);
}
&.dropdown-toggle::after {
.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);
}
}
.dropdown-menu.show {
.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;
.user-department {
}
.webbpm.ervu_lkrp_ul .header .header-menu .dropdown-menu.show .user-department {
color: var(--color-text-primary);
font-family: 'InterB';
padding: 8px 16px;
}
& > button, & > a {
.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);
&:hover,
&:focus,
&:active {
}
.webbpm.ervu_lkrp_ul .header .header-menu .dropdown-menu.show > :is(button, a):is(:hover, :focus, :active) {
color: var(--color-link-hover);
}
&::before {
.webbpm.ervu_lkrp_ul .header .header-menu .dropdown-menu.show > :is(button, a)::before {
content: "";
position: absolute;
left: 16px;
width: 24px;
height: 24px;
}
&.exit::before {
.webbpm.ervu_lkrp_ul .header .header-menu .dropdown-menu.show > :is(button, a).exit::before {
background-image: url(../img/svg/exit.svg);
}
&.data::before {
.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 {
height: var(--h-footer);
@ -182,12 +173,11 @@ body.webbpm.ervu_lkrp_ul {
.webbpm.ervu_lkrp_ul .container {
padding-top: var(--h-header);
bottom: var(--h-footer);
.container-inside {
}
.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))) {*/
@media (max-width: 1024px) {
@ -215,21 +205,19 @@ body.webbpm.ervu_lkrp_ul {
--indent-small: 16px;
}
.webbpm.ervu_lkrp_ul .header .header-logo {
.main-page {
.webbpm.ervu_lkrp_ul .header .header-logo .main-page {
display: none;
}
.header-menu-left {
.webbpm.ervu_lkrp_ul .header .header-logo .header-menu-left {
margin-left: 40px;
a {
}
.webbpm.ervu_lkrp_ul .header .header-logo .header-menu-left a {
white-space: nowrap;
text-overflow: ellipsis;
max-width: 85px;
overflow: hidden;
}
}
}
}
/*----------------- Login ---------------- */
.webbpm.ervu_lkrp_ul :is(.form-signin, .form-signup, .confirm) {
@ -242,23 +230,24 @@ body.webbpm.ervu_lkrp_ul {
border-radius: 8px;
background-color: var(--white);
box-shadow: var(--bg-shadow);
}
h1, h2 {
.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;
}
.logo {
.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;
&::after {
}
.webbpm.ervu_lkrp_ul :is(.form-signin, .form-signup, .confirm) .logo::after {
position: absolute;
content: "";
left: 0;
@ -266,53 +255,48 @@ body.webbpm.ervu_lkrp_ul {
height: 72px;
background-image: url(../img/svg/form-logo.svg);
}
}
.row {
.webbpm.ervu_lkrp_ul :is(.form-signin, .form-signup, .confirm) .row {
position: relative;
margin-bottom: 0;
& + .row {
}
.webbpm.ervu_lkrp_ul :is(.form-signin, .form-signup, .confirm) .row + .row {
margin-top: 20px;
}
}
input {
.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);
&[type="password"] {
}
.webbpm.ervu_lkrp_ul :is(.form-signin, .form-signup, .confirm) input[type="password"] {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
& ~ .input-group-append > .input-group-text {
}
.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);
}
}
& + label {
.webbpm.ervu_lkrp_ul :is(.form-signin, .form-signup, .confirm) input + label {
position: absolute;
top: 16px;
left: 16px;
pointer-events: none;
transition: all 200ms;
}
&:focus + label,
&:not(:placeholder-shown) + label {
.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;
}
}
.msg-text {
.webbpm.ervu_lkrp_ul :is(.form-signin, .form-signup, .confirm) .msg-text {
margin-top: 12px;
}
.btn-box {
.webbpm.ervu_lkrp_ul :is(.form-signin, .form-signup, .confirm) .btn-box {
margin-top: 32px;
}
}
.webbpm.ervu_lkrp_ul .form-signin .row.registration > * + *,
.webbpm.ervu_lkrp_ul .form-signin .login-btn-box .password,

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

@ -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.0</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.0</webbpm-platform.version>
<h2.version>1.4.200</h2.version>
<build.timestamp>0801193042</build.timestamp>
<build.timestamp>0823160217</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.0</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.0</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.0</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.0</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.0</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.0</version>
<studioVersion>3.178.0</studioVersion>
<backendModule>
<groupId>ru.cg.webbpm.packages.base</groupId>
<artifactId>backend</artifactId>
<version>3.177.0-9188-SNAPSHOT</version>
<version>3.178.0</version>
</backendModule>
<frontendModule>
<packageName>@webbpm/base-package</packageName>
<version>3.177.0-9188-SNAPSHOT-0801192452</version>
<version>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</value>
</entry>
</packageVersions>
</versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/SignVerification.html</documentation>
<internal>false</internal>
<versions>
<studioVersion>3.177.0-9188-SNAPSHOT</studioVersion>
<studioVersion>3.178.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</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.0</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.177.0-9188-SNAPSHOT</value>
<value>3.178.0</value>
</entry>
</packageVersions>
</versions>

View file

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

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