Merge remote-tracking branch 'origin/develop' into ERVU-119

This commit is contained in:
Makarova Elena 2024-09-04 10:30:18 +03:00
commit d065711489
210 changed files with 638 additions and 5920 deletions

22
Dockerfile Normal file
View file

@ -0,0 +1,22 @@
FROM maven:3-openjdk-17-slim AS build
RUN apt update \
&& apt upgrade -y \
&& curl -fsSL https://deb.nodesource.com/setup_14.x | bash - \
&& apt install -y git nodejs \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY . .
RUN mvn clean && mvn package -T4C
FROM gitlab.micord.ru:5050/common/base/webbpm/webbpm-tomcat-cprocsp:8.0.15-jre17-webprofile
ARG ADMIN_PASSWORD=Secr3t
COPY config/tomcat/tomee /usr/local/tomee
RUN rm -rf /usr/local/tomee/webapps/ROOT \
&& cat /usr/local/tomee/conf/webbpm.properties >> /usr/local/tomee/conf/catalina.properties \
&& sed -i -r "s/<must-be-changed>/$ADMIN_PASSWORD/g" /usr/local/tomee/conf/tomcat-users.xml
COPY --from=build /app/frontend/target/*.war /usr/local/tomee/webapps/ROOT.war
COPY --from=build /app/backend/target/*.war /usr/local/tomee/webapps/ul.war

18
Dockerfile.old Normal file
View file

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

View file

@ -3,11 +3,11 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>ervu_lkrp_ul</groupId> <groupId>ru.micord.ervu.lkrp</groupId>
<artifactId>ervu_lkrp_ul</artifactId> <artifactId>ul</artifactId>
<version>1.0.0-SNAPSHOT</version> <version>1.0.0-SNAPSHOT</version>
</parent> </parent>
<groupId>ervu_lkrp_ul.ervu_lkrp_ul</groupId> <groupId>ru.micord.ervu.lkrp.ul</groupId>
<artifactId>backend</artifactId> <artifactId>backend</artifactId>
<packaging>war</packaging> <packaging>war</packaging>
<dependencies> <dependencies>
@ -25,7 +25,7 @@
<scope>runtime</scope> <scope>runtime</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>ervu_lkrp_ul.ervu_lkrp_ul</groupId> <groupId>ru.micord.ervu.lkrp.ul</groupId>
<artifactId>resources</artifactId> <artifactId>resources</artifactId>
<scope>runtime</scope> <scope>runtime</scope>
</dependency> </dependency>
@ -107,30 +107,6 @@
<groupId>ru.cg.webbpm.modules</groupId> <groupId>ru.cg.webbpm.modules</groupId>
<artifactId>inject</artifactId> <artifactId>inject</artifactId>
</dependency> </dependency>
<dependency>
<groupId>ru.cg.webbpm.modules.bpmn</groupId>
<artifactId>bpmn-workflow-api</artifactId>
</dependency>
<dependency>
<groupId>ru.cg.webbpm.modules.bpmn</groupId>
<artifactId>bpmn-workflow-jbpm-api</artifactId>
</dependency>
<dependency>
<groupId>ru.cg.webbpm.modules.bpmn</groupId>
<artifactId>bpmn-workflow-jbpm</artifactId>
</dependency>
<dependency>
<groupId>ru.cg.webbpm.modules.bpmn</groupId>
<artifactId>bpmn-beans</artifactId>
</dependency>
<dependency>
<groupId>ru.cg.webbpm.modules.bpmn</groupId>
<artifactId>bpmn-variable-condition-adapter</artifactId>
</dependency>
<dependency>
<groupId>ru.cg.webbpm.modules.bpmn</groupId>
<artifactId>bpmn-deploy</artifactId>
</dependency>
<dependency> <dependency>
<groupId>ru.cg.webbpm.modules</groupId> <groupId>ru.cg.webbpm.modules</groupId>
<artifactId>webkit-rpc</artifactId> <artifactId>webkit-rpc</artifactId>
@ -184,22 +160,6 @@
<groupId>ru.cg.webbpm.modules.core</groupId> <groupId>ru.cg.webbpm.modules.core</groupId>
<artifactId>metrics</artifactId> <artifactId>metrics</artifactId>
</dependency> </dependency>
<dependency>
<groupId>ru.cg.webbpm.modules.webkit</groupId>
<artifactId>active-users-tracker</artifactId>
</dependency>
<dependency>
<groupId>ru.cg.webbpm.modules.security</groupId>
<artifactId>security-beans</artifactId>
</dependency>
<dependency>
<groupId>ru.cg.webbpm.modules.security</groupId>
<artifactId>security-api</artifactId>
</dependency>
<dependency>
<groupId>ru.cg.webbpm.modules.security</groupId>
<artifactId>security-esia</artifactId>
</dependency>
<dependency> <dependency>
<groupId>ru.cg.webbpm.modules.reporting</groupId> <groupId>ru.cg.webbpm.modules.reporting</groupId>
<artifactId>reporting-api</artifactId> <artifactId>reporting-api</artifactId>
@ -236,14 +196,6 @@
<groupId>ru.cg.webbpm.modules</groupId> <groupId>ru.cg.webbpm.modules</groupId>
<artifactId>webkit-base</artifactId> <artifactId>webkit-base</artifactId>
</dependency> </dependency>
<dependency>
<groupId>ru.cg.webbpm.modules.security</groupId>
<artifactId>security-db-synchronization-api</artifactId>
</dependency>
<dependency>
<groupId>ru.cg.webbpm.modules.security</groupId>
<artifactId>security-db-synchronization-ldap-impl</artifactId>
</dependency>
<dependency> <dependency>
<groupId>xerces</groupId> <groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId> <artifactId>xercesImpl</artifactId>
@ -260,14 +212,6 @@
<groupId>org.apache.tika</groupId> <groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId> <artifactId>tika-core</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.security.kerberos</groupId>
<artifactId>spring-security-kerberos-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security.kerberos</groupId>
<artifactId>spring-security-kerberos-web</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.bouncycastle</groupId> <groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId> <artifactId>bcprov-jdk15on</artifactId>
@ -294,6 +238,7 @@
</dependency> </dependency>
</dependencies> </dependencies>
<build> <build>
<finalName>${parent.artifactId}</finalName>
<plugins> <plugins>
<plugin> <plugin>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
@ -327,16 +272,6 @@
<profiles> <profiles>
<profile> <profile>
<id>studio</id> <id>studio</id>
<build>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<warName>${project.artifactId}</warName>
</configuration>
</plugin>
</plugins>
</build>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>ru.cg.webbpm.modules.resources</groupId> <groupId>ru.cg.webbpm.modules.resources</groupId>

View file

@ -11,6 +11,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.retry.annotation.EnableRetry; import org.springframework.retry.annotation.EnableRetry;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
@ -31,13 +32,12 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc;
"i18n", "i18n",
"errorhandling", "errorhandling",
"database", "database",
"security",
"component.addresses", "component.addresses",
"gen", "gen",
"ru.cg", "ru.cg",
"ru.micord", "ru.micord",
"ervu", }, excludeFilters = {
"esia" @ComponentScan.Filter(type = FilterType.REGEX, pattern = "security.WebSecurityConfig")
}) })
@EnableAspectJAutoProxy(proxyTargetClass = true) @EnableAspectJAutoProxy(proxyTargetClass = true)
@EnableWebMvc @EnableWebMvc

View file

@ -1,34 +0,0 @@
package controller;
import dto.jivoprofile.JivoProfileDto;
import org.hsqldb.lib.StringUtil;
import org.springframework.web.bind.annotation.*;
import ru.cg.webbpm.modules.security.api.model.User;
import ru.cg.webbpm.modules.security.api.service.UserService;
@RestController
public class ProfileController {
private UserService userService;
public ProfileController(UserService userService) {
this.userService = userService;
}
@RequestMapping(value = "/profile/jivo/{userId}", method = RequestMethod.GET)
public JivoProfileDto profile(@PathVariable("userId") String userId) {
if (StringUtil.isEmpty(userId)) {
return new JivoProfileDto();
}
User user = userService.get(userId);
JivoProfileDto profileDto = new JivoProfileDto();
profileDto.setUsername(user.firstName());
profileDto.setEmail(user.email());
profileDto.setPhone(user.phone());
return profileDto;
}
}

View file

@ -0,0 +1,25 @@
package ru.micord.security;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
//@EnableAuthorizationServer
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeHttpRequests()
.antMatchers("/**")
.permitAll();
return http.build();
}
}

View file

@ -41,4 +41,4 @@ RUN chmod -R +x patches && \
ENV SERVER_START=true ENV SERVER_START=true
COPY --chown=jboss *.ear $JBOSS_HOME/standalone/deployments/ COPY --chown=jboss *.ear $JBOSS_HOME/standalone/deployments/
HEALTHCHECK --timeout=3s --start-period=3600s CMD curl --fail 127.0.0.1:8080/backend/version || exit 1 HEALTHCHECK --timeout=3s --start-period=3600s CMD curl --fail 127.0.0.1:8080/ul/version || exit 1

36
config/context.xml Normal file
View file

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

View file

@ -16,41 +16,6 @@ xa-data-source add \
--query-timeout=300 \ --query-timeout=300 \
--xa-datasource-properties=ServerName=${env.DB_APP_HOST:db},PortNumber=${env.DB_APP_PORT:5432},DatabaseName=${env.DB_APP_NAME:app} --xa-datasource-properties=ServerName=${env.DB_APP_HOST:db},PortNumber=${env.DB_APP_PORT:5432},DatabaseName=${env.DB_APP_NAME:app}
xa-data-source add \
--name=JBPMDS \
--enabled=true \
--driver-name=postgresql \
--jndi-name=java:jboss/datasources/jbpmDS \
--user-name=${env.DB_JBPM_USERNAME:jbpm} \
--password=${env.DB_JBPM_PASSWORD:jbpmpassword} \
--use-ccm=true \
--valid-connection-checker-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker \
--validate-on-match=false \
--background-validation=true \
--background-validation-millis=5000 \
--exception-sorter-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter \
--statistics-enabled=true \
--max-pool-size=50 \
--query-timeout=300 \
--xa-datasource-properties=ServerName=${env.DB_JBPM_HOST:db},PortNumber=${env.DB_JBPM_PORT:5432},DatabaseName=${env.DB_JBPM_NAME:jbpm}
xa-data-source add \
--name=SECURITYDS \
--enabled=true \
--driver-name=postgresql \
--jndi-name=java:/webbpm/security-ds \
--user-name=${env.DB_SEC_USERNAME:security_user} \
--password=${env.DB_SEC_PASSWORD:secpassword} \
--max-pool-size=70 \
--valid-connection-checker-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker \
--validate-on-match=false \
--background-validation=true \
--background-validation-millis=5000 \
--exception-sorter-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter \
--statistics-enabled=true \
--query-timeout=300 \
--xa-datasource-properties=ServerName=${env.DB_SEC_HOST:db},PortNumber=${env.DB_SEC_PORT:5432},DatabaseName=${env.DB_SEC_NAME:app}
/system-property=ldap.mapping.login.param:add(value=${env.WEBBPM_LDAP_LOGIN_ATTR:uid}) /system-property=ldap.mapping.login.param:add(value=${env.WEBBPM_LDAP_LOGIN_ATTR:uid})
/system-property=ldap.mapping.org.code.param:add(value=${env.WEBBPM_LDAP_ORGANIZATION_ATTR:ou}) /system-property=ldap.mapping.org.code.param:add(value=${env.WEBBPM_LDAP_ORGANIZATION_ATTR:ou})
/system-property=jboss.as.management.blocking.timeout:add(value=900) /system-property=jboss.as.management.blocking.timeout:add(value=900)
@ -62,6 +27,7 @@ xa-data-source add \
/system-property=gar.enable:add(value=false) /system-property=gar.enable:add(value=false)
/system-property=security.password.regex:add(value="^((?=(.*\\d){1,})(?=.*[a-zа-яё])(?=.*[A-ZА-ЯЁ]).{8,})$") /system-property=security.password.regex:add(value="^((?=(.*\\d){1,})(?=.*[a-zа-яё])(?=.*[A-ZА-ЯЁ]).{8,})$")
/system-property=fias.enable:add(value=false) /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.url:add(value="https://ervu-webdav.k8s.micord.ru")
/system-property=file.webdav.upload.username:add(value="test") /system-property=file.webdav.upload.username:add(value="test")
/system-property=file.webdav.upload.password:add(value="test") /system-property=file.webdav.upload.password:add(value="test")

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -2,27 +2,27 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>ervu_lkrp_ul</groupId> <groupId>ru.micord.ervu.lkrp</groupId>
<artifactId>ervu_lkrp_ul</artifactId> <artifactId>ul</artifactId>
<version>1.0.0-SNAPSHOT</version> <version>1.0.0-SNAPSHOT</version>
</parent> </parent>
<groupId>ervu_lkrp_ul.ervu_lkrp_ul</groupId> <groupId>ru.micord.ervu.lkrp.ul</groupId>
<artifactId>distribution</artifactId> <artifactId>distribution</artifactId>
<packaging>ear</packaging> <packaging>ear</packaging>
<properties> <properties>
<backendContext>/backend</backendContext> <backendContext>/ul</backendContext>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>ervu_lkrp_ul.ervu_lkrp_ul</groupId> <groupId>ru.micord.ervu.lkrp.ul</groupId>
<artifactId>backend</artifactId> <artifactId>backend</artifactId>
<type>war</type> <type>war</type>
</dependency> </dependency>
<dependency> <dependency>
<groupId>ervu_lkrp_ul.ervu_lkrp_ul</groupId> <groupId>ru.micord.ervu.lkrp.ul</groupId>
<artifactId>frontend</artifactId> <artifactId>frontend</artifactId>
<type>war</type> <type>war</type>
</dependency> </dependency>
@ -37,16 +37,16 @@
<configuration> <configuration>
<modules> <modules>
<webModule> <webModule>
<groupId>ervu_lkrp_ul.ervu_lkrp_ul</groupId> <groupId>ru.micord.ervu.lkrp.ul</groupId>
<artifactId>frontend</artifactId> <artifactId>frontend</artifactId>
<contextRoot>/</contextRoot> <contextRoot>/</contextRoot>
<bundleFileName>frontend.war</bundleFileName> <bundleFileName>frontend.war</bundleFileName>
</webModule> </webModule>
<webModule> <webModule>
<groupId>ervu_lkrp_ul.ervu_lkrp_ul</groupId> <groupId>ru.micord.ervu.lkrp.ul</groupId>
<artifactId>backend</artifactId> <artifactId>backend</artifactId>
<contextRoot>${backendContext}</contextRoot> <contextRoot>${backendContext}</contextRoot>
<bundleFileName>backend.war</bundleFileName> <bundleFileName>ul.war</bundleFileName>
</webModule> </webModule>
</modules> </modules>
</configuration> </configuration>
@ -59,7 +59,7 @@
<profile> <profile>
<id>enable-version-in-url</id> <id>enable-version-in-url</id>
<properties> <properties>
<backendContext>/backend-${project.version}</backendContext> <backendContext>/ul-${project.version}</backendContext>
</properties> </properties>
</profile> </profile>
</profiles> </profiles>

View file

@ -1624,9 +1624,9 @@
} }
}, },
"@webbpm/base-package": { "@webbpm/base-package": {
"version": "3.177.0", "version": "3.178.2",
"resolved": "https://repo.micord.ru/repository/npm-all/@webbpm/base-package/-/base-package-3.177.0.tgz", "resolved": "https://repo.micord.ru/repository/npm-all/@webbpm/base-package/-/base-package-3.178.2.tgz",
"integrity": "sha512-YgjHHcIR0m/QHujiU17e4NmGmSRxUg88G609KkTGh8XreTXbpYwRxo+3Vr5ttfjk0ND1NMWt6L2TlTLlaCgpkQ==", "integrity": "sha512-ShqAmiaGCvrg7ffrhntshwcZJVW8cK10JsMy/OT36p7iK6B/IR0YCJZZ+GIhakLo0CZsEokhcpKBdORvfOI55g==",
"requires": { "requires": {
"tslib": "^1.9.0" "tslib": "^1.9.0"
} }

View file

@ -1,5 +1,5 @@
{ {
"name": "webbpm-frontend", "name": "ervu_lkrp_ul",
"version": "1.0.0", "version": "1.0.0",
"scripts": { "scripts": {
"lite": "node ./node_modules/lite-server/bin/lite-server", "lite": "node ./node_modules/lite-server/bin/lite-server",
@ -27,7 +27,7 @@
"@angular/platform-browser-dynamic": "7.2.15", "@angular/platform-browser-dynamic": "7.2.15",
"@angular/router": "7.2.15", "@angular/router": "7.2.15",
"@ng-bootstrap/ng-bootstrap": "4.1.1", "@ng-bootstrap/ng-bootstrap": "4.1.1",
"@webbpm/base-package": "3.177.0", "@webbpm/base-package": "3.178.2",
"ag-grid-angular": "29.0.0-micord.4", "ag-grid-angular": "29.0.0-micord.4",
"ag-grid-community": "29.0.0-micord.4", "ag-grid-community": "29.0.0-micord.4",
"angular-calendar": "0.28.28", "angular-calendar": "0.28.28",

View file

@ -2,12 +2,12 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>ervu_lkrp_ul</groupId> <groupId>ru.micord.ervu.lkrp</groupId>
<artifactId>ervu_lkrp_ul</artifactId> <artifactId>ul</artifactId>
<version>1.0.0-SNAPSHOT</version> <version>1.0.0-SNAPSHOT</version>
</parent> </parent>
<groupId>ervu_lkrp_ul.ervu_lkrp_ul</groupId> <groupId>ru.micord.ervu.lkrp.ul</groupId>
<artifactId>frontend</artifactId> <artifactId>frontend</artifactId>
<packaging>war</packaging> <packaging>war</packaging>

View file

@ -18,7 +18,7 @@
}); });
</script> </script>
</head> </head>
<body preview-container id="webbpm-angular-application-container ervu_lkrp_ul" class="webbpm"> <body preview-container id="webbpm-angular-application-container" class="webbpm ervu_lkrp_ul">
<div class="loader"></div> <div class="loader"></div>
</body> </body>
</html> </html>

View file

@ -5,6 +5,7 @@
"filter_cleanup_check_period_minutes": 30, "filter_cleanup_check_period_minutes": 30,
"auth_method": "form", "auth_method": "form",
"enable.version.in.url": "%enable.version.in.url%", "enable.version.in.url": "%enable.version.in.url%",
"backend.context": "ul",
"guard.confirm_exit": false, "guard.confirm_exit": false,
"message_service_error_timeout": "", "message_service_error_timeout": "",
"message_service_warning_timeout": "", "message_service_warning_timeout": "",

View file

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

View file

@ -1,17 +1,10 @@
<nav class="header" *ngIf="currentSession | async as session" id="webbpm-header"> <nav class="header" id="webbpm-header">
<div class="header-logo"> <div class="header-logo">
<div class="logo"><a routerLink="/"></a></div> <div class="logo"><a routerLink="/"></a></div>
<div class="main-page"><a routerLink="/">Главная</a></div> <div class="main-page"><a routerLink="/">Главная</a></div>
<div class="header-menu-left"><a routerLink="/filesentlog">Журнал взаимодействий</a></div> <div class="header-menu-left"><a routerLink="/filesentlog">Журнал взаимодействий</a></div>
</div> </div>
<div class="header-menu"> <div class="header-menu">
<!--
<process *ngIf="session.authorities.includes('BPMN.USER.START_PROCESS')"></process>
<div *ngIf="session.authorities.includes('BPMN.USER.TASK_LIST')">
<button class="nav-link bi bi-file-text-fill" (click)="openTaskList()" title="Задачи"></button>
</div>
<admin-menu [placement]="'bottom'"></admin-menu>
-->
<div ngbDropdown class="logout" log-out></div> <div ngbDropdown class="logout" log-out></div>
</div> </div>
</nav> </nav>

View file

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

View file

@ -1,11 +0,0 @@
<button class="user-info" ngbDropdownToggle *ngIf="currentSession | async as session">{{session.fullUserName}}</button>
<div ngbDropdownMenu *ngIf="currentSession | async as session">
<!--
<div class="user-info">
<div class="user-login">{{session.username}}</div>
</div>
-->
<div class="user-department">{{getOrgUnitName()}}</div>
<a routerLink="/mydata" class="data">Данные организации</a>
<button ngbDropdownItem class="exit" *ngIf="isLogoutButtonVisible()" (click)="logout()">Выйти</button>
</div>

View file

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

View file

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

View file

@ -1,12 +0,0 @@
<div ngbDropdown class="nav-item">
<button class="nav-link bi bi-clipboard-plus-fill" id="startProcessDropdownMenu" ngbDropdownToggle title="Создать"></button>
<div ngbDropdownMenu aria-labelledby="startProcessDropdownMenu">
<div class="dropdown-menu-inner">
<div *ngFor="let process of processList">
<button (click)="startProcess(process.processDefId)" ngbDropdownItem>
{{ process.name }}
</button>
</div>
</div>
<div>
</div><!-- TODO: move to directive or something else -->

View file

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

View file

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

View file

@ -1,3 +0,0 @@
<div id="page">
<router-outlet></router-outlet>
</div>

View file

@ -1,49 +0,0 @@
<div class="inner">
<div class="task-list">
<div class="task-list-tree-panel">
<div class="task-list-filter">
<ul>
<li>Фильтры</li>
<li>
<label>
<input type="radio" name="task-filter" value="All" [(ngModel)]="showMode" (ngModelChange)="filterVisibleTasks()">
<span>Все [{{tasks.length}}]</span>
</label></li>
<li class="ontime">
<label>
<input type="radio" name="task-filter" value="OnTime" [(ngModel)]="showMode" (ngModelChange)="filterVisibleTasks()">
<span><div></div>Без превышения срока [{{onTimeTasks.length}}]</span>
</label></li>
<li class="overdue">
<label>
<input type="radio" name="task-filter" value="Overdue" [(ngModel)]="showMode" (ngModelChange)="filterVisibleTasks()">
<span><div></div>С превышением срока [{{overdueTasks.length}}]</span>
</label></li>
</ul>
</div>
</div>
<div class="task-list-workplace">
<div class="alert alert-danger" [hidden]="!errorMessage">{{errorMessage}}</div>
<div class="table task-tbl">
<div class="thead">
<div class="tr">
<div class="th">Процесс</div>
<div class="th">Версия</div>
<div class="th">Задача</div>
<div class="th">Дата создания</div>
<div class="th">Срок</div>
</div>
</div>
<div *ngFor="let task of visibleTasks"
class="tr" [ngClass]="{'task-overdue': isOverdue(task), 'task-ontime': isOnTime(task)}"
(click)="startTask(task)">
<div class="td">{{ task.processName }}</div>
<div class="td">{{ task.processVersion }}</div>
<div class="td task">{{ task.name }}</div>
<div class="td">{{ task.createdOn | date:'dd.MM.yyyy HH:mm:ss' }}</div>
<div class="td">{{ task.expirationTime | date:'dd.MM.yyyy HH:mm:ss' }}</div>
</div>
</div>
</div>
</div>
</div>

View file

@ -1,8 +0,0 @@
<div class="task-not-found-page">
<div class="task-not-found-container">
<div>:(</div>
<div><h2>Ошибка</h2>
Данная задача не существует.<br/>
Перейти к <a (click)="goToTaskList()" tabindex>списку задач</a></div>
</div>
</div>

View file

@ -1,65 +1,13 @@
import {NgModule} from "@angular/core"; import {NgModule} from "@angular/core";
import {RouterModule, Routes} from "@angular/router"; import {RouterModule, Routes} from "@angular/router";
import {AccessDeniedComponent} from "./component/access-denied.component"; import {AccessDeniedComponent} from "./component/access-denied.component";
import {LoginComponent} from "./component/login.component"; import {ConfirmExitGuard} from "@webbpm/base-package";
import {AuthenticationGuard, ConfirmExitGuard, SignedInGuard, ProcessInstanceRouteResolver} from "@webbpm/base-package";
import {RegisterComponent} from "./component/register.component";
import {ConfirmUserEmailComponent} from "./component/confirm-user-email.component";
import {ResetPasswordComponent} from "./component/reset-password.component";
import {NewPasswordComponent} from "./component/new-password.component";
import {TaskListComponent} from "./component/task-list.component";
const appRoutes: Routes = [ const appRoutes: Routes = [
{
path: 'login',
component: LoginComponent,
canActivate: [SignedInGuard]
},
{ {
path: 'access-denied', path: 'access-denied',
component: AccessDeniedComponent, component: AccessDeniedComponent,
canActivate: [AuthenticationGuard, ConfirmExitGuard] canActivate: [ConfirmExitGuard]
},
{
path: 'registration',
component: RegisterComponent,
canActivate: [SignedInGuard]
},
{
path: 'confirm',
component: ConfirmUserEmailComponent
},
{
path: 'reset-password',
component: ResetPasswordComponent
},
{
path: 'new-password',
component: NewPasswordComponent
},
{
path: 'process',
canActivate: [AuthenticationGuard, ConfirmExitGuard],
children: [
{
path: 'instance',
loadChildren: 'generated-sources/page-process-instance-list.module#PageprocessinstancelistModule',
resolve: {
processInstanceId: ProcessInstanceRouteResolver
}
},
{
path: 'instance/:processInstanceId',
loadChildren: 'generated-sources/page-process-instance.module#PageprocessinstanceModule',
resolve: {
processInstanceId: ProcessInstanceRouteResolver
}
},
{
path: 'tasks',
component: TaskListComponent,
}
]
}, },
{ {
path: 'mydata', path: 'mydata',
@ -69,8 +17,8 @@ const appRoutes: Routes = [
path: 'filesentlog', path: 'filesentlog',
loadChildren: 'generated-sources/page-filesentlog.module#PagefilesentlogModule', loadChildren: 'generated-sources/page-filesentlog.module#PagefilesentlogModule',
} }
]; ];
@NgModule({ @NgModule({

View file

@ -11,25 +11,15 @@ import {
ProgressIndicationService, ProgressIndicationService,
SecurityModule SecurityModule
} from "@webbpm/base-package"; } from "@webbpm/base-package";
import {AdminMenuComponent} from "./component/admin-menu.component";
import {AppHeaderComponent} from "./component/app-header.component"; import {AppHeaderComponent} from "./component/app-header.component";
import {AppFooterComponent} from "./component/app-footer.component"; import {AppFooterComponent} from "./component/app-footer.component";
import {LogOutComponent} from "./component/logout.component";
import {LoginComponent} from "./component/login.component";
import {AccessDeniedComponent} from "./component/access-denied.component"; import {AccessDeniedComponent} from "./component/access-denied.component";
import {ApplicationVersionComponent} from "./component/application-version.component"; import {ApplicationVersionComponent} from "./component/application-version.component";
import {RouterModule} from "@angular/router"; import {RouterModule} from "@angular/router";
import {RegisterComponent} from "./component/register.component";
import {ConfirmUserEmailComponent} from "./component/confirm-user-email.component";
import {InternationalPhoneNumberModule} from "ngx-international-phone-number"; import {InternationalPhoneNumberModule} from "ngx-international-phone-number";
import {ResetPasswordComponent} from "./component/reset-password.component";
import {NewPasswordComponent} from "./component/new-password.component";
import {AppProgressIndicationComponent} from "./component/app-progress-indication.component"; import {AppProgressIndicationComponent} from "./component/app-progress-indication.component";
import {AppProgressIndicationService} from "./service/app-progress-indication.service"; import {AppProgressIndicationService} from "./service/app-progress-indication.service";
import {TaskListComponent} from "./component/task-list.component";
import {ProcessListComponent} from "./component/process-list.component";
import {TaskComponent} from "./component/task.component";
import {TaskNotFoundComponent} from "./component/task-not-found.component";
import {FileUploadModule} from "ng2-file-upload"; import {FileUploadModule} from "ng2-file-upload";
import {ErvuFileUpload} from "../../ervu/component/fileupload/ErvuFileUpload"; import {ErvuFileUpload} from "../../ervu/component/fileupload/ErvuFileUpload";
@ -37,20 +27,9 @@ registerLocaleData(localeRu);
export const DIRECTIVES = [ export const DIRECTIVES = [
forwardRef(() => AppHeaderComponent), forwardRef(() => AppHeaderComponent),
forwardRef(() => AppFooterComponent), forwardRef(() => AppFooterComponent),
forwardRef(() => AdminMenuComponent),
forwardRef(() => ApplicationVersionComponent), forwardRef(() => ApplicationVersionComponent),
forwardRef(() => LogOutComponent),
forwardRef(() => LoginComponent),
forwardRef(() => AccessDeniedComponent), forwardRef(() => AccessDeniedComponent),
forwardRef(() => RegisterComponent),
forwardRef(() => ConfirmUserEmailComponent),
forwardRef(() => ResetPasswordComponent),
forwardRef(() => NewPasswordComponent),
forwardRef(() => AppProgressIndicationComponent), forwardRef(() => AppProgressIndicationComponent),
forwardRef(() => TaskListComponent),
forwardRef(() => ProcessListComponent),
forwardRef(() => TaskComponent),
forwardRef(() => TaskNotFoundComponent),
forwardRef(() => ErvuFileUpload) forwardRef(() => ErvuFileUpload)
]; ];
@ -78,7 +57,7 @@ export const DIRECTIVES = [
{ provide: ProgressIndicationService, useClass: AppProgressIndicationService } { provide: ProgressIndicationService, useClass: AppProgressIndicationService }
], ],
bootstrap: [], bootstrap: [],
entryComponents: [AppProgressIndicationComponent, TaskNotFoundComponent] entryComponents: [AppProgressIndicationComponent]
}) })
export class AppModule { export class AppModule {
} }

View file

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

View file

@ -1,7 +1,5 @@
import {ChangeDetectionStrategy, Component} from "@angular/core"; import {ChangeDetectionStrategy, Component} from "@angular/core";
import {Router} from "@angular/router"; import {Router} from "@angular/router";
import {UserService, Session} from "@webbpm/base-package";
import {Observable} from "rxjs";
@Component({ @Component({
moduleId: module.id, moduleId: module.id,
@ -11,14 +9,6 @@ import {Observable} from "rxjs";
}) })
export class AppHeaderComponent { export class AppHeaderComponent {
public currentSession: Observable<Session>; constructor(protected router: Router) {
constructor(protected userService: UserService,
protected router: Router) {
this.currentSession = this.userService.getCurrentSession();
}
public openTaskList(): void {
this.router.navigateByUrl("/process/tasks");
} }
} }

View file

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

View file

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

View file

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

View file

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

View file

@ -1,44 +0,0 @@
import {ChangeDetectionStrategy, ChangeDetectorRef, Component, Input} from "@angular/core";
import {Process, TaskService, ProcessDefinitionResource, ProcessService} from "@webbpm/base-package";
@Component({
moduleId: module.id,
selector: 'process',
templateUrl: '../../../../../src/resources/template/app/component/process_list.html',
changeDetection: ChangeDetectionStrategy.OnPush
})
export class ProcessListComponent {
@Input()
public processList: Process[];
@Input()
public errorMessage: string;
constructor(private processDefinitionResource: ProcessDefinitionResource,
private taskService: TaskService,
private cd: ChangeDetectorRef,
private processService: ProcessService) {
this.processList = [];
this.loadProcessList();
}
loadProcessList() {
this.processDefinitionResource.list().then(
(processList) => {
this.processList = processList;
this.cd.markForCheck();
},
() => {
this.errorMessage = "Error load process list";
this.cd.markForCheck();
})
}
startProcess(processDefinitionId: string) {
this.processService.start(processDefinitionId, null).then(
(processInstanceId: number) => {
this.taskService.startAndOpenNextTask(processInstanceId);
}
);
}
}

View file

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

View file

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

View file

@ -1,121 +0,0 @@
import {Component, Input} from "@angular/core";
import {Task, TaskService, TaskStatus, TaskReference, TaskResource, ProcessVariable, UserService, RolesService, ProcessService} from "@webbpm/base-package";
@Component({
moduleId: module.id,
selector: "task-list",
templateUrl: "../../../../../src/resources/template/app/component/task_list.html"
})
export class TaskListComponent {
@Input()
public tasks: Task[];
@Input()
public onTimeTasks: Task[];
@Input()
public overdueTasks: Task[];
@Input()
public visibleTasks: Task[];
@Input()
public showMode: string;
@Input()
public errorMessage: string;
@Input()
public roles: string[];
constructor(private taskService: TaskService,
private $taskResource: TaskResource,
private userService: UserService,
private rolesService: RolesService,
private processService: ProcessService) {
this.tasks = [];
this.onTimeTasks = [];
this.overdueTasks = [];
this.visibleTasks = [];
this.roles = [];
this.showMode = 'All';
this.rolesService.getRoles().then((roles: string[]) => {
this.roles = roles;
});
this.loadTasks();
}
private loadTasks(): void {
this.$taskResource.list()
.then(
(tasks: Task[]) => this.initTasks(tasks),
() => this.errorMessage = "Error load tasks"
);
}
public startTask(task: Task): Promise<any> {
let taskRef: TaskReference = new TaskReference();
taskRef.processInstanceId = task.processInstanceId;
taskRef.taskId = task.id;
if (task.status == TaskStatus.InProgress) {
return this.taskService.openTask(taskRef);
}
else if (task.status == TaskStatus.Reserved || task.status == TaskStatus.Ready) {
return this.taskService.startAndOpenTask(taskRef);
}
}
private initTasks(tasks: Task[]): void {
this.tasks = tasks;
this.filterOnTimeTasks();
this.filterOverdueTasks();
this.filterVisibleTasks();
}
public isVisible(task: Task): boolean {
return this.showMode == 'All' ||
this.showMode == 'OnTime' && !this.isOverdue(task) ||
this.showMode == 'Overdue' && this.isOverdue(task);
}
public isOverdue(task: Task): boolean {
if (!task.expirationTime) {
return false;
}
return new Date(task.expirationTime).getTime() <= new Date().getTime();
}
public isOnTime(task: Task): boolean {
return !this.isOverdue(task);
}
public startProcess(processDefinitionId: string, processVars?: Array<ProcessVariable | any>) {
this.processService.start(processDefinitionId, processVars).then(
(processInstanceId: number) => {
this.taskService.startAndOpenNextTask(processInstanceId);
}
);
}
public filterOnTimeTasks() {
this.onTimeTasks = this.tasks
.filter((task: Task) => this.isOnTime(task));
}
public filterOverdueTasks() {
this.overdueTasks = this.tasks
.filter((task: Task) => this.isOverdue(task));
}
public filterVisibleTasks() {
this.visibleTasks = this.tasks
.filter((task: Task) => this.isVisible(task));
}
public hasRole(role: string) {
return this.roles.includes(role);
}
}

View file

@ -1,18 +0,0 @@
import {ChangeDetectionStrategy, Component} from "@angular/core";
import {Router} from "@angular/router";
@Component({
moduleId: module.id,
selector: 'task-not-found',
templateUrl: '../../../../../src/resources/template/app/component/task_not_found.html',
changeDetection: ChangeDetectionStrategy.OnPush
})
export class TaskNotFoundComponent {
constructor(private router: Router) {
}
goToTaskList() {
return this.router.navigateByUrl("/process/tasks");
}
}

View file

@ -1,9 +0,0 @@
import {Component} from "@angular/core";
@Component({
moduleId: module.id,
selector: "[task]",
templateUrl: "../../../../../src/resources/template/app/component/task.html"
})
export class TaskComponent {
}

View file

@ -1,298 +0,0 @@
import {Injectable, OnDestroy} from "@angular/core";
import {HttpClient} from "@angular/common/http";
import {UserService, AppConfigService, Session} from "@webbpm/base-package";
import {
JivoProfileDto
} from "../../../generated/dto/jivoprofile/JivoProfileDto";
import {Observable, Subscription} from "rxjs";
declare function jivo_InitProfile(name, email, phone);
declare function jivo_ClearHistory();
@Injectable()
export class AppJivoChatWidgetService implements OnDestroy {
public static LIVE_CHAT_WIDGET_API_URL: string = "jivo_chat_widget_api_url";
public static LIVE_CHAT_WIDGET_ENABLE: string = "jivo_chat_widget_enabled";
public static LIVE_CHAT_WIDGET_DEFAULT_VALUE: boolean = false;
private JIVO_CSS: string = `
/* hide the original widget - that there were no two labels on the screen*/
#jivo_chat_widget{
display: none;
}
/* the default style - for offline messages if no one is online */
#jivo_custom_widget{
position: fixed;
z-index: 300000;
cursor: pointer;
display: block;
right: 60px;
bottom: 10px;
width: 60px;
height: 60px;
background-image: url('data:image/png;base64,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');
background-size: 60px 60px;
background-repeat: no-repeat;
}
#jivo_custom_widget:hover{
bottom: 13px;
}
/* if there are operators online - show other label*/
#jivo_custom_widget.jivo_online{
height: 60px;
width: 60px;
background-size: 60px 60px;
background-repeat: no-repeat;
background-image: url('data:image/png;base64,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');
}`;
private JIVO_JS: string = `
/* Callback function that is called immediately after JivoChat is loaded */
function jivo_onLoadCallback() {
window.jivo_cstm_widget = document.createElement('div');
jivo_cstm_widget.setAttribute('id', 'jivo_custom_widget');
document.body.appendChild(jivo_cstm_widget);
/* Adds handlers click on the icon - to maximize the window when clicked */
jivo_cstm_widget.onclick = function () {
jivo_api.open();
}
/* Change the CSS class if there are agents online */
if (jivo_config.chat_mode === "online") {
jivo_cstm_widget.setAttribute("class", "jivo_online");
}
/* Show the user a shortcut */
window.jivo_cstm_widget.style.display = 'block';
}
/*
Callback function jivo_onOpen and jivo_onClose called whenever the chat window JivoChat
is expanded or collapsed by the user or by the proactive invitations rule.
*/
function jivo_onOpen() {
/* If chat is deployed - hide shortcut */
if (jivo_cstm_widget)
jivo_cstm_widget.style.display = 'none';
}
function jivo_onClose() {
/* If chat is minimized - show label */
if (jivo_cstm_widget)
jivo_cstm_widget.style.display = 'block';
}
function jivo_ClearHistory() {
jivo_api.clearHistory();
jivo_api.close();
}
function jivo_InitProfile(name, email, phone) {
let chatMode = jivo_api.chatMode();
let args = {
name: name ? name : '',
email: email ? email : '',
phone: phone ? phone : ''
};
if (chatMode === 'offline') {
jivo_api.sendOfflineMessage(args);
}
else {
jivo_api.setContactInfo(args);
}
}
`;
private currentUserName: string;
private currentEmail: string;
private currentPhone: string;
private jsLoaded = false;
private jivoWidgetApiUrl: string;
private currentSession: Observable<Session>;
private currentSessionSubscription: Subscription;
private session: Session;
private sessionInitJivoChatWidget: boolean;
constructor(private httpClient: HttpClient,
private appConfigService: AppConfigService,
private userService: UserService) {
this.currentSession = userService.getCurrentSession();
this.currentSessionSubscription =
this.currentSession.subscribe(val => {
if (!this.sessionInitJivoChatWidget || !this.session) {
this.initJivoChatWidget();
this.sessionInitJivoChatWidget = true;
}
if (this.session && !val) {
// logout
this.clearJivoProfile();
this.session = null;
this.sessionInitJivoChatWidget = false;
}
if (val) {
this.session = val;
}
});
}
private initJivoChatWidget() {
let liveChatWidgetEnabled = this.getValueFromAppConfig(
AppJivoChatWidgetService.LIVE_CHAT_WIDGET_ENABLE,
AppJivoChatWidgetService.LIVE_CHAT_WIDGET_DEFAULT_VALUE);
if (liveChatWidgetEnabled) {
this.jivoWidgetApiUrl = this.getValueFromAppConfig(
AppJivoChatWidgetService.LIVE_CHAT_WIDGET_API_URL,
'');
if (!this.jivoWidgetApiUrl) {
throw new Error(
`The configuration file does not contain the 'Jivo API url'. Please check that '${AppJivoChatWidgetService.LIVE_CHAT_WIDGET_API_URL}' has data`);
}
let userId = this.userService.getCurrentUserId();
if (userId) {
this.clearJivoProfile();
this.httpClient.get('profile/jivo/' + userId)
.toPromise()
.then((profile: JivoProfileDto) => {
this.currentUserName = profile.username;
this.currentEmail = profile.email;
this.currentPhone = profile.phone;
let initProfileFunction = () => this.initProfile(this.currentUserName,
this.currentEmail,
this.currentPhone);
this.loadScripts(initProfileFunction);
});
}
else {
let initProfileFunction = () => this.initProfile(this.currentUserName, this.currentEmail,
this.currentPhone);
this.loadScripts(initProfileFunction);
}
}
}
private clearJivoProfile() {
this.clearProfileData();
try {
jivo_ClearHistory();
}
catch (ignore) {
}
}
private clearProfileData() {
this.currentUserName = '';
this.currentEmail = '';
this.currentPhone = '';
}
private loadScripts(initProfileFunction): void {
let afterLoadMainJs = () => {
this.loadScriptJsContent('jivoCustomJs', this.JIVO_JS, initProfileFunction);
}
this.loadScript('jivoWidget', this.jivoWidgetApiUrl, true, afterLoadMainJs);
this.loadStyleContent('jivoCustomCss', this.JIVO_CSS);
}
private initProfile(username: string, email: string, phone: string): void {
try {
jivo_InitProfile(username, email, phone);
}
catch (e) {
if (e instanceof ReferenceError) {
if (!this.jsLoaded) {
this.jsLoaded = true;
setTimeout(() => {
jivo_InitProfile(username, email, phone);
}, 3000);
}
}
}
}
private loadScript(elementId, js, async, callback): void {
let jivoJsLink = document.getElementById(elementId);
if (!jivoJsLink) {
let node = document.createElement('script');
node.src = js;
node.type = 'text/javascript';
node.id = elementId;
node.async = async;
node.charset = 'utf-8';
if (callback) {
node.onload = function () {
callback();
};
}
document.getElementsByTagName('head')[0].appendChild(node);
}
else {
if (callback) {
callback();
}
}
}
private loadScriptJsContent(elementId, js, callback): void {
let jivoJs = document.getElementById(elementId);
if (!jivoJs) {
let node = document.createElement('script');
node.innerHTML = js;
node.type = 'text/javascript';
node.id = elementId;
node.charset = 'utf-8';
if (callback) {
callback();
}
document.getElementsByTagName('head')[0].appendChild(node);
}
else {
if (callback) {
callback();
}
}
}
private loadStyleContent(elementId, styleCss): void {
let jivoCss = document.getElementById(elementId);
if (!jivoCss) {
const style = document.createElement('style');
style.id = elementId;
style.innerHTML = styleCss;
document.getElementsByTagName('head')[0].appendChild(style);
}
}
private getValueFromAppConfig(key, defaultValue) {
let enabled = this.appConfigService.getParamValue(key);
if (enabled === undefined) {
return defaultValue;
}
return enabled;
}
ngOnDestroy(): void {
this.currentSessionSubscription.unsubscribe();
}
}

View file

@ -8,7 +8,6 @@ import {
Router Router
} from "@angular/router"; } from "@angular/router";
import {ProgressIndicationService} from "@webbpm/base-package"; import {ProgressIndicationService} from "@webbpm/base-package";
import {AppJivoChatWidgetService} from "../../app/service/app-jivo-chat.service";
@Component({ @Component({
moduleId: module.id, moduleId: module.id,
@ -20,8 +19,7 @@ export class WebbpmComponent {
public footerVisible: boolean = true; public footerVisible: boolean = true;
constructor(private router: Router, constructor(private router: Router,
private progressIndicationService: ProgressIndicationService, private progressIndicationService: ProgressIndicationService) {
private appJivoChatWidgetService: AppJivoChatWidgetService) {
router.events.subscribe((event: Event) => { router.events.subscribe((event: Event) => {
if (event instanceof NavigationStart) { if (event instanceof NavigationStart) {
progressIndicationService.showProgressBar(); progressIndicationService.showProgressBar();

View file

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

View file

@ -1,38 +1,16 @@
import {NgModule} from "@angular/core"; import {NgModule} from "@angular/core";
import {RouterModule, Routes} from "@angular/router"; import {RouterModule, Routes} from "@angular/router";
import {HomeComponent} from "./component/home.component";
import { import {
AuthenticationGuard,
HistoryLocationGuard,
TaskPageRouteResolver,
ConfirmExitGuard ConfirmExitGuard
} from "@webbpm/base-package"; } from "@webbpm/base-package";
import {DYNAMIC_ROUTING} from "../../page.routing";
import {TaskComponent} from "./../app/component/task.component";
import {TaskNotFoundComponent} from "./../app/component/task-not-found.component";
const webbpmRoutes: Routes = [ const webbpmRoutes: Routes = [
{ {
path: '', path: '',
loadChildren: 'generated-sources/page-lkul.module#PagelkulModule', loadChildren: 'generated-sources/page-lkul.module#PagelkulModule',
canActivate: [AuthenticationGuard, ConfirmExitGuard], canActivate: [ConfirmExitGuard],
pathMatch: 'full', pathMatch: 'full',
}, },
{
path: 'process/:processInstanceId/task/:taskId',
component: TaskComponent,
children: DYNAMIC_ROUTING,
canActivate: [HistoryLocationGuard],
resolve: {
taskPage: TaskPageRouteResolver
},
runGuardsAndResolvers: "always"
},
{
path: 'process/task-not-found',
component: TaskNotFoundComponent,
canActivate: [AuthenticationGuard]
},
{ {
path: '**', path: '**',
redirectTo: '', redirectTo: '',

View file

@ -13,13 +13,8 @@ import {
BpmnModule, BpmnModule,
ComponentsModule, ComponentsModule,
CoreModule, CoreModule,
SecurityModule,
} from "@webbpm/base-package"; } from "@webbpm/base-package";
import {TaskParamsProvider} from "@webbpm/base-package";
import {ProcessInstanceParamsProvider} from "@webbpm/base-package";
import {AppRoutingModule} from "../app/app-routing.module"; import {AppRoutingModule} from "../app/app-routing.module";
import {AppJivoChatWidgetService} from "../app/service/app-jivo-chat.service";
import {UserManagementRoutingModule} from "./user-management-routing.module";
import {GlobalErrorHandler} from "./handler/global-error.handler.prod"; import {GlobalErrorHandler} from "./handler/global-error.handler.prod";
import {DEFAULT_HTTP_INTERCEPTOR_PROVIDERS} from "./interceptor/default-interceptors.prod"; import {DEFAULT_HTTP_INTERCEPTOR_PROVIDERS} from "./interceptor/default-interceptors.prod";
@ -31,11 +26,9 @@ let IMPORTS = [
ToastNoAnimationModule.forRoot(), ToastNoAnimationModule.forRoot(),
AgGridModule, AgGridModule,
AppRoutingModule, AppRoutingModule,
UserManagementRoutingModule,
BpmnModule, BpmnModule,
CoreModule, CoreModule,
ComponentsModule, ComponentsModule,
SecurityModule,
AppModule, AppModule,
WebbpmRoutingModule WebbpmRoutingModule
]; ];
@ -48,9 +41,6 @@ let IMPORTS = [
], ],
exports: [], exports: [],
providers: [ providers: [
TaskParamsProvider,
ProcessInstanceParamsProvider,
AppJivoChatWidgetService,
{provide: ErrorHandler, useClass: GlobalErrorHandler}, {provide: ErrorHandler, useClass: GlobalErrorHandler},
DEFAULT_HTTP_INTERCEPTOR_PROVIDERS DEFAULT_HTTP_INTERCEPTOR_PROVIDERS
], ],

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

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