Merge branch 'feature/admin-messages' of github.com:ONLYOFFICE/AppServer into feature/session-lifetime

# Conflicts:
#	packages/asc-web-common/store/AuthStore.js
This commit is contained in:
Viktor Fomin 2022-04-12 11:31:41 +03:00
commit d61612fdf5
72 changed files with 1181 additions and 359 deletions

View File

@ -1,11 +1,15 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DOCUMENT Type="Advanced Installer" CreateVersion="18.6" version="18.6" Modules="enterprise" RootPath="." Language="ru" Id="{2D2C7C0E-FA78-4158-A222-DA463E882AAC}"> <DOCUMENT Type="Advanced Installer" CreateVersion="18.6" version="18.7" Modules="enterprise" RootPath="." Language="ru" Id="{2D2C7C0E-FA78-4158-A222-DA463E882AAC}">
<COMPONENT cid="caphyon.advinst.msicomp.MsiPropsComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiPropsComponent">
<ROW Property="AI_BITMAP_DISPLAY_MODE" Value="0"/> <ROW Property="AI_BITMAP_DISPLAY_MODE" Value="0"/>
<ROW Property="AI_CURRENT_YEAR" Value="2022" ValueLocId="-"/> <ROW Property="AI_CURRENT_YEAR" Value="2022" ValueLocId="-"/>
<ROW Property="AI_PREDEF_LCONDS_PROPS" Value="AI_DETECTED_INTERNET_CONNECTION"/> <ROW Property="AI_PREDEF_LCONDS_PROPS" Value="AI_DETECTED_INTERNET_CONNECTION"/>
<ROW Property="AI_PRODUCTNAME_ARP" Value="Apache Kafka"/>
<ROW Property="AI_UNINSTALLER" Value="msiexec.exe"/>
<ROW Property="ALLUSERS" Value="1"/> <ROW Property="ALLUSERS" Value="1"/>
<ROW Property="ARPCOMMENTS" Value="Эта база данных установщика содержит логику и данные, необходимые для установки [|[ProductName]." ValueLocId="*"/> <ROW Property="ARPNOMODIFY" MultiBuildValue="DefaultBuild:1"/>
<ROW Property="ARPNOREPAIR" Value="1"/>
<ROW Property="ARPSYSTEMCOMPONENT" Value="1"/>
<ROW Property="Manufacturer" Value="Apache"/> <ROW Property="Manufacturer" Value="Apache"/>
<ROW Property="ProductCode" Value="1049:{79F55836-69B9-46CE-B03D-7679D38C0AD4} " Type="16"/> <ROW Property="ProductCode" Value="1049:{79F55836-69B9-46CE-B03D-7679D38C0AD4} " Type="16"/>
<ROW Property="ProductLanguage" Value="1033"/> <ROW Property="ProductLanguage" Value="1033"/>
@ -33,6 +37,8 @@
<ROW Directory="tools_Dir" Directory_Parent="kafka_2.122.8.0_Dir" DefaultDir="tools"/> <ROW Directory="tools_Dir" Directory_Parent="kafka_2.122.8.0_Dir" DefaultDir="tools"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiCompsComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiCompsComponent">
<ROW Component="AI_CustomARPName" ComponentId="{0A28214B-8B18-41A6-8221-28805AFC74D8}" Directory_="APPDIR" Attributes="4" KeyPath="DisplayName" Options="1"/>
<ROW Component="AI_DisableModify" ComponentId="{9AEFD4E1-809A-4BA7-8210-A26107288AD8}" Directory_="APPDIR" Attributes="4" KeyPath="NoModify" Options="1"/>
<ROW Component="APPDIR" ComponentId="{65AA756C-1422-4BF9-9839-FC3C55E40801}" Directory_="APPDIR" Attributes="0"/> <ROW Component="APPDIR" ComponentId="{65AA756C-1422-4BF9-9839-FC3C55E40801}" Directory_="APPDIR" Attributes="0"/>
<ROW Component="Apache" ComponentId="{AD0BEF35-DD7E-47D2-8E16-10F0066B56D7}" Directory_="kafkazookeeper_Dir" Attributes="0"/> <ROW Component="Apache" ComponentId="{AD0BEF35-DD7E-47D2-8E16-10F0066B56D7}" Directory_="kafkazookeeper_Dir" Attributes="0"/>
<ROW Component="ProductInformation" ComponentId="{0A3116F5-AD20-4DBA-A42B-68B3CE9DB645}" Directory_="APPDIR" Attributes="4" KeyPath="Version"/> <ROW Component="ProductInformation" ComponentId="{0A3116F5-AD20-4DBA-A42B-68B3CE9DB645}" Directory_="APPDIR" Attributes="4" KeyPath="Version"/>
@ -128,6 +134,7 @@
<ROW Action="AI_DetectSoftware" Type="257" Source="SoftwareDetector.dll" Target="OnDetectSoftware"/> <ROW Action="AI_DetectSoftware" Type="257" Source="SoftwareDetector.dll" Target="OnDetectSoftware"/>
<ROW Action="AI_DpiContentScale" Type="1" Source="aicustact.dll" Target="DpiContentScale"/> <ROW Action="AI_DpiContentScale" Type="1" Source="aicustact.dll" Target="DpiContentScale"/>
<ROW Action="AI_EnableDebugLog" Type="321" Source="aicustact.dll" Target="EnableDebugLog"/> <ROW Action="AI_EnableDebugLog" Type="321" Source="aicustact.dll" Target="EnableDebugLog"/>
<ROW Action="AI_GetArpIconPath" Type="1" Source="aicustact.dll" Target="GetArpIconPath"/>
<ROW Action="AI_InstallModeCheck" Type="1" Source="aicustact.dll" Target="UpdateInstallMode" WithoutSeq="true"/> <ROW Action="AI_InstallModeCheck" Type="1" Source="aicustact.dll" Target="UpdateInstallMode" WithoutSeq="true"/>
<ROW Action="AI_PREPARE_UPGRADE" Type="65" Source="aicustact.dll" Target="PrepareUpgrade"/> <ROW Action="AI_PREPARE_UPGRADE" Type="65" Source="aicustact.dll" Target="PrepareUpgrade"/>
<ROW Action="AI_ProcessFailActions" Type="1" Source="aicustact.dll" Target="ProcessFailActions" AdditionalSeq="AI_DATA_SETTER_1"/> <ROW Action="AI_ProcessFailActions" Type="1" Source="aicustact.dll" Target="ProcessFailActions" AdditionalSeq="AI_DATA_SETTER_1"/>
@ -157,6 +164,8 @@
<ROW Feature_="MainFeature" Component_="kafka.exe"/> <ROW Feature_="MainFeature" Component_="kafka.exe"/>
<ROW Feature_="MainFeature" Component_="kafka.xml"/> <ROW Feature_="MainFeature" Component_="kafka.xml"/>
<ROW Feature_="MainFeature" Component_="zookeeper.exe"/> <ROW Feature_="MainFeature" Component_="zookeeper.exe"/>
<ROW Feature_="MainFeature" Component_="AI_CustomARPName"/>
<ROW Feature_="MainFeature" Component_="AI_DisableModify"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstExSeqComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiInstExSeqComponent">
<ROW Action="AI_DOWNGRADE" Condition="AI_NEWERPRODUCTFOUND AND (UILevel &lt;&gt; 5)" Sequence="210"/> <ROW Action="AI_DOWNGRADE" Condition="AI_NEWERPRODUCTFOUND AND (UILevel &lt;&gt; 5)" Sequence="210"/>
@ -171,7 +180,7 @@
<ROW Action="AI_DATA_SETTER_1" Sequence="5847"/> <ROW Action="AI_DATA_SETTER_1" Sequence="5847"/>
<ROW Action="AI_TxtUpdaterInstall" Sequence="5101"/> <ROW Action="AI_TxtUpdaterInstall" Sequence="5101"/>
<ROW Action="AI_DetectSoftware" Sequence="101"/> <ROW Action="AI_DetectSoftware" Sequence="101"/>
<ATTRIBUTE name="RegisterProduct" value="false"/> <ROW Action="AI_GetArpIconPath" Sequence="1401"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstallUISequenceComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiInstallUISequenceComponent">
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=&quot;&quot;" Sequence="749"/> <ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=&quot;&quot;" Sequence="749"/>
@ -191,8 +200,36 @@
<ROW Condition="VersionNT" Description="[ProductName] не может быть установлен на [WindowsType9XDisplay]." DescriptionLocId="AI.LaunchCondition.No9X" IsPredefined="true" Builds="DefaultBuild"/> <ROW Condition="VersionNT" Description="[ProductName] не может быть установлен на [WindowsType9XDisplay]." DescriptionLocId="AI.LaunchCondition.No9X" IsPredefined="true" Builds="DefaultBuild"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiRegsComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiRegsComponent">
<ROW Registry="Comments" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Comments" Value="[ARPCOMMENTS]" Component_="AI_CustomARPName"/>
<ROW Registry="Contact" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Contact" Value="[ARPCONTACT]" Component_="AI_CustomARPName"/>
<ROW Registry="CurrentVersion" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion" Name="\"/>
<ROW Registry="DisplayIcon" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayIcon" Value="[ARP_ICON_PATH]" Component_="AI_CustomARPName"/>
<ROW Registry="DisplayName" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayName" Value="[AI_PRODUCTNAME_ARP]" Component_="AI_CustomARPName"/>
<ROW Registry="DisplayVersion" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayVersion" Value="[ProductVersion]" Component_="AI_CustomARPName"/>
<ROW Registry="EstimatedSize" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="EstimatedSize" Value="#[AI_ARP_SIZE]" Component_="AI_CustomARPName" VirtualValue="#"/>
<ROW Registry="HelpLink" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="HelpLink" Value="[ARPHELPLINK]" Component_="AI_CustomARPName"/>
<ROW Registry="HelpTelephone" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="HelpTelephone" Value="[ARPHELPTELEPHONE]" Component_="AI_CustomARPName"/>
<ROW Registry="InstallLocation" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="InstallLocation" Value="[APPDIR]" Component_="AI_CustomARPName"/>
<ROW Registry="Manufacturer" Root="-1" Key="Software\[Manufacturer]" Name="\"/>
<ROW Registry="Microsoft" Root="-1" Key="Software\Microsoft" Name="\"/>
<ROW Registry="ModifyPath" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="ModifyPath" Value="[AI_UNINSTALLER] /i [ProductCode] AI_UNINSTALLER_CTP=1" Component_="AI_CustomARPName"/>
<ROW Registry="NoModify" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="NoModify" Value="#1" Component_="AI_DisableModify" VirtualValue="#"/>
<ROW Registry="NoRepair" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="NoRepair" Value="#1" Component_="AI_CustomARPName" VirtualValue="#"/>
<ROW Registry="Path" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Path" Value="[APPDIR]" Component_="ProductInformation"/> <ROW Registry="Path" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Path" Value="[APPDIR]" Component_="ProductInformation"/>
<ROW Registry="ProductName" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="\"/>
<ROW Registry="ProductNameProductVersion" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="\"/>
<ROW Registry="Publisher" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Publisher" Value="[Manufacturer]" Component_="AI_CustomARPName"/>
<ROW Registry="Readme" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Readme" Value="[ARPREADME]" Component_="AI_CustomARPName"/>
<ROW Registry="Software" Root="-1" Key="Software" Name="\"/>
<ROW Registry="URLInfoAbout" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="URLInfoAbout" Value="[ARPURLINFOABOUT]" Component_="AI_CustomARPName"/>
<ROW Registry="URLUpdateInfo" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="URLUpdateInfo" Value="[ARPURLUPDATEINFO]" Component_="AI_CustomARPName"/>
<ROW Registry="Uninstall" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall" Name="\"/>
<ROW Registry="UninstallPath" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="UninstallPath" Value="[AI_UNINSTALLER] /x [ProductCode] AI_UNINSTALLER_CTP=1" Component_="AI_CustomARPName"/>
<ROW Registry="UninstallString" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="UninstallString" Value="[AI_UNINSTALLER] /x [ProductCode] AI_UNINSTALLER_CTP=1" Component_="AI_CustomARPName"/>
<ROW Registry="Version" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Version" Value="[ProductVersion]" Component_="ProductInformation"/> <ROW Registry="Version" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Version" Value="[ProductVersion]" Component_="ProductInformation"/>
<ROW Registry="VersionMajor" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="VersionMajor" Value="#1" Component_="AI_CustomARPName" VirtualValue="#"/>
<ROW Registry="VersionMinor" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="VersionMinor" Value="#0" Component_="AI_CustomARPName" VirtualValue="#"/>
<ROW Registry="Windows" Root="-1" Key="Software\Microsoft\Windows" Name="\"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiServConfigComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiServConfigComponent">
<ROW MsiServiceConfig="Apache_Kafka" Name="[ServiceName_Apache_Kafka]" Event="1" ConfigType="3" Argument="1" Component_="kafka.exe"/> <ROW MsiServiceConfig="Apache_Kafka" Name="[ServiceName_Apache_Kafka]" Event="1" ConfigType="3" Argument="1" Component_="kafka.exe"/>

View File

@ -1,10 +1,14 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DOCUMENT Type="Advanced Installer" CreateVersion="18.6.1" version="18.6.1" Modules="enterprise" RootPath="." Language="ru" Id="{93F1E21E-F074-444A-9756-659088E0DA02}"> <DOCUMENT Type="Advanced Installer" CreateVersion="18.6.1" version="18.7" Modules="enterprise" RootPath="." Language="ru" Id="{93F1E21E-F074-444A-9756-659088E0DA02}">
<COMPONENT cid="caphyon.advinst.msicomp.MsiPropsComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiPropsComponent">
<ROW Property="AI_BITMAP_DISPLAY_MODE" Value="0"/> <ROW Property="AI_BITMAP_DISPLAY_MODE" Value="0"/>
<ROW Property="AI_CURRENT_YEAR" Value="2022" ValueLocId="-"/> <ROW Property="AI_CURRENT_YEAR" Value="2022" ValueLocId="-"/>
<ROW Property="AI_PRODUCTNAME_ARP" Value="Apache ZooKeeper"/>
<ROW Property="AI_UNINSTALLER" Value="msiexec.exe"/>
<ROW Property="ALLUSERS" Value="1"/> <ROW Property="ALLUSERS" Value="1"/>
<ROW Property="ARPCOMMENTS" Value="Эта база данных установщика содержит логику и данные, необходимые для установки [|[ProductName]." ValueLocId="*"/> <ROW Property="ARPNOMODIFY" MultiBuildValue="DefaultBuild:1"/>
<ROW Property="ARPNOREPAIR" Value="1"/>
<ROW Property="ARPSYSTEMCOMPONENT" Value="1"/>
<ROW Property="Manufacturer" Value="Apache"/> <ROW Property="Manufacturer" Value="Apache"/>
<ROW Property="ProductCode" Value="1049:{DA471CF9-78DC-4D13-AB18-87B4604538FA} " Type="16"/> <ROW Property="ProductCode" Value="1049:{DA471CF9-78DC-4D13-AB18-87B4604538FA} " Type="16"/>
<ROW Property="ProductLanguage" Value="1033"/> <ROW Property="ProductLanguage" Value="1033"/>
@ -29,6 +33,8 @@
<ROW Directory="kafkazookeeper_Dir" Directory_Parent="WindowsVolume" DefaultDir="Apache"/> <ROW Directory="kafkazookeeper_Dir" Directory_Parent="WindowsVolume" DefaultDir="Apache"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiCompsComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiCompsComponent">
<ROW Component="AI_CustomARPName" ComponentId="{DA50695D-FCFD-46A6-90BD-50D219311605}" Directory_="APPDIR" Attributes="4" KeyPath="DisplayName" Options="1"/>
<ROW Component="AI_DisableModify" ComponentId="{01A44BB2-4D9C-4BE1-A645-EDB8A011DC61}" Directory_="APPDIR" Attributes="4" KeyPath="NoModify" Options="1"/>
<ROW Component="APPDIR" ComponentId="{7C252C97-43D5-4EE8-884E-1BF7D1A2D490}" Directory_="APPDIR" Attributes="0"/> <ROW Component="APPDIR" ComponentId="{7C252C97-43D5-4EE8-884E-1BF7D1A2D490}" Directory_="APPDIR" Attributes="0"/>
<ROW Component="ProductInformation" ComponentId="{0903BE7F-28BE-4981-B82B-2D9A86C43A63}" Directory_="APPDIR" Attributes="4" KeyPath="Version"/> <ROW Component="ProductInformation" ComponentId="{0903BE7F-28BE-4981-B82B-2D9A86C43A63}" Directory_="APPDIR" Attributes="4" KeyPath="Version"/>
<ROW Component="zookeeper" ComponentId="{F2EFFE90-2C47-4BAF-9541-143E8ADF5B4B}" Directory_="apachezookeeper3.7.0bin_Dir" Attributes="0"/> <ROW Component="zookeeper" ComponentId="{F2EFFE90-2C47-4BAF-9541-143E8ADF5B4B}" Directory_="apachezookeeper3.7.0bin_Dir" Attributes="0"/>
@ -99,6 +105,7 @@
<ROW Action="AI_DOWNGRADE" Type="19" Target="4010"/> <ROW Action="AI_DOWNGRADE" Type="19" Target="4010"/>
<ROW Action="AI_DpiContentScale" Type="1" Source="aicustact.dll" Target="DpiContentScale"/> <ROW Action="AI_DpiContentScale" Type="1" Source="aicustact.dll" Target="DpiContentScale"/>
<ROW Action="AI_EnableDebugLog" Type="321" Source="aicustact.dll" Target="EnableDebugLog"/> <ROW Action="AI_EnableDebugLog" Type="321" Source="aicustact.dll" Target="EnableDebugLog"/>
<ROW Action="AI_GetArpIconPath" Type="1" Source="aicustact.dll" Target="GetArpIconPath"/>
<ROW Action="AI_InstallModeCheck" Type="1" Source="aicustact.dll" Target="UpdateInstallMode" WithoutSeq="true"/> <ROW Action="AI_InstallModeCheck" Type="1" Source="aicustact.dll" Target="UpdateInstallMode" WithoutSeq="true"/>
<ROW Action="AI_PREPARE_UPGRADE" Type="65" Source="aicustact.dll" Target="PrepareUpgrade"/> <ROW Action="AI_PREPARE_UPGRADE" Type="65" Source="aicustact.dll" Target="PrepareUpgrade"/>
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH" Target="[AI_SETUPEXEPATH_ORIGINAL]"/> <ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH" Target="[AI_SETUPEXEPATH_ORIGINAL]"/>
@ -116,6 +123,8 @@
<ROW Feature_="MainFeature" Component_="APPDIR"/> <ROW Feature_="MainFeature" Component_="APPDIR"/>
<ROW Feature_="MainFeature" Component_="ProductInformation"/> <ROW Feature_="MainFeature" Component_="ProductInformation"/>
<ROW Feature_="MainFeature" Component_="zookeeper"/> <ROW Feature_="MainFeature" Component_="zookeeper"/>
<ROW Feature_="MainFeature" Component_="AI_CustomARPName"/>
<ROW Feature_="MainFeature" Component_="AI_DisableModify"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstExSeqComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiInstExSeqComponent">
<ROW Action="AI_DOWNGRADE" Condition="AI_NEWERPRODUCTFOUND AND (UILevel &lt;&gt; 5)" Sequence="210"/> <ROW Action="AI_DOWNGRADE" Condition="AI_NEWERPRODUCTFOUND AND (UILevel &lt;&gt; 5)" Sequence="210"/>
@ -126,7 +135,7 @@
<ROW Action="AI_EnableDebugLog" Sequence="51"/> <ROW Action="AI_EnableDebugLog" Sequence="51"/>
<ROW Action="RemoveManufactorDir" Condition="( NOT Installed )" Sequence="6602"/> <ROW Action="RemoveManufactorDir" Condition="( NOT Installed )" Sequence="6602"/>
<ROW Action="AI_DATA_SETTER_2" Condition="( NOT Installed )" Sequence="6601"/> <ROW Action="AI_DATA_SETTER_2" Condition="( NOT Installed )" Sequence="6601"/>
<ATTRIBUTE name="RegisterProduct" value="false"/> <ROW Action="AI_GetArpIconPath" Sequence="1401"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstallUISequenceComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiInstallUISequenceComponent">
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=&quot;&quot;" Sequence="749"/> <ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=&quot;&quot;" Sequence="749"/>
@ -144,8 +153,36 @@
<ROW Condition="VersionNT" Description="[ProductName] не может быть установлен на [WindowsType9XDisplay]." DescriptionLocId="AI.LaunchCondition.No9X" IsPredefined="true" Builds="DefaultBuild"/> <ROW Condition="VersionNT" Description="[ProductName] не может быть установлен на [WindowsType9XDisplay]." DescriptionLocId="AI.LaunchCondition.No9X" IsPredefined="true" Builds="DefaultBuild"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiRegsComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiRegsComponent">
<ROW Registry="Comments" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Comments" Value="[ARPCOMMENTS]" Component_="AI_CustomARPName"/>
<ROW Registry="Contact" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Contact" Value="[ARPCONTACT]" Component_="AI_CustomARPName"/>
<ROW Registry="CurrentVersion" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion" Name="\"/>
<ROW Registry="DisplayIcon" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayIcon" Value="[ARP_ICON_PATH]" Component_="AI_CustomARPName"/>
<ROW Registry="DisplayName" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayName" Value="[AI_PRODUCTNAME_ARP]" Component_="AI_CustomARPName"/>
<ROW Registry="DisplayVersion" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayVersion" Value="[ProductVersion]" Component_="AI_CustomARPName"/>
<ROW Registry="EstimatedSize" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="EstimatedSize" Value="#[AI_ARP_SIZE]" Component_="AI_CustomARPName" VirtualValue="#"/>
<ROW Registry="HelpLink" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="HelpLink" Value="[ARPHELPLINK]" Component_="AI_CustomARPName"/>
<ROW Registry="HelpTelephone" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="HelpTelephone" Value="[ARPHELPTELEPHONE]" Component_="AI_CustomARPName"/>
<ROW Registry="InstallLocation" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="InstallLocation" Value="[APPDIR]" Component_="AI_CustomARPName"/>
<ROW Registry="Manufacturer" Root="-1" Key="Software\[Manufacturer]" Name="\"/>
<ROW Registry="Microsoft" Root="-1" Key="Software\Microsoft" Name="\"/>
<ROW Registry="ModifyPath" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="ModifyPath" Value="[AI_UNINSTALLER] /i [ProductCode] AI_UNINSTALLER_CTP=1" Component_="AI_CustomARPName"/>
<ROW Registry="NoModify" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="NoModify" Value="#1" Component_="AI_DisableModify" VirtualValue="#"/>
<ROW Registry="NoRepair" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="NoRepair" Value="#1" Component_="AI_CustomARPName" VirtualValue="#"/>
<ROW Registry="Path" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Path" Value="[APPDIR]" Component_="ProductInformation"/> <ROW Registry="Path" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Path" Value="[APPDIR]" Component_="ProductInformation"/>
<ROW Registry="ProductName" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="\"/>
<ROW Registry="ProductNameProductVersion" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="\"/>
<ROW Registry="Publisher" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Publisher" Value="[Manufacturer]" Component_="AI_CustomARPName"/>
<ROW Registry="Readme" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Readme" Value="[ARPREADME]" Component_="AI_CustomARPName"/>
<ROW Registry="Software" Root="-1" Key="Software" Name="\"/>
<ROW Registry="URLInfoAbout" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="URLInfoAbout" Value="[ARPURLINFOABOUT]" Component_="AI_CustomARPName"/>
<ROW Registry="URLUpdateInfo" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="URLUpdateInfo" Value="[ARPURLUPDATEINFO]" Component_="AI_CustomARPName"/>
<ROW Registry="Uninstall" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall" Name="\"/>
<ROW Registry="UninstallPath" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="UninstallPath" Value="[AI_UNINSTALLER] /x [ProductCode] AI_UNINSTALLER_CTP=1" Component_="AI_CustomARPName"/>
<ROW Registry="UninstallString" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="UninstallString" Value="[AI_UNINSTALLER] /x [ProductCode] AI_UNINSTALLER_CTP=1" Component_="AI_CustomARPName"/>
<ROW Registry="Version" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Version" Value="[ProductVersion]" Component_="ProductInformation"/> <ROW Registry="Version" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Version" Value="[ProductVersion]" Component_="ProductInformation"/>
<ROW Registry="VersionMajor" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="VersionMajor" Value="#1" Component_="AI_CustomARPName" VirtualValue="#"/>
<ROW Registry="VersionMinor" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="VersionMinor" Value="#0" Component_="AI_CustomARPName" VirtualValue="#"/>
<ROW Registry="Windows" Root="-1" Key="Software\Microsoft\Windows" Name="\"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiThemeComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiThemeComponent">
<ATTRIBUTE name="UsedTheme" value="classic"/> <ATTRIBUTE name="UsedTheme" value="classic"/>

View File

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DOCUMENT Type="Advanced Installer" CreateVersion="18.4" version="18.7" Modules="enterprise" RootPath="." Language="ru" Id="{54B168F8-13C3-42BC-B783-24F5F6D98365}"> <DOCUMENT Type="Advanced Installer" CreateVersion="18.4" version="18.7" Modules="enterprise" RootPath="." Language="en" Id="{54B168F8-13C3-42BC-B783-24F5F6D98365}">
<COMPONENT cid="caphyon.advinst.msicomp.MsiPropsComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiPropsComponent">
<ROW Property="AI_BITMAP_DISPLAY_MODE" Value="0"/> <ROW Property="AI_BITMAP_DISPLAY_MODE" Value="0"/>
<ROW Property="AI_CURRENT_YEAR" Value="2022" ValueLocId="-"/> <ROW Property="AI_CURRENT_YEAR" Value="2022" ValueLocId="-"/>
<ROW Property="AI_FINDEXE_TITLE" Value="Выберите установочный пакет для [|ProductName]" ValueLocId="AI.Property.FindExeTitle"/> <ROW Property="AI_FINDEXE_TITLE" Value="Select the installation package for [|ProductName]" ValueLocId="AI.Property.FindExeTitle"/>
<ROW Property="AI_PREDEF_LCONDS_PROPS" Value="AI_DETECTED_INTERNET_CONNECTION"/> <ROW Property="AI_PREDEF_LCONDS_PROPS" Value="AI_DETECTED_INTERNET_CONNECTION"/>
<ROW Property="AI_PRODUCTNAME_ARP" Value="[|ProductName]"/> <ROW Property="AI_PRODUCTNAME_ARP" Value="[|ProductName]"/>
<ROW Property="AI_UNINSTALLER" Value="msiexec.exe"/> <ROW Property="AI_UNINSTALLER" Value="msiexec.exe"/>
@ -28,6 +28,10 @@
<ROW Property="ELASTICSEARCH_SCHEME" Value="http" ValueLocId="-"/> <ROW Property="ELASTICSEARCH_SCHEME" Value="http" ValueLocId="-"/>
<ROW Property="ENVIRONMENT" Value="test"/> <ROW Property="ENVIRONMENT" Value="test"/>
<ROW Property="INSTALL_ROOT_FOLDER_NAME" Value="[|Manufacturer]"/> <ROW Property="INSTALL_ROOT_FOLDER_NAME" Value="[|Manufacturer]"/>
<ROW Property="KAFKA_HOST" Value="localhost"/>
<ROW Property="KAFKA_MSG" Value="Unable to connect to remote Kafka server at "/>
<ROW Property="KAFKA_PORT" Value="9092"/>
<ROW Property="KAFKA_SCHEME" Value="http"/>
<ROW Property="MSIFASTINSTALL" MultiBuildValue="DefaultBuild:3"/> <ROW Property="MSIFASTINSTALL" MultiBuildValue="DefaultBuild:3"/>
<ROW Property="MYSQLODBCDRIVER" Value="MySQL ODBC 8.0 Unicode Driver"/> <ROW Property="MYSQLODBCDRIVER" Value="MySQL ODBC 8.0 Unicode Driver"/>
<ROW Property="Manufacturer" Value="Ascensio System SIA"/> <ROW Property="Manufacturer" Value="Ascensio System SIA"/>
@ -36,8 +40,8 @@
<ROW Property="PACKAGE_NAME" Value="ONLYOFFICE_AppServer_Win-install.v[|ProductVersion]"/> <ROW Property="PACKAGE_NAME" Value="ONLYOFFICE_AppServer_Win-install.v[|ProductVersion]"/>
<ROW Property="PASSWORD_PROP" Value="root"/> <ROW Property="PASSWORD_PROP" Value="root"/>
<ROW Property="PORT_PROP" Value="3306"/> <ROW Property="PORT_PROP" Value="3306"/>
<ROW Property="ProductCode" Value="1049:{3FABEB4A-D27F-4BA6-A40E-16BE47540727} " Type="16"/> <ROW Property="ProductCode" Value="1033:{3FABEB4A-D27F-4BA6-A40E-16BE47540727} " Type="16"/>
<ROW Property="ProductLanguage" Value="1049"/> <ROW Property="ProductLanguage" Value="1033"/>
<ROW Property="ProductName" Value="ONLYOFFICE AppServer [|ProductVersion]"/> <ROW Property="ProductName" Value="ONLYOFFICE AppServer [|ProductVersion]"/>
<ROW Property="ProductVersion" Value="1.0.0" Type="32"/> <ROW Property="ProductVersion" Value="1.0.0" Type="32"/>
<ROW Property="SERVER_PROP" Value="localhost"/> <ROW Property="SERVER_PROP" Value="localhost"/>
@ -74,6 +78,10 @@
<ROW Property="WindowsTypeNT50Display" MultiBuildValue="DefaultBuild:Windows 2000" ValueLocId="-"/> <ROW Property="WindowsTypeNT50Display" MultiBuildValue="DefaultBuild:Windows 2000" ValueLocId="-"/>
<ROW Property="WindowsTypeNT5X" MultiBuildValue="DefaultBuild:Windows XP/2003" ValueLocId="-"/> <ROW Property="WindowsTypeNT5X" MultiBuildValue="DefaultBuild:Windows XP/2003" ValueLocId="-"/>
<ROW Property="WindowsTypeNT5XDisplay" MultiBuildValue="DefaultBuild:Windows XP/2003" ValueLocId="-"/> <ROW Property="WindowsTypeNT5XDisplay" MultiBuildValue="DefaultBuild:Windows XP/2003" ValueLocId="-"/>
<ROW Property="ZOOKEEPER_HOST" Value="localhost"/>
<ROW Property="ZOOKEEPER_MSG" Value="Unable to connect to remote ZooKeeper server at "/>
<ROW Property="ZOOKEEPER_PORT" Value="2181"/>
<ROW Property="ZOOKEEPER_SCHEME" Value="http"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiDirsComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiDirsComponent">
<ROW Directory="APPDIR" Directory_Parent="TARGETDIR" DefaultDir="APPDIR:." IsPseudoRoot="1"/> <ROW Directory="APPDIR" Directory_Parent="TARGETDIR" DefaultDir="APPDIR:." IsPseudoRoot="1"/>
@ -176,11 +184,11 @@
<ROW Action="AI_DetectSoftware" Sequence="151"/> <ROW Action="AI_DetectSoftware" Sequence="151"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.BuildComponent"> <COMPONENT cid="caphyon.advinst.msicomp.BuildComponent">
<ROW BuildKey="DefaultBuild" BuildName="ONLYOFFICE_EXE" BuildOrder="1" BuildType="0" PackageFolder="publish" PackageFileName="[|PACKAGE_NAME]" Languages="ru" InstallationType="4" CabsLocation="1" PackageType="1" FilesInsideExe="true" ExeIconPath="Resources\icon.ico" ExtractionFolder="[AppDataFolder][|INSTALL_ROOT_FOLDER_NAME]\AppServer\install" ExtUI="true" UseLargeSchema="true" Unicode="true" ExeName="[|PACKAGE_NAME]" UACExecutionLevel="2"/> <ROW BuildKey="DefaultBuild" BuildName="ONLYOFFICE_EXE" BuildOrder="1" BuildType="0" PackageFolder="publish" PackageFileName="[|PACKAGE_NAME]" Languages="en" InstallationType="4" CabsLocation="1" PackageType="1" FilesInsideExe="true" ExeIconPath="Resources\icon.ico" ExtractionFolder="[AppDataFolder][|INSTALL_ROOT_FOLDER_NAME]\AppServer\install" ExtUI="true" UseLargeSchema="true" Unicode="true" ExeName="[|PACKAGE_NAME]" UACExecutionLevel="2"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.DictionaryComponent"> <COMPONENT cid="caphyon.advinst.msicomp.DictionaryComponent">
<ROW Path="&lt;AI_DICTS&gt;ui.ail"/> <ROW Path="&lt;AI_DICTS&gt;ui.ail"/>
<ROW Path="&lt;AI_DICTS&gt;ui_ru.ail"/> <ROW Path="&lt;AI_DICTS&gt;ui_en.ail"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.FragmentComponent"> <COMPONENT cid="caphyon.advinst.msicomp.FragmentComponent">
<ROW Fragment="CommonUI.aip" Path="&lt;AI_FRAGS&gt;CommonUI.aip"/> <ROW Fragment="CommonUI.aip" Path="&lt;AI_FRAGS&gt;CommonUI.aip"/>
@ -213,22 +221,22 @@
<ROW JsonProperty="migration" Parent="Root_1" Name="migration" Condition="1" Order="1" Flags="60"/> <ROW JsonProperty="migration" Parent="Root_1" Name="migration" Condition="1" Order="1" Flags="60"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiActionTextComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiActionTextComponent">
<ROW Action="AI_ConfigFailActions" Description="Настройка действия при сбое службы" DescriptionLocId="ActionText.Description.AI_ConfigFailActions" Template="Служба: [1]" TemplateLocId="ActionText.Template.AI_ConfigFailActions"/> <ROW Action="AI_ConfigFailActions" Description="Configure service failure actions" DescriptionLocId="ActionText.Description.AI_ConfigFailActions" Template="Service: [1]" TemplateLocId="ActionText.Template.AI_ConfigFailActions"/>
<ROW Action="AI_DeleteLzma" Description="Удаление извлеченных файлов из архива" DescriptionLocId="ActionText.Description.AI_DeleteLzma" TemplateLocId="-"/> <ROW Action="AI_DeleteLzma" Description="Deleting files extracted from archive" DescriptionLocId="ActionText.Description.AI_DeleteLzma" TemplateLocId="-"/>
<ROW Action="AI_DeleteRLzma" Description="Удаление извлеченных файлов из архива" DescriptionLocId="ActionText.Description.AI_DeleteLzma" TemplateLocId="-"/> <ROW Action="AI_DeleteRLzma" Description="Deleting files extracted from archive" DescriptionLocId="ActionText.Description.AI_DeleteLzma" TemplateLocId="-"/>
<ROW Action="AI_ExtractFiles" Description="Извлечение файлов из архива" DescriptionLocId="ActionText.Description.AI_ExtractLzma" TemplateLocId="-"/> <ROW Action="AI_ExtractFiles" Description="Extracting files from archive" DescriptionLocId="ActionText.Description.AI_ExtractLzma" TemplateLocId="-"/>
<ROW Action="AI_ExtractLzma" Description="Извлечение файлов из архива" DescriptionLocId="ActionText.Description.AI_ExtractLzma" TemplateLocId="-"/> <ROW Action="AI_ExtractLzma" Description="Extracting files from archive" DescriptionLocId="ActionText.Description.AI_ExtractLzma" TemplateLocId="-"/>
<ROW Action="AI_JsonCommit" Description="Фиксация JSON-файла конфигурации." DescriptionLocId="ActionText.Description.AI_JsonCommit" Template="Фиксация JSON-файла конфигурации." TemplateLocId="ActionText.Template.AI_JsonCommit"/> <ROW Action="AI_JsonCommit" Description="Committing JSON file configurations." DescriptionLocId="ActionText.Description.AI_JsonCommit" Template="Committing JSON file configurations." TemplateLocId="ActionText.Template.AI_JsonCommit"/>
<ROW Action="AI_JsonConfig" Description="Выполнение файла конфигурации JSON" DescriptionLocId="ActionText.Description.AI_JsonConfig" Template="Настройка JSON-файла: &quot;[1]&quot;" TemplateLocId="ActionText.Template.AI_JsonConfig"/> <ROW Action="AI_JsonConfig" Description="Executing JSON file configurations" DescriptionLocId="ActionText.Description.AI_JsonConfig" Template="Configuring JSON file: &quot;[1]&quot;" TemplateLocId="ActionText.Template.AI_JsonConfig"/>
<ROW Action="AI_JsonInstall" Description="Создание действий для настройки JSON-файлов" DescriptionLocId="ActionText.Description.AI_JsonInstall"/> <ROW Action="AI_JsonInstall" Description="Generating actions to configure JSON files" DescriptionLocId="ActionText.Description.AI_JsonInstall"/>
<ROW Action="AI_JsonRemove" Description="Выполнение файла конфигурации JSON" DescriptionLocId="ActionText.Description.AI_JsonRemove" Template="Настройка JSON-файла: &quot;[1]&quot;" TemplateLocId="ActionText.Template.AI_JsonRemove"/> <ROW Action="AI_JsonRemove" Description="Executing JSON file configurations" DescriptionLocId="ActionText.Description.AI_JsonRemove" Template="Configuring JSON file: &quot;[1]&quot;" TemplateLocId="ActionText.Template.AI_JsonRemove"/>
<ROW Action="AI_JsonRollback" Description="Откат файлов конфигурации JSON." DescriptionLocId="ActionText.Description.AI_JsonRollback" Template="Откат файлов конфигурации JSON." TemplateLocId="ActionText.Template.AI_JsonRollback"/> <ROW Action="AI_JsonRollback" Description="Rolling back JSON file configurations." DescriptionLocId="ActionText.Description.AI_JsonRollback" Template="Rolling back JSON file configurations." TemplateLocId="ActionText.Template.AI_JsonRollback"/>
<ROW Action="AI_JsonUninstall" Description="Создание действий для настройки JSON-файлов" DescriptionLocId="ActionText.Description.AI_JsonUninstall"/> <ROW Action="AI_JsonUninstall" Description="Generating actions to configure JSON files" DescriptionLocId="ActionText.Description.AI_JsonUninstall"/>
<ROW Action="AI_ProcessFailActions" Description="Создание действия для настройки действия при сбое службы" DescriptionLocId="ActionText.Description.AI_ProcessFailActions" Template="Служба: [1]" TemplateLocId="ActionText.Template.AI_ProcessFailActions"/> <ROW Action="AI_ProcessFailActions" Description="Generating actions to configure service failure actions" DescriptionLocId="ActionText.Description.AI_ProcessFailActions" Template="Service: [1]" TemplateLocId="ActionText.Template.AI_ProcessFailActions"/>
<ROW Action="AI_TxtUpdaterCommit" Description="Фиксация изменений текстового файла." DescriptionLocId="ActionText.Description.AI_TxtUpdaterCommit" Template="Фиксация изменений текстового файла." TemplateLocId="ActionText.Template.AI_TxtUpdaterCommit"/> <ROW Action="AI_TxtUpdaterCommit" Description="Commit text file changes." DescriptionLocId="ActionText.Description.AI_TxtUpdaterCommit" Template="Commit text file changes." TemplateLocId="ActionText.Template.AI_TxtUpdaterCommit"/>
<ROW Action="AI_TxtUpdaterConfig" Description="Выполнение обновления текстового файла" DescriptionLocId="ActionText.Description.AI_TxtUpdaterConfig" Template="Обновление текстового файла: &quot;[1]&quot;" TemplateLocId="ActionText.Template.AI_TxtUpdaterConfig"/> <ROW Action="AI_TxtUpdaterConfig" Description="Executing text file updates" DescriptionLocId="ActionText.Description.AI_TxtUpdaterConfig" Template="Updating text file: &quot;[1]&quot;" TemplateLocId="ActionText.Template.AI_TxtUpdaterConfig"/>
<ROW Action="AI_TxtUpdaterInstall" Description="Создание действий для настройки текстовых файлов обновлений" DescriptionLocId="ActionText.Description.AI_TxtUpdaterInstall"/> <ROW Action="AI_TxtUpdaterInstall" Description="Generating actions to configure text files updates" DescriptionLocId="ActionText.Description.AI_TxtUpdaterInstall"/>
<ROW Action="AI_TxtUpdaterRollback" Description="Откат изменений текстового файла." DescriptionLocId="ActionText.Description.AI_TxtUpdaterRollback" Template="Откат изменений текстового файла." TemplateLocId="ActionText.Template.AI_TxtUpdaterRollback"/> <ROW Action="AI_TxtUpdaterRollback" Description="Rolling back text file changes." DescriptionLocId="ActionText.Description.AI_TxtUpdaterRollback" Template="Rolling back text file changes." TemplateLocId="ActionText.Template.AI_TxtUpdaterRollback"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiAppSearchComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiAppSearchComponent">
<ROW Property="AI_SETUPEXEPATH" Signature_="AI_EXE_PATH_LM" Builds="DefaultBuild"/> <ROW Property="AI_SETUPEXEPATH" Signature_="AI_EXE_PATH_LM" Builds="DefaultBuild"/>
@ -243,6 +251,7 @@
<ROW Name="jsonCfg.dll" SourcePath="&lt;AI_CUSTACTS&gt;jsonCfg.dll"/> <ROW Name="jsonCfg.dll" SourcePath="&lt;AI_CUSTACTS&gt;jsonCfg.dll"/>
<ROW Name="lzmaextractor.dll" SourcePath="&lt;AI_CUSTACTS&gt;lzmaextractor.dll"/> <ROW Name="lzmaextractor.dll" SourcePath="&lt;AI_CUSTACTS&gt;lzmaextractor.dll"/>
<ROW Name="utils.vbs" SourcePath="utils.vbs"/> <ROW Name="utils.vbs" SourcePath="utils.vbs"/>
<ROW Name="Utils.CA.dll" SourcePath="Utils.CA.dll"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiControlComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiControlComponent">
<ROW Dialog_="AdminInstallPointDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="600" TextLocId="-" MsiKey="AdminInstallPointDlg#Back" Options="1"/> <ROW Dialog_="AdminInstallPointDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="600" TextLocId="-" MsiKey="AdminInstallPointDlg#Back" Options="1"/>
@ -254,9 +263,9 @@
<ROW Dialog_="ELKConnectionDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="[BannerBitmap]" Order="400"/> <ROW Dialog_="ELKConnectionDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="[BannerBitmap]" Order="400"/>
<ROW Dialog_="ELKConnectionDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="500"/> <ROW Dialog_="ELKConnectionDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="500"/>
<ROW Dialog_="ELKConnectionDlg" Control="BottomLine" Type="Line" X="5" Y="234" Width="368" Height="0" Attributes="1" Order="600"/> <ROW Dialog_="ELKConnectionDlg" Control="BottomLine" Type="Line" X="5" Y="234" Width="368" Height="0" Attributes="1" Order="600"/>
<ROW Dialog_="ELKConnectionDlg" Control="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Attributes="196611" Text="Описание нового диалогового окна..." Order="700"/> <ROW Dialog_="ELKConnectionDlg" Control="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Attributes="196611" Text="Настройка подключения Elasticsearch..." Order="700"/>
<ROW Dialog_="ELKConnectionDlg" Control="Logo" Type="Text" X="4" Y="228" Width="70" Height="12" Attributes="1" Text="Advanced Installer" Order="800"/> <ROW Dialog_="ELKConnectionDlg" Control="Logo" Type="Text" X="4" Y="228" Width="70" Height="12" Attributes="1" Text="Advanced Installer" Order="800"/>
<ROW Dialog_="ELKConnectionDlg" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="Новое диалоговое окно" TextStyle="[DlgTitleFont]" Order="900"/> <ROW Dialog_="ELKConnectionDlg" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="Elasticsearch настройки подключения" TextStyle="[DlgTitleFont]" Order="900"/>
<ROW Dialog_="ELKConnectionDlg" Control="ProtocolLabel" Type="Text" X="25" Y="65" Width="67" Height="11" Attributes="65539" Text="Protocol" Order="1000"/> <ROW Dialog_="ELKConnectionDlg" Control="ProtocolLabel" Type="Text" X="25" Y="65" Width="67" Height="11" Attributes="65539" Text="Protocol" Order="1000"/>
<ROW Dialog_="ELKConnectionDlg" Control="ServerLabel" Type="Text" X="25" Y="92" Width="67" Height="11" Attributes="65539" Text="Server:" Order="1100"/> <ROW Dialog_="ELKConnectionDlg" Control="ServerLabel" Type="Text" X="25" Y="92" Width="67" Height="11" Attributes="65539" Text="Server:" Order="1100"/>
<ROW Dialog_="ELKConnectionDlg" Control="PortLabel" Type="Text" X="25" Y="119" Width="67" Height="11" Attributes="65539" Text="Port:" Order="1200"/> <ROW Dialog_="ELKConnectionDlg" Control="PortLabel" Type="Text" X="25" Y="119" Width="67" Height="11" Attributes="65539" Text="Port:" Order="1200"/>
@ -265,7 +274,23 @@
<ROW Dialog_="ELKConnectionDlg" Control="PortEdit" Type="Edit" X="98" Y="116" Width="253" Height="18" Attributes="19" Property="ELASTICSEARCH_PORT" Text="{7}" Order="1500"/> <ROW Dialog_="ELKConnectionDlg" Control="PortEdit" Type="Edit" X="98" Y="116" Width="253" Height="18" Attributes="19" Property="ELASTICSEARCH_PORT" Text="{7}" Order="1500"/>
<ROW Dialog_="ExitDialog" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="400" TextLocId="-" MsiKey="ExitDialog#Back" Options="1"/> <ROW Dialog_="ExitDialog" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="400" TextLocId="-" MsiKey="ExitDialog#Back" Options="1"/>
<ROW Dialog_="FatalError" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="400" TextLocId="-" MsiKey="FatalError#Back" Options="1"/> <ROW Dialog_="FatalError" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="400" TextLocId="-" MsiKey="FatalError#Back" Options="1"/>
<ROW Dialog_="FolderDlg" Control="FolderEdit" Type="PathEdit" X="18" Y="126" Width="252" Height="18" Attributes="7" Property="APPDIR" Help="|" Order="300" HelpLocId="Control.Help.FolderDlg#FolderEdit" MsiKey="FolderDlg#FolderEdit"/>
<ROW Dialog_="FolderDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="800" TextLocId="-" MsiKey="FolderDlg#Back" Options="1"/> <ROW Dialog_="FolderDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="800" TextLocId="-" MsiKey="FolderDlg#Back" Options="1"/>
<ROW Dialog_="KAFKAConnectionDlg" Control="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Next]" Order="100" Options="1"/>
<ROW Dialog_="KAFKAConnectionDlg" Control="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Cancel]" Order="200" Options="1"/>
<ROW Dialog_="KAFKAConnectionDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="300" Options="1"/>
<ROW Dialog_="KAFKAConnectionDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="[BannerBitmap]" Order="400"/>
<ROW Dialog_="KAFKAConnectionDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="500"/>
<ROW Dialog_="KAFKAConnectionDlg" Control="BottomLine" Type="Line" X="5" Y="234" Width="368" Height="0" Attributes="1" Order="600"/>
<ROW Dialog_="KAFKAConnectionDlg" Control="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Attributes="196611" Text="Настройка подключения Kafka..." Order="700"/>
<ROW Dialog_="KAFKAConnectionDlg" Control="Logo" Type="Text" X="4" Y="228" Width="70" Height="12" Attributes="1" Text="Advanced Installer" Order="800"/>
<ROW Dialog_="KAFKAConnectionDlg" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="Kafka настройки подключения" TextStyle="[DlgTitleFont]" Order="900"/>
<ROW Dialog_="KAFKAConnectionDlg" Control="ProtocolLabel" Type="Text" X="25" Y="65" Width="67" Height="11" Attributes="65539" Text="Protocol" Order="1000"/>
<ROW Dialog_="KAFKAConnectionDlg" Control="ServerLabel" Type="Text" X="25" Y="92" Width="67" Height="11" Attributes="65539" Text="Server:" Order="1100"/>
<ROW Dialog_="KAFKAConnectionDlg" Control="PortLabel" Type="Text" X="25" Y="119" Width="67" Height="11" Attributes="65539" Text="Port:" Order="1200"/>
<ROW Dialog_="KAFKAConnectionDlg" Control="ProtocolEdit" Type="Edit" X="98" Y="61" Width="253" Height="18" Attributes="3" Property="KAFKA_SCHEME" Text="{5}" Order="1300"/>
<ROW Dialog_="KAFKAConnectionDlg" Control="ServerEdit" Type="Edit" X="98" Y="89" Width="253" Height="18" Attributes="3" Property="KAFKA_HOST" Text="[ComputerName]" Order="1400"/>
<ROW Dialog_="KAFKAConnectionDlg" Control="PortEdit" Type="Edit" X="98" Y="116" Width="253" Height="18" Attributes="19" Property="KAFKA_PORT" Text="{7}" Order="1500"/>
<ROW Dialog_="MaintenanceTypeDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="700" TextLocId="-" MsiKey="MaintenanceTypeDlg#Back" Options="1"/> <ROW Dialog_="MaintenanceTypeDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="700" TextLocId="-" MsiKey="MaintenanceTypeDlg#Back" Options="1"/>
<ROW Dialog_="MaintenanceWelcomeDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="400" TextLocId="-" MsiKey="MaintenanceWelcomeDlg#Back" Options="1"/> <ROW Dialog_="MaintenanceWelcomeDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="400" TextLocId="-" MsiKey="MaintenanceWelcomeDlg#Back" Options="1"/>
<ROW Dialog_="PatchWelcomeDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="400" TextLocId="-" MsiKey="PatchWelcomeDlg#Back" Options="1"/> <ROW Dialog_="PatchWelcomeDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="400" TextLocId="-" MsiKey="PatchWelcomeDlg#Back" Options="1"/>
@ -297,14 +322,29 @@
<ROW Dialog_="VerifyRepairDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="600" TextLocId="-" MsiKey="VerifyRepairDlg#Back" Options="1"/> <ROW Dialog_="VerifyRepairDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="600" TextLocId="-" MsiKey="VerifyRepairDlg#Back" Options="1"/>
<ROW Dialog_="WelcomeDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="400" TextLocId="-" MsiKey="WelcomeDlg#Back" Options="1"/> <ROW Dialog_="WelcomeDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="400" TextLocId="-" MsiKey="WelcomeDlg#Back" Options="1"/>
<ROW Dialog_="WelcomePrereqDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="300" TextLocId="-" MsiKey="WelcomePrereqDlg#Back" Options="1"/> <ROW Dialog_="WelcomePrereqDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="300" TextLocId="-" MsiKey="WelcomePrereqDlg#Back" Options="1"/>
<ROW Dialog_="ZKConnectionDlg" Control="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Next]" Order="100" Options="1"/>
<ROW Dialog_="ZKConnectionDlg" Control="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Cancel]" Order="200" Options="1"/>
<ROW Dialog_="ZKConnectionDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="300" Options="1"/>
<ROW Dialog_="ZKConnectionDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="[BannerBitmap]" Order="400"/>
<ROW Dialog_="ZKConnectionDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="500"/>
<ROW Dialog_="ZKConnectionDlg" Control="BottomLine" Type="Line" X="5" Y="234" Width="368" Height="0" Attributes="1" Order="600"/>
<ROW Dialog_="ZKConnectionDlg" Control="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Attributes="196611" Text="Настройка подключения ZooKeeper..." Order="700"/>
<ROW Dialog_="ZKConnectionDlg" Control="Logo" Type="Text" X="4" Y="228" Width="70" Height="12" Attributes="1" Text="Advanced Installer" Order="800"/>
<ROW Dialog_="ZKConnectionDlg" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="ZooKeeper настройки подключения" TextStyle="[DlgTitleFont]" Order="900"/>
<ROW Dialog_="ZKConnectionDlg" Control="ProtocolLabel" Type="Text" X="25" Y="65" Width="67" Height="11" Attributes="65539" Text="Protocol" Order="1000"/>
<ROW Dialog_="ZKConnectionDlg" Control="ServerLabel" Type="Text" X="25" Y="92" Width="67" Height="11" Attributes="65539" Text="Server:" Order="1100"/>
<ROW Dialog_="ZKConnectionDlg" Control="PortLabel" Type="Text" X="25" Y="119" Width="67" Height="11" Attributes="65539" Text="Port:" Order="1200"/>
<ROW Dialog_="ZKConnectionDlg" Control="ProtocolEdit" Type="Edit" X="98" Y="61" Width="253" Height="18" Attributes="3" Property="ZOOKEEPER_SCHEME" Text="{5}" Order="1300"/>
<ROW Dialog_="ZKConnectionDlg" Control="ServerEdit" Type="Edit" X="98" Y="89" Width="253" Height="18" Attributes="3" Property="ZOOKEEPER_HOST" Text="[ComputerName]" Order="1400"/>
<ROW Dialog_="ZKConnectionDlg" Control="PortEdit" Type="Edit" X="98" Y="116" Width="253" Height="18" Attributes="19" Property="ZOOKEEPER_PORT" Text="{7}" Order="1500"/>
<ATTRIBUTE name="DeletedRows" value="SQLConnectionDlg#OdbcResourceEdit@SQLConnectionDlg#OdbcResourceLabel@SQLConnectionDlg.aip"/> <ATTRIBUTE name="DeletedRows" value="SQLConnectionDlg#OdbcResourceEdit@SQLConnectionDlg#OdbcResourceLabel@SQLConnectionDlg.aip"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiControlEventComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiControlEventComponent">
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS = &quot;&quot; )" Ordering="7"/> <ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS = &quot;&quot; )" Ordering="9"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="SQLConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="205"/> <ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="SQLConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="210"/>
<ROW Dialog_="FolderDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL" Ordering="1"/> <ROW Dialog_="FolderDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL" Ordering="1"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_INSTALL" Ordering="197"/> <ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_INSTALL" Ordering="197"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="ELKConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError &lt;&gt; &quot;&quot; AND ELK_CONNECTION = 0 )" Ordering="203"/> <ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="KAFKAConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND ZK_CONNECTION = &quot;True&quot; AND KAFKA_CONNECTION = &quot;False&quot; )" Ordering="203"/>
<ROW Dialog_="MaintenanceWelcomeDlg" Control_="Next" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="99"/> <ROW Dialog_="MaintenanceWelcomeDlg" Control_="Next" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="99"/>
<ROW Dialog_="CustomizeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_MAINT" Ordering="101"/> <ROW Dialog_="CustomizeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_MAINT" Ordering="101"/>
<ROW Dialog_="CustomizeDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="1"/> <ROW Dialog_="CustomizeDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="1"/>
@ -325,40 +365,75 @@
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_PATCH" Ordering="199"/> <ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_PATCH" Ordering="199"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="PatchWelcomeDlg" Condition="AI_PATCH" Ordering="205"/> <ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="PatchWelcomeDlg" Condition="AI_PATCH" Ordering="205"/>
<ROW Dialog_="PrerequisitesDlg" Control_="Back" Event="NewDialog" Argument="WelcomePrereqDlg" Condition="AI_BOOTSTRAPPER" Ordering="1"/> <ROW Dialog_="PrerequisitesDlg" Control_="Back" Event="NewDialog" Argument="WelcomePrereqDlg" Condition="AI_BOOTSTRAPPER" Ordering="1"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_5" Condition="AI_INSTALL AND ( SqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="4"/> <ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_5" Condition="AI_INSTALL AND ( SqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="3"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="DoAction" Argument="TestSQLConnectionMsgBox" Condition="AI_INSTALL AND ( SqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="5"/> <ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="DoAction" Argument="TestSQLConnectionMsgBox" Condition="AI_INSTALL AND ( SqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="4"/>
<ROW Dialog_="SQLConnectionDlg" Control_="SQLConnectionDlgDialogInitializer" Event="[PASSWORD_PROP]" Argument="{}" Condition="AI_INSTALL AND ( OLDPRODUCTS=&quot;&quot; AND SQLConnectionDlg_Cond )" Ordering="4"/> <ROW Dialog_="SQLConnectionDlg" Control_="SQLConnectionDlgDialogInitializer" Event="[PASSWORD_PROP]" Argument="{}" Condition="AI_INSTALL AND ( OLDPRODUCTS=&quot;&quot; AND SQLConnectionDlg_Cond )" Ordering="4"/>
<ROW Dialog_="SQLConnectionDlg" Control_="SQLConnectionDlgDialogInitializer" Event="[AI_ButtonText_Next_Orig]" Argument="[ButtonText_Next]" Condition="AI_INSTALL AND ( OLDPRODUCTS=&quot;&quot; AND SQLConnectionDlg_Cond )" Ordering="3"/> <ROW Dialog_="SQLConnectionDlg" Control_="SQLConnectionDlgDialogInitializer" Event="[AI_ButtonText_Next_Orig]" Argument="[ButtonText_Next]" Condition="AI_INSTALL AND ( OLDPRODUCTS=&quot;&quot; AND SQLConnectionDlg_Cond )" Ordering="3"/>
<ROW Dialog_="SQLConnectionDlg" Control_="SQLConnectionDlgDialogInitializer" Event="[ButtonText_Next]" Argument="[[AI_CommitButton]]" Condition="AI_INSTALL AND ( OLDPRODUCTS=&quot;&quot; AND SQLConnectionDlg_Cond )" Ordering="2"/> <ROW Dialog_="SQLConnectionDlg" Control_="SQLConnectionDlgDialogInitializer" Event="[ButtonText_Next]" Argument="[[AI_CommitButton]]" Condition="AI_INSTALL AND ( OLDPRODUCTS=&quot;&quot; AND SQLConnectionDlg_Cond )" Ordering="2"/>
<ROW Dialog_="SQLConnectionDlg" Control_="SQLConnectionDlgDialogInitializer" Event="[AI_Text_Next_Orig]" Argument="[Text_Next]" Condition="AI_INSTALL AND ( OLDPRODUCTS=&quot;&quot; AND SQLConnectionDlg_Cond )" Ordering="1"/> <ROW Dialog_="SQLConnectionDlg" Control_="SQLConnectionDlgDialogInitializer" Event="[AI_Text_Next_Orig]" Argument="[Text_Next]" Condition="AI_INSTALL AND ( OLDPRODUCTS=&quot;&quot; AND SQLConnectionDlg_Cond )" Ordering="1"/>
<ROW Dialog_="SQLConnectionDlg" Control_="SQLConnectionDlgDialogInitializer" Event="[Text_Next]" Argument="[Text_Install]" Condition="AI_INSTALL AND ( OLDPRODUCTS=&quot;&quot; AND SQLConnectionDlg_Cond )" Ordering="0"/> <ROW Dialog_="SQLConnectionDlg" Control_="SQLConnectionDlgDialogInitializer" Event="[Text_Next]" Argument="[Text_Install]" Condition="AI_INSTALL AND ( OLDPRODUCTS=&quot;&quot; AND SQLConnectionDlg_Cond )" Ordering="0"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="NewDialog" Argument="ELKConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = 0 )" Ordering="7"/> <ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="NewDialog" Argument="ELKConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;False&quot; )" Ordering="5"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS = &quot;&quot; )" Ordering="2"/> <ROW Dialog_="SQLConnectionDlg" Control_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS = &quot;&quot; )" Ordering="2"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="DoAction" Argument="TestSqlConnection" Condition="AI_INSTALL" Ordering="1"/> <ROW Dialog_="WelcomeDlg" Control_="Next" Event="DoAction" Argument="TestSqlConnection" Condition="AI_INSTALL" Ordering="1"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="SQLConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="4"/> <ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="SQLConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError &lt;&gt; &quot;&quot; AND OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="10"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL AND ( SqlConnectionError=&quot;&quot; AND ELK_CONNECTION = 1 )" Ordering="6"/> <ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND ZK_CONNECTION = &quot;True&quot; AND KAFKA_CONNECTION = &quot;True&quot; AND OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="16"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="DoAction" Argument="TestSqlConnection" Condition="AI_INSTALL" Ordering="201"/> <ROW Dialog_="FolderDlg" Control_="Next" Event="DoAction" Argument="TestSqlConnection" Condition="AI_INSTALL" Ordering="201"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = 1 )" Ordering="207"/> <ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND ZK_CONNECTION = &quot;True&quot; AND KAFKA_CONNECTION = &quot;True&quot; )" Ordering="214"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="DoAction" Argument="TestSqlConnection" Condition="AI_INSTALL" Ordering="3"/> <ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="DoAction" Argument="TestSqlConnection" Condition="AI_INSTALL" Ordering="2"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS = &quot;&quot; AND SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = 1 )" Ordering="201"/> <ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL AND (OLDPRODUCTS = &quot;&quot; )" Ordering="201"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL" Ordering="202"/> <ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL" Ordering="202"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Cancel" Event="SpawnDialog" Argument="CancelDlg" Condition="1" Ordering="100"/> <ROW Dialog_="ELKConnectionDlg" Control_="Cancel" Event="SpawnDialog" Argument="CancelDlg" Condition="1" Ordering="100"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL AND ( ELK_CONNECTION = 1 AND SqlConnectionError = &quot;&quot; )" Ordering="7"/> <ROW Dialog_="ELKConnectionDlg" Control_="Next" Event="NewDialog" Argument="ZKConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND ZK_CONNECTION = &quot;False&quot; )" Ordering="6"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS = &quot;&quot; )" Ordering="3"/> <ROW Dialog_="ELKConnectionDlg" Control_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS = &quot;&quot; )" Ordering="3"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Back" Event="NewDialog" Argument="SQLConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="5"/> <ROW Dialog_="ELKConnectionDlg" Control_="Back" Event="NewDialog" Argument="SQLConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="5"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Next" Event="DoAction" Argument="TestElasticsearchConnection" Condition="AI_INSTALL" Ordering="3"/> <ROW Dialog_="ELKConnectionDlg" Control_="Next" Event="DoAction" Argument="TestElasticsearchConnection" Condition="AI_INSTALL" Ordering="3"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_1" Condition="AI_INSTALL" Ordering="2"/> <ROW Dialog_="ELKConnectionDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_1" Condition="AI_INSTALL" Ordering="2"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Next" Event="DoAction" Argument="TestElasticsearchConnectionMsgBox" Condition="AI_INSTALL AND ( ELK_CONNECTION = 0 )" Ordering="6"/> <ROW Dialog_="ELKConnectionDlg" Control_="Next" Event="DoAction" Argument="TestElasticsearchConnectionMsgBox" Condition="AI_INSTALL AND ( ELK_CONNECTION = &quot;False&quot; )" Ordering="5"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER" Condition="AI_INSTALL AND ( ELK_CONNECTION = 0 )" Ordering="5"/> <ROW Dialog_="ELKConnectionDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER" Condition="AI_INSTALL AND ( ELK_CONNECTION = &quot;False&quot; )" Ordering="4"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="3"/> <ROW Dialog_="SQLConnectionDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="3"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="4"/> <ROW Dialog_="ELKConnectionDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="4"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="DoAction" Argument="TestElasticsearchConnection" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; )" Ordering="3"/> <ROW Dialog_="WelcomeDlg" Control_="Next" Event="DoAction" Argument="TestElasticsearchConnection" Condition="AI_INSTALL" Ordering="3"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_1" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; )" Ordering="2"/> <ROW Dialog_="WelcomeDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_1" Condition="AI_INSTALL" Ordering="2"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="ELKConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = 0 )" Ordering="5"/> <ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="ELKConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;False&quot; AND OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="11"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="SpawnDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = 1 )" Ordering="8"/> <ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="SpawnDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND ZK_CONNECTION = &quot;True&quot; AND KAFKA_CONNECTION = &quot;True&quot; )" Ordering="8"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="DoAction" Argument="TestElasticsearchConnection" Condition="AI_INSTALL" Ordering="204"/> <ROW Dialog_="FolderDlg" Control_="Next" Event="DoAction" Argument="TestElasticsearchConnection" Condition="AI_INSTALL AND SqlConnectionError = &quot;&quot;" Ordering="203"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_1" Condition="AI_INSTALL" Ordering="203"/> <ROW Dialog_="FolderDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_1" Condition="AI_INSTALL AND SqlConnectionError = &quot;&quot;" Ordering="202"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="ELKConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = 0 )" Ordering="206"/> <ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="ELKConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;False&quot; )" Ordering="211"/>
<ROW Dialog_="ZKConnectionDlg" Control_="Cancel" Event="SpawnDialog" Argument="CancelDlg" Condition="1" Ordering="100"/>
<ROW Dialog_="ZKConnectionDlg" Control_="Next" Event="NewDialog" Argument="KAFKAConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND ZK_CONNECTION = &quot;True&quot; AND KAFKA_CONNECTION = &quot;False&quot; )" Ordering="7"/>
<ROW Dialog_="ZKConnectionDlg" Control_="Back" Event="NewDialog" Argument="ELKConnectionDlg" Condition="AI_INSTALL AND ( ELK_CONNECTION = &quot;False&quot; )" Ordering="3"/>
<ROW Dialog_="KAFKAConnectionDlg" Control_="Cancel" Event="SpawnDialog" Argument="CancelDlg" Condition="1" Ordering="100"/>
<ROW Dialog_="KAFKAConnectionDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND ZK_CONNECTION = &quot;True&quot; AND KAFKA_CONNECTION = &quot;True&quot; )" Ordering="8"/>
<ROW Dialog_="KAFKAConnectionDlg" Control_="Back" Event="NewDialog" Argument="ZKConnectionDlg" Condition="AI_INSTALL AND ( ZK_CONNECTION = &quot;False&quot; )" Ordering="3"/>
<ROW Dialog_="ZKConnectionDlg" Control_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS = &quot;&quot; )" Ordering="1"/>
<ROW Dialog_="KAFKAConnectionDlg" Control_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS = &quot;&quot; )" Ordering="1"/>
<ROW Dialog_="ZKConnectionDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="2"/>
<ROW Dialog_="KAFKAConnectionDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="2"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="DoAction" Argument="TestZookeeperConnection" Condition="AI_INSTALL" Ordering="5"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_4" Condition="AI_INSTALL" Ordering="4"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="DoAction" Argument="TestKafkaConnection" Condition="AI_INSTALL" Ordering="7"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_15" Condition="AI_INSTALL" Ordering="6"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="ZKConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND ZK_CONNECTION = &quot;False&quot; AND OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="12"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="KAFKAConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND ZK_CONNECTION = &quot;True&quot; AND KAFKA_CONNECTION = &quot;False&quot; AND OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="15"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="ZKConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND ZK_CONNECTION = &quot;False&quot; )" Ordering="212"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="KAFKAConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND ZK_CONNECTION = &quot;True&quot; AND KAFKA_CONNECTION = &quot;False&quot; )" Ordering="213"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="DoAction" Argument="TestZookeeperConnection" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; )" Ordering="206"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_4" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; )" Ordering="205"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="DoAction" Argument="TestKafkaConnection" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND ZK_CONNECTION = &quot;True&quot; )" Ordering="209"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_15" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND ZK_CONNECTION = &quot;True&quot; )" Ordering="208"/>
<ROW Dialog_="ZKConnectionDlg" Control_="Next" Event="DoAction" Argument="TestZookeeperConnection" Condition="AI_INSTALL" Ordering="3"/>
<ROW Dialog_="ZKConnectionDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_4" Condition="AI_INSTALL" Ordering="2"/>
<ROW Dialog_="ZKConnectionDlg" Control_="Next" Event="DoAction" Argument="TestZookeeperConnectionMsgBox" Condition="AI_INSTALL AND ( ZK_CONNECTION = &quot;False&quot; )" Ordering="5"/>
<ROW Dialog_="ZKConnectionDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_14" Condition="AI_INSTALL AND ( ZK_CONNECTION = &quot;False&quot; )" Ordering="4"/>
<ROW Dialog_="ZKConnectionDlg" Control_="Next" Event="SpawnDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND ZK_CONNECTION = &quot;True&quot; AND KAFKA_CONNECTION = &quot;True&quot; )" Ordering="8"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="NewDialog" Argument="ZKConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND ZK_CONNECTION = &quot;False&quot; )" Ordering="6"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="NewDialog" Argument="KAFKAConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND ZK_CONNECTION = &quot;True&quot; AND KAFKA_CONNECTION = &quot;False&quot; )" Ordering="7"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Next" Event="SpawnDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND ZK_CONNECTION = &quot;True&quot; AND KAFKA_CONNECTION = &quot;True&quot; )" Ordering="8"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Next" Event="NewDialog" Argument="KAFKAConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND ZK_CONNECTION = &quot;True&quot; AND KAFKA_CONNECTION = &quot;False&quot; )" Ordering="7"/>
<ROW Dialog_="KAFKAConnectionDlg" Control_="Next" Event="DoAction" Argument="TestKafkaConnection" Condition="AI_INSTALL" Ordering="4"/>
<ROW Dialog_="KAFKAConnectionDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_15" Condition="AI_INSTALL" Ordering="3"/>
<ROW Dialog_="KAFKAConnectionDlg" Control_="Next" Event="DoAction" Argument="TestKafkaConnectionMsgBox" Condition="AI_INSTALL AND ( KAFKA_CONNECTION = &quot;False&quot; )" Ordering="7"/>
<ROW Dialog_="KAFKAConnectionDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_16" Condition="AI_INSTALL AND ( KAFKA_CONNECTION = &quot;False&quot; )" Ordering="6"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiCreateFolderComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiCreateFolderComponent">
<ROW Directory_="APPDIR" Component_="APPDIR" ManualDelete="true"/> <ROW Directory_="APPDIR" Component_="APPDIR" ManualDelete="true"/>
@ -369,18 +444,22 @@
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH_ORIGINAL" Target="[AI_SETUPEXEPATH]"/> <ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH_ORIGINAL" Target="[AI_SETUPEXEPATH]"/>
<ROW Action="AI_ConfigFailActions" Type="11265" Source="aicustact.dll" Target="ConfigureServFailActions" WithoutSeq="true"/> <ROW Action="AI_ConfigFailActions" Type="11265" Source="aicustact.dll" Target="ConfigureServFailActions" WithoutSeq="true"/>
<ROW Action="AI_DATA_SETTER" Type="51" Source="CustomActionData" Target="[ELASTICSEARCH_MSG]&#13;\n[ELASTICSEARCH_SCHEME]://[ELASTICSEARCH_HOST]:[ELASTICSEARCH_PORT] |[ProductName] Setup |MB_OK,MB_ICONWARNING,MB_DEFBUTTON1||[CLIENTPROCESSID]"/> <ROW Action="AI_DATA_SETTER" Type="51" Source="CustomActionData" Target="[ELASTICSEARCH_MSG]&#13;\n[ELASTICSEARCH_SCHEME]://[ELASTICSEARCH_HOST]:[ELASTICSEARCH_PORT] |[ProductName] Setup |MB_OK,MB_ICONWARNING,MB_DEFBUTTON1||[CLIENTPROCESSID]"/>
<ROW Action="AI_DATA_SETTER_1" Type="51" Source="CustomActionData" Target="AEQAaQBnAGkAdABhAGwAbAB5AFMAaQBnAG4AUwBjAHIAaQBwAHQAAgABAEYAbABhAGcAcwACADYAAQBQAGEAcgBhAG0AcwACAAEAUwBjAHIAaQBwAHQAAgAjAFIAZQBxAHUAaQByAGUAcwAgAC0AdgBlAHIAcwBpAG8AbgAgADMADQAKAFAAYQByAGEAbQAoACkADQAKAA0ACgBmAHUAbgBjAHQAaQBvAG4AIABDAGgAZQBjAGsAVABDAFAAUABvAHIAdABBAHYAYQBpAGwAYQBiAGkAbABpAHQAeQAgAFsAXAB7AF0ADQAKAA0ACgAgACAAcABhAHIAYQBtACAAKAAgACQAdABjAHAAXwBoAG8AcwB0ACwAIAAkAHAAbwByAHQAIAApAA0ACgANAAoAIAAgACQAdABpAG0AZQBfAHQAbwBfAHcAYQBpAHQAIAA9ACAAMQAwADAAMAANAAoAIAAgACQAdABjAHAAbwBiAGoAZQBjAHQAIAA9ACAATgBlAHcALQBPAGIAagBlAGMAdAAgAHMAeQBzAHQAZQBtAC4ATgBlAHQALgBTAG8AYwBrAGUAdABzAC4AVABjAHAAQwBsAGkAZQBuAHQADQAKACAAIAAkAGMAbwBuAG4AZQBjAHQAIAA9ACAAJAB0AGMAcABvAGIAagBlAGMAdAAuAEIAZQBnAGkAbgBDAG8AbgBuAGUAYwB0ACgAJAB0AGMAcABfAGgAbwBzAHQALAAgACQAcABvAHIAdAAsACAAJABuAHUAbABsACwAIAAkAG4AdQBsAGwAKQANAAoAIAAgACQAdwBhAGkAdAAgAD0AIAAkAGMAbwBuAG4AZQBjAHQALgBBAHMAeQBuAGMAVwBhAGkAdABIAGEAbgBkAGwAZQAuAFcAYQBpAHQATwBuAGUAKAAkAHQAaQBtAGUAXwB0AG8AXwB3AGEAaQB0ACwAIAAkAGYAYQBsAHMAZQApAA0ACgAgACAAaQBmACAAKAAtAE4AbwB0ACAAJAB3AGEAaQB0ACkAIABbAFwAewBdAA0ACgAgACAAIAAgAHIAZQB0AHUAcgBuACAAMAANAAoAIAAgAFsAXAB9AF0AIABlAGwAcwBlACAAWwBcAHsAXQANAAoAIAAgACAAIAAkAEUAcgByAG8AcgAuAGMAbABlAGEAcgAoACkADQAKACAAIAAgACAAJAB0AGMAcABvAGIAagBlAGMAdAAuAEUAbgBkAEMAbwBuAG4AZQBjAHQAKAAkAGMAbwBuAG4AZQBjAHQAKQAgAHwAIABPAHUAdAAtAE4AdQBsAGwADQAKACAAIAAgACAAaQBmACAAKAAkAEUAcgByAG8AcgBbAFwAWwBdADAAWwBcAF0AXQApACAAWwBcAHsAXQANAAoAIAAgACAAIAAgACAAIAAgAFcAcgBpAHQAZQAtAFcAYQByAG4AaQBuAGcAIAAoACIAWwBcAHsAXQAwAFsAXAB9AF0AIgAgAC0AZgAgACQARQByAHIAbwByAFsAXABbAF0AMABbAFwAXQBdAC4ARQB4AGMAZQBwAHQAaQBvAG4ALgBNAGUAcwBzAGEAZwBlACkADQAKACAAIAAgACAAWwBcAH0AXQAgAGUAbABzAGUAIABbAFwAewBdAA0ACgAgACAAIAAgACAAIAAgACAAcgBlAHQAdQByAG4AIAAxAA0ACgAgACAAIAAgAFsAXAB9AF0ADQAKACAAIABbAFwAfQBdAA0ACgBbAFwAfQBdAA0ACgANAAoAJABFAEwASwBfAEgATwBTAFQAIAA9ACAAQQBJAF8ARwBlAHQATQBzAGkAUAByAG8AcABlAHIAdAB5ACAARQBMAEEAUwBUAEkAQwBTAEUAQQBSAEMASABfAEgATwBTAFQADQAKACQARQBMAEsAXwBQAE8AUgBUACAAPQAgAEEASQBfAEcAZQB0AE0AcwBpAFAAcgBvAHAAZQByAHQAeQAgAEUATABBAFMAVABJAEMAUwBFAEEAUgBDAEgAXwBQAE8AUgBUAA0ACgANAAoAJABFAEwASwBfAEMATwBOAE4ARQBDAFQASQBPAE4AIAA9ACAAQwBoAGUAYwBrAFQAQwBQAFAAbwByAHQAQQB2AGEAaQBsAGEAYgBpAGwAaQB0AHkAIAAkAEUATABLAF8ASABPAFMAVAAgACQARQBMAEsAXwBQAE8AUgBUAA0ACgANAAoAQQBJAF8AUwBlAHQATQBzAGkAUAByAG8AcABlAHIAdAB5ACAARQBMAEsAXwBDAE8ATgBOAEUAQwBUAEkATwBOACAAJABFAEwASwBfAEMATwBOAE4ARQBDAFQASQBPAE4="/> <ROW Action="AI_DATA_SETTER_1" Type="51" Source="CustomActionData" Target="HOST=[ELASTICSEARCH_HOST];PORT=[ELASTICSEARCH_PORT];OUTPUT=ELK_CONNECTION"/>
<ROW Action="AI_DATA_SETTER_10" Type="51" Source="CustomActionData" Target="MySQL80"/>
<ROW Action="AI_DATA_SETTER_11" Type="51" Source="CustomActionData" Target="MySQL80"/>
<ROW Action="AI_DATA_SETTER_12" Type="51" Source="CustomActionData" Target="Elasticsearch"/>
<ROW Action="AI_DATA_SETTER_13" Type="51" Source="StartElasticSearchService" Target="Elasticsearch"/>
<ROW Action="AI_DATA_SETTER_2" Type="51" Source="CustomActionData" Target="[AI_SETUPEXEPATH]"/> <ROW Action="AI_DATA_SETTER_2" Type="51" Source="CustomActionData" Target="[AI_SETUPEXEPATH]"/>
<ROW Action="AI_DATA_SETTER_3" Type="51" Source="CustomActionData" Target="[~]"/> <ROW Action="AI_DATA_SETTER_3" Type="51" Source="CustomActionData" Target="[~]"/>
<ROW Action="AI_DATA_SETTER_4" Type="51" Source="CustomActionData" Target="HOST=[ZOOKEEPER_HOST];PORT=[ZOOKEEPER_PORT];OUTPUT=ZK_CONNECTION"/>
<ROW Action="AI_DATA_SETTER_5" Type="51" Source="CustomActionData" Target="[SqlConnectionError] |[ProductName] Setup |MB_OK,MB_ICONWARNING,MB_DEFBUTTON1||[CLIENTPROCESSID]"/> <ROW Action="AI_DATA_SETTER_5" Type="51" Source="CustomActionData" Target="[SqlConnectionError] |[ProductName] Setup |MB_OK,MB_ICONWARNING,MB_DEFBUTTON1||[CLIENTPROCESSID]"/>
<ROW Action="AI_DATA_SETTER_6" Type="51" Source="CustomActionData" Target="[APPDIR_FORWARD_SLASH]"/> <ROW Action="AI_DATA_SETTER_6" Type="51" Source="CustomActionData" Target="[APPDIR_FORWARD_SLASH]"/>
<ROW Action="AI_DATA_SETTER_7" Type="51" Source="CustomActionData" Target="[~]"/> <ROW Action="AI_DATA_SETTER_7" Type="51" Source="CustomActionData" Target="[~]"/>
<ROW Action="AI_DATA_SETTER_8" Type="51" Source="CustomActionData" Target="[~]"/> <ROW Action="AI_DATA_SETTER_8" Type="51" Source="CustomActionData" Target="[~]"/>
<ROW Action="AI_DATA_SETTER_9" Type="51" Source="CustomActionData" Target="MySQL80"/> <ROW Action="AI_DATA_SETTER_9" Type="51" Source="CustomActionData" Target="MySQL80"/>
<ROW Action="AI_DATA_SETTER_10" Type="51" Source="CustomActionData" Target="MySQL80"/>
<ROW Action="AI_DATA_SETTER_11" Type="51" Source="CustomActionData" Target="MySQL80"/>
<ROW Action="AI_DATA_SETTER_12" Type="51" Source="CustomActionData" Target="Elasticsearch"/>
<ROW Action="AI_DATA_SETTER_13" Type="51" Source="StartElasticSearchService" Target="Elasticsearch"/>
<ROW Action="AI_DATA_SETTER_14" Type="51" Source="CustomActionData" Target="[ZOOKEEPER_MSG]&#13;\n[ZOOKEEPER_SCHEME]://[ZOOKEEPER_HOST]:[ZOOKEEPER_PORT] |[ProductName] Setup |MB_OK,MB_ICONWARNING,MB_DEFBUTTON1||[CLIENTPROCESSID]"/>
<ROW Action="AI_DATA_SETTER_15" Type="51" Source="CustomActionData" Target="HOST=[KAFKA_HOST];PORT=[KAFKA_PORT];OUTPUT=KAFKA_CONNECTION"/>
<ROW Action="AI_DATA_SETTER_16" Type="51" Source="CustomActionData" Target="[KAFKA_MSG]&#13;\n[KAFKA_SCHEME]://[KAFKA_HOST]:[KAFKA_PORT] |[ProductName] Setup |MB_OK,MB_ICONWARNING,MB_DEFBUTTON1||[CLIENTPROCESSID]"/>
<ROW Action="AI_DOWNGRADE" Type="19" Target="4010"/> <ROW Action="AI_DOWNGRADE" Type="19" Target="4010"/>
<ROW Action="AI_DeleteCadLzma" Type="51" Source="AI_DeleteLzma" Target="[AI_SETUPEXEPATH]"/> <ROW Action="AI_DeleteCadLzma" Type="51" Source="AI_DeleteLzma" Target="[AI_SETUPEXEPATH]"/>
<ROW Action="AI_DeleteLzma" Type="1025" Source="lzmaextractor.dll" Target="DeleteLZMAFiles"/> <ROW Action="AI_DeleteLzma" Type="1025" Source="lzmaextractor.dll" Target="DeleteLZMAFiles"/>
@ -427,13 +506,19 @@
<ROW Action="StartMySQLService" Type="1" Source="aicustact.dll" Target="StartWinService" Options="1" AdditionalSeq="AI_DATA_SETTER_11"/> <ROW Action="StartMySQLService" Type="1" Source="aicustact.dll" Target="StartWinService" Options="1" AdditionalSeq="AI_DATA_SETTER_11"/>
<ROW Action="StopElasticSearchService" Type="1" Source="aicustact.dll" Target="StopWinService" Options="1" AdditionalSeq="AI_DATA_SETTER_12"/> <ROW Action="StopElasticSearchService" Type="1" Source="aicustact.dll" Target="StopWinService" Options="1" AdditionalSeq="AI_DATA_SETTER_12"/>
<ROW Action="StopMySQLService" Type="1" Source="aicustact.dll" Target="StopWinService" Options="1" AdditionalSeq="AI_DATA_SETTER_10"/> <ROW Action="StopMySQLService" Type="1" Source="aicustact.dll" Target="StopWinService" Options="1" AdditionalSeq="AI_DATA_SETTER_10"/>
<ROW Action="TestElasticsearchConnection" Type="1" Source="PowerShellScriptLauncher.dll" Target="RunPowerShellScript" WithoutSeq="true" Options="1" AdditionalSeq="AI_DATA_SETTER_1"/> <ROW Action="TestElasticsearchConnection" Type="1" Source="Utils.CA.dll" Target="CheckTCPAvailability" WithoutSeq="true" AdditionalSeq="AI_DATA_SETTER_1"/>
<ROW Action="TestElasticsearchConnectionMsgBox" Type="1" Source="aicustact.dll" Target="MsgBox" WithoutSeq="true" Options="1" AdditionalSeq="AI_DATA_SETTER"/> <ROW Action="TestElasticsearchConnectionMsgBox" Type="1" Source="aicustact.dll" Target="MsgBox" WithoutSeq="true" Options="1" AdditionalSeq="AI_DATA_SETTER"/>
<ROW Action="TestKafkaConnection" Type="1" Source="Utils.CA.dll" Target="CheckTCPAvailability" WithoutSeq="true" AdditionalSeq="AI_DATA_SETTER_15"/>
<ROW Action="TestKafkaConnectionMsgBox" Type="1" Source="aicustact.dll" Target="MsgBox" WithoutSeq="true" Options="1" AdditionalSeq="AI_DATA_SETTER_16"/>
<ROW Action="TestSQLConnectionMsgBox" Type="1" Source="aicustact.dll" Target="MsgBox" WithoutSeq="true" Options="1" AdditionalSeq="AI_DATA_SETTER_5"/> <ROW Action="TestSQLConnectionMsgBox" Type="1" Source="aicustact.dll" Target="MsgBox" WithoutSeq="true" Options="1" AdditionalSeq="AI_DATA_SETTER_5"/>
<ROW Action="TestSqlConnection" Type="6" Source="utils.vbs" Target="TestSqlConnection" WithoutSeq="true"/> <ROW Action="TestSqlConnection" Type="6" Source="utils.vbs" Target="TestSqlConnection" WithoutSeq="true"/>
<ROW Action="TestZookeeperConnection" Type="1" Source="Utils.CA.dll" Target="CheckTCPAvailability" WithoutSeq="true" AdditionalSeq="AI_DATA_SETTER_4"/>
<ROW Action="TestZookeeperConnectionMsgBox" Type="1" Source="aicustact.dll" Target="MsgBox" WithoutSeq="true" Options="1" AdditionalSeq="AI_DATA_SETTER_14"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiDialogComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiDialogComponent">
<ROW Dialog="ELKConnectionDlg" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel"/> <ROW Dialog="ELKConnectionDlg" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel"/>
<ROW Dialog="KAFKAConnectionDlg" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel"/>
<ROW Dialog="ZKConnectionDlg" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiEnvComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiEnvComponent">
<ROW Environment="JAVA_HOME" Name="=-*JAVA_HOME" Value="[WindowsVolume]Progra~1\Elastic\Elasticsearch\7.13.1\jdk" Component_="AI_ExePath"/> <ROW Environment="JAVA_HOME" Name="=-*JAVA_HOME" Value="[WindowsVolume]Progra~1\Elastic\Elasticsearch\7.13.1\jdk" Component_="AI_ExePath"/>
@ -527,12 +612,12 @@
<ROW Action="AI_RestartElevated" Sequence="51"/> <ROW Action="AI_RestartElevated" Sequence="51"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiLaunchConditionsComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiLaunchConditionsComponent">
<ROW Condition="((VersionNT &lt;&gt; 501) AND (VersionNT &lt;&gt; 502))" Description="Нельзя установить [ProductName] на [WindowsTypeNT5XDisplay]." DescriptionLocId="AI.LaunchCondition.NoNT5X" IsPredefined="true" Builds="DefaultBuild"/> <ROW Condition="((VersionNT &lt;&gt; 501) AND (VersionNT &lt;&gt; 502))" Description="[ProductName] cannot be installed on [WindowsTypeNT5XDisplay]." DescriptionLocId="AI.LaunchCondition.NoNT5X" IsPredefined="true" Builds="DefaultBuild"/>
<ROW Condition="(VersionNT &lt;&gt; 400)" Description="Нельзя установить [ProductName] на [WindowsTypeNT40Display]." DescriptionLocId="AI.LaunchCondition.NoNT40" IsPredefined="true" Builds="DefaultBuild"/> <ROW Condition="(VersionNT &lt;&gt; 400)" Description="[ProductName] cannot be installed on [WindowsTypeNT40Display]." DescriptionLocId="AI.LaunchCondition.NoNT40" IsPredefined="true" Builds="DefaultBuild"/>
<ROW Condition="(VersionNT &lt;&gt; 500)" Description="Нельзя установить [ProductName] на [WindowsTypeNT50Display]." DescriptionLocId="AI.LaunchCondition.NoNT50" IsPredefined="true" Builds="DefaultBuild"/> <ROW Condition="(VersionNT &lt;&gt; 500)" Description="[ProductName] cannot be installed on [WindowsTypeNT50Display]." DescriptionLocId="AI.LaunchCondition.NoNT50" IsPredefined="true" Builds="DefaultBuild"/>
<ROW Condition="AI_DETECTED_INTERNET_CONNECTION" Description="Для установки [ProductName] требуется активное подключение к Интернету. Пожалуйста, проверьте настройки прокси-сервера и конфигурации сети." DescriptionLocId="AI.LaunchCondition.Internet" IsPredefined="true" Builds="DefaultBuild"/> <ROW Condition="AI_DETECTED_INTERNET_CONNECTION" Description="[ProductName] requires an active Internet connection for installation. Please check your network configuration and proxy settings." DescriptionLocId="AI.LaunchCondition.Internet" IsPredefined="true" Builds="DefaultBuild"/>
<ROW Condition="SETUPEXEDIR OR (REMOVE=&quot;ALL&quot;)" Description="Этот пакет можно запускать только из загрузчика." DescriptionLocId="AI.LaunchCondition.RequireBootstrapper" IsPredefined="true" Builds="DefaultBuild"/> <ROW Condition="SETUPEXEDIR OR (REMOVE=&quot;ALL&quot;)" Description="This package can only be run from a bootstrapper." DescriptionLocId="AI.LaunchCondition.RequireBootstrapper" IsPredefined="true" Builds="DefaultBuild"/>
<ROW Condition="VersionNT" Description="[ProductName] не может быть установлен на [WindowsType9XDisplay]." DescriptionLocId="AI.LaunchCondition.No9X" IsPredefined="true" Builds="DefaultBuild"/> <ROW Condition="VersionNT" Description="[ProductName] cannot be installed on [WindowsType9XDisplay]." DescriptionLocId="AI.LaunchCondition.No9X" IsPredefined="true" Builds="DefaultBuild"/>
</COMPONENT> </COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiRegLocatorComponent"> <COMPONENT cid="caphyon.advinst.msicomp.MsiRegLocatorComponent">
<ROW Signature_="AI_EXE_PATH_CU" Root="1" Key="Software\Caphyon\Advanced Installer\LZMA\[ProductCode]\[ProductVersion]" Name="AI_ExePath" Type="2"/> <ROW Signature_="AI_EXE_PATH_CU" Root="1" Key="Software\Caphyon\Advanced Installer\LZMA\[ProductCode]\[ProductVersion]" Name="AI_ExePath" Type="2"/>
@ -654,10 +739,10 @@
<COMPONENT cid="caphyon.advinst.msicomp.PreReqComponent"> <COMPONENT cid="caphyon.advinst.msicomp.PreReqComponent">
<ROW PrereqKey="A918597FE054CCCB65ABDBA0AD8F63C" DisplayName="Visual C++ Redistributable for Visual Studio 2015-2019 x86" VersionMin="14.26" SetupFileUrl="https://download.visualstudio.microsoft.com/download/pr/d60aa805-26e9-47df-b4e3-cd6fcc392333/A06AAC66734A618AB33C1522920654DDFC44FC13CAFAA0F0AB85B199C3D51DC0/VC_redist.x86.exe" Location="1" ExactSize="14413048" WinNTVersions="Windows Vista RTM x86, Windows Vista SP1 x86, Windows Server 2008 RTM x86, Windows 7 RTM x86" WinNT64Versions="Windows Vista RTM x64, Windows Vista SP1 x64, Windows Server 2008 RTM x64, Windows 7 RTM x64, Windows Server 2008 R2 RTM x64" Operator="0" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="ym" MD5="fe6eae1c34528d1ea224569dcdc35618" TargetName="Visual C++ Redistributable for Visual Studio 2015-2019"/> <ROW PrereqKey="A918597FE054CCCB65ABDBA0AD8F63C" DisplayName="Visual C++ Redistributable for Visual Studio 2015-2019 x86" VersionMin="14.26" SetupFileUrl="https://download.visualstudio.microsoft.com/download/pr/d60aa805-26e9-47df-b4e3-cd6fcc392333/A06AAC66734A618AB33C1522920654DDFC44FC13CAFAA0F0AB85B199C3D51DC0/VC_redist.x86.exe" Location="1" ExactSize="14413048" WinNTVersions="Windows Vista RTM x86, Windows Vista SP1 x86, Windows Server 2008 RTM x86, Windows 7 RTM x86" WinNT64Versions="Windows Vista RTM x64, Windows Vista SP1 x64, Windows Server 2008 RTM x64, Windows 7 RTM x64, Windows Server 2008 R2 RTM x64" Operator="0" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="ym" MD5="fe6eae1c34528d1ea224569dcdc35618" TargetName="Visual C++ Redistributable for Visual Studio 2015-2019"/>
<ROW PrereqKey="A9D0C6C76E024A7A84C9B69789BFB916" DisplayName="ASP.NET Core Runtime 6.0.0 x86" VersionMin="6.0" SetupFileUrl="https://download.visualstudio.microsoft.com/download/pr/7f757d80-b065-430e-ba65-7e95c3ec95e1/4d0335985f09db0650bbf9efe773f46c/aspnetcore-runtime-6.0.0-win-x86.exe" Location="1" ExactSize="8122576" WinNTVersions="Windows Vista x86, Windows Server 2008 x86, Windows 7 RTM x86, Windows 8 x86, Windows 10 version 1507 x86, Windows 10 version 1511 x86" WinNT64Versions="Windows Vista x64, Windows Server 2008 x64, Windows 7 RTM x64, Windows Server 2008 R2 x64, Windows 8 x64, Windows Server 2012 x64, Windows 10 version 1507 x64, Windows 10 version 1511 x64" Operator="1" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="ym" MD5="5fe23a4a4752deb2218b95cc84557429" TargetName="ASP.NET Core 6.0"/> <ROW PrereqKey="A9D0C6C76E024A7A84C9B69789BFB916" DisplayName="ASP.NET Core Runtime 6.0.0 x86" VersionMin="6.0" SetupFileUrl="https://download.visualstudio.microsoft.com/download/pr/7f757d80-b065-430e-ba65-7e95c3ec95e1/4d0335985f09db0650bbf9efe773f46c/aspnetcore-runtime-6.0.0-win-x86.exe" Location="1" ExactSize="8122576" WinNTVersions="Windows Vista x86, Windows Server 2008 x86, Windows 7 RTM x86, Windows 8 x86, Windows 10 version 1507 x86, Windows 10 version 1511 x86" WinNT64Versions="Windows Vista x64, Windows Server 2008 x64, Windows 7 RTM x64, Windows Server 2008 R2 x64, Windows 8 x64, Windows Server 2012 x64, Windows 10 version 1507 x64, Windows 10 version 1511 x64" Operator="1" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="ym" MD5="5fe23a4a4752deb2218b95cc84557429" TargetName="ASP.NET Core 6.0"/>
<ROW PrereqKey="ApacheKafka" DisplayName="Apache Kafka" VersionMin="1.0.0" SetupFileUrl="Apache Kafka.msi" Location="0" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" Operator="1" ComLine="/qn" BasicUiComLine="/qn" NoUiComLine="/qn" Options="y" TargetName="Apache Kafka\Apache Kafka.msi"/> <ROW PrereqKey="ApacheKafka" DisplayName="Apache Kafka" VersionMin="1.0.0" SetupFileUrl="Apache Kafka.msi" Location="0" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" Operator="1" ComLine="/qn /norestart" BasicUiComLine="/qn /norestart" NoUiComLine="/qn /norestart" Options="y" TargetName="Apache Kafka\Apache Kafka.msi"/>
<ROW PrereqKey="ApacheZooKepper" DisplayName="Apache ZooKepper" VersionMin="1.0.0" SetupFileUrl="Apache ZooKeeper.msi" Location="0" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" Operator="1" ComLine="/qn" BasicUiComLine="/qn" NoUiComLine="/qn" Options="y" TargetName="Apache ZooKepper\Apache ZooKeeper.msi"/> <ROW PrereqKey="ApacheZooKepper" DisplayName="Apache ZooKepper" VersionMin="1.0.0" SetupFileUrl="Apache ZooKeeper.msi" Location="0" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" Operator="1" ComLine="/qn /norestart" BasicUiComLine="/qn /norestart" NoUiComLine="/qn /norestart" Options="y" TargetName="Apache ZooKepper\Apache ZooKeeper.msi"/>
<ROW PrereqKey="B365F790B0C4E08A90D54675D858A21" DisplayName=".NET Core Runtime 3.1.10 x64" VersionMin="3.1" SetupFileUrl="https://download.visualstudio.microsoft.com/download/pr/9845b4b0-fb52-48b6-83cf-4c431558c29b/41025de7a76639eeff102410e7015214/dotnet-runtime-3.1.10-win-x64.exe" Location="1" ExactSize="26230496" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" WinNT64Versions="Windows Vista x64, Windows Server 2008 x64, Windows 7 RTM x64, Windows Server 2008 R2 x64, Windows 8 x64, Windows Server 2012 x64, Windows 10 version 1507 x64, Windows 10 version 1511 x64" Operator="1" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="y" MD5="a6e46b0e884ba62316560e3bd17384a5" TargetName=".NET Core 3.1"/> <ROW PrereqKey="B365F790B0C4E08A90D54675D858A21" DisplayName=".NET Core Runtime 3.1.10 x64" VersionMin="3.1" SetupFileUrl="https://download.visualstudio.microsoft.com/download/pr/9845b4b0-fb52-48b6-83cf-4c431558c29b/41025de7a76639eeff102410e7015214/dotnet-runtime-3.1.10-win-x64.exe" Location="1" ExactSize="26230496" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" WinNT64Versions="Windows Vista x64, Windows Server 2008 x64, Windows 7 RTM x64, Windows Server 2008 R2 x64, Windows 8 x64, Windows Server 2012 x64, Windows 10 version 1507 x64, Windows 10 version 1511 x64" Operator="1" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="ym" MD5="a6e46b0e884ba62316560e3bd17384a5" TargetName=".NET Core 3.1"/>
<ROW PrereqKey="B450414DF7494F99141402B8725A7C" DisplayName=".NET Core Runtime 3.1.10 x86" VersionMin="3.1" SetupFileUrl="https://download.visualstudio.microsoft.com/download/pr/abb3fb5d-4e82-4ca8-bc03-ac13e988e608/b34036773a72b30c5dc5520ee6a2768f/dotnet-runtime-3.1.10-win-x86.exe" Location="1" ExactSize="23451472" WinNTVersions="Windows Vista x86, Windows Server 2008 x86, Windows 7 RTM x86, Windows 8 x86, Windows 10 version 1507 x86, Windows 10 version 1511 x86" WinNT64Versions="Windows Vista x64, Windows Server 2008 x64, Windows 7 RTM x64, Windows Server 2008 R2 x64, Windows 8 x64, Windows Server 2012 x64, Windows 10 version 1507 x64, Windows 10 version 1511 x64" Operator="1" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="y" MD5="03832c85bc74de4fcb7fffa862b9f4a5" TargetName=".NET Core 3.1"/> <ROW PrereqKey="B450414DF7494F99141402B8725A7C" DisplayName=".NET Core Runtime 3.1.10 x86" VersionMin="3.1" SetupFileUrl="https://download.visualstudio.microsoft.com/download/pr/abb3fb5d-4e82-4ca8-bc03-ac13e988e608/b34036773a72b30c5dc5520ee6a2768f/dotnet-runtime-3.1.10-win-x86.exe" Location="1" ExactSize="23451472" WinNTVersions="Windows Vista x86, Windows Server 2008 x86, Windows 7 RTM x86, Windows 8 x86, Windows 10 version 1507 x86, Windows 10 version 1511 x86" WinNT64Versions="Windows Vista x64, Windows Server 2008 x64, Windows 7 RTM x64, Windows Server 2008 R2 x64, Windows 8 x64, Windows Server 2012 x64, Windows 10 version 1507 x64, Windows 10 version 1511 x64" Operator="1" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="ym" MD5="03832c85bc74de4fcb7fffa862b9f4a5" TargetName=".NET Core 3.1"/>
<ROW PrereqKey="B96F93FA27E74B02866727AAE83982D0" DisplayName=".NET Framework 4.8" SetupFileUrl="https://download.visualstudio.microsoft.com/download/pr/014120d7-d689-4305-befd-3cb711108212/0fd66638cde16859462a6243a4629a50/ndp48-x86-x64-allos-enu.exe" Location="1" ExactSize="117380440" WinNTVersions="Windows Vista x86, Windows Server 2008 x86, Windows 7 RTM x86, Windows 8 x86, Windows 10 version 1507 x86, Windows 10 version 1511 x86, Windows 10 version 1903 x86, Windows 10 version 1909 x86, Windows 10 version 2004 x86, Windows 10 version 20H2 x86, Windows 10 version 21H1 x86" WinNT64Versions="Windows Vista x64, Windows Server 2008 x64, Windows 7 RTM x64, Windows Server 2008 R2 RTM x64, Windows 8 x64, Windows 10 version 1507 x64, Windows 10 version 1511 x64, Windows 10 version 1903 x64, Windows 10 version 1909 x64, Windows 10 version 2004 x64, Windows 10 version 20H2 x64, Windows 10 version 21H1 x64" Operator="1" ComLine="/q" BasicUiComLine="/q" NoUiComLine="/q" Options="xym" MD5="aebcb9fcafa2becf8bb30458a7e1f0a2" TargetName=".NET Framework 4.8"/> <ROW PrereqKey="B96F93FA27E74B02866727AAE83982D0" DisplayName=".NET Framework 4.8" SetupFileUrl="https://download.visualstudio.microsoft.com/download/pr/014120d7-d689-4305-befd-3cb711108212/0fd66638cde16859462a6243a4629a50/ndp48-x86-x64-allos-enu.exe" Location="1" ExactSize="117380440" WinNTVersions="Windows Vista x86, Windows Server 2008 x86, Windows 7 RTM x86, Windows 8 x86, Windows 10 version 1507 x86, Windows 10 version 1511 x86, Windows 10 version 1903 x86, Windows 10 version 1909 x86, Windows 10 version 2004 x86, Windows 10 version 20H2 x86, Windows 10 version 21H1 x86" WinNT64Versions="Windows Vista x64, Windows Server 2008 x64, Windows 7 RTM x64, Windows Server 2008 R2 RTM x64, Windows 8 x64, Windows 10 version 1507 x64, Windows 10 version 1511 x64, Windows 10 version 1903 x64, Windows 10 version 1909 x64, Windows 10 version 2004 x64, Windows 10 version 20H2 x64, Windows 10 version 21H1 x64" Operator="1" ComLine="/q" BasicUiComLine="/q" NoUiComLine="/q" Options="xym" MD5="aebcb9fcafa2becf8bb30458a7e1f0a2" TargetName=".NET Framework 4.8"/>
<ROW PrereqKey="C4FE6FD5B7C4D07B3A313E754A9A6A8" DisplayName="Visual C++ Redistributable for Visual Studio 2015-2019 x64" VersionMin="14.26" SetupFileUrl="https://download.visualstudio.microsoft.com/download/pr/d60aa805-26e9-47df-b4e3-cd6fcc392333/7D7105C52FCD6766BEEE1AE162AA81E278686122C1E44890712326634D0B055E/VC_redist.x64.exe" Location="1" ExactSize="14974616" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" WinNT64Versions="Windows Vista RTM x64, Windows Vista SP1 x64, Windows Server 2008 RTM x64, Windows 7 RTM x64, Windows Server 2008 R2 RTM x64" Operator="1" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="xym" MD5="264c296cc0bf00db6ba8e7bf8cc4e706" TargetName="Visual C++ Redistributable for Visual Studio 2015-2019"/> <ROW PrereqKey="C4FE6FD5B7C4D07B3A313E754A9A6A8" DisplayName="Visual C++ Redistributable for Visual Studio 2015-2019 x64" VersionMin="14.26" SetupFileUrl="https://download.visualstudio.microsoft.com/download/pr/d60aa805-26e9-47df-b4e3-cd6fcc392333/7D7105C52FCD6766BEEE1AE162AA81E278686122C1E44890712326634D0B055E/VC_redist.x64.exe" Location="1" ExactSize="14974616" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" WinNT64Versions="Windows Vista RTM x64, Windows Vista SP1 x64, Windows Server 2008 RTM x64, Windows 7 RTM x64, Windows Server 2008 R2 RTM x64" Operator="1" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="xym" MD5="264c296cc0bf00db6ba8e7bf8cc4e706" TargetName="Visual C++ Redistributable for Visual Studio 2015-2019"/>
<ROW PrereqKey="C6F7BF650B714DC58735D62C12F214E4" DisplayName=".NET Runtime 6.0.0 x64" VersionMin="6.0" SetupFileUrl="https://download.visualstudio.microsoft.com/download/pr/b9cfdb9e-d5cd-4024-b318-00390b729d2f/65690f2440f40654898020cdfffa1050/dotnet-runtime-6.0.0-win-x64.exe" Location="1" ExactSize="28180712" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" WinNT64Versions="Windows Vista x64, Windows Server 2008 x64, Windows 7 RTM x64, Windows Server 2008 R2 x64, Windows 8 x64, Windows Server 2012 x64, Windows 10 version 1507 x64, Windows 10 version 1511 x64" Operator="1" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="ym" MD5="7ec466a9808697c935bd0525a922beca" TargetName=".NET 6.0"/> <ROW PrereqKey="C6F7BF650B714DC58735D62C12F214E4" DisplayName=".NET Runtime 6.0.0 x64" VersionMin="6.0" SetupFileUrl="https://download.visualstudio.microsoft.com/download/pr/b9cfdb9e-d5cd-4024-b318-00390b729d2f/65690f2440f40654898020cdfffa1050/dotnet-runtime-6.0.0-win-x64.exe" Location="1" ExactSize="28180712" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" WinNT64Versions="Windows Vista x64, Windows Server 2008 x64, Windows 7 RTM x64, Windows Server 2008 R2 x64, Windows 8 x64, Windows Server 2012 x64, Windows 10 version 1507 x64, Windows 10 version 1511 x64" Operator="1" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="ym" MD5="7ec466a9808697c935bd0525a922beca" TargetName=".NET 6.0"/>
@ -665,7 +750,7 @@
<ROW PrereqKey="D564007E3BBE4F85950A09B470A7CA65" DisplayName="Visual C++ Redistributable for Visual Studio 2013 Update 5 x86" VersionMin="12.0" SetupFileUrl="http://download.microsoft.com/download/C/C/2/CC2DF5F8-4454-44B4-802D-5EA68D086676/vcredist_x86.exe" Location="1" ExactSize="6510272" Operator="0" ComLine="/quiet" BasicUiComLine="/quiet" NoUiComLine="/quiet" Options="ym" MD5="6a3a1760342ea699d5e6df1f2a1c7707" TargetName="Visual C++ Redistributable for Visual Studio 2013?vcredist_2013u5_x86.exe"/> <ROW PrereqKey="D564007E3BBE4F85950A09B470A7CA65" DisplayName="Visual C++ Redistributable for Visual Studio 2013 Update 5 x86" VersionMin="12.0" SetupFileUrl="http://download.microsoft.com/download/C/C/2/CC2DF5F8-4454-44B4-802D-5EA68D086676/vcredist_x86.exe" Location="1" ExactSize="6510272" Operator="0" ComLine="/quiet" BasicUiComLine="/quiet" NoUiComLine="/quiet" Options="ym" MD5="6a3a1760342ea699d5e6df1f2a1c7707" TargetName="Visual C++ Redistributable for Visual Studio 2013?vcredist_2013u5_x86.exe"/>
<ROW PrereqKey="E25D6A62194038942640BDE651049C" DisplayName="ASP.NET Core Runtime 6.0.0 x64" VersionMin="6.0" SetupFileUrl="https://download.visualstudio.microsoft.com/download/pr/3223fa10-441d-406b-af2e-94874ce38199/09347f9b4aea0ab34d6944b6b78fa29d/aspnetcore-runtime-6.0.0-win-x64.exe" Location="1" ExactSize="8897224" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" WinNT64Versions="Windows Vista x64, Windows Server 2008 x64, Windows 7 RTM x64, Windows Server 2008 R2 x64, Windows 8 x64, Windows Server 2012 x64, Windows 10 version 1507 x64, Windows 10 version 1511 x64" Operator="1" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="xym" MD5="27ec1b4780b035ac230399c120280a5e" TargetName="ASP.NET Core 6.0"/> <ROW PrereqKey="E25D6A62194038942640BDE651049C" DisplayName="ASP.NET Core Runtime 6.0.0 x64" VersionMin="6.0" SetupFileUrl="https://download.visualstudio.microsoft.com/download/pr/3223fa10-441d-406b-af2e-94874ce38199/09347f9b4aea0ab34d6944b6b78fa29d/aspnetcore-runtime-6.0.0-win-x64.exe" Location="1" ExactSize="8897224" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" WinNT64Versions="Windows Vista x64, Windows Server 2008 x64, Windows 7 RTM x64, Windows Server 2008 R2 x64, Windows 8 x64, Windows Server 2012 x64, Windows 10 version 1507 x64, Windows 10 version 1511 x64" Operator="1" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="xym" MD5="27ec1b4780b035ac230399c120280a5e" TargetName="ASP.NET Core 6.0"/>
<ROW PrereqKey="E92D3665B5E468A8661F6547C8C142C" DisplayName=".NET Runtime 6.0.0 x86" VersionMin="6.0" SetupFileUrl="https://download.visualstudio.microsoft.com/download/pr/34df41d5-c813-4e30-8aa3-3603ce6600c0/976e801af82c7108abbcb736a8bc5c14/dotnet-runtime-6.0.0-win-x86.exe" Location="1" ExactSize="25750728" WinNTVersions="Windows Vista x86, Windows Server 2008 x86, Windows 7 RTM x86, Windows 8 x86, Windows 10 version 1507 x86, Windows 10 version 1511 x86" WinNT64Versions="Windows Vista x64, Windows Server 2008 x64, Windows 7 RTM x64, Windows Server 2008 R2 x64, Windows 8 x64, Windows Server 2012 x64, Windows 10 version 1507 x64, Windows 10 version 1511 x64" Operator="1" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="ym" MD5="d8033ef93d3a003691f3046ea013447c" TargetName=".NET 6.0"/> <ROW PrereqKey="E92D3665B5E468A8661F6547C8C142C" DisplayName=".NET Runtime 6.0.0 x86" VersionMin="6.0" SetupFileUrl="https://download.visualstudio.microsoft.com/download/pr/34df41d5-c813-4e30-8aa3-3603ce6600c0/976e801af82c7108abbcb736a8bc5c14/dotnet-runtime-6.0.0-win-x86.exe" Location="1" ExactSize="25750728" WinNTVersions="Windows Vista x86, Windows Server 2008 x86, Windows 7 RTM x86, Windows 8 x86, Windows 10 version 1507 x86, Windows 10 version 1511 x86" WinNT64Versions="Windows Vista x64, Windows Server 2008 x64, Windows 7 RTM x64, Windows Server 2008 R2 x64, Windows 8 x64, Windows Server 2012 x64, Windows 10 version 1507 x64, Windows 10 version 1511 x64" Operator="1" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="ym" MD5="d8033ef93d3a003691f3046ea013447c" TargetName=".NET 6.0"/>
<ROW PrereqKey="F6D8148C0594E7491C36E27FD5E9E89" DisplayName="Oracle Java SE Runtime Environment 8u281 x64" VersionMin="1.8" SetupFileUrl="https://javadl.oracle.com/webapps/download/AutoDL?BundleId=244068_89d678f2be164786b292527658ca1605" Location="1" ExactSize="83548808" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" WinNT64Versions="Windows Vista RTM x64, Windows Vista SP1 x64" Operator="0" ComLine="/s" BasicUiComLine="/s" NoUiComLine="/s" Options="xy" MD5="c6136758f1fec04a2f7f01249280c315" TargetName="Oracle Java SE Runtime Environment?jre-8u281-windows-x64.exe"/> <ROW PrereqKey="F6D8148C0594E7491C36E27FD5E9E89" DisplayName="Oracle Java SE Runtime Environment 8u281 x64" VersionMin="1.8" SetupFileUrl="https://javadl.oracle.com/webapps/download/AutoDL?BundleId=244068_89d678f2be164786b292527658ca1605" Location="1" ExactSize="83548808" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" WinNT64Versions="Windows Vista RTM x64, Windows Vista SP1 x64" Operator="0" ComLine="/s" BasicUiComLine="/s" NoUiComLine="/s" Options="xym" MD5="c6136758f1fec04a2f7f01249280c315" TargetName="Oracle Java SE Runtime Environment?jre-8u281-windows-x64.exe"/>
<ROW PrereqKey="MySQLInstallerRunn" DisplayName="MySQL Installer Runner 8.0.21 x86" SetupFileUrl="MySQL Installer Runner.exe" Location="0" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" Operator="1" ComLine="/VERYSILENT /PASSWORD_PROP=&quot;root&quot; /MYSQL_VERSION=&quot;8.0.21&quot;" BasicUiComLine="/VERYSILENT /PASSWORD_PROP=&quot;root&quot; /MYSQL_VERSION=&quot;8.0.21&quot;" NoUiComLine="/VERYSILENT /PASSWORD_PROP=&quot;root&quot; /MYSQL_VERSION=&quot;8.0.21&quot;" Options="y" TargetName="MySQL Installer Runner \MySQL Installer Runner.exe" ParentPrereq="RequiredApplication_2"/> <ROW PrereqKey="MySQLInstallerRunn" DisplayName="MySQL Installer Runner 8.0.21 x86" SetupFileUrl="MySQL Installer Runner.exe" Location="0" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" Operator="1" ComLine="/VERYSILENT /PASSWORD_PROP=&quot;root&quot; /MYSQL_VERSION=&quot;8.0.21&quot;" BasicUiComLine="/VERYSILENT /PASSWORD_PROP=&quot;root&quot; /MYSQL_VERSION=&quot;8.0.21&quot;" NoUiComLine="/VERYSILENT /PASSWORD_PROP=&quot;root&quot; /MYSQL_VERSION=&quot;8.0.21&quot;" Options="y" TargetName="MySQL Installer Runner \MySQL Installer Runner.exe" ParentPrereq="RequiredApplication_2"/>
<ROW PrereqKey="RequiredApplication" DisplayName="MySQL Connector/ODBC 8.0.21 x86" SetupFileUrl="https://dev.mysql.com/get/Downloads/Connector-ODBC/8.0/mysql-connector-odbc-8.0.21-win32.msi" Location="1" ExactSize="0" Operator="1" ComLine="/quiet" BasicUiComLine="/quiet" NoUiComLine="/quiet" Options="ym" TargetName="MySQL Connector ODBC 8.0.21 x86"/> <ROW PrereqKey="RequiredApplication" DisplayName="MySQL Connector/ODBC 8.0.21 x86" SetupFileUrl="https://dev.mysql.com/get/Downloads/Connector-ODBC/8.0/mysql-connector-odbc-8.0.21-win32.msi" Location="1" ExactSize="0" Operator="1" ComLine="/quiet" BasicUiComLine="/quiet" NoUiComLine="/quiet" Options="ym" TargetName="MySQL Connector ODBC 8.0.21 x86"/>
<ROW PrereqKey="RequiredApplication_1" DisplayName="Node.js 14.17.4" VersionMin="14.17.4" SetupFileUrl="https://nodejs.org/dist/v14.17.4/node-v14.17.4-x64.msi" Location="1" ExactSize="0" Operator="0" ComLine="/quiet" BasicUiComLine="/quiet" NoUiComLine="/quiet" Options="my" TargetName="Node.js v14.17.4 x64"/> <ROW PrereqKey="RequiredApplication_1" DisplayName="Node.js 14.17.4" VersionMin="14.17.4" SetupFileUrl="https://nodejs.org/dist/v14.17.4/node-v14.17.4-x64.msi" Location="1" ExactSize="0" Operator="0" ComLine="/quiet" BasicUiComLine="/quiet" NoUiComLine="/quiet" Options="my" TargetName="Node.js v14.17.4 x64"/>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" />
<supportedRuntime version="v2.0.50727"/>
</startup>
</configuration>

View File

@ -0,0 +1,20 @@
using System;
using System.Net.Sockets;
using Microsoft.Deployment.WindowsInstaller;
namespace Utils
{
public class CustomActions
{
[CustomAction]
public static ActionResult CheckTCPAvailability(Session session)
{
string HOST = session.CustomActionData["HOST"];
string PORT = session.CustomActionData["PORT"];
string OUTPUT = session.CustomActionData["OUTPUT"];
var success = new TcpClient().BeginConnect(HOST, Convert.ToInt32(PORT), null, null).AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(1));
session[OUTPUT] = success.ToString();
return ActionResult.Success;
}
}
}

View File

@ -0,0 +1,34 @@
using System.Reflection;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Utils")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Utils")]
[assembly: AssemblyCopyright("Copyright © 2016")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("31f44d45-4371-4b33-a846-2e3b78131469")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{F149436D-C079-4011-88D2-B45167C81595}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Utils</RootNamespace>
<AssemblyName>Utils</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<WixCATargetsPath Condition=" '$(WixCATargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.CA.targets</WixCATargetsPath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.IO.Compression" />
<Reference Include="System.Web" />
<Reference Include="System.Xml.Linq" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Xml" />
<Reference Include="Microsoft.Deployment.WindowsInstaller">
<Private>True</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="CustomAction.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Content Include="CustomAction.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(WixCATargetsPath)" />
</Project>

View File

@ -1,3 +1,6 @@
REM echo ######## Set variables ########
set "msbuild4="C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe""
REM echo ######## Extracting and preparing files to build ######## REM echo ######## Extracting and preparing files to build ########
%sevenzip% x build\install\win\nginx-1.21.1.zip -o"build\install\win\Files" -y %sevenzip% x build\install\win\nginx-1.21.1.zip -o"build\install\win\Files" -y
xcopy "build\install\win\Files\nginx-1.21.1" "build\install\win\Files\nginx" /s /y /b /i xcopy "build\install\win\Files\nginx-1.21.1" "build\install\win\Files\nginx" /s /y /b /i
@ -25,6 +28,12 @@ copy "build\install\win\kafka-zookeeper\zookeeper\conf\zoo_sample.cfg" "build\in
del /f /q "build\install\win\kafka-zookeeper\zookeeper\conf\zoo_sample.cfg" del /f /q "build\install\win\kafka-zookeeper\zookeeper\conf\zoo_sample.cfg"
rmdir build\install\win\publish /s /q rmdir build\install\win\publish /s /q
REM echo ######## Build Utils ########
%msbuild4% build\install\win\CustomActions\C#\Utils\Utils.csproj
copy build\install\win\CustomActions\C#\Utils\bin\Debug\Utils.CA.dll build\install\win\Utils.CA.dll /y
rmdir build\install\win\CustomActions\C#\Utils\bin /s /q
rmdir build\install\win\CustomActions\C#\Utils\obj /s /q
REM echo ######## Edit zookeeper/kafka cfg and proprties files ######## REM echo ######## Edit zookeeper/kafka cfg and proprties files ########
%sed% -i "s/\(dataDir\).*/\1=.\/..\/zookeeper\/Data/g" build/install/win/kafka-zookeeper/zookeeper/conf/zoo.cfg %sed% -i "s/\(dataDir\).*/\1=.\/..\/zookeeper\/Data/g" build/install/win/kafka-zookeeper/zookeeper/conf/zoo.cfg
%sed% -i "s/\(log.dirs\)=.*/\1=kafka-logs/g" build/install/win/kafka-zookeeper/kafka/config/server.properties %sed% -i "s/\(log.dirs\)=.*/\1=kafka-logs/g" build/install/win/kafka-zookeeper/kafka/config/server.properties
@ -74,4 +83,5 @@ REM echo ######## Build MySQL Server Installer ########
iscc "build\install\win\MySQL Server Installer Runner.iss" iscc "build\install\win\MySQL Server Installer Runner.iss"
REM echo ######## Build AppServer package ######## REM echo ######## Build AppServer package ########
%AdvancedInstaller% /edit build\install\win\AppServer.aip /SetVersion %BUILD_VERSION%.%BUILD_NUMBER%
%AdvancedInstaller% /rebuild build\install\win\AppServer.aip %AdvancedInstaller% /rebuild build\install\win\AppServer.aip

View File

@ -3,6 +3,7 @@
using ASC.Common; using ASC.Common;
using ASC.Common.Logging; using ASC.Common.Logging;
using ASC.Core; using ASC.Core;
using ASC.Core.Common.Settings;
using ASC.IPSecurity; using ASC.IPSecurity;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
@ -19,16 +20,18 @@ namespace ASC.Api.Core.Middleware
public IpSecurityFilter( public IpSecurityFilter(
IOptionsMonitor<ILog> options, IOptionsMonitor<ILog> options,
AuthContext authContext, AuthContext authContext,
IPSecurity.IPSecurity IPSecurity) IPSecurity.IPSecurity IPSecurity,
SettingsManager settingsManager)
{ {
log = options.CurrentValue; log = options.CurrentValue;
AuthContext = authContext; AuthContext = authContext;
this.IPSecurity = IPSecurity; this.IPSecurity = IPSecurity;
SettingsManager = settingsManager;
} }
private AuthContext AuthContext { get; } private AuthContext AuthContext { get; }
public IPRestrictionsSettings IPRestrictionsSettings { get; }
private IPSecurity.IPSecurity IPSecurity { get; } private IPSecurity.IPSecurity IPSecurity { get; }
private SettingsManager SettingsManager { get; }
public void OnResourceExecuted(ResourceExecutedContext context) public void OnResourceExecuted(ResourceExecutedContext context)
{ {
@ -36,7 +39,12 @@ namespace ASC.Api.Core.Middleware
public void OnResourceExecuting(ResourceExecutingContext context) public void OnResourceExecuting(ResourceExecutingContext context)
{ {
if (AuthContext.IsAuthenticated && !IPSecurity.Verify())
if (AuthContext.IsAuthenticated)
{
var enable = SettingsManager.Load<IPRestrictionsSettings>().Enable;
if (enable && !IPSecurity.Verify())
{ {
context.Result = new StatusCodeResult((int)HttpStatusCode.Forbidden); context.Result = new StatusCodeResult((int)HttpStatusCode.Forbidden);
log.WarnFormat("IPSecurity: user {0}", AuthContext.CurrentAccount.ID); log.WarnFormat("IPSecurity: user {0}", AuthContext.CurrentAccount.ID);
@ -44,4 +52,5 @@ namespace ASC.Api.Core.Middleware
} }
} }
} }
}
} }

View File

@ -25,8 +25,10 @@
using System; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Net.Sockets;
using System.Web; using System.Web;
using ASC.Common; using ASC.Common;
@ -55,6 +57,7 @@ namespace ASC.IPSecurity
private SettingsManager SettingsManager { get; } private SettingsManager SettingsManager { get; }
private readonly string CurrentIpForTest; private readonly string CurrentIpForTest;
private readonly string MyNetworks;
public IPSecurity( public IPSecurity(
IConfiguration configuration, IConfiguration configuration,
@ -72,6 +75,7 @@ namespace ASC.IPSecurity
IPRestrictionsService = iPRestrictionsService; IPRestrictionsService = iPRestrictionsService;
SettingsManager = settingsManager; SettingsManager = settingsManager;
CurrentIpForTest = configuration["ipsecurity:test"]; CurrentIpForTest = configuration["ipsecurity:test"];
MyNetworks = configuration["ipsecurity:mynetworks"];
var hideSettings = (configuration["web:hide-settings"] ?? "").Split(new[] { ',', ';', ' ' }); var hideSettings = (configuration["web:hide-settings"] ?? "").Split(new[] { ',', ';', ' ' });
IpSecurityEnabled = !hideSettings.Contains("IpSecurity", StringComparer.CurrentCultureIgnoreCase); IpSecurityEnabled = !hideSettings.Contains("IpSecurity", StringComparer.CurrentCultureIgnoreCase);
} }
@ -109,6 +113,10 @@ namespace ASC.IPSecurity
{ {
return true; return true;
} }
if (IsMyNetwork(ips))
{
return true;
}
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -140,5 +148,42 @@ namespace ASC.IPSecurity
var portIdx = ip.IndexOf(':'); var portIdx = ip.IndexOf(':');
return portIdx > 0 ? ip.Substring(0, portIdx) : ip; return portIdx > 0 ? ip.Substring(0, portIdx) : ip;
} }
private bool IsMyNetwork(string[] ips)
{
try
{
if (!string.IsNullOrEmpty(MyNetworks))
{
var myNetworkIps = MyNetworks.Split(new[] { ",", " " }, StringSplitOptions.RemoveEmptyEntries);
if (ips.Any(requestIp => myNetworkIps.Any(ipAddress => MatchIPs(GetIpWithoutPort(requestIp), ipAddress))))
{
return true;
}
}
var hostName = Dns.GetHostName();
var hostAddresses = Dns.GetHostAddresses(Dns.GetHostName());
var localIPs = new List<IPAddress> { IPAddress.IPv6Loopback, IPAddress.Loopback };
localIPs.AddRange(hostAddresses.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork || ip.AddressFamily == AddressFamily.InterNetworkV6));
foreach (var ipAddress in localIPs)
{
if (ips.Contains(ipAddress.ToString()))
{
return true;
}
}
}
catch (Exception ex)
{
Log.ErrorFormat("Can't verify local network from request with IP-address: {0}", string.Join(",", ips), ex);
}
return false;
}
} }
} }

View File

@ -69,6 +69,13 @@ export function setIpRestrictions(data) {
}); });
} }
export function getIpRestrictionsEnable() {
return request({
method: "get",
url: "/settings/iprestrictions/settings",
});
}
export function setIpRestrictionsEnable(data) { export function setIpRestrictionsEnable(data) {
return request({ return request({
method: "put", method: "put",

View File

@ -31,6 +31,7 @@ const Article = ({
toggleShowText, toggleShowText,
toggleArticleOpen, toggleArticleOpen,
setIsMobileArticle, setIsMobileArticle,
isLoading,
children, children,
...rest ...rest
}) => { }) => {
@ -115,7 +116,11 @@ const Article = ({
className="resizable-block" className="resizable-block"
handleWrapperClass="resizable-border not-selectable" handleWrapperClass="resizable-border not-selectable"
> >
<SubArticleHeader showText={showText} onClick={toggleShowText}> <SubArticleHeader
isLoading={isLoading}
showText={showText}
onClick={toggleShowText}
>
{articleHeaderContent ? articleHeaderContent.props.children : null} {articleHeaderContent ? articleHeaderContent.props.children : null}
</SubArticleHeader> </SubArticleHeader>
{articleMainButtonContent && !isMobileOnly && !isMobileUtils() ? ( {articleMainButtonContent && !isMobileOnly && !isMobileUtils() ? (
@ -123,7 +128,7 @@ const Article = ({
{articleMainButtonContent.props.children} {articleMainButtonContent.props.children}
</SubArticleMainButton> </SubArticleMainButton>
) : null} ) : null}
<SubArticleBody showText={showText}> <SubArticleBody isLoading={isLoading} showText={showText}>
{articleBodyContent ? articleBodyContent.props.children : null} {articleBodyContent ? articleBodyContent.props.children : null}
</SubArticleBody> </SubArticleBody>
</Resizable> </Resizable>

View File

@ -142,10 +142,18 @@ const StyledArticleHeader = styled.div`
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
.loader {
padding-top: 2px;
}
@media ${tablet} { @media ${tablet} {
padding: 16px 16px 17px; padding: 16px 16px 17px;
margin: 0; margin: 0;
justify-content: ${(props) => (props.showText ? "flex-start" : "center")}; justify-content: ${(props) => (props.showText ? "flex-start" : "center")};
.loader {
padding-top: 5px;
padding-bottom: 7px;
}
} }
@media ${mobile} { @media ${mobile} {
@ -159,6 +167,10 @@ const StyledArticleHeader = styled.div`
padding: 16px 16px 17px; padding: 16px 16px 17px;
justify-content: ${(props) => (props.showText ? "flex-start" : "center")}; justify-content: ${(props) => (props.showText ? "flex-start" : "center")};
margin: 0; margin: 0;
.loader {
padding-top: 5px;
padding-bottom: 7px;
}
`} `}
${isMobileOnly && ${isMobileOnly &&

View File

@ -0,0 +1,40 @@
import React from "react";
import styled from "styled-components";
import Loaders from "@appserver/common/components/Loaders";
import { isTablet as isTabletUtils } from "@appserver/components/utils/device";
import { isTablet } from "react-device-detect";
const StyledLoader = styled.div`
padding: 0px 16px 0px;
.loader {
display: block;
width: 20px;
padding-bottom: 16px;
}
@media (min-width: 1024px) {
padding: 0px 20px 0px;
margin-top: -7px;
.loader {
width: 216px;
padding-bottom: 12px;
}
}
`;
const LoaderArticleBody = () => {
const heightLoader = isTabletUtils() || isTablet ? "20px" : "24px";
return (
<StyledLoader>
<Loaders.Rectangle height={heightLoader} className="loader" />
<Loaders.Rectangle height={heightLoader} className="loader" />
<Loaders.Rectangle height={heightLoader} className="loader" />
<Loaders.Rectangle height={heightLoader} className="loader" />
<Loaders.Rectangle height={heightLoader} className="loader" />
</StyledLoader>
);
};
export default LoaderArticleBody;

View File

@ -1,8 +1,10 @@
import React from "react"; import React from "react";
import Scrollbar from "@appserver/components/scrollbar"; import Scrollbar from "@appserver/components/scrollbar";
import LoaderArticleBody from "./article-body-loader";
const ArticleBody = ({ children }) => { const ArticleBody = ({ children, isLoading = false }) => {
return ( return isLoading ? (
<LoaderArticleBody />
) : (
<Scrollbar className="article-body__scrollbar" stype="mediumBlack"> <Scrollbar className="article-body__scrollbar" stype="mediumBlack">
{children} {children}
</Scrollbar> </Scrollbar>

View File

@ -1,5 +1,8 @@
import React from "react"; import React from "react";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import Loaders from "@appserver/common/components/Loaders";
import { isTablet as isTabletUtils } from "@appserver/components/utils/device";
import { isTablet } from "react-device-detect";
import { import {
StyledArticleHeader, StyledArticleHeader,
@ -8,8 +11,20 @@ import {
StyledMenuIcon, StyledMenuIcon,
} from "../styled-article"; } from "../styled-article";
const ArticleHeader = ({ showText, children, onClick, ...rest }) => { const ArticleHeader = ({
return ( showText,
children,
onClick,
isLoading = false,
...rest
}) => {
const heightLoader = isTabletUtils() || isTablet ? "20px" : "32px";
return isLoading ? (
<StyledArticleHeader>
<Loaders.ArticleHeader height={heightLoader} className="loader" />
</StyledArticleHeader>
) : (
<StyledArticleHeader showText={showText} {...rest}> <StyledArticleHeader showText={showText} {...rest}>
<StyledIconBox name="article-burger"> <StyledIconBox name="article-burger">
<StyledMenuIcon onClick={onClick} /> <StyledMenuIcon onClick={onClick} />

View File

@ -105,6 +105,8 @@ const Navigation = ({
getContextOptionsFolder={getContextOptionsFolder} getContextOptionsFolder={getContextOptionsFolder}
getContextOptionsPlus={getContextOptionsPlus} getContextOptionsPlus={getContextOptionsPlus}
toggleDropBox={toggleDropBox} toggleDropBox={toggleDropBox}
toggleInfoPanel={toggleInfoPanel}
isInfoPanelVisible={isInfoPanelVisible}
onClickAvailable={onClickAvailable} onClickAvailable={onClickAvailable}
/> />
)} )}

View File

@ -9,6 +9,8 @@ const StyledContainer = styled.div`
grid-template-columns: ${(props) => grid-template-columns: ${(props) =>
props.isRootFolder ? "auto 1fr" : "29px auto 1fr"}; props.isRootFolder ? "auto 1fr" : "29px auto 1fr"};
padding: ${(props) => (props.isDropBox ? "10px 0 5px" : "10px 0 11px")};
.arrow-button { .arrow-button {
width: 17px; width: 17px;
min-width: 17px; min-width: 17px;
@ -16,24 +18,25 @@ const StyledContainer = styled.div`
@media ${tablet} { @media ${tablet} {
width: 100%; width: 100%;
padding: ${(props) => (props.isDropBox ? "16px 0 5px" : "16px 0 0px")}; padding: ${(props) => (props.isDropBox ? "14px 0 5px" : "14px 0 15px")};
} }
${isMobile && ${isMobile &&
css` css`
width: 100%; width: 100%;
padding: ${(props) => padding: ${(props) =>
props.isDropBox ? "16px 0 5px" : " 16px 0 0px"} !important; props.isDropBox ? "12px 0 5px" : " 12px 0 13px"} !important;
`} `}
@media ${mobile} { @media ${mobile} {
height: 53px; padding: ${(props) =>
props.isDropBox ? "10px 0 5px" : "10px 0 11px"} !important;
} }
${isMobileOnly && ${isMobileOnly &&
css` css`
width: 100% !important; width: 100% !important;
padding: ${(props) => padding: ${(props) =>
props.isDropBox ? "18px 0 5px" : "18px 0 0"} !important; props.isDropBox ? "10px 0 5px" : "10px 0 11px"} !important;
`} `}
`; `;

View File

@ -31,7 +31,6 @@ const StyledContainer = styled.div`
} }
.option-button { .option-button {
margin-left: auto;
margin-right: 15px; margin-right: 15px;
min-width: 17px; min-width: 17px;
} }
@ -46,7 +45,7 @@ const StyledInfoPanelToggleWrapper = styled.div`
align-items: center; align-items: center;
align-self: center; align-self: center;
justify-content: center; justify-content: center;
margin-left: ${({ isRootFolder }) => (isRootFolder ? "auto" : "none")}; margin-left: auto;
.info-panel-toggle-bg { .info-panel-toggle-bg {
height: 32px; height: 32px;
@ -136,7 +135,7 @@ const ControlButtons = ({
<div className="info-panel-toggle-bg"> <div className="info-panel-toggle-bg">
<IconButton <IconButton
className="info-panel-toggle" className="info-panel-toggle"
iconName="images/panel.svg" iconName="images/panel.react.svg"
size="16" size="16"
isFill={true} isFill={true}
onClick={toggleInfoPanel} onClick={toggleInfoPanel}

View File

@ -26,7 +26,7 @@ const StyledBox = styled.div`
top: 0px; top: 0px;
left: ${isMobile ? "-16px" : "-20px"}; left: ${isMobile ? "-16px" : "-20px"};
padding: ${isMobile ? "0 16px 0 16px" : "0 20px"}; padding: ${isMobile ? "0 16px " : "0 20px"};
width: ${(props) => props.dropBoxWidth}px; width: ${(props) => props.dropBoxWidth}px;
@ -85,7 +85,9 @@ const DropBox = React.forwardRef(
getContextOptionsFolder, getContextOptionsFolder,
getContextOptionsPlus, getContextOptionsPlus,
toggleDropBox, toggleDropBox,
toggleInfoPanel,
onClickAvailable, onClickAvailable,
isInfoPanelVisible,
}, },
ref ref
) => { ) => {
@ -141,6 +143,8 @@ const DropBox = React.forwardRef(
canCreate={canCreate} canCreate={canCreate}
getContextOptionsFolder={getContextOptionsFolder} getContextOptionsFolder={getContextOptionsFolder}
getContextOptionsPlus={getContextOptionsPlus} getContextOptionsPlus={getContextOptionsPlus}
toggleInfoPanel={toggleInfoPanel}
isInfoPanelVisible={isInfoPanelVisible}
/> />
</StyledContainer> </StyledContainer>

View File

@ -222,7 +222,6 @@ class Section extends React.Component {
isTabletView, isTabletView,
firstLoad, firstLoad,
dragging, dragging,
isBackdropVisible,
isDesktop, isDesktop,
isHomepage, isHomepage,
maintenanceExist, maintenanceExist,
@ -560,9 +559,6 @@ export default inject(({ auth, infoPanelStore }) => {
isHeaderVisible, isHeaderVisible,
isTabletView, isTabletView,
isBackdropVisible,
setIsBackdropVisible,
isDesktopClient, isDesktopClient,
maintenanceExist, maintenanceExist,
snackbarExist, snackbarExist,
@ -579,8 +575,6 @@ export default inject(({ auth, infoPanelStore }) => {
isTabletView, isTabletView,
isHeaderVisible, isHeaderVisible,
isBackdropVisible,
setIsBackdropVisible,
maintenanceExist, maintenanceExist,
snackbarExist, snackbarExist,
setMaintenanceExist, setMaintenanceExist,

View File

@ -22,7 +22,7 @@ const tabletProps = css`
${isMobileOnly && ${isMobileOnly &&
css` css`
padding: 0 16px; padding: 0 16px;
margin: 0 -16px; margin: 0 0 0 -16px;
`} `}
} }
.section-body_filter { .section-body_filter {

View File

@ -11,59 +11,42 @@ import Base from "@appserver/components/themes/base";
const StyledSectionHeader = styled.div` const StyledSectionHeader = styled.div`
position: relative; position: relative;
height: 53px;
min-height: 53px; padding-right: 20px;
margin-right: 20px;
box-sizing: border-box;
${NoUserSelect} ${NoUserSelect}
display: grid; display: grid;
align-items: center; align-items: center;
/* width: calc(100vw - 296px); width: 100%;
max-width: calc(100vw - 296px); */ max-width: 100%;
width: ${(props) =>
props.infoPanelIsVisible ? "calc(100vw - 696px)" : "calc(100vw - 296px)"};
max-width: ${(props) =>
props.infoPanelIsVisible ? "calc(100vw - 696px)" : "calc(100vw - 296px)"};
@media ${tablet} { @media ${tablet} {
width: ${(props) => padding-right: 16px;
props.showText ? "calc(100vw - 272px)" : "calc(100vw - 84px)"}; margin-right: 0px;
max-width: ${(props) =>
props.showText ? "calc(100vw - 272px)" : "calc(100vw - 84px)"};
height: 61px;
min-height: 61px;
margin-right: 0px !important;
} }
${isMobile && ${isMobile &&
css` css`
width: ${(props) => padding-right: 0 !important;
props.showText ? "calc(100vw - 272px)" : "calc(100vw - 84px)"} !important; margin-right: -16px !important;
max-width: ${(props) =>
props.showText ? "calc(100vw - 272px)" : "calc(100vw - 84px)"} !important;
height: 61px !important;
min-height: 61px !important;
margin-right: 0px !important;
`} `}
@media ${mobile} { @media ${mobile} {
width: calc(100vw - 32px) !important; margin-right: 0px;
max-width: calc(100vw - 32px) !important;
height: 53px;
min-height: 53px;
margin-right: 0px !important;
} }
${isMobileOnly && ${isMobileOnly &&
css` css`
width: calc(100vw - 32px) !important; width: 100vw !important;
max-width: calc(100vw - 32px) !important; max-width: 100vw !important;
height: 53px;
min-height: 53px; padding-right: 16px !important;
margin-top: -2px;
margin-right: 0px !important; margin-top: -2px !important;
`} `}
`; `;

View File

@ -52,13 +52,6 @@ class AuthStore {
this.userStore.user && requests.push(this.moduleStore.init()); this.userStore.user && requests.push(this.moduleStore.init());
} }
if (this.isAuthenticated) {
this.settingsStore.getPortalPasswordSettings();
this.tfaStore.getTfaType();
this.settingsStore.getIpRestrictions();
this.settingsStore.getSessionLifetime();
}
return Promise.all(requests); return Promise.all(requests);
}; };
setLanguage() { setLanguage() {

View File

@ -1,6 +1,6 @@
import { makeAutoObservable } from "mobx"; import { makeAutoObservable } from "mobx";
import api from "../api"; import api from "../api";
import { ARTICLE_PINNED_KEY, LANGUAGE, TenantStatus } from "../constants"; import { LANGUAGE, TenantStatus } from "../constants";
import { combineUrl } from "../utils"; import { combineUrl } from "../utils";
import FirebaseHelper from "../utils/firebase"; import FirebaseHelper from "../utils/firebase";
import { AppServerConfig } from "../constants"; import { AppServerConfig } from "../constants";
@ -455,8 +455,8 @@ class SettingsStore {
getIpRestrictions = async () => { getIpRestrictions = async () => {
const res = await api.settings.getIpRestrictions(); const res = await api.settings.getIpRestrictions();
if (res.length === 0) this.ipRestrictionEnabled = false; this.ipRestrictions = res?.map((el) => el.ip);
else this.ipRestrictionEnabled = true; console.log(this.ipRestrictions);
}; };
setIpRestrictions = async (ips) => { setIpRestrictions = async (ips) => {
@ -464,8 +464,12 @@ class SettingsStore {
ips: ips, ips: ips,
}; };
const res = await api.settings.setIpRestrictions(data); const res = await api.settings.setIpRestrictions(data);
console.log("setIpRestrictions", res); this.ipRestrictions = res;
this.ipRestrictions = ips; };
getIpRestrictionsEnable = async () => {
const res = await api.settings.getIpRestrictionsEnable();
this.ipRestrictionEnable = res.enable;
}; };
setIpRestrictionsEnable = async (enable) => { setIpRestrictionsEnable = async (enable) => {
@ -473,8 +477,7 @@ class SettingsStore {
enable: enable, enable: enable,
}; };
const res = await api.settings.setIpRestrictionsEnable(data); const res = await api.settings.setIpRestrictionsEnable(data);
console.log("setIpRestrictionsEnable", res); this.ipRestrictionEnable = res.enable;
this.ipRestrictionEnabled = enable;
}; };
setMessageSettings = async (turnOn) => { setMessageSettings = async (turnOn) => {

View File

@ -57,7 +57,7 @@ const Avatar = (props) => {
const { size, source, userName, role, editing, editAction } = props; const { size, source, userName, role, editing, editAction } = props;
let isDefault = false; let isDefault = false;
if (source.includes("default_user_photo")) isDefault = true; if (source?.includes("default_user_photo")) isDefault = true;
const avatarContent = source ? ( const avatarContent = source ? (
<StyledImage src={source} isDefault={isDefault} /> <StyledImage src={source} isDefault={isDefault} />

View File

@ -81,7 +81,7 @@ const tabletButtons = css`
.save-button, .save-button,
.cancel-button { .cancel-button {
max-width: max-content; width: auto;
padding-left: 28px; padding-left: 28px;
padding-right: 28px; padding-right: 28px;
} }

View File

@ -6,6 +6,8 @@ const StyledSearchInput = styled.div`
font-style: normal; font-style: normal;
.search-input-block { .search-input-block {
max-height: 32px;
& > input { & > input {
font-size: ${(props) => props.theme.searchInput.fontSize}; font-size: ${(props) => props.theme.searchInput.fontSize};
font-weight: ${(props) => props.theme.searchInput.fontWeight}; font-weight: ${(props) => props.theme.searchInput.fontWeight};

View File

@ -157,6 +157,8 @@ const StyledInfoPanelToggleWrapper = styled.div`
? props.theme.infoPanel.sectionHeaderToggleIconActive ? props.theme.infoPanel.sectionHeaderToggleIconActive
: props.theme.infoPanel.sectionHeaderToggleIcon}; : props.theme.infoPanel.sectionHeaderToggleIcon};
} }
margin-bottom: 1px;
} }
`; `;
StyledInfoPanelToggleWrapper.defaultProps = { theme: Base }; StyledInfoPanelToggleWrapper.defaultProps = { theme: Base };
@ -199,6 +201,8 @@ const StyledTableHeaderCell = styled.div`
`} `}
svg { svg {
width: 12px;
height: 12px;
path { path {
fill: ${(props) => fill: ${(props) =>
props.isActive props.isActive

View File

@ -62,7 +62,7 @@ const TableGroupMenu = (props) => {
<div className="info-panel-toggle-bg"> <div className="info-panel-toggle-bg">
<IconButton <IconButton
className="info-panel-toggle" className="info-panel-toggle"
iconName="images/panel.svg" iconName="images/panel.react.svg"
size="16" size="16"
isFill={true} isFill={true}
onClick={toggleInfoPanel} onClick={toggleInfoPanel}

View File

@ -1950,7 +1950,7 @@ const Dark = {
header: { header: {
backgroundColor: black, backgroundColor: black,
background: `linear-gradient(180deg,#333333 2.81%,rgba(51, 51, 51, 0.91) 63.03%,rgba(255, 255, 255, 0) 100%)`, background: `linear-gradient(180deg, #333333 2.81%, rgba(51, 51, 51, 0.9) 63.03%, rgba(51, 51, 51, 0) 100%);`,
}, },
}, },

View File

@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M0 3.5C0 2.67157 0.671573 2 1.5 2H14.5C15.3284 2 16 2.67157 16 3.5V12.5C16 13.3284 15.3284 14 14.5 14H1.5C0.671573 14 0 13.3284 0 12.5V3.5ZM2 5C2 4.44772 2.44772 4 3 4H9V12H3C2.44772 12 2 11.5523 2 11V5ZM11 12H13C13.5523 12 14 11.5523 14 11V5C14 4.44772 13.5523 4 13 4H11V12Z" fill="#A3A9AE"/>
</svg>

After

Width:  |  Height:  |  Size: 446 B

View File

@ -1,3 +0,0 @@
<svg width="17" height="15" viewBox="0 0 17 15" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.5 2.5H13.5C14.0523 2.5 14.5 2.94772 14.5 3.5V11.5C14.5 12.0523 14.0523 12.5 13.5 12.5H11.5V2.5ZM9 2.5H3.5C2.94772 2.5 2.5 2.94772 2.5 3.5V11.5C2.5 12.0523 2.94772 12.5 3.5 12.5H9V2.5ZM17 1.5C17 0.671573 16.3284 0 15.5 0H14.5H2.5H1.5C0.671573 0 0 0.671573 0 1.5V2.88462V12.1154V13.5C0 14.3284 0.671573 15 1.5 15H2.5H14.5H15.5C16.3284 15 17 14.3284 17 13.5V12.1154V2.88462V1.5Z" fill="#A3A9AE"/>
</svg>

Before

Width:  |  Height:  |  Size: 550 B

View File

@ -37,7 +37,6 @@ const withHotkeys = (Component) => {
activateHotkeys, activateHotkeys,
backToParentFolder, backToParentFolder,
hideArticle,
uploadFile, uploadFile,
someDialogIsOpen, someDialogIsOpen,
} = props; } = props;
@ -147,10 +146,7 @@ const withHotkeys = (Component) => {
//Crete form template from file //Crete form template from file
useHotkeys( useHotkeys(
"Alt+Shift+o", "Alt+Shift+o",
() => { () => setSelectFileDialogVisible(true),
hideArticle();
setSelectFileDialogVisible(true);
},
hotkeysFilter hotkeysFilter
); );
@ -217,14 +213,12 @@ const withHotkeys = (Component) => {
return inject( return inject(
({ ({
auth,
filesStore, filesStore,
dialogsStore, dialogsStore,
settingsStore, settingsStore,
filesActionsStore, filesActionsStore,
hotkeyStore, hotkeyStore,
}) => { }) => {
const { hideArticle } = auth.settingsStore;
const { setSelected, viewAs, setViewAs, fileActionStore } = filesStore; const { setSelected, viewAs, setViewAs, fileActionStore } = filesStore;
const { setAction } = fileActionStore; const { setAction } = fileActionStore;
@ -291,7 +285,6 @@ const withHotkeys = (Component) => {
activateHotkeys, activateHotkeys,
backToParentFolder, backToParentFolder,
hideArticle,
uploadFile, uploadFile,
someDialogIsOpen, someDialogIsOpen,
}; };

View File

@ -142,7 +142,6 @@ export default inject(
toggleArticleOpen, toggleArticleOpen,
personal, personal,
hideArticle,
isDesktopClient, isDesktopClient,
FirebaseHelper, FirebaseHelper,
theme, theme,
@ -171,7 +170,6 @@ export default inject(
setTreeFolders, setTreeFolders,
setNewFilesPanelVisible, setNewFilesPanelVisible,
hideArticle,
firstLoad, firstLoad,
isDesktopClient, isDesktopClient,
FirebaseHelper, FirebaseHelper,

View File

@ -116,7 +116,11 @@ const StyledTile = styled.div`
} }
.tile-folder-loader { .tile-folder-loader {
padding-top: 4px; padding-top: 16px;
width: 32px;
height: 32px;
margin-left: 21px;
margin-right: 14px;
} }
:hover { :hover {
@ -180,8 +184,11 @@ const StyledFileTileBottom = styled.div`
box-sizing: border-box; box-sizing: border-box;
.tile-file-loader { .tile-file-loader {
padding-top: 4px; padding-top: 16px;
padding-left: 3px; width: 32px;
height: 32px;
margin-left: 23px;
margin-right: 14px;
} }
`; `;

View File

@ -63,7 +63,7 @@ class ContextOptionsStore {
const { const {
setConvertPasswordDialogVisible, setConvertPasswordDialogVisible,
setFormCreationInfo, setFormCreationInfo,
} = dialogsStore; } = this.dialogsStore;
const { title, id, folderId, fileExst } = item; const { title, id, folderId, fileExst } = item;
const newTitle = const newTitle =
@ -412,7 +412,7 @@ class ContextOptionsStore {
}, },
{ {
key: "copy", key: "copy",
label: t("Duplicate"), label: t("Common:Duplicate"),
onClick: () => this.onDuplicate(item, t), onClick: () => this.onDuplicate(item, t),
disabled: false, disabled: false,
}, },
@ -436,7 +436,7 @@ class ContextOptionsStore {
}, },
{ {
key: "copy", key: "copy",
label: t("Duplicate"), label: t("Common:Duplicate"),
icon: "/static/images/copy.react.svg", icon: "/static/images/copy.react.svg",
onClick: () => this.onDuplicate(item, t), onClick: () => this.onDuplicate(item, t),
disabled: false, disabled: false,

View File

@ -153,7 +153,6 @@ class DialogsStore {
this.setNewFilesIds(null); this.setNewFilesIds(null);
} }
this.authStore.settingsStore.hideArticle();
this.newFilesPanelVisible = newFilesPanelVisible; this.newFilesPanelVisible = newFilesPanelVisible;
}; };

View File

@ -49,7 +49,7 @@ class HotkeyStore {
if (!hotkeyCaret) { if (!hotkeyCaret) {
const scroll = document.getElementsByClassName("section-scroll"); const scroll = document.getElementsByClassName("section-scroll");
scroll && scroll[0].focus(); scroll && scroll[0] && scroll[0].focus();
} }
if (!hotkeyCaret && selection.length) { if (!hotkeyCaret && selection.length) {
@ -129,26 +129,31 @@ class HotkeyStore {
}; };
selectBottom = () => { selectBottom = () => {
const { viewAs, hotkeyCaret } = this.filesStore; const { viewAs, hotkeyCaret, selection } = this.filesStore;
if (!hotkeyCaret) return this.selectFirstFile(); if (!hotkeyCaret && !selection.length) return this.selectFirstFile();
else if (viewAs === "tile") else if (viewAs === "tile")
this.setSelectionWithCaret([this.nextForTileDown]); this.setSelectionWithCaret([this.nextForTileDown]);
else if (this.nextFile) this.setSelectionWithCaret([this.nextFile]); else if (this.nextFile) this.setSelectionWithCaret([this.nextFile]);
}; };
selectUpper = () => { selectUpper = () => {
const { hotkeyCaret, viewAs } = this.filesStore; const { hotkeyCaret, viewAs, selection } = this.filesStore;
if (!hotkeyCaret) return this.selectFirstFile(); if (!hotkeyCaret && !selection.length) return this.selectFirstFile();
else if (viewAs === "tile") else if (viewAs === "tile")
this.setSelectionWithCaret([this.prevForTileUp]); this.setSelectionWithCaret([this.prevForTileUp]);
else if (this.prevFile) this.setSelectionWithCaret([this.prevFile]); else if (this.prevFile) this.setSelectionWithCaret([this.prevFile]);
}; };
selectLeft = () => { selectLeft = () => {
const { hotkeyCaret, filesList, setHotkeyCaretStart } = this.filesStore; const {
if (!hotkeyCaret) { hotkeyCaret,
filesList,
setHotkeyCaretStart,
selection,
} = this.filesStore;
if (!hotkeyCaret && !selection.length) {
this.selectFirstFile(); this.selectFirstFile();
setHotkeyCaretStart(filesList[0]); setHotkeyCaretStart(filesList[0]);
@ -158,9 +163,14 @@ class HotkeyStore {
}; };
selectRight = () => { selectRight = () => {
const { hotkeyCaret, filesList, setHotkeyCaretStart } = this.filesStore; const {
hotkeyCaret,
filesList,
setHotkeyCaretStart,
selection,
} = this.filesStore;
if (!hotkeyCaret) { if (!hotkeyCaret && !selection.length) {
this.selectFirstFile(); this.selectFirstFile();
setHotkeyCaretStart(filesList[0]); setHotkeyCaretStart(filesList[0]);
} else if (this.nextFile) { } else if (this.nextFile) {
@ -183,7 +193,7 @@ class HotkeyStore {
if (!hotkeyCaretStart) { if (!hotkeyCaretStart) {
setHotkeyCaretStart(hotkeyCaret); setHotkeyCaretStart(hotkeyCaret);
} }
if (!hotkeyCaret) return this.selectFirstFile(); if (!hotkeyCaret && !selection.length) return this.selectFirstFile();
if (viewAs === "tile") { if (viewAs === "tile") {
if (this.nextForTileDown.id === hotkeyCaret.id) return; if (this.nextForTileDown.id === hotkeyCaret.id) return;
@ -218,7 +228,7 @@ class HotkeyStore {
if (!hotkeyCaretStart) { if (!hotkeyCaretStart) {
setHotkeyCaretStart(hotkeyCaret); setHotkeyCaretStart(hotkeyCaret);
} }
if (!hotkeyCaret) this.selectFirstFile(); if (!hotkeyCaret && !selection.length) this.selectFirstFile();
if (viewAs === "tile") { if (viewAs === "tile") {
if (this.prevForTileUp.id === hotkeyCaret.id) return; if (this.prevForTileUp.id === hotkeyCaret.id) return;
@ -251,7 +261,7 @@ class HotkeyStore {
filesList, filesList,
} = this.filesStore; } = this.filesStore;
if (!hotkeyCaret) return this.selectFirstFile(); if (!hotkeyCaret && !selection.length) return this.selectFirstFile();
const nextFile = this.nextFile; const nextFile = this.nextFile;
if (!nextFile) return; if (!nextFile) return;
@ -309,7 +319,7 @@ class HotkeyStore {
hotkeyCaretStart, hotkeyCaretStart,
} = this.filesStore; } = this.filesStore;
if (!hotkeyCaret) return this.selectFirstFile(); if (!hotkeyCaret && !selection.length) return this.selectFirstFile();
const prevFile = this.prevFile; const prevFile = this.prevFile;
if (!prevFile) return; if (!prevFile) return;
@ -461,8 +471,9 @@ class HotkeyStore {
} }
get caretIndex() { get caretIndex() {
const { filesList, hotkeyCaret } = this.filesStore; const { filesList, hotkeyCaret, selection } = this.filesStore;
const caretIndex = filesList.findIndex((f) => f.id === hotkeyCaret.id); const id = selection.length ? selection[0].id : hotkeyCaret?.id;
const caretIndex = filesList.findIndex((f) => f.id === id);
if (caretIndex !== -1) return caretIndex; if (caretIndex !== -1) return caretIndex;
else return null; else return null;

View File

@ -1405,6 +1405,13 @@ namespace ASC.Api.Settings
return IPRestrictionsService.Save(model.Ips, Tenant.TenantId); return IPRestrictionsService.Save(model.Ips, Tenant.TenantId);
} }
[Read("iprestrictions/settings")]
public IPRestrictionsSettings GetIpRestrictionsSettings()
{
PermissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
return SettingsManager.Load<IPRestrictionsSettings>();
}
[Update("iprestrictions/settings")] [Update("iprestrictions/settings")]
public IPRestrictionsSettings UpdateIpRestrictionsSettingsFromBody([FromBody] IpRestrictionsModel model) public IPRestrictionsSettings UpdateIpRestrictionsSettingsFromBody([FromBody] IpRestrictionsModel model)
{ {

View File

@ -578,6 +578,7 @@ const ShellWrapper = inject(({ auth, backup }) => {
setTheme, setTheme,
} = settingsStore; } = settingsStore;
const { setPreparationPortalDialogVisible } = backup; const { setPreparationPortalDialogVisible } = backup;
return { return {
loadBaseInfo: async () => { loadBaseInfo: async () => {
await init(); await init();

View File

@ -6,6 +6,10 @@ import { withTranslation } from "react-i18next";
import { isArrayEqual } from "@appserver/components/utils/array"; import { isArrayEqual } from "@appserver/components/utils/array";
import { isMobileOnly } from "react-device-detect";
import { isMobile } from "@appserver/components/utils/device";
import { import {
//getKeyByLink, //getKeyByLink,
settingsTree, settingsTree,
@ -55,7 +59,7 @@ class ArticleBodyContent extends React.Component {
componentDidUpdate(prevProps, prevState) { componentDidUpdate(prevProps, prevState) {
if (!isArrayEqual(prevState.selectedKeys, this.state.selectedKeys)) { if (!isArrayEqual(prevState.selectedKeys, this.state.selectedKeys)) {
const { selectedKeys } = this.state; const { selectedKeys } = this.state;
console.log(selectedKeys);
const { match, history } = this.props; const { match, history } = this.props;
const settingsPath = getSelectedLinkByKey(selectedKeys[0], settingsTree); const settingsPath = getSelectedLinkByKey(selectedKeys[0], settingsTree);
const newPath = match.path + settingsPath; const newPath = match.path + settingsPath;
@ -66,13 +70,17 @@ class ArticleBodyContent extends React.Component {
onSelect = (value) => { onSelect = (value) => {
const { selectedKeys } = this.state; const { selectedKeys } = this.state;
console.log(selectedKeys, value); const { toggleArticleOpen } = this.props;
if (isArrayEqual([value], selectedKeys)) { if (isArrayEqual([value], selectedKeys)) {
return; return;
} }
this.setState({ selectedKeys: [value + "-0"] }); this.setState({ selectedKeys: [value + "-0"] });
if (isMobileOnly || isMobile()) {
toggleArticleOpen();
}
}; };
mapKeys = (tKey) => { mapKeys = (tKey) => {
@ -145,5 +153,6 @@ class ArticleBodyContent extends React.Component {
export default inject(({ auth }) => { export default inject(({ auth }) => {
return { return {
showText: auth.settingsStore.showText, showText: auth.settingsStore.showText,
toggleArticleOpen: auth.settingsStore.toggleArticleOpen,
}; };
})(withRouter(withTranslation("Settings")(observer(ArticleBodyContent)))); })(withRouter(withTranslation("Settings")(observer(ArticleBodyContent))));

View File

@ -110,8 +110,9 @@ class SectionHeaderContent extends React.Component {
const resultPath = locationPathname.slice(fullSettingsUrlLength + 1); const resultPath = locationPathname.slice(fullSettingsUrlLength + 1);
const arrayOfParams = resultPath.split("/"); const arrayOfParams = resultPath.split("/");
const key = getKeyByLink(arrayOfParams, settingsTree)[0]; const key = getKeyByLink(arrayOfParams, settingsTree);
const header = getTKeyByKey(key, settingsTree); const currKey = key.length > 3 ? key : key[0];
const header = getTKeyByKey(currKey, settingsTree);
const isCategory = checkPropertyByLink( const isCategory = checkPropertyByLink(
arrayOfParams, arrayOfParams,
settingsTree, settingsTree,
@ -133,8 +134,9 @@ class SectionHeaderContent extends React.Component {
componentDidUpdate() { componentDidUpdate() {
const arrayOfParams = this.getArrayOfParams(); const arrayOfParams = this.getArrayOfParams();
const key = getKeyByLink(arrayOfParams, settingsTree)[0]; const key = getKeyByLink(arrayOfParams, settingsTree);
const header = getTKeyByKey(key, settingsTree); const currKey = key.length > 3 ? key : key[0];
const header = getTKeyByKey(currKey, settingsTree);
const isCategory = checkPropertyByLink( const isCategory = checkPropertyByLink(
arrayOfParams, arrayOfParams,
settingsTree, settingsTree,

View File

@ -0,0 +1,46 @@
import React from "react";
import styled, { css } from "styled-components";
import Loaders from "@appserver/common/components/Loaders";
import { isDesktop as isDesktopUtils } from "@appserver/components/utils/device";
import { isTablet } from "react-device-detect";
const tabletStyles = css`
padding-top: 12px;
.loader {
width: 184px;
}
`;
const StyledLoader = styled.div`
padding-top: 8px;
.loader {
width: 273px;
}
@media (min-width: 600px) {
${tabletStyles}
}
${isTablet &&
css`
${tabletStyles}
`}
@media (min-width: 1025px) {
.loader {
width: 296px;
}
}
`;
const LoaderSectionHeader = () => {
const heightLoader = isDesktopUtils() ? "29px" : "37px";
return (
<StyledLoader>
<Loaders.Rectangle height={heightLoader} className="loader" />
</StyledLoader>
);
};
export default LoaderSectionHeader;

View File

@ -4,6 +4,7 @@ import { ArticleHeaderContent, ArticleBodyContent } from "./Article";
import { SectionHeaderContent, SectionPagingContent } from "./Section"; import { SectionHeaderContent, SectionPagingContent } from "./Section";
import { inject, observer } from "mobx-react"; import { inject, observer } from "mobx-react";
import Section from "@appserver/common/components/Section"; import Section from "@appserver/common/components/Section";
import LoaderSectionHeader from "./Section/loaderSectionHeader";
const ArticleSettings = React.memo(() => { const ArticleSettings = React.memo(() => {
return ( return (

View File

@ -10,6 +10,7 @@ import { AppServerConfig } from "@appserver/common/constants";
import withCultureNames from "@appserver/common/hoc/withCultureNames"; import withCultureNames from "@appserver/common/hoc/withCultureNames";
import history from "@appserver/common/history"; import history from "@appserver/common/history";
import { Base } from "@appserver/components/themes"; import { Base } from "@appserver/components/themes";
import LoaderCustomizationNavbar from "./sub-components/loaderCustomizationNavbar";
import { StyledArrowRightIcon } from "../common/settingsCustomization/StyledSettings"; import { StyledArrowRightIcon } from "../common/settingsCustomization/StyledSettings";
@ -51,6 +52,9 @@ const CustomizationNavbar = ({ t, theme, helpUrlCommonSettings }) => {
e.preventDefault(); e.preventDefault();
history.push(e.target.pathname); history.push(e.target.pathname);
}; };
//return <LoaderCustomizationNavbar />;
return ( return (
<StyledComponent> <StyledComponent>
<div className="category-item-wrapper"> <div className="category-item-wrapper">

View File

@ -1,6 +1,7 @@
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { withTranslation } from "react-i18next"; import { withTranslation } from "react-i18next";
import styled from "styled-components"; import styled from "styled-components";
import { inject, observer } from "mobx-react";
import withCultureNames from "@appserver/common/hoc/withCultureNames"; import withCultureNames from "@appserver/common/hoc/withCultureNames";
import LanguageAndTimeZone from "./settingsCustomization/language-and-time-zone"; import LanguageAndTimeZone from "./settingsCustomization/language-and-time-zone";
import WelcomePageSettings from "./settingsCustomization/welcome-page-settings"; import WelcomePageSettings from "./settingsCustomization/welcome-page-settings";
@ -9,8 +10,11 @@ import { isSmallTablet } from "@appserver/components/utils/device";
import CustomizationNavbar from "./customization-navbar"; import CustomizationNavbar from "./customization-navbar";
import { Base } from "@appserver/components/themes"; import { Base } from "@appserver/components/themes";
import { setDocumentTitle } from "../../../../../helpers/utils"; import { setDocumentTitle } from "../../../../../helpers/utils";
import LoaderDescriptionCustomization from "./sub-components/loaderDescriptionCustomization";
const StyledComponent = styled.div` const StyledComponent = styled.div`
width: 100%;
.combo-button-label { .combo-button-label {
max-width: 100%; max-width: 100%;
} }
@ -61,9 +65,9 @@ const StyledComponent = styled.div`
StyledComponent.defaultProps = { theme: Base }; StyledComponent.defaultProps = { theme: Base };
const Customization = ({ t }) => { const Customization = ({ t, setIsLoadingArticleSettings }) => {
const [mobileView, setMobileView] = useState(true); const [mobileView, setMobileView] = useState(true);
const [isLoadingCustomization, setIsLoadingCustomization] = useState(true); const [isLoadingCustomization, setIsLoadingCustomization] = useState(false);
const checkInnerWidth = () => { const checkInnerWidth = () => {
if (isSmallTablet()) { if (isSmallTablet()) {
@ -75,8 +79,12 @@ const Customization = ({ t }) => {
useEffect(() => { useEffect(() => {
setDocumentTitle(t("Customization")); setDocumentTitle(t("Customization"));
//TODO: add method to get the portal name //TODO: Add method to get the portal name
setIsLoadingArticleSettings(true);
setTimeout(() => {
setIsLoadingCustomization(false); setIsLoadingCustomization(false);
setIsLoadingArticleSettings(isLoadingCustomization);
}, 3000);
window.addEventListener("resize", checkInnerWidth); window.addEventListener("resize", checkInnerWidth);
return () => window.removeEventListener("resize", checkInnerWidth); return () => window.removeEventListener("resize", checkInnerWidth);
@ -91,6 +99,7 @@ const Customization = ({ t }) => {
<div className="category-description">{`${t( <div className="category-description">{`${t(
"Settings:CustomizationDescription" "Settings:CustomizationDescription"
)}`}</div> )}`}</div>
{/* <LoaderDescriptionCustomization /> */}
<LanguageAndTimeZone <LanguageAndTimeZone
isLoadingCustomization={isLoadingCustomization} isLoadingCustomization={isLoadingCustomization}
isMobileView={isMobile} isMobileView={isMobile}
@ -101,6 +110,14 @@ const Customization = ({ t }) => {
); );
}; };
export default withCultureNames( export default inject(({ setup }) => {
withTranslation(["Settings", "Common"])(Customization) const { setIsLoadingArticleSettings } = setup;
return {
setIsLoadingArticleSettings,
};
})(
withCultureNames(
withTranslation(["Settings", "Common"])(observer(Customization))
)
); );

View File

@ -8,7 +8,7 @@ import config from "../../../../../../package.json";
import Customization from "./customization"; import Customization from "./customization";
import WhiteLabel from "./whitelabel"; import WhiteLabel from "./whitelabel";
import AppLoader from "@appserver/common/components/AppLoader"; import LoaderSubmenu from "./sub-components/loaderSubmenu";
const SubmenuCommon = (props) => { const SubmenuCommon = (props) => {
const { t, history } = props; const { t, history } = props;
@ -34,7 +34,7 @@ const SubmenuCommon = (props) => {
if (currentTab !== -1) { if (currentTab !== -1) {
setCurrentTab(currentTab); setCurrentTab(currentTab);
} }
setIsLoading(true); //setIsLoading(true);
}, []); }, []);
const onSelect = (e) => { const onSelect = (e) => {
@ -46,9 +46,9 @@ const SubmenuCommon = (props) => {
) )
); );
}; };
//TODO: isLoading
return !isLoading ? ( return isLoading ? (
<AppLoader /> <LoaderSubmenu />
) : ( ) : (
<Submenu <Submenu
data={data} data={data}

View File

@ -22,7 +22,7 @@ import { isMobileOnly } from "react-device-detect";
import { isSmallTablet } from "@appserver/components/utils/device"; import { isSmallTablet } from "@appserver/components/utils/device";
import checkScrollSettingsBlock from "../utils"; import checkScrollSettingsBlock from "../utils";
import { StyledSettingsComponent, StyledScrollbar } from "./StyledSettings"; import { StyledSettingsComponent, StyledScrollbar } from "./StyledSettings";
import LoaderLngTZSettings from "../sub-components/loaderLngTZSettings"; import LoaderCustomization from "../sub-components/loaderCustomization";
const mapTimezonesToArray = (timezones) => { const mapTimezonesToArray = (timezones) => {
return timezones.map((timezone) => { return timezones.map((timezone) => {
return { key: timezone.id, label: timezone.displayName }; return { key: timezone.id, label: timezone.displayName };
@ -399,6 +399,7 @@ class LanguageAndTimeZone extends React.Component {
</div> </div>
); );
//return <LoaderCustomization lngTZSettings={true} />;
return !isLoadedData ? ( return !isLoadedData ? (
<Loader className="pageLoader" type="rombs" size="40px" /> <Loader className="pageLoader" type="rombs" size="40px" />
) : ( ) : (

View File

@ -18,6 +18,7 @@ import { PortalRenamingTooltip } from "../sub-components/common-tooltips";
import { StyledSettingsComponent, StyledScrollbar } from "./StyledSettings"; import { StyledSettingsComponent, StyledScrollbar } from "./StyledSettings";
import { saveToSessionStorage, getFromSessionStorage } from "../../../utils"; import { saveToSessionStorage, getFromSessionStorage } from "../../../utils";
import { setDocumentTitle } from "../../../../../../helpers/utils"; import { setDocumentTitle } from "../../../../../../helpers/utils";
import LoaderCustomization from "../sub-components/loaderCustomization";
const PortalRenaming = ({ t, setPortalRename, isMobileView }) => { const PortalRenaming = ({ t, setPortalRename, isMobileView }) => {
// TODO: Change false // TODO: Change false
@ -186,6 +187,7 @@ const PortalRenaming = ({ t, setPortalRename, isMobileView }) => {
</div> </div>
); );
//return <LoaderCustomization portalRenaming={true} />;
return !isLoadedData ? ( return !isLoadedData ? (
<Loader className="pageLoader" type="rombs" size="40px" /> <Loader className="pageLoader" type="rombs" size="40px" />
) : ( ) : (

View File

@ -19,7 +19,7 @@ import { isMobileOnly } from "react-device-detect";
import { isSmallTablet } from "@appserver/components/utils/device"; import { isSmallTablet } from "@appserver/components/utils/device";
import checkScrollSettingsBlock from "../utils"; import checkScrollSettingsBlock from "../utils";
import { StyledSettingsComponent, StyledScrollbar } from "./StyledSettings"; import { StyledSettingsComponent, StyledScrollbar } from "./StyledSettings";
import LoaderLngTZSettings from "../sub-components/loaderLngTZSettings"; import LoaderCustomization from "../sub-components/loaderCustomization";
let greetingTitleFromSessionStorage = ""; let greetingTitleFromSessionStorage = "";
let greetingTitleDefaultFromSessionStorage = ""; let greetingTitleDefaultFromSessionStorage = "";
@ -250,6 +250,7 @@ class WelcomePageSettings extends React.Component {
</div> </div>
); );
// return <LoaderCustomization welcomePage={true} />;
return !isLoadedData ? ( return !isLoadedData ? (
<Loader className="pageLoader" type="rombs" size="40px" /> <Loader className="pageLoader" type="rombs" size="40px" />
) : ( ) : (

View File

@ -0,0 +1,143 @@
import React from "react";
import styled, { css } from "styled-components";
import Loaders from "@appserver/common/components/Loaders";
import { isTablet } from "react-device-detect";
const tabletStyles = css`
.header {
display: block;
width: ${(props) =>
props.lngTZSettings
? "283px"
: props.welcomePage
? "201px"
: props.portalRenaming
? "150px"
: 0};
padding-bottom: 16px;
}
.description {
display: none;
}
.title {
display: block;
width: ${(props) =>
props.lngTZSettings
? "65px"
: props.welcomePage
? "31px"
: props.portalRenaming
? "113px"
: 0};
}
.combo-box {
display: block;
width: 350px;
}
.field-container {
display: block;
width: 350px;
}
.save-cancel-buttons {
display: block;
position: static;
width: 350px;
padding: 0;
}
`;
const StyledLoader = styled.div`
.header {
display: none;
}
.description {
width: 100%;
padding-bottom: 12px;
}
.title {
width: ${(props) => (props.portalRenaming ? "49px" : "63.7px")};
padding-bottom: 4px;
}
.title-long {
display: block;
width: 68px;
padding-bottom: 4px;
}
.combo-box {
display: block;
width: 100%;
padding-bottom: 24px;
}
.field-container {
width: 100%;
padding-bottom: 12px;
}
.save-cancel-buttons {
display: block;
position: absolute;
bottom: 0;
left: 0;
width: calc(100% - 32px);
padding: 0 0 16px 16px;
}
@media (min-width: 600px) {
${tabletStyles}
}
${isTablet &&
`
${tabletStyles}
`}
`;
const LoaderCustomization = ({
lngTZSettings,
portalRenaming,
welcomePage,
}) => {
const heightSaveCancelButtons = window.innerWidth < 600 ? "40px" : "32px";
return (
<StyledLoader
lngTZSettings={lngTZSettings}
portalRenaming={portalRenaming}
welcomePage={welcomePage}
className="category-item-wrapper"
>
<Loaders.Rectangle height="22px" className="header" />
{portalRenaming && (
<Loaders.Rectangle height="80px" className="description" />
)}
<Loaders.Rectangle height="20px" className="title" />
<Loaders.Rectangle height="32px" className="combo-box" />
{lngTZSettings && (
<>
<Loaders.Rectangle height="20px" className="field-container" />
<Loaders.Rectangle height="20px" className="title-long" />
<Loaders.Rectangle height="32px" className="combo-box" />
</>
)}
<Loaders.Rectangle
height={heightSaveCancelButtons}
className="save-cancel-buttons"
/>
</StyledLoader>
);
};
export default LoaderCustomization;

View File

@ -0,0 +1,44 @@
import React from "react";
import styled from "styled-components";
import Loaders from "@appserver/common/components/Loaders";
const StyledLoader = styled.div`
.title-long {
width: 283px;
padding-bottom: 8px;
}
.width {
width: 100%;
padding-bottom: 8px;
}
.link {
width: 57px;
padding-bottom: 20px;
}
.title {
display: block;
width: 132px;
padding-bottom: 8px;
}
`;
const LoaderCustomizationNavbar = () => {
return (
<StyledLoader>
<Loaders.Rectangle height="22px" className="title-long" />
<Loaders.Rectangle height="100px" className="width" />
<Loaders.Rectangle height="20px" className="link" />
<Loaders.Rectangle height="22px" className="title" />
<Loaders.Rectangle height="80px" className="width" />
<Loaders.Rectangle height="22px" className="title" />
<Loaders.Rectangle height="20px" className="width" />
</StyledLoader>
);
};
export default LoaderCustomizationNavbar;

View File

@ -0,0 +1,38 @@
import React from "react";
import styled, { css } from "styled-components";
import Loaders from "@appserver/common/components/Loaders";
import { isTablet } from "react-device-detect";
const tabletStyles = css`
.description {
width: 684px;
padding-bottom: 20px;
}
`;
const StyledLoader = styled.div`
@media (min-width: 600px) {
${tabletStyles}
}
${isTablet &&
css`
${tabletStyles}
`}
@media (min-width: 1024px) {
.description {
width: 700px;
}
}
`;
const LoaderDescriptionCustomization = () => {
return (
<StyledLoader>
<Loaders.Rectangle height="40px" className="description" />
</StyledLoader>
);
};
export default LoaderDescriptionCustomization;

View File

@ -1,15 +0,0 @@
import React from "react";
import styled from "styled-components";
import Loaders from "@appserver/common/components/Loaders";
const StyledLoader = styled.div``;
const LoaderLngTZSettings = () => {
return (
<StyledLoader>
<Loaders.Rectangle />
</StyledLoader>
);
};
export default LoaderLngTZSettings;

View File

@ -0,0 +1,32 @@
import React from "react";
import styled from "styled-components";
import Loaders from "@appserver/common/components/Loaders";
import { isTablet } from "react-device-detect";
const StyledLoader = styled.div`
margin-top: -4px;
.loader {
padding-right: 4px;
}
@media (min-width: 600px) {
margin-top: -9px;
}
${isTablet &&
css`
margin-top: -9px;
`}
`;
const LoaderSubmenu = () => {
return (
<StyledLoader>
<Loaders.Rectangle width="100px" height="28px" className="loader" />
<Loaders.Rectangle width="100px" height="28px" />
</StyledLoader>
);
};
export default LoaderSubmenu;

View File

@ -308,7 +308,6 @@ class WhiteLabel extends React.Component {
<Loader className="pageLoader" type="rombs" size="40px" /> <Loader className="pageLoader" type="rombs" size="40px" />
) : ( ) : (
<> <>
В разработке
<StyledComponent> <StyledComponent>
<div className="settings-block"> <div className="settings-block">
<Text fontSize="16px">{t("LogoSettings")}</Text> <Text fontSize="16px">{t("LogoSettings")}</Text>

View File

@ -85,34 +85,6 @@ export const StyledMobileCategoryWrapper = styled.div`
StyledMobileCategoryWrapper.defaultProps = { theme: Base }; StyledMobileCategoryWrapper.defaultProps = { theme: Base };
export const ButtonsWrapper = styled.div`
display: flex;
flex-direction: row;
gap: 8px;
align-items: center;
margin-top: 24px;
@media (max-width: 600px) {
position: absolute;
bottom: 16px;
width: calc(100vw - 84px);
.button {
height: 40px;
width: 100%;
}
.reminder {
position: absolute;
bottom: 48px;
}
}
@media (max-width: 430px) {
width: calc(100vw - 32px);
}
`;
export const LearnMoreWrapper = styled.div` export const LearnMoreWrapper = styled.div`
display: none; display: none;

View File

@ -8,10 +8,10 @@ import Text from "@appserver/components/text";
import Link from "@appserver/components/link"; import Link from "@appserver/components/link";
import toastr from "@appserver/components/toast/toastr"; import toastr from "@appserver/components/toast/toastr";
import { getLanguage } from "@appserver/common/utils"; import { getLanguage } from "@appserver/common/utils";
import Buttons from "../sub-components/buttons";
import { LearnMoreWrapper } from "../StyledSecurity"; import { LearnMoreWrapper } from "../StyledSecurity";
import { size } from "@appserver/components/utils/device"; import { size } from "@appserver/components/utils/device";
import { saveToSessionStorage, getFromSessionStorage } from "../../../utils"; import { saveToSessionStorage, getFromSessionStorage } from "../../../utils";
import SaveCancelButtons from "@appserver/components/save-cancel-buttons";
const MainContainer = styled.div` const MainContainer = styled.div`
width: 100%; width: 100%;
@ -19,6 +19,10 @@ const MainContainer = styled.div`
.page-subtitle { .page-subtitle {
margin-bottom: 10px; margin-bottom: 10px;
} }
.box {
margin-bottom: 24px;
}
`; `;
const AdminMessage = (props) => { const AdminMessage = (props) => {
@ -133,11 +137,16 @@ const AdminMessage = (props) => {
onClick={onSelectType} onClick={onSelectType}
/> />
<Buttons <SaveCancelButtons
t={t} className="save-cancel-buttons"
showReminder={showReminder}
onSaveClick={onSaveClick} onSaveClick={onSaveClick}
onCancelClick={onCancelClick} onCancelClick={onCancelClick}
showReminder={showReminder}
reminderTest={t("YouHaveUnsavedChanges")}
saveButtonLabel={t("Common:SaveButton")}
cancelButtonLabel={t("Common:CancelButton")}
displaySettings={true}
hasScroll={false}
/> />
</MainContainer> </MainContainer>
); );

View File

@ -8,10 +8,10 @@ import RadioButtonGroup from "@appserver/components/radio-button-group";
import toastr from "@appserver/components/toast/toastr"; import toastr from "@appserver/components/toast/toastr";
import { LearnMoreWrapper } from "../StyledSecurity"; import { LearnMoreWrapper } from "../StyledSecurity";
import UserFields from "../sub-components/user-fields"; import UserFields from "../sub-components/user-fields";
import Buttons from "../sub-components/buttons";
import { size } from "@appserver/components/utils/device"; import { size } from "@appserver/components/utils/device";
import { saveToSessionStorage, getFromSessionStorage } from "../../../utils"; import { saveToSessionStorage, getFromSessionStorage } from "../../../utils";
import isEqual from "lodash/isEqual"; import isEqual from "lodash/isEqual";
import SaveCancelButtons from "@appserver/components/save-cancel-buttons";
const MainContainer = styled.div` const MainContainer = styled.div`
width: 100%; width: 100%;
@ -31,19 +31,23 @@ const MainContainer = styled.div`
.warning-text { .warning-text {
margin-bottom: 9px; margin-bottom: 9px;
} }
.save-cancel-buttons {
margin-top: 24px;
}
`; `;
const IpSecurity = (props) => { const IpSecurity = (props) => {
const { const {
t, t,
history, history,
ipRestrictionEnabled, ipRestrictionEnable,
setIpRestrictionsEnable, setIpRestrictionsEnable,
ipRestrictions, ipRestrictions,
setIpRestrictions, setIpRestrictions,
} = props; } = props;
const regexp = /(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))|((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])/; //check ip valid const regexp = /^(?!0)(?!.*\.$)((1?\d?\d|25[0-5]|2[0-4]\d)(\.|$)){4}$/; //check ip valid
const [enable, setEnable] = useState(false); const [enable, setEnable] = useState(false);
const [ips, setIps] = useState(); const [ips, setIps] = useState();
@ -58,7 +62,7 @@ const IpSecurity = (props) => {
saveToSessionStorage("defaultIPSettings", defaultSettings); saveToSessionStorage("defaultIPSettings", defaultSettings);
} else { } else {
const defaultData = { const defaultData = {
enable: ipRestrictionEnabled, enable: ipRestrictionEnable,
ips: ipRestrictions, ips: ipRestrictions,
}; };
saveToSessionStorage("defaultIPSettings", defaultData); saveToSessionStorage("defaultIPSettings", defaultData);
@ -68,7 +72,7 @@ const IpSecurity = (props) => {
setEnable(currentSettings.enable); setEnable(currentSettings.enable);
setIps(currentSettings.ips); setIps(currentSettings.ips);
} else { } else {
setEnable(ipRestrictionEnabled); setEnable(ipRestrictionEnable);
setIps(ipRestrictions); setIps(ipRestrictions);
} }
@ -125,14 +129,15 @@ const IpSecurity = (props) => {
setIps([...ips, ""]); setIps([...ips, ""]);
}; };
const onSaveClick = () => { const onSaveClick = async () => {
const valid = ips.map((ip) => regexp.test(ip)); const valid = ips.map((ip) => regexp.test(ip));
if (valid.includes(false)) { if (valid.includes(false)) {
return; return;
} }
setIpRestrictions(ips); try {
setIpRestrictionsEnable(enable); await setIpRestrictions(ips);
await setIpRestrictionsEnable(enable);
saveToSessionStorage("defaultIPSettings", { saveToSessionStorage("defaultIPSettings", {
enable: enable, enable: enable,
@ -140,6 +145,9 @@ const IpSecurity = (props) => {
}); });
setShowReminder(false); setShowReminder(false);
toastr.success(t("SuccessfullySaveSettingsMessage")); toastr.success(t("SuccessfullySaveSettingsMessage"));
} catch (error) {
toastr.error(error);
}
}; };
const onCancelClick = () => { const onCancelClick = () => {
@ -188,6 +196,8 @@ const IpSecurity = (props) => {
/> />
)} )}
{enable && (
<>
<Text <Text
color="#F21C0E" color="#F21C0E"
fontSize="16px" fontSize="16px"
@ -197,12 +207,19 @@ const IpSecurity = (props) => {
{t("Common:Warning")}! {t("Common:Warning")}!
</Text> </Text>
<Text>{t("IPSecurityWarningHelper")}</Text> <Text>{t("IPSecurityWarningHelper")}</Text>
</>
)}
<Buttons <SaveCancelButtons
t={t} className="save-cancel-buttons"
showReminder={showReminder}
onSaveClick={onSaveClick} onSaveClick={onSaveClick}
onCancelClick={onCancelClick} onCancelClick={onCancelClick}
showReminder={showReminder}
reminderTest={t("YouHaveUnsavedChanges")}
saveButtonLabel={t("Common:SaveButton")}
cancelButtonLabel={t("Common:CancelButton")}
displaySettings={true}
hasScroll={false}
/> />
</MainContainer> </MainContainer>
); );
@ -210,14 +227,14 @@ const IpSecurity = (props) => {
export default inject(({ auth }) => { export default inject(({ auth }) => {
const { const {
ipRestrictionEnabled, ipRestrictionEnable,
setIpRestrictionsEnable, setIpRestrictionsEnable,
ipRestrictions, ipRestrictions,
setIpRestrictions, setIpRestrictions,
} = auth.settingsStore; } = auth.settingsStore;
return { return {
ipRestrictionEnabled, ipRestrictionEnable,
setIpRestrictionsEnable, setIpRestrictionsEnable,
ipRestrictions, ipRestrictions,
setIpRestrictions, setIpRestrictions,

View File

@ -11,10 +11,10 @@ import Checkbox from "@appserver/components/checkbox";
import { getLanguage } from "@appserver/common/utils"; import { getLanguage } from "@appserver/common/utils";
import { LearnMoreWrapper } from "../StyledSecurity"; import { LearnMoreWrapper } from "../StyledSecurity";
import toastr from "@appserver/components/toast/toastr"; import toastr from "@appserver/components/toast/toastr";
import Buttons from "../sub-components/buttons";
import { size } from "@appserver/components/utils/device"; import { size } from "@appserver/components/utils/device";
import { saveToSessionStorage, getFromSessionStorage } from "../../../utils"; import { saveToSessionStorage, getFromSessionStorage } from "../../../utils";
import isEqual from "lodash/isEqual"; import isEqual from "lodash/isEqual";
import SaveCancelButtons from "@appserver/components/save-cancel-buttons";
const MainContainer = styled.div` const MainContainer = styled.div`
width: 100%; width: 100%;
@ -30,6 +30,7 @@ const MainContainer = styled.div`
flex-direction: column; flex-direction: column;
gap: 8px; gap: 8px;
margin-top: 18px; margin-top: 18px;
margin-bottom: 24px;
} }
`; `;
@ -216,11 +217,16 @@ const PasswordStrength = (props) => {
/> />
</Box> </Box>
<Buttons <SaveCancelButtons
t={t} className="save-cancel-buttons"
showReminder={showReminder}
onSaveClick={onSaveClick} onSaveClick={onSaveClick}
onCancelClick={onCancelClick} onCancelClick={onCancelClick}
showReminder={showReminder}
reminderTest={t("YouHaveUnsavedChanges")}
saveButtonLabel={t("Common:SaveButton")}
cancelButtonLabel={t("Common:CancelButton")}
displaySettings={true}
hasScroll={false}
/> />
</MainContainer> </MainContainer>
); );

View File

@ -8,13 +8,17 @@ import Text from "@appserver/components/text";
import Link from "@appserver/components/link"; import Link from "@appserver/components/link";
import toastr from "@appserver/components/toast/toastr"; import toastr from "@appserver/components/toast/toastr";
import { getLanguage } from "@appserver/common/utils"; import { getLanguage } from "@appserver/common/utils";
import Buttons from "../sub-components/buttons";
import { LearnMoreWrapper } from "../StyledSecurity"; import { LearnMoreWrapper } from "../StyledSecurity";
import { size } from "@appserver/components/utils/device"; import { size } from "@appserver/components/utils/device";
import { saveToSessionStorage, getFromSessionStorage } from "../../../utils"; import { saveToSessionStorage, getFromSessionStorage } from "../../../utils";
import SaveCancelButtons from "@appserver/components/save-cancel-buttons";
const MainContainer = styled.div` const MainContainer = styled.div`
width: 100%; width: 100%;
.box {
margin-bottom: 24px;
}
`; `;
const TwoFactorAuth = (props) => { const TwoFactorAuth = (props) => {
@ -145,11 +149,16 @@ const TwoFactorAuth = (props) => {
onClick={onSelectTfaType} onClick={onSelectTfaType}
/> />
<Buttons <SaveCancelButtons
t={t} className="save-cancel-buttons"
showReminder={showReminder}
onSaveClick={onSaveClick} onSaveClick={onSaveClick}
onCancelClick={onCancelClick} onCancelClick={onCancelClick}
showReminder={showReminder}
reminderTest={t("YouHaveUnsavedChanges")}
saveButtonLabel={t("Common:SaveButton")}
cancelButtonLabel={t("Common:CancelButton")}
displaySettings={true}
hasScroll={false}
/> />
</MainContainer> </MainContainer>
); );

View File

@ -10,24 +10,20 @@ import { LearnMoreWrapper } from "../StyledSecurity";
import { getLanguage } from "@appserver/common/utils"; import { getLanguage } from "@appserver/common/utils";
import toastr from "@appserver/components/toast/toastr"; import toastr from "@appserver/components/toast/toastr";
import UserFields from "../sub-components/user-fields"; import UserFields from "../sub-components/user-fields";
import Buttons from "../sub-components/buttons";
import { size } from "@appserver/components/utils/device"; import { size } from "@appserver/components/utils/device";
import { saveToSessionStorage, getFromSessionStorage } from "../../../utils"; import { saveToSessionStorage, getFromSessionStorage } from "../../../utils";
import isEqual from "lodash/isEqual"; import isEqual from "lodash/isEqual";
import SaveCancelButtons from "@appserver/components/save-cancel-buttons";
const MainContainer = styled.div` const MainContainer = styled.div`
width: 100%; width: 100%;
.user-fields {
margin-bottom: 18px;
}
.box { .box {
margin-bottom: 11px; margin-bottom: 11px;
} }
.warning-text { .save-cancel-buttons {
margin-bottom: 9px; margin-top: 24px;
} }
`; `;
@ -45,9 +41,10 @@ const TrustedMail = (props) => {
const [type, setType] = useState("0"); const [type, setType] = useState("0");
const [domains, setDomains] = useState([]); const [domains, setDomains] = useState([]);
const [showReminder, setShowReminder] = useState(false); const [showReminder, setShowReminder] = useState(false);
const [isSaving, setIsSaving] = useState(false);
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const getSettings = async () => { const getSettings = () => {
const currentSettings = getFromSessionStorage("currentTrustedMailSettings"); const currentSettings = getFromSessionStorage("currentTrustedMailSettings");
const defaultSettings = getFromSessionStorage("defaultTrustedMailSettings"); const defaultSettings = getFromSessionStorage("defaultTrustedMailSettings");
@ -68,7 +65,6 @@ const TrustedMail = (props) => {
setType(String(trustedDomainsType)); setType(String(trustedDomainsType));
setDomains(trustedDomains); setDomains(trustedDomains);
} }
setIsLoading(true); setIsLoading(true);
}; };
@ -81,7 +77,6 @@ const TrustedMail = (props) => {
useEffect(() => { useEffect(() => {
if (!isLoading) return; if (!isLoading) return;
const defaultSettings = getFromSessionStorage("defaultTrustedMailSettings"); const defaultSettings = getFromSessionStorage("defaultTrustedMailSettings");
const newSettings = { const newSettings = {
type: type, type: type,
@ -124,25 +119,33 @@ const TrustedMail = (props) => {
setDomains(newInputs); setDomains(newInputs);
}; };
const onSaveClick = () => { const onSaveClick = async () => {
setIsSaving(true);
const valid = domains.map((domain) => regexp.test(domain)); const valid = domains.map((domain) => regexp.test(domain));
if (type === "1" && valid.includes(false)) { if (type === "1" && valid.includes(false)) {
setIsSaving(false);
toastr.error(t("Common:IncorrectDomain")); toastr.error(t("Common:IncorrectDomain"));
return; return;
} }
try {
const data = { const data = {
type: Number(type), type: Number(type),
domains: domains, domains: domains,
inviteUsersAsVisitors: true, inviteUsersAsVisitors: true,
}; };
setMailDomainSettings(data); await setMailDomainSettings(data);
saveToSessionStorage("defaultTrustedMailSettings", { saveToSessionStorage("defaultTrustedMailSettings", {
type: type, type: type,
domains: domains, domains: domains,
}); });
setShowReminder(false); setShowReminder(false);
toastr.success(t("SuccessfullySaveSettingsMessage")); toastr.success(t("SuccessfullySaveSettingsMessage"));
} catch (error) {
toastr.error(error);
}
setIsSaving(false);
}; };
const onCancelClick = () => { const onCancelClick = () => {
@ -194,7 +197,6 @@ const TrustedMail = (props) => {
{type === "1" && ( {type === "1" && (
<UserFields <UserFields
className="user-fields"
inputs={domains} inputs={domains}
buttonLabel={t("AddTrustedDomain")} buttonLabel={t("AddTrustedDomain")}
onChangeInput={onChangeInput} onChangeInput={onChangeInput}
@ -204,11 +206,16 @@ const TrustedMail = (props) => {
/> />
)} )}
<Buttons <SaveCancelButtons
t={t} className="save-cancel-buttons"
showReminder={showReminder}
onSaveClick={onSaveClick} onSaveClick={onSaveClick}
onCancelClick={onCancelClick} onCancelClick={onCancelClick}
showReminder={showReminder}
reminderTest={t("YouHaveUnsavedChanges")}
saveButtonLabel={t("Common:SaveButton")}
cancelButtonLabel={t("Common:CancelButton")}
displaySettings={true}
hasScroll={false}
/> />
</MainContainer> </MainContainer>
); );

View File

@ -2,6 +2,7 @@ import React, { useEffect, useState } from "react";
import Submenu from "@appserver/components/submenu"; import Submenu from "@appserver/components/submenu";
import { withRouter } from "react-router"; import { withRouter } from "react-router";
import { withTranslation } from "react-i18next"; import { withTranslation } from "react-i18next";
import { inject, observer } from "mobx-react";
import { AppServerConfig } from "@appserver/common/constants"; import { AppServerConfig } from "@appserver/common/constants";
import { combineUrl } from "@appserver/common/utils"; import { combineUrl } from "@appserver/common/utils";
import config from "../../../../../../package.json"; import config from "../../../../../../package.json";
@ -11,7 +12,7 @@ import AccessPortal from "./access-portal/index.js";
import AppLoader from "@appserver/common/components/AppLoader"; import AppLoader from "@appserver/common/components/AppLoader";
const SecurityWrapper = (props) => { const SecurityWrapper = (props) => {
const { t, history } = props; const { t, history, loadBaseInfo } = props;
const [currentTab, setCurrentTab] = useState(0); const [currentTab, setCurrentTab] = useState(0);
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
@ -28,11 +29,16 @@ const SecurityWrapper = (props) => {
}, },
]; ];
useEffect(() => { const load = async () => {
await loadBaseInfo();
const path = location.pathname; const path = location.pathname;
const currentTab = data.findIndex((item) => path.includes(item.id)); const currentTab = data.findIndex((item) => path.includes(item.id));
if (currentTab !== -1) setCurrentTab(currentTab); if (currentTab !== -1) setCurrentTab(currentTab);
setIsLoading(true); setIsLoading(true);
};
useEffect(() => {
load();
}, []); }, []);
const onSelect = (e) => { const onSelect = (e) => {
@ -55,4 +61,12 @@ const SecurityWrapper = (props) => {
); );
}; };
export default withTranslation("Settings")(withRouter(SecurityWrapper)); export default inject(({ setup }) => {
const { initSettings } = setup;
return {
loadBaseInfo: async () => {
await initSettings();
},
};
})(withTranslation("Settings")(withRouter(observer(SecurityWrapper))));

View File

@ -1,40 +0,0 @@
import React from "react";
import Button from "@appserver/components/button";
import Text from "@appserver/components/text";
import { ButtonsWrapper } from "../StyledSecurity";
const Buttons = (props) => {
const { t, showReminder, onSaveClick, onCancelClick } = props;
return (
<ButtonsWrapper>
<Button
label={t("Common:SaveButton")}
size="small"
primary={true}
className="button"
onClick={onSaveClick}
isDisabled={!showReminder}
/>
<Button
label={t("Common:CancelButton")}
size="small"
className="button"
onClick={onCancelClick}
isDisabled={!showReminder}
/>
{showReminder && (
<Text
color="#A3A9AE"
fontSize="12px"
fontWeight="600"
className="reminder"
>
{t("YouHaveUnsavedChanges")}
</Text>
)}
</ButtonsWrapper>
);
};
export default Buttons;

View File

@ -27,7 +27,11 @@ const StyledInputWrapper = styled.div`
gap: 10px; gap: 10px;
align-items: center; align-items: center;
margin-bottom: 8px; margin-bottom: 8px;
width: 370px; width: 350px;
@media (max-width: 375px) {
width: 100%;
}
`; `;
const StyledAddWrapper = styled.div` const StyledAddWrapper = styled.div`

View File

@ -2,12 +2,18 @@ import api from "@appserver/common/api";
import { makeAutoObservable } from "mobx"; import { makeAutoObservable } from "mobx";
const { Filter } = api; const { Filter } = api;
import SelectionStore from "./SelectionStore"; import SelectionStore from "./SelectionStore";
import authStore from "@appserver/common/store/AuthStore";
import { combineUrl } from "@appserver/common/utils"; import { combineUrl } from "@appserver/common/utils";
import { AppServerConfig } from "@appserver/common/constants"; import { AppServerConfig } from "@appserver/common/constants";
import config from "../../package.json"; import config from "../../package.json";
class SettingsSetupStore { class SettingsSetupStore {
selectionStore = null; selectionStore = null;
authStore = null;
isLoadingArticleSettings = false;
isInit = false;
common = { common = {
whiteLabel: { whiteLabel: {
@ -45,9 +51,22 @@ class SettingsSetupStore {
constructor() { constructor() {
this.selectionStore = new SelectionStore(this); this.selectionStore = new SelectionStore(this);
this.authStore = authStore;
makeAutoObservable(this); makeAutoObservable(this);
} }
initSettings = async () => {
if (this.isInit) return;
this.isInit = true;
if (authStore.isAuthenticated) {
await authStore.settingsStore.getPortalPasswordSettings();
await authStore.tfaStore.getTfaType();
await authStore.settingsStore.getIpRestrictionsEnable();
await authStore.settingsStore.getIpRestrictions();
}
};
setIsLoading = (isLoading) => { setIsLoading = (isLoading) => {
this.security.accessRight.isLoading = isLoading; this.security.accessRight.isLoading = isLoading;
}; };
@ -302,6 +321,10 @@ class SettingsSetupStore {
this.setCommonThirdPartyList(res); this.setCommonThirdPartyList(res);
}; };
setIsLoadingArticleSettings = (isLoading) => {
this.isLoadingArticleSettings = isLoading;
};
} }
export default SettingsSetupStore; export default SettingsSetupStore;

View File

@ -802,6 +802,7 @@ Scenario("Trusted mail settings change test success", async ({ I }) => {
I.mockEndpoint(Endpoints.info, "infoSettings"); I.mockEndpoint(Endpoints.info, "infoSettings");
I.mockEndpoint(Endpoints.self, "selfSettings"); I.mockEndpoint(Endpoints.self, "selfSettings");
I.mockEndpoint(Endpoints.common, "common"); I.mockEndpoint(Endpoints.common, "common");
I.mockEndpoint(Endpoints.maildomainsettings, "maildomainsettings");
if (deviceType === "mobile") { if (deviceType === "mobile") {
I.amOnPage("/settings/security/access-portal/trusted-mail"); I.amOnPage("/settings/security/access-portal/trusted-mail");
@ -834,6 +835,7 @@ Scenario("Trusted mail settings change test error", async ({ I }) => {
I.mockEndpoint(Endpoints.info, "infoSettings"); I.mockEndpoint(Endpoints.info, "infoSettings");
I.mockEndpoint(Endpoints.self, "selfSettings"); I.mockEndpoint(Endpoints.self, "selfSettings");
I.mockEndpoint(Endpoints.common, "common"); I.mockEndpoint(Endpoints.common, "common");
I.mockEndpoint(Endpoints.maildomainsettings, "maildomainsettings");
if (deviceType === "mobile") { if (deviceType === "mobile") {
I.amOnPage("/settings/security/access-portal/trusted-mail"); I.amOnPage("/settings/security/access-portal/trusted-mail");
@ -859,3 +861,36 @@ Scenario("Trusted mail settings change test error", async ({ I }) => {
I.see("Incorrect domain"); I.see("Incorrect domain");
} }
}); });
Scenario("Trusted mail settings change test server error", async ({ I }) => {
I.mockEndpoint(Endpoints.settings, "settings");
I.mockEndpoint(Endpoints.build, "build");
I.mockEndpoint(Endpoints.info, "info");
I.mockEndpoint(Endpoints.self, "self");
I.mockEndpoint(Endpoints.common, "common");
I.mockEndpoint(Endpoints.maildomainsettings, "maildomainsettingsError");
if (deviceType === "mobile") {
I.amOnPage("/settings/security/access-portal/trusted-mail");
I.see("Trusted mail domain settings");
I.click({
react: "Checkbox",
props: {
value: "1",
},
});
I.see("You have unsaved changes");
I.click("Add trusted domain");
I.see({ react: "TextInput" });
I.fillField("#domain-input-0", "test");
I.click("Save");
I.see("You have unsaved changes");
I.see("Request failed with status code 400");
}
});

View File

@ -135,4 +135,10 @@ module.exports = class Endpoints {
method: "PUT", method: "PUT",
baseDir: "settings", baseDir: "settings",
}; };
static maildomainsettings = {
url: ["http://localhost:8092/api/2.0/settings/maildomainsettings.json"],
method: "POST",
baseDir: "settings",
};
}; };

View File

@ -0,0 +1,6 @@
{
"count": 1,
"response": "Settings have been successfully updated",
"status": 0,
"statusCode": 200
}

View File

@ -0,0 +1,6 @@
{
"count": 1,
"response": "Error",
"status": 0,
"statusCode": 400
}

View File

@ -36,6 +36,7 @@ using ASC.Core;
using ASC.Core.Common.Settings; using ASC.Core.Common.Settings;
using ASC.Core.Tenants; using ASC.Core.Tenants;
using ASC.Core.Users; using ASC.Core.Users;
using ASC.IPSecurity;
using ASC.MessagingSystem; using ASC.MessagingSystem;
using ASC.Web.Core.PublicResources; using ASC.Web.Core.PublicResources;
using ASC.Web.Core.Utility; using ASC.Web.Core.Utility;
@ -259,7 +260,9 @@ namespace ASC.Web.Core.Users
email = (email ?? "").Trim(); email = (email ?? "").Trim();
if (!email.TestEmailRegex()) throw new ArgumentNullException(nameof(email), Resource.ErrorNotCorrectEmail); if (!email.TestEmailRegex()) throw new ArgumentNullException(nameof(email), Resource.ErrorNotCorrectEmail);
if (!IPSecurity.Verify()) var settings = SettingsManager.Load<IPRestrictionsSettings>();
if (settings.Enable && !IPSecurity.Verify())
{ {
throw new Exception(Resource.ErrorAccessRestricted); throw new Exception(Resource.ErrorAccessRestricted);
} }