Merge branch 'feature/shared-redesign-third-party' of github.com:ONLYOFFICE/DocSpace into feature/shared-redesign-third-party

This commit is contained in:
Maksim Chegulov 2022-10-03 11:45:24 +03:00
commit b543e49d52
83 changed files with 2409 additions and 1916 deletions

View File

@ -1,266 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DOCUMENT Type="Advanced Installer" CreateVersion="18.6" version="18.7" Modules="enterprise" RootPath="." Language="en" Id="{2D2C7C0E-FA78-4158-A222-DA463E882AAC}">
<COMPONENT cid="caphyon.advinst.msicomp.MsiPropsComponent">
<ROW Property="AI_BITMAP_DISPLAY_MODE" Value="0"/>
<ROW Property="AI_CURRENT_YEAR" Value="2022" ValueLocId="-"/>
<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="ARPNOMODIFY" MultiBuildValue="DefaultBuild:1"/>
<ROW Property="ARPNOREPAIR" Value="1"/>
<ROW Property="ARPSYSTEMCOMPONENT" Value="1"/>
<ROW Property="Manufacturer" Value="Apache"/>
<ROW Property="ProductCode" Value="1033:{79F55836-69B9-46CE-B03D-7679D38C0AD4} " Type="16"/>
<ROW Property="ProductLanguage" Value="1033"/>
<ROW Property="ProductName" Value="Apache Kafka"/>
<ROW Property="ProductVersion" Value="1.0.0"/>
<ROW Property="SecureCustomProperties" Value="OLDPRODUCTS;AI_NEWERPRODUCTFOUND"/>
<ROW Property="ServiceName_Apache_Kafka" Value="Apache Kafka"/>
<ROW Property="ServiceName_Apache_ZooKeeper" Value="Apache ZooKeeper"/>
<ROW Property="UpgradeCode" Value="{9202447D-B999-4041-B479-B3789A872456}"/>
<ROW Property="WindowsType9X" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
<ROW Property="WindowsType9XDisplay" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
<ROW Property="WindowsTypeNT40" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
<ROW Property="WindowsTypeNT40Display" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
<ROW Property="WindowsTypeNT50" MultiBuildValue="DefaultBuild:Windows 2000" ValueLocId="-"/>
<ROW Property="WindowsTypeNT50Display" MultiBuildValue="DefaultBuild:Windows 2000" ValueLocId="-"/>
<ROW Property="WindowsTypeNT5X" MultiBuildValue="DefaultBuild:Windows XP/2003" ValueLocId="-"/>
<ROW Property="WindowsTypeNT5XDisplay" MultiBuildValue="DefaultBuild:Windows XP/2003" ValueLocId="-"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiDirsComponent">
<ROW Directory="APPDIR" Directory_Parent="TARGETDIR" DefaultDir="APPDIR:." IsPseudoRoot="1"/>
<ROW Directory="TARGETDIR" DefaultDir="SourceDir"/>
<ROW Directory="WindowsVolume" Directory_Parent="TARGETDIR" DefaultDir="WINDOW~1|WindowsVolume" IsPseudoRoot="1"/>
<ROW Directory="kafka_2.122.8.0_Dir" Directory_Parent="kafkazookeeper_Dir" DefaultDir="kafka"/>
<ROW Directory="kafkazookeeper_Dir" Directory_Parent="WindowsVolume" DefaultDir="Apache"/>
<ROW Directory="tools_Dir" Directory_Parent="kafka_2.122.8.0_Dir" DefaultDir="tools"/>
</COMPONENT>
<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="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="kafka.exe" ComponentId="{193EC233-51DE-4D1E-9528-A22252F0661E}" Directory_="tools_Dir" Attributes="0" KeyPath="kafka.exe"/>
<ROW Component="kafka.xml" ComponentId="{531D2348-5D97-434D-9AC6-2B73961605F4}" Directory_="tools_Dir" Attributes="0" KeyPath="kafka.xml" Type="0"/>
<ROW Component="zookeeper.exe" ComponentId="{2E8D451F-F3A5-46E8-B3A5-E4087EABB148}" Directory_="tools_Dir" Attributes="0" KeyPath="zookeeper.exe"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiFeatsComponent">
<ROW Feature="MainFeature" Title="MainFeature" Description="Description" Display="1" Level="1" Directory_="APPDIR" Attributes="0"/>
<ATTRIBUTE name="CurrentFeature" value="MainFeature"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiFilesComponent">
<ROW File="kafka.exe" Component_="kafka.exe" FileName="kafka.exe" Attributes="0" SourcePath="kafka-zookeeper\kafka\tools\kafka.exe" SelfReg="false" DigSign="true"/>
<ROW File="kafka.xml" Component_="kafka.xml" FileName="kafka.xml" Attributes="0" SourcePath="kafka-zookeeper\kafka\tools\kafka.xml" SelfReg="false"/>
<ROW File="zookeeper.exe" Component_="zookeeper.exe" FileName="ZOOKEE~1.EXE|zookeeper.exe" Attributes="0" SourcePath="kafka-zookeeper\kafka\tools\zookeeper.exe" SelfReg="false" DigSign="true"/>
<ROW File="zookeeper.xml" Component_="kafka.xml" FileName="ZOOKEE~1.XML|zookeeper.xml" Attributes="0" SourcePath="kafka-zookeeper\kafka\tools\zookeeper.xml" SelfReg="false"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.BootstrOptComponent">
<ROW BootstrOptKey="GlobalOptions" DownloadFolder="[AppDataFolder][|Manufacturer]\[|ProductName]\prerequisites" Options="2"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.BootstrapperUISequenceComponent">
<ROW Action="AI_DetectSoftware" Sequence="151"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.BuildComponent">
<ROW BuildKey="DefaultBuild" BuildName="DefaultBuild" BuildOrder="1" BuildType="0" PackageFolder="publish" PackageFileName="[|ProductName]" Languages="en" InstallationType="4" UseLargeSchema="true" Unicode="true" UACExecutionLevel="2"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.DictionaryComponent">
<ROW Path="&lt;AI_DICTS&gt;ui.ail"/>
<ROW Path="&lt;AI_DICTS&gt;ui_en.ail"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.FragmentComponent">
<ROW Fragment="CommonUI.aip" Path="&lt;AI_FRAGS&gt;CommonUI.aip"/>
<ROW Fragment="FolderDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\FolderDlg.aip"/>
<ROW Fragment="MaintenanceTypeDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\MaintenanceTypeDlg.aip"/>
<ROW Fragment="MaintenanceWelcomeDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\MaintenanceWelcomeDlg.aip"/>
<ROW Fragment="SequenceDialogs.aip" Path="&lt;AI_THEMES&gt;classic\fragments\SequenceDialogs.aip"/>
<ROW Fragment="Sequences.aip" Path="&lt;AI_FRAGS&gt;Sequences.aip"/>
<ROW Fragment="StaticUIStrings.aip" Path="&lt;AI_FRAGS&gt;StaticUIStrings.aip"/>
<ROW Fragment="UI.aip" Path="&lt;AI_THEMES&gt;classic\fragments\UI.aip"/>
<ROW Fragment="Validation.aip" Path="&lt;AI_FRAGS&gt;Validation.aip"/>
<ROW Fragment="VerifyRemoveDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\VerifyRemoveDlg.aip"/>
<ROW Fragment="VerifyRepairDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\VerifyRepairDlg.aip"/>
<ROW Fragment="WelcomeDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\WelcomeDlg.aip"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiActionTextComponent">
<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_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="Commit text file changes." DescriptionLocId="ActionText.Description.AI_TxtUpdaterCommit" Template="Commit text file changes." TemplateLocId="ActionText.Template.AI_TxtUpdaterCommit"/>
<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="Generating actions to configure text files updates" DescriptionLocId="ActionText.Description.AI_TxtUpdaterInstall"/>
<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 cid="caphyon.advinst.msicomp.MsiBinaryComponent">
<ROW Name="PowerShellScriptLauncher.dll" SourcePath="&lt;AI_CUSTACTS&gt;PowerShellScriptLauncher.dll"/>
<ROW Name="SoftwareDetector.dll" SourcePath="&lt;AI_CUSTACTS&gt;SoftwareDetector.dll"/>
<ROW Name="TxtUpdater.dll" SourcePath="&lt;AI_CUSTACTS&gt;TxtUpdater.dll"/>
<ROW Name="aicustact.dll" SourcePath="&lt;AI_CUSTACTS&gt;aicustact.dll"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiControlEventComponent">
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL" Ordering="1"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL" Ordering="201"/>
<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_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL" Ordering="201"/>
<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_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="1"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_MAINT" Ordering="198"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="CustomizeDlg" Condition="AI_MAINT" Ordering="202"/>
<ROW Dialog_="MaintenanceTypeDlg" Control_="ChangeButton" Event="NewDialog" Argument="CustomizeDlg" Condition="AI_MAINT" Ordering="501"/>
<ROW Dialog_="MaintenanceTypeDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceWelcomeDlg" Condition="AI_MAINT" Ordering="1"/>
<ROW Dialog_="MaintenanceTypeDlg" Control_="RemoveButton" Event="NewDialog" Argument="VerifyRemoveDlg" Condition="AI_MAINT AND InstallMode=&quot;Remove&quot;" Ordering="601"/>
<ROW Dialog_="VerifyRemoveDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT AND InstallMode=&quot;Remove&quot;" Ordering="1"/>
<ROW Dialog_="MaintenanceTypeDlg" Control_="RepairButton" Event="NewDialog" Argument="VerifyRepairDlg" Condition="AI_MAINT AND InstallMode=&quot;Repair&quot;" Ordering="601"/>
<ROW Dialog_="VerifyRepairDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT AND InstallMode=&quot;Repair&quot;" Ordering="1"/>
<ROW Dialog_="VerifyRepairDlg" Control_="Repair" Event="EndDialog" Argument="Return" Condition="AI_MAINT AND InstallMode=&quot;Repair&quot;" Ordering="399" Options="1"/>
<ROW Dialog_="VerifyRemoveDlg" Control_="Remove" Event="EndDialog" Argument="Return" Condition="AI_MAINT AND InstallMode=&quot;Remove&quot;" Ordering="299" Options="1"/>
<ROW Dialog_="PatchWelcomeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_PATCH" Ordering="201"/>
<ROW Dialog_="ResumeDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_RESUME" Ordering="299"/>
<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="203"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiCreateFolderComponent">
<ROW Directory_="APPDIR" Component_="APPDIR" ManualDelete="true"/>
<ROW Directory_="kafkazookeeper_Dir" Component_="Apache" ManualDelete="false"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiCustActComponent">
<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_DATA_SETTER" Type="51" Source="CustomActionData" Target="AEQAaQBnAGkAdABhAGwAbAB5AFMAaQBnAG4AUwBjAHIAaQBwAHQAAgABAEYAbABhAGcAcwACADYAAQBQAGEAcgBhAG0AcwACAAEAUwBjAHIAaQBwAHQAAgAjAFIAZQBxAHUAaQByAGUAcwAgAC0AdgBlAHIAcwBpAG8AbgAgADMADQAKAFAAYQByAGEAbQAoACkADQAKAA0ACgAkAEEAUABQAEQASQBSACAAPQAgAEEASQBfAEcAZQB0AE0AcwBpAFAAcgBvAHAAZQByAHQAeQAgAEEAUABQAEQASQBSAA0ACgAkAE0AQQBJAE4ARABJAFIAIAA9ACAAJABBAFAAUABEAEkAUgAuAFQAbwBTAHQAcgBpAG4AZwAoACkAIAArACAAIgAuAC4AIgANAAoAUgBlAG0AbwB2AGUALQBJAHQAZQBtACAAJABNAEEASQBOAEQASQBSACAALQBSAGUAYwB1AHIAcwBl"/>
<ROW Action="AI_DATA_SETTER_1" Type="51" Source="CustomActionData" Target="[~]"/>
<ROW Action="AI_DOWNGRADE" Type="19" Target="4010"/>
<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_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_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_RESTORE_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH" Target="[AI_SETUPEXEPATH_ORIGINAL]"/>
<ROW Action="AI_RESTORE_LOCATION" Type="65" Source="aicustact.dll" Target="RestoreLocation"/>
<ROW Action="AI_ResolveKnownFolders" Type="1" Source="aicustact.dll" Target="AI_ResolveKnownFolders"/>
<ROW Action="AI_RestartElevated" Type="1" Source="aicustact.dll" Target="RestartElevated"/>
<ROW Action="AI_SHOW_LOG" Type="65" Source="aicustact.dll" Target="LaunchLogFile" WithoutSeq="true"/>
<ROW Action="AI_STORE_LOCATION" Type="51" Source="ARPINSTALLLOCATION" Target="[APPDIR]"/>
<ROW Action="AI_TxtUpdaterCommit" Type="11777" Source="TxtUpdater.dll" Target="OnTxtUpdaterCommit" WithoutSeq="true"/>
<ROW Action="AI_TxtUpdaterConfig" Type="11265" Source="TxtUpdater.dll" Target="OnTxtUpdaterConfig" WithoutSeq="true"/>
<ROW Action="AI_TxtUpdaterInstall" Type="1" Source="TxtUpdater.dll" Target="OnTxtUpdaterInstall"/>
<ROW Action="AI_TxtUpdaterRollback" Type="11521" Source="TxtUpdater.dll" Target="OnTxtUpdaterRollback" WithoutSeq="true"/>
<ROW Action="RemoveManufactorDir" Type="65" Source="PowerShellScriptLauncher.dll" Target="RunPowerShellScript" Options="1" AdditionalSeq="AI_DATA_SETTER"/>
<ROW Action="SET_APPDIR" Type="307" Source="APPDIR" Target="[ProgramFilesFolder][Manufacturer]\[ProductName]"/>
<ROW Action="SET_SHORTCUTDIR" Type="307" Source="SHORTCUTDIR" Target="[ProgramMenuFolder][ProductName]"/>
<ROW Action="SET_TARGETDIR_TO_APPDIR" Type="51" Source="TARGETDIR" Target="[APPDIR]"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiEnvComponent">
<ROW Environment="JAVA_HOME" Name="=-*JAVA_HOME" Value="[PATH_TO_JAVA]" Component_="Apache"/>
<ROW Environment="Path" Name="=*Path" Value="[~];%JAVA_HOME%\bin" Component_="Apache"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiFeatCompsComponent">
<ROW Feature_="MainFeature" Component_="APPDIR"/>
<ROW Feature_="MainFeature" Component_="ProductInformation"/>
<ROW Feature_="MainFeature" Component_="Apache"/>
<ROW Feature_="MainFeature" Component_="kafka.exe"/>
<ROW Feature_="MainFeature" Component_="kafka.xml"/>
<ROW Feature_="MainFeature" Component_="zookeeper.exe"/>
<ROW Feature_="MainFeature" Component_="AI_CustomARPName"/>
<ROW Feature_="MainFeature" Component_="AI_DisableModify"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstExSeqComponent">
<ROW Action="AI_DOWNGRADE" Condition="AI_NEWERPRODUCTFOUND AND (UILevel &lt;&gt; 5)" Sequence="210"/>
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=&quot;&quot;" Sequence="749"/>
<ROW Action="AI_STORE_LOCATION" Condition="(Not Installed) OR REINSTALL" Sequence="1501"/>
<ROW Action="AI_PREPARE_UPGRADE" Condition="AI_UPGRADE=&quot;No&quot; AND (Not Installed)" Sequence="1397"/>
<ROW Action="AI_ResolveKnownFolders" Sequence="52"/>
<ROW Action="AI_EnableDebugLog" Sequence="51"/>
<ROW Action="RemoveManufactorDir" Condition="( NOT Installed )" Sequence="6602"/>
<ROW Action="AI_DATA_SETTER" Condition="( NOT Installed )" Sequence="6601"/>
<ROW Action="AI_ProcessFailActions" Sequence="5848"/>
<ROW Action="AI_DATA_SETTER_1" Sequence="5847"/>
<ROW Action="AI_TxtUpdaterInstall" Sequence="5101"/>
<ROW Action="AI_DetectSoftware" Sequence="101"/>
<ROW Action="AI_GetArpIconPath" Sequence="1401"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstallUISequenceComponent">
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=&quot;&quot;" Sequence="749"/>
<ROW Action="AI_ResolveKnownFolders" Sequence="54"/>
<ROW Action="AI_DpiContentScale" Sequence="53"/>
<ROW Action="AI_EnableDebugLog" Sequence="52"/>
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Sequence="99"/>
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Condition="AI_SETUPEXEPATH_ORIGINAL" Sequence="102"/>
<ROW Action="AI_DetectSoftware" Sequence="101"/>
<ROW Action="AI_RestartElevated" Sequence="51" Builds="DefaultBuild"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiLaunchConditionsComponent">
<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] cannot be installed on [WindowsTypeNT40Display]." DescriptionLocId="AI.LaunchCondition.NoNT40" 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] 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="VersionNT" Description="[ProductName] cannot be installed on [WindowsType9XDisplay]." DescriptionLocId="AI.LaunchCondition.No9X" IsPredefined="true" Builds="DefaultBuild"/>
</COMPONENT>
<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="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="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 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_ZooKeeper" Name="[ServiceName_Apache_ZooKeeper]" Event="1" ConfigType="3" Argument="1" Component_="zookeeper.exe"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiServConfigFailureActionsComponent">
<ROW MsiServiceConfigFailureActions="Apache_Kafka" Name="[ServiceName_Apache_Kafka]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="kafka.exe"/>
<ROW MsiServiceConfigFailureActions="Apache_ZooKeeper" Name="[ServiceName_Apache_ZooKeeper]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="zookeeper.exe"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiServCtrlComponent">
<ROW ServiceControl="Apache_Kafka" Name="[ServiceName_Apache_Kafka]" Event="161" Wait="1" Component_="kafka.exe"/>
<ROW ServiceControl="Apache_ZooKeeper" Name="[ServiceName_Apache_ZooKeeper]" Event="161" Wait="1" Component_="zookeeper.exe"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiServInstComponent">
<ROW ServiceInstall="Apache_Kafka" Name="[ServiceName_Apache_Kafka]" DisplayName="[ServiceName_Apache_Kafka]" ServiceType="16" StartType="2" ErrorControl="1" Component_="kafka.exe"/>
<ROW ServiceInstall="Apache_ZooKeeper" Name="[ServiceName_Apache_ZooKeeper]" DisplayName="[ServiceName_Apache_ZooKeeper]" ServiceType="16" StartType="2" ErrorControl="1" Component_="zookeeper.exe"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiThemeComponent">
<ATTRIBUTE name="UsedTheme" value="classic"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiUpgradeComponent">
<ROW UpgradeCode="[|UpgradeCode]" VersionMin="0.0.1" VersionMax="[|ProductVersion]" Attributes="257" ActionProperty="OLDPRODUCTS"/>
<ROW UpgradeCode="[|UpgradeCode]" VersionMin="[|ProductVersion]" Attributes="2" ActionProperty="AI_NEWERPRODUCTFOUND"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.SynchronizedFolderComponent">
<ROW Directory_="kafka_2.122.8.0_Dir" SourcePath="kafka-zookeeper\kafka" Feature="MainFeature" ExcludePattern="*~|#*#|%*%|._|CVS|.cvsignore|SCCS|vssver.scc|mssccprj.scc|vssver2.scc|.svn|.DS_Store" ExcludeFlags="6" FileAddOptions="4"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.TxtUpdateComponent">
<ROW Name="ReplaceWinVol" TxtUpdateSet="xml" FindPattern="{WindowsVolume}" ReplacePattern="[WindowsVolume]" Options="2" Order="0" FileEncoding="-1"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.TxtUpdateSetComponent">
<ROW Key="xml" Component="zookeeper.exe" FileName="*.xml" Directory="tools_Dir" Options="17"/>
</COMPONENT>
</DOCUMENT>

View File

@ -1,197 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DOCUMENT Type="Advanced Installer" CreateVersion="18.6.1" version="18.7" Modules="enterprise" RootPath="." Language="en" Id="{93F1E21E-F074-444A-9756-659088E0DA02}">
<COMPONENT cid="caphyon.advinst.msicomp.MsiPropsComponent">
<ROW Property="AI_BITMAP_DISPLAY_MODE" Value="0"/>
<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="ARPNOMODIFY" MultiBuildValue="DefaultBuild:1"/>
<ROW Property="ARPNOREPAIR" Value="1"/>
<ROW Property="ARPSYSTEMCOMPONENT" Value="1"/>
<ROW Property="Manufacturer" Value="Apache"/>
<ROW Property="ProductCode" Value="1033:{DA471CF9-78DC-4D13-AB18-87B4604538FA} " Type="16"/>
<ROW Property="ProductLanguage" Value="1033"/>
<ROW Property="ProductName" Value="Apache ZooKeeper"/>
<ROW Property="ProductVersion" Value="1.0.0" Type="32"/>
<ROW Property="SecureCustomProperties" Value="OLDPRODUCTS;AI_NEWERPRODUCTFOUND"/>
<ROW Property="UpgradeCode" Value="{5CB34BEC-536C-45BA-8C86-77E055EF4325}"/>
<ROW Property="WindowsType9X" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
<ROW Property="WindowsType9XDisplay" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
<ROW Property="WindowsTypeNT40" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
<ROW Property="WindowsTypeNT40Display" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
<ROW Property="WindowsTypeNT50" MultiBuildValue="DefaultBuild:Windows 2000" ValueLocId="-"/>
<ROW Property="WindowsTypeNT50Display" MultiBuildValue="DefaultBuild:Windows 2000" ValueLocId="-"/>
<ROW Property="WindowsTypeNT5X" MultiBuildValue="DefaultBuild:Windows XP/2003" ValueLocId="-"/>
<ROW Property="WindowsTypeNT5XDisplay" MultiBuildValue="DefaultBuild:Windows XP/2003" ValueLocId="-"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiDirsComponent">
<ROW Directory="APPDIR" Directory_Parent="TARGETDIR" DefaultDir="APPDIR:." IsPseudoRoot="1"/>
<ROW Directory="TARGETDIR" DefaultDir="SourceDir"/>
<ROW Directory="WindowsVolume" Directory_Parent="TARGETDIR" DefaultDir="WINDOW~1|WindowsVolume" IsPseudoRoot="1"/>
<ROW Directory="apachezookeeper3.7.0bin_Dir" Directory_Parent="kafkazookeeper_Dir" DefaultDir="ZOOKEE~1|zookeeper"/>
<ROW Directory="kafkazookeeper_Dir" Directory_Parent="WindowsVolume" DefaultDir="Apache"/>
</COMPONENT>
<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="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"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiFeatsComponent">
<ROW Feature="MainFeature" Title="MainFeature" Description="Description" Display="1" Level="1" Directory_="APPDIR" Attributes="0"/>
<ATTRIBUTE name="CurrentFeature" value="MainFeature"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.BootstrOptComponent">
<ROW BootstrOptKey="GlobalOptions" DownloadFolder="[AppDataFolder][|Manufacturer]\[|ProductName]\prerequisites" Options="2"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.BuildComponent">
<ROW BuildKey="DefaultBuild" BuildName="DefaultBuild" BuildOrder="1" BuildType="0" PackageFolder="publish" PackageFileName="[|ProductName]" Languages="en" InstallationType="4" UseLargeSchema="true" Unicode="true" UACExecutionLevel="2"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.DictionaryComponent">
<ROW Path="&lt;AI_DICTS&gt;ui.ail"/>
<ROW Path="&lt;AI_DICTS&gt;ui_en.ail"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.FragmentComponent">
<ROW Fragment="CommonUI.aip" Path="&lt;AI_FRAGS&gt;CommonUI.aip"/>
<ROW Fragment="FolderDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\FolderDlg.aip"/>
<ROW Fragment="MaintenanceTypeDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\MaintenanceTypeDlg.aip"/>
<ROW Fragment="MaintenanceWelcomeDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\MaintenanceWelcomeDlg.aip"/>
<ROW Fragment="SequenceDialogs.aip" Path="&lt;AI_THEMES&gt;classic\fragments\SequenceDialogs.aip"/>
<ROW Fragment="Sequences.aip" Path="&lt;AI_FRAGS&gt;Sequences.aip"/>
<ROW Fragment="StaticUIStrings.aip" Path="&lt;AI_FRAGS&gt;StaticUIStrings.aip"/>
<ROW Fragment="UI.aip" Path="&lt;AI_THEMES&gt;classic\fragments\UI.aip"/>
<ROW Fragment="Validation.aip" Path="&lt;AI_FRAGS&gt;Validation.aip"/>
<ROW Fragment="VerifyRemoveDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\VerifyRemoveDlg.aip"/>
<ROW Fragment="VerifyRepairDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\VerifyRepairDlg.aip"/>
<ROW Fragment="WelcomeDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\WelcomeDlg.aip"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiBinaryComponent">
<ROW Name="PowerShellScriptLauncher.dll" SourcePath="&lt;AI_CUSTACTS&gt;PowerShellScriptLauncher.dll"/>
<ROW Name="aicustact.dll" SourcePath="&lt;AI_CUSTACTS&gt;aicustact.dll"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiControlEventComponent">
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL" Ordering="1"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL" Ordering="201"/>
<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_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL" Ordering="201"/>
<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_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="1"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_MAINT" Ordering="198"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="CustomizeDlg" Condition="AI_MAINT" Ordering="202"/>
<ROW Dialog_="MaintenanceTypeDlg" Control_="ChangeButton" Event="NewDialog" Argument="CustomizeDlg" Condition="AI_MAINT" Ordering="501"/>
<ROW Dialog_="MaintenanceTypeDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceWelcomeDlg" Condition="AI_MAINT" Ordering="1"/>
<ROW Dialog_="MaintenanceTypeDlg" Control_="RemoveButton" Event="NewDialog" Argument="VerifyRemoveDlg" Condition="AI_MAINT AND InstallMode=&quot;Remove&quot;" Ordering="601"/>
<ROW Dialog_="VerifyRemoveDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT AND InstallMode=&quot;Remove&quot;" Ordering="1"/>
<ROW Dialog_="MaintenanceTypeDlg" Control_="RepairButton" Event="NewDialog" Argument="VerifyRepairDlg" Condition="AI_MAINT AND InstallMode=&quot;Repair&quot;" Ordering="601"/>
<ROW Dialog_="VerifyRepairDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT AND InstallMode=&quot;Repair&quot;" Ordering="1"/>
<ROW Dialog_="VerifyRepairDlg" Control_="Repair" Event="EndDialog" Argument="Return" Condition="AI_MAINT AND InstallMode=&quot;Repair&quot;" Ordering="399" Options="1"/>
<ROW Dialog_="VerifyRemoveDlg" Control_="Remove" Event="EndDialog" Argument="Return" Condition="AI_MAINT AND InstallMode=&quot;Remove&quot;" Ordering="299" Options="1"/>
<ROW Dialog_="PatchWelcomeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_PATCH" Ordering="201"/>
<ROW Dialog_="ResumeDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_RESUME" Ordering="299"/>
<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="203"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiCreateFolderComponent">
<ROW Directory_="APPDIR" Component_="APPDIR" ManualDelete="true"/>
<ROW Directory_="apachezookeeper3.7.0bin_Dir" Component_="zookeeper" ManualDelete="false"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiCustActComponent">
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH_ORIGINAL" Target="[AI_SETUPEXEPATH]"/>
<ROW Action="AI_DATA_SETTER_2" Type="51" Source="CustomActionData" Target="AEQAaQBnAGkAdABhAGwAbAB5AFMAaQBnAG4AUwBjAHIAaQBwAHQAAgABAEYAbABhAGcAcwACADYAAQBQAGEAcgBhAG0AcwACAAEAUwBjAHIAaQBwAHQAAgAjAFIAZQBxAHUAaQByAGUAcwAgAC0AdgBlAHIAcwBpAG8AbgAgADMADQAKAFAAYQByAGEAbQAoACkADQAKAA0ACgAkAEEAUABQAEQASQBSACAAPQAgAEEASQBfAEcAZQB0AE0AcwBpAFAAcgBvAHAAZQByAHQAeQAgAEEAUABQAEQASQBSAA0ACgAkAE0AQQBJAE4ARABJAFIAIAA9ACAAJABBAFAAUABEAEkAUgAuAFQAbwBTAHQAcgBpAG4AZwAoACkAIAArACAAIgAuAC4AIgANAAoAUgBlAG0AbwB2AGUALQBJAHQAZQBtACAAJABNAEEASQBOAEQASQBSACAALQBSAGUAYwB1AHIAcwBl"/>
<ROW Action="AI_DOWNGRADE" Type="19" Target="4010"/>
<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_GetArpIconPath" Type="1" Source="aicustact.dll" Target="GetArpIconPath"/>
<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_RESTORE_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH" Target="[AI_SETUPEXEPATH_ORIGINAL]"/>
<ROW Action="AI_RESTORE_LOCATION" Type="65" Source="aicustact.dll" Target="RestoreLocation"/>
<ROW Action="AI_ResolveKnownFolders" Type="1" Source="aicustact.dll" Target="AI_ResolveKnownFolders"/>
<ROW Action="AI_RestartElevated" Type="1" Source="aicustact.dll" Target="RestartElevated"/>
<ROW Action="AI_SHOW_LOG" Type="65" Source="aicustact.dll" Target="LaunchLogFile" WithoutSeq="true"/>
<ROW Action="AI_STORE_LOCATION" Type="51" Source="ARPINSTALLLOCATION" Target="[APPDIR]"/>
<ROW Action="RemoveManufactorDir" Type="65" Source="PowerShellScriptLauncher.dll" Target="RunPowerShellScript" Options="1" AdditionalSeq="AI_DATA_SETTER_2"/>
<ROW Action="SET_APPDIR" Type="307" Source="APPDIR" Target="[ProgramFilesFolder][Manufacturer]\[ProductName]"/>
<ROW Action="SET_SHORTCUTDIR" Type="307" Source="SHORTCUTDIR" Target="[ProgramMenuFolder][ProductName]"/>
<ROW Action="SET_TARGETDIR_TO_APPDIR" Type="51" Source="TARGETDIR" Target="[APPDIR]"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiFeatCompsComponent">
<ROW Feature_="MainFeature" Component_="APPDIR"/>
<ROW Feature_="MainFeature" Component_="ProductInformation"/>
<ROW Feature_="MainFeature" Component_="zookeeper"/>
<ROW Feature_="MainFeature" Component_="AI_CustomARPName"/>
<ROW Feature_="MainFeature" Component_="AI_DisableModify"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstExSeqComponent">
<ROW Action="AI_DOWNGRADE" Condition="AI_NEWERPRODUCTFOUND AND (UILevel &lt;&gt; 5)" Sequence="210"/>
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=&quot;&quot;" Sequence="749"/>
<ROW Action="AI_STORE_LOCATION" Condition="(Not Installed) OR REINSTALL" Sequence="1501"/>
<ROW Action="AI_PREPARE_UPGRADE" Condition="AI_UPGRADE=&quot;No&quot; AND (Not Installed)" Sequence="1397"/>
<ROW Action="AI_ResolveKnownFolders" Sequence="52"/>
<ROW Action="AI_EnableDebugLog" Sequence="51"/>
<ROW Action="RemoveManufactorDir" Condition="( NOT Installed )" Sequence="6602"/>
<ROW Action="AI_DATA_SETTER_2" Condition="( NOT Installed )" Sequence="6601"/>
<ROW Action="AI_GetArpIconPath" Sequence="1401"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstallUISequenceComponent">
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=&quot;&quot;" Sequence="749"/>
<ROW Action="AI_ResolveKnownFolders" Sequence="54"/>
<ROW Action="AI_DpiContentScale" Sequence="53"/>
<ROW Action="AI_EnableDebugLog" Sequence="52"/>
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Sequence="99"/>
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Condition="AI_SETUPEXEPATH_ORIGINAL" Sequence="101"/>
<ROW Action="AI_RestartElevated" Sequence="51" Builds="DefaultBuild"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiLaunchConditionsComponent">
<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] cannot be installed on [WindowsTypeNT40Display]." DescriptionLocId="AI.LaunchCondition.NoNT40" 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="VersionNT" Description="[ProductName] cannot be installed on [WindowsType9XDisplay]." DescriptionLocId="AI.LaunchCondition.No9X" IsPredefined="true" Builds="DefaultBuild"/>
</COMPONENT>
<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="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="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 cid="caphyon.advinst.msicomp.MsiThemeComponent">
<ATTRIBUTE name="UsedTheme" value="classic"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiUpgradeComponent">
<ROW UpgradeCode="[|UpgradeCode]" VersionMin="0.0.1" VersionMax="[|ProductVersion]" Attributes="257" ActionProperty="OLDPRODUCTS"/>
<ROW UpgradeCode="[|UpgradeCode]" VersionMin="[|ProductVersion]" Attributes="2" ActionProperty="AI_NEWERPRODUCTFOUND"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.SynchronizedFolderComponent">
<ROW Directory_="apachezookeeper3.7.0bin_Dir" SourcePath="kafka-zookeeper\zookeeper" Feature="MainFeature" ExcludePattern="*~|#*#|%*%|._|CVS|.cvsignore|SCCS|vssver.scc|mssccprj.scc|vssver2.scc|.svn|.DS_Store" ExcludeFlags="6" FileAddOptions="4"/>
</COMPONENT>
</DOCUMENT>

View File

@ -1,11 +1,113 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Net.Sockets;
using Microsoft.Deployment.WindowsInstaller;
using RabbitMQ.Client;
namespace Utils
{
public class CustomActions
{
public static string CreateAuthToken(string pkey, string machinekey)
{
using (var hasher = new System.Security.Cryptography.HMACSHA1(Encoding.UTF8.GetBytes(machinekey)))
{
var now = DateTime.UtcNow.ToString("yyyyMMddHHmmss");
var hash = System.Web.HttpServerUtility.UrlTokenEncode(hasher.ComputeHash(Encoding.UTF8.GetBytes(string.Join("\n", now, pkey))));
return string.Format("ASC {0}:{1}:{2}", pkey, now, hash);
}
}
[CustomAction]
public static ActionResult SetVersionReleaseDateSign(Session session)
{
var pkey = Convert.ToString(session["VERSION.RELEASE_DATE"]);
var machineKey = Convert.ToString(session["MACHINE_KEY"]);
session.Log("SetVersionReleaseDateSign: pkey {0}, machineKey {1}", pkey, machineKey);
session["VERSION.RELEASE_DATE.SIGN"] = CreateAuthToken(pkey, machineKey);
session.Log("SetVersionReleaseDateSign End: {0}", session["VERSION.RELEASE_DATE.SIGN"]);
return ActionResult.Success;
}
[CustomAction]
public static ActionResult TestRedisServerConnection(Session session)
{
try
{
using (var redis = new Redis(session["REDIS_HOST_PROP"], Convert.ToInt32(session["REDIS_PORT_PROP"])))
{
if (!String.IsNullOrEmpty(session["REDIS_PASSWORD_PROP"].Trim()))
redis.Password = session["REDIS_PASSWORD_PROP"];
var pong = redis.Ping("ONLYOFFICE");
session.Log("Redis Status: IsConnected is {0}", !String.IsNullOrEmpty(pong));
session["RedisServerConnectionError"] = !String.IsNullOrEmpty(pong) ? "" : String.Format("Connection Refused HOST:{0},PORT:{1},PASS:{2}", session["REDIS_HOST_PROP"], session["REDIS_PORT_PROP"], session["REDIS_PASSWORD_PROP"]);
}
}
catch (Exception ex)
{
session.Log("RedisConnectionException '{0}'", ex.Message);
session["RedisServerConnectionError"] = String.Format("Connection Refused HOST:{0},PORT:{1},PASS:{2}", session["REDIS_HOST_PROP"], session["REDIS_PORT_PROP"], session["REDIS_PASSWORD_PROP"]);
}
return ActionResult.Success;
}
[CustomAction]
public static ActionResult TestRabbitMQConnection(Session session)
{
ConnectionFactory factory = new ConnectionFactory();
factory.HostName = session["RABBITMQ_HOSTNAME_PROP"];
factory.Port = Convert.ToInt32(session["RABBITMQ_PORT_PROP"]);
factory.VirtualHost = session["RABBITMQ_VIRTUALHOST_PROP"];
factory.UserName = session["RABBITMQ_USERNAME_PROP"];
factory.Password = session["RABBITMQ_PASSWORD_PROP"];
try
{
using (IConnection conn = factory.CreateConnection())
{
session.Log("RabbitMQ Status: IsConnected is {0}", conn.IsOpen);
session["RabbitMQServerConnectionError"] = conn.IsOpen ? "" : String.Format("Connection Refused HOST:{0}, PORT:{1}, VirtualHost:{2}, UserName:{3}, PASS:{4}",
session["RABBITMQ_HOSTNAME_PROP"],
session["RABBITMQ_PORT_PROP"],
session["RABBITMQ_VIRTUALHOST_PROP"],
session["RABBITMQ_USERNAME_PROP"],
session["RABBITMQ_PASSWORD_PROP"]
);
}
}
catch (Exception ex)
{
session.Log("RabbitMQ.Client.Exceptions.BrokerUnreachableException {0}", ex.Message);
session["RabbitMQServerConnectionError"] = String.Format("Connection Refused HOST:{0}, PORT:{1}, VirtualHost:{2}, UserName:{3}, PASS:{4}",
session["RABBITMQ_HOSTNAME_PROP"],
session["RABBITMQ_PORT_PROP"],
session["RABBITMQ_VIRTUALHOST_PROP"],
session["RABBITMQ_USERNAME_PROP"],
session["RABBITMQ_PASSWORD_PROP"]
);
}
return ActionResult.Success;
}
[CustomAction]
public static ActionResult CheckTCPAvailability(Session session)
{

View File

@ -1,4 +1,5 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following

View File

@ -32,6 +32,9 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="RabbitMQ.Client">
<HintPath>packages\RabbitMQ.Client.3.6.5\lib\net45\RabbitMQ.Client.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.IO.Compression" />
@ -46,8 +49,12 @@
<ItemGroup>
<Compile Include="CustomAction.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="redis-sharp.cs" />
<Content Include="CustomAction.config" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(WixCATargetsPath)" />
</Project>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="RabbitMQ.Client" version="3.6.5" targetFramework="net45" />
</packages>

View File

@ -0,0 +1,937 @@
//
// redis-sharp.cs: ECMA CLI Binding to the Redis key-value storage system
//
// Authors:
// Miguel de Icaza (miguel@gnome.org)
//
// Copyright 2010 Novell, Inc.
//
// Licensed under the same terms of reddis: new BSD license.
//
#define DEBUG
using System;
using System.IO;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using System.Diagnostics;
using System.Linq;
public class Redis : IDisposable {
Socket socket;
BufferedStream bstream;
public enum KeyType {
None, String, List, Set
}
public class ResponseException : Exception {
public ResponseException (string code) : base ("Response error")
{
Code = code;
}
public string Code { get; private set; }
}
public Redis (string host, int port)
{
if (host == null)
throw new ArgumentNullException ("host");
Host = host;
Port = port;
SendTimeout = -1;
}
public Redis (string host) : this (host, 6379)
{
}
public Redis () : this ("localhost", 6379)
{
}
public string Host { get; private set; }
public int Port { get; private set; }
public int RetryTimeout { get; set; }
public int RetryCount { get; set; }
public int SendTimeout { get; set; }
public string Password { get; set; }
int db;
public int Db {
get {
return db;
}
set {
db = value;
SendExpectSuccess ("SELECT", db);
}
}
public string this [string key] {
get { return GetString (key); }
set { Set (key, value); }
}
public void Set (string key, string value)
{
if (key == null)
throw new ArgumentNullException ("key");
if (value == null)
throw new ArgumentNullException ("value");
Set (key, Encoding.UTF8.GetBytes (value));
}
public void Set (string key, byte [] value)
{
if (key == null)
throw new ArgumentNullException ("key");
if (value == null)
throw new ArgumentNullException ("value");
if (value.Length > 1073741824)
throw new ArgumentException ("value exceeds 1G", "value");
if (!SendDataCommand (value, "SET", key))
throw new Exception ("Unable to connect");
ExpectSuccess ();
}
public bool SetNX (string key, string value)
{
if (key == null)
throw new ArgumentNullException ("key");
if (value == null)
throw new ArgumentNullException ("value");
return SetNX (key, Encoding.UTF8.GetBytes (value));
}
public bool SetNX (string key, byte [] value)
{
if (key == null)
throw new ArgumentNullException ("key");
if (value == null)
throw new ArgumentNullException ("value");
if (value.Length > 1073741824)
throw new ArgumentException ("value exceeds 1G", "value");
return SendDataExpectInt (value, "SETNX", key) > 0 ? true : false;
}
public void Set (IDictionary<string,string> dict)
{
if (dict == null)
throw new ArgumentNullException ("dict");
Set (dict.ToDictionary(k => k.Key, v => Encoding.UTF8.GetBytes(v.Value)));
}
public void Set (IDictionary<string,byte []> dict)
{
if (dict == null)
throw new ArgumentNullException ("dict");
MSet (dict.Keys.ToArray (), dict.Values.ToArray ());
}
public void MSet (string [] keys, byte [][] values)
{
if (keys.Length != values.Length)
throw new ArgumentException ("keys and values must have the same size");
byte [] nl = Encoding.UTF8.GetBytes ("\r\n");
MemoryStream ms = new MemoryStream ();
for (int i = 0; i < keys.Length; i++) {
byte [] key = Encoding.UTF8.GetBytes(keys[i]);
byte [] val = values[i];
byte [] kLength = Encoding.UTF8.GetBytes ("$" + key.Length + "\r\n");
byte [] k = Encoding.UTF8.GetBytes (keys[i] + "\r\n");
byte [] vLength = Encoding.UTF8.GetBytes ("$" + val.Length + "\r\n");
ms.Write (kLength, 0, kLength.Length);
ms.Write (k, 0, k.Length);
ms.Write (vLength, 0, vLength.Length);
ms.Write (val, 0, val.Length);
ms.Write (nl, 0, nl.Length);
}
SendDataRESP (ms.ToArray (), "*" + (keys.Length * 2 + 1) + "\r\n$4\r\nMSET\r\n");
ExpectSuccess ();
}
public byte [] Get (string key)
{
if (key == null)
throw new ArgumentNullException ("key");
return SendExpectData ("GET", key);
}
public string Ping(String key)
{
return Encoding.UTF8.GetString (SendExpectData("PING", key));
}
public string GetString (string key)
{
if (key == null)
throw new ArgumentNullException ("key");
return Encoding.UTF8.GetString (Get (key));
}
public byte [][] Sort (SortOptions options)
{
return Sort (options.Key, options.StoreInKey, options.ToArgs());
}
public byte [][] Sort (string key, string destination, params object [] options)
{
if (key == null)
throw new ArgumentNullException ("key");
int offset = string.IsNullOrEmpty (destination) ? 1 : 3;
object [] args = new object [offset + options.Length];
args [0] = key;
Array.Copy (options, 0, args, offset, options.Length);
if (offset == 1) {
return SendExpectDataArray ("SORT", args);
}
else {
args [1] = "STORE";
args [2] = destination;
int n = SendExpectInt ("SORT", args);
return new byte [n][];
}
}
public byte [] GetSet (string key, byte [] value)
{
if (key == null)
throw new ArgumentNullException ("key");
if (value == null)
throw new ArgumentNullException ("value");
if (value.Length > 1073741824)
throw new ArgumentException ("value exceeds 1G", "value");
if (!SendDataCommand (value, "GETSET", key))
throw new Exception ("Unable to connect");
return ReadData ();
}
public string GetSet (string key, string value)
{
if (key == null)
throw new ArgumentNullException ("key");
if (value == null)
throw new ArgumentNullException ("value");
return Encoding.UTF8.GetString (GetSet (key, Encoding.UTF8.GetBytes (value)));
}
string ReadLine ()
{
StringBuilder sb = new StringBuilder ();
int c;
while ((c = bstream.ReadByte ()) != -1){
if (c == '\r')
continue;
if (c == '\n')
break;
sb.Append ((char) c);
}
return sb.ToString ();
}
void Connect ()
{
socket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.NoDelay = true;
socket.SendTimeout = SendTimeout;
socket.Connect (Host, Port);
if (!socket.Connected){
socket.Close ();
socket = null;
return;
}
bstream = new BufferedStream (new NetworkStream (socket), 16*1024);
if (Password != null)
SendExpectSuccess ("AUTH", Password);
}
byte [] end_data = new byte [] { (byte) '\r', (byte) '\n' };
bool SendDataCommand (byte [] data, string cmd, params object [] args)
{
string resp = "*" + (1 + args.Length + 1).ToString () + "\r\n";
resp += "$" + cmd.Length + "\r\n" + cmd + "\r\n";
foreach (object arg in args) {
string argStr = arg.ToString ();
int argStrLength = Encoding.UTF8.GetByteCount(argStr);
resp += "$" + argStrLength + "\r\n" + argStr + "\r\n";
}
resp += "$" + data.Length + "\r\n";
return SendDataRESP (data, resp);
}
bool SendDataRESP (byte [] data, string resp)
{
if (socket == null)
Connect ();
if (socket == null)
return false;
byte [] r = Encoding.UTF8.GetBytes (resp);
try {
Log ("C", resp);
socket.Send (r);
if (data != null){
socket.Send (data);
socket.Send (end_data);
}
} catch (SocketException){
// timeout;
socket.Close ();
socket = null;
return false;
}
return true;
}
bool SendCommand (string cmd, params object [] args)
{
if (socket == null)
Connect ();
if (socket == null)
return false;
string resp = "*" + (1 + args.Length).ToString () + "\r\n";
resp += "$" + cmd.Length + "\r\n" + cmd + "\r\n";
foreach (object arg in args) {
string argStr = arg.ToString ();
int argStrLength = Encoding.UTF8.GetByteCount(argStr);
resp += "$" + argStrLength + "\r\n" + argStr + "\r\n";
}
byte [] r = Encoding.UTF8.GetBytes (resp);
try {
Log ("C", resp);
socket.Send (r);
} catch (SocketException){
// timeout;
socket.Close ();
socket = null;
return false;
}
return true;
}
[Conditional ("DEBUG")]
void Log (string id, string message)
{
Console.WriteLine(id + ": " + message.Trim().Replace("\r\n", " "));
}
void ExpectSuccess ()
{
int c = bstream.ReadByte ();
if (c == -1)
throw new ResponseException ("No more data");
string s = ReadLine ();
Log ("S", (char)c + s);
if (c == '-')
throw new ResponseException (s.StartsWith ("ERR ") ? s.Substring (4) : s);
}
void SendExpectSuccess (string cmd, params object [] args)
{
if (!SendCommand (cmd, args))
throw new Exception ("Unable to connect");
ExpectSuccess ();
}
int SendDataExpectInt (byte[] data, string cmd, params object [] args)
{
if (!SendDataCommand (data, cmd, args))
throw new Exception ("Unable to connect");
int c = bstream.ReadByte ();
if (c == -1)
throw new ResponseException ("No more data");
string s = ReadLine ();
Log ("S", (char)c + s);
if (c == '-')
throw new ResponseException (s.StartsWith ("ERR ") ? s.Substring (4) : s);
if (c == ':'){
int i;
if (int.TryParse (s, out i))
return i;
}
throw new ResponseException ("Unknown reply on integer request: " + c + s);
}
int SendExpectInt (string cmd, params object [] args)
{
if (!SendCommand (cmd, args))
throw new Exception ("Unable to connect");
int c = bstream.ReadByte ();
if (c == -1)
throw new ResponseException ("No more data");
string s = ReadLine ();
Log ("S", (char)c + s);
if (c == '-')
throw new ResponseException (s.StartsWith ("ERR ") ? s.Substring (4) : s);
if (c == ':'){
int i;
if (int.TryParse (s, out i))
return i;
}
throw new ResponseException ("Unknown reply on integer request: " + c + s);
}
string SendExpectString (string cmd, params object [] args)
{
if (!SendCommand (cmd, args))
throw new Exception ("Unable to connect");
int c = bstream.ReadByte ();
if (c == -1)
throw new ResponseException ("No more data");
string s = ReadLine ();
Log ("S", (char)c + s);
if (c == '-')
throw new ResponseException (s.StartsWith ("ERR ") ? s.Substring (4) : s);
if (c == '+')
return s;
throw new ResponseException ("Unknown reply on integer request: " + c + s);
}
//
// This one does not throw errors
//
string SendGetString (string cmd, params object [] args)
{
if (!SendCommand (cmd, args))
throw new Exception ("Unable to connect");
return ReadLine ();
}
byte [] SendExpectData (string cmd, params object [] args)
{
if (!SendCommand (cmd, args))
throw new Exception ("Unable to connect");
return ReadData ();
}
byte [] ReadData ()
{
string s = ReadLine ();
Log ("S", s);
if (s.Length == 0)
throw new ResponseException ("Zero length respose");
char c = s [0];
if (c == '-')
throw new ResponseException (s.StartsWith ("-ERR ") ? s.Substring (5) : s.Substring (1));
if (c == '$'){
if (s == "$-1")
return null;
int n;
if (Int32.TryParse (s.Substring (1), out n)){
byte [] retbuf = new byte [n];
int bytesRead = 0;
do {
int read = bstream.Read (retbuf, bytesRead, n - bytesRead);
if (read < 1)
throw new ResponseException("Invalid termination mid stream");
bytesRead += read;
}
while (bytesRead < n);
if (bstream.ReadByte () != '\r' || bstream.ReadByte () != '\n')
throw new ResponseException ("Invalid termination");
return retbuf;
}
throw new ResponseException ("Invalid length");
}
/* don't treat arrays here because only one element works -- use DataArray!
//returns the number of matches
if (c == '*') {
int n;
if (Int32.TryParse(s.Substring(1), out n))
return n <= 0 ? new byte [0] : ReadData();
throw new ResponseException ("Unexpected length parameter" + r);
}
*/
throw new ResponseException ("Unexpected reply: " + s);
}
public bool ContainsKey (string key)
{
if (key == null)
throw new ArgumentNullException ("key");
return SendExpectInt ("EXISTS", key) == 1;
}
public bool Remove (string key)
{
if (key == null)
throw new ArgumentNullException ("key");
return SendExpectInt ("DEL", key) == 1;
}
public int Remove (params string [] args)
{
if (args == null)
throw new ArgumentNullException ("args");
return SendExpectInt ("DEL", args);
}
public int Increment (string key)
{
if (key == null)
throw new ArgumentNullException ("key");
return SendExpectInt ("INCR", key);
}
public int Increment (string key, int count)
{
if (key == null)
throw new ArgumentNullException ("key");
return SendExpectInt ("INCRBY", key, count);
}
public int Decrement (string key)
{
if (key == null)
throw new ArgumentNullException ("key");
return SendExpectInt ("DECR", key);
}
public int Decrement (string key, int count)
{
if (key == null)
throw new ArgumentNullException ("key");
return SendExpectInt ("DECRBY", key, count);
}
public KeyType TypeOf (string key)
{
if (key == null)
throw new ArgumentNullException ("key");
switch (SendExpectString ("TYPE", key)) {
case "none":
return KeyType.None;
case "string":
return KeyType.String;
case "set":
return KeyType.Set;
case "list":
return KeyType.List;
}
throw new ResponseException ("Invalid value");
}
public string RandomKey ()
{
return SendExpectString ("RANDOMKEY");
}
public bool Rename (string oldKeyname, string newKeyname)
{
if (oldKeyname == null)
throw new ArgumentNullException ("oldKeyname");
if (newKeyname == null)
throw new ArgumentNullException ("newKeyname");
return SendGetString ("RENAME", oldKeyname, newKeyname) [0] == '+';
}
public bool Expire (string key, int seconds)
{
if (key == null)
throw new ArgumentNullException ("key");
return SendExpectInt ("EXPIRE", key, seconds) == 1;
}
public bool ExpireAt (string key, int time)
{
if (key == null)
throw new ArgumentNullException ("key");
return SendExpectInt ("EXPIREAT", key, time) == 1;
}
public int TimeToLive (string key)
{
if (key == null)
throw new ArgumentNullException ("key");
return SendExpectInt ("TTL", key);
}
public int DbSize {
get {
return SendExpectInt ("DBSIZE");
}
}
public void Save ()
{
SendExpectSuccess ("SAVE");
}
public void BackgroundSave ()
{
SendExpectSuccess ("BGSAVE");
}
public void Shutdown ()
{
SendCommand ("SHUTDOWN");
try {
// the server may return an error
string s = ReadLine ();
Log ("S", s);
if (s.Length == 0)
throw new ResponseException ("Zero length respose");
throw new ResponseException (s.StartsWith ("-ERR ") ? s.Substring (5) : s.Substring (1));
} catch (IOException) {
// this is the expected good result
socket.Close ();
socket = null;
}
}
public void FlushAll ()
{
SendExpectSuccess ("FLUSHALL");
}
public void FlushDb ()
{
SendExpectSuccess ("FLUSHDB");
}
const long UnixEpoch = 621355968000000000L;
public DateTime LastSave {
get {
int t = SendExpectInt ("LASTSAVE");
return new DateTime (UnixEpoch) + TimeSpan.FromSeconds (t);
}
}
public Dictionary<string,string> GetInfo ()
{
byte [] r = SendExpectData ("INFO");
var dict = new Dictionary<string,string>();
foreach (var line in Encoding.UTF8.GetString (r).Split ('\n')){
int p = line.IndexOf (':');
if (p == -1)
continue;
dict.Add (line.Substring (0, p), line.Substring (p+1));
}
return dict;
}
public string [] Keys {
get {
return GetKeys("*");
}
}
public string [] GetKeys (string pattern)
{
if (pattern == null)
throw new ArgumentNullException ("pattern");
return SendExpectStringArray ("KEYS", pattern);
}
public byte [][] MGet (params string [] keys)
{
if (keys == null)
throw new ArgumentNullException ("keys");
if (keys.Length == 0)
throw new ArgumentException ("keys");
return SendExpectDataArray ("MGET", keys);
}
public string [] SendExpectStringArray (string cmd, params object [] args)
{
byte [][] reply = SendExpectDataArray (cmd, args);
string [] keys = new string [reply.Length];
for (int i = 0; i < reply.Length; i++)
keys[i] = Encoding.UTF8.GetString (reply[i]);
return keys;
}
public byte[][] SendExpectDataArray (string cmd, params object [] args)
{
if (!SendCommand (cmd, args))
throw new Exception("Unable to connect");
int c = bstream.ReadByte();
if (c == -1)
throw new ResponseException("No more data");
string s = ReadLine();
Log("S", (char)c + s);
if (c == '-')
throw new ResponseException(s.StartsWith("ERR ") ? s.Substring(4) : s);
if (c == '*') {
int count;
if (int.TryParse (s, out count)) {
byte [][] result = new byte [count][];
for (int i = 0; i < count; i++)
result[i] = ReadData();
return result;
}
}
throw new ResponseException("Unknown reply on multi-request: " + c + s);
}
#region List commands
public byte[][] ListRange(string key, int start, int end)
{
return SendExpectDataArray ("LRANGE", key, start, end);
}
public void LeftPush(string key, string value)
{
LeftPush(key, Encoding.UTF8.GetBytes (value));
}
public void LeftPush(string key, byte [] value)
{
SendDataCommand (value, "LPUSH", key);
ExpectSuccess();
}
public void RightPush(string key, string value)
{
RightPush(key, Encoding.UTF8.GetBytes (value));
}
public void RightPush(string key, byte [] value)
{
SendDataCommand (value, "RPUSH", key);
ExpectSuccess();
}
public int ListLength (string key)
{
return SendExpectInt ("LLEN", key);
}
public byte[] ListIndex (string key, int index)
{
SendCommand ("LINDEX", key, index);
return ReadData ();
}
public byte[] LeftPop(string key)
{
SendCommand ("LPOP", key);
return ReadData ();
}
public byte[] RightPop(string key)
{
SendCommand ("RPOP", key);
return ReadData ();
}
#endregion
#region Set commands
public bool AddToSet (string key, byte[] member)
{
return SendDataExpectInt(member, "SADD", key) > 0;
}
public bool AddToSet (string key, string member)
{
return AddToSet (key, Encoding.UTF8.GetBytes(member));
}
public int CardinalityOfSet (string key)
{
return SendExpectInt ("SCARD", key);
}
public bool IsMemberOfSet (string key, byte[] member)
{
return SendDataExpectInt (member, "SISMEMBER", key) > 0;
}
public bool IsMemberOfSet(string key, string member)
{
return IsMemberOfSet(key, Encoding.UTF8.GetBytes(member));
}
public byte[][] GetMembersOfSet (string key)
{
return SendExpectDataArray ("SMEMBERS", key);
}
public byte[] GetRandomMemberOfSet (string key)
{
return SendExpectData ("SRANDMEMBER", key);
}
public byte[] PopRandomMemberOfSet (string key)
{
return SendExpectData ("SPOP", key);
}
public bool RemoveFromSet (string key, byte[] member)
{
return SendDataExpectInt (member, "SREM", key) > 0;
}
public bool RemoveFromSet (string key, string member)
{
return RemoveFromSet (key, Encoding.UTF8.GetBytes(member));
}
public byte[][] GetUnionOfSets (params string[] keys)
{
if (keys == null)
throw new ArgumentNullException();
return SendExpectDataArray ("SUNION", keys);
}
void StoreSetCommands (string cmd, params string[] keys)
{
if (String.IsNullOrEmpty(cmd))
throw new ArgumentNullException ("cmd");
if (keys == null)
throw new ArgumentNullException ("keys");
SendExpectSuccess (cmd, keys);
}
public void StoreUnionOfSets (params string[] keys)
{
StoreSetCommands ("SUNIONSTORE", keys);
}
public byte[][] GetIntersectionOfSets (params string[] keys)
{
if (keys == null)
throw new ArgumentNullException();
return SendExpectDataArray ("SINTER", keys);
}
public void StoreIntersectionOfSets (params string[] keys)
{
StoreSetCommands ("SINTERSTORE", keys);
}
public byte[][] GetDifferenceOfSets (params string[] keys)
{
if (keys == null)
throw new ArgumentNullException();
return SendExpectDataArray ("SDIFF", keys);
}
public void StoreDifferenceOfSets (params string[] keys)
{
StoreSetCommands ("SDIFFSTORE", keys);
}
public bool MoveMemberToSet (string srcKey, string destKey, byte[] member)
{
return SendDataExpectInt (member, "SMOVE", srcKey, destKey) > 0;
}
#endregion
public void Dispose ()
{
Dispose (true);
GC.SuppressFinalize (this);
}
~Redis ()
{
Dispose (false);
}
protected virtual void Dispose (bool disposing)
{
if (disposing){
SendCommand ("QUIT");
ExpectSuccess ();
socket.Close ();
socket = null;
}
}
}
public class SortOptions {
public string Key { get; set; }
public bool Descending { get; set; }
public bool Lexographically { get; set; }
public Int32 LowerLimit { get; set; }
public Int32 UpperLimit { get; set; }
public string By { get; set; }
public string StoreInKey { get; set; }
public string Get { get; set; }
public object [] ToArgs ()
{
System.Collections.ArrayList args = new System.Collections.ArrayList();
if (LowerLimit != 0 || UpperLimit != 0) {
args.Add ("LIMIT");
args.Add (LowerLimit);
args.Add (UpperLimit);
}
if (Lexographically)
args.Add("ALPHA");
if (!string.IsNullOrEmpty (By)) {
args.Add("BY");
args.Add(By);
}
if (!string.IsNullOrEmpty (Get)) {
args.Add("GET");
args.Add(Get);
}
return args.ToArray ();
}
}

View File

@ -28,7 +28,9 @@
<ROW Property="ELASTICSEARCH_PORT" Value="9200" ValueLocId="-"/>
<ROW Property="ELASTICSEARCH_SCHEME" Value="http" ValueLocId="-"/>
<ROW Property="ENVIRONMENT" Value="test"/>
<ROW Property="Editor_Port" Value="5013"/>
<ROW Property="INSTALL_ROOT_FOLDER_NAME" Value="[|Manufacturer]"/>
<ROW Property="Login_Port" Value="5011"/>
<ROW Property="MSIFASTINSTALL" MultiBuildValue="DefaultBuild:3"/>
<ROW Property="MYSQLODBCDRIVER" Value="MySQL ODBC 8.0 Unicode Driver"/>
<ROW Property="Manufacturer" Value="Ascensio System SIA"/>
@ -56,8 +58,10 @@
<ROW Property="ServiceName_BackgroundTasks" Value="ASC.Data.Backup.BackgroundTasks"/>
<ROW Property="ServiceName_BackupService" Value="ASC.BackupService"/>
<ROW Property="ServiceName_ClearEvents" Value="ASC.ClearEvents"/>
<ROW Property="ServiceName_DocEditor" Value="ASC.DocEditor"/>
<ROW Property="ServiceName_FileServer" Value="ASC.FileServer"/>
<ROW Property="ServiceName_FileService" Value="ASC.FileService"/>
<ROW Property="ServiceName_Login" Value="ASC.Login"/>
<ROW Property="ServiceName_Migration" Value="ASC.Migration"/>
<ROW Property="ServiceName_MigrationRunner" Value="ASC.MigrationRunner"/>
<ROW Property="ServiceName_NotifyService" Value="ASC.NotifyService"/>
@ -71,8 +75,11 @@
<ROW Property="ServiceName_WebApi" Value="ASC.WebApi"/>
<ROW Property="ServiceName_WebStudio" Value="ASC.WebStudio"/>
<ROW Property="ServiceName_WebhooksService" Value="ASC.WebhooksService"/>
<ROW Property="Socket.IO_Port" Value="9899"/>
<ROW Property="SsoAuth_port" Value="9834"/>
<ROW Property="USERNAME_PROP" Value="root"/>
<ROW Property="UpgradeCode" Value="{FFA9CD16-E087-45F3-8D34-3BBA1EF8A897}"/>
<ROW Property="UrlShortener_Port" Value="9999"/>
<ROW Property="WindowsType9X" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
<ROW Property="WindowsType9XDisplay" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
<ROW Property="WindowsTypeNT40" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
@ -83,82 +90,163 @@
<ROW Property="WindowsTypeNT5XDisplay" MultiBuildValue="DefaultBuild:Windows XP/2003" ValueLocId="-"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiDirsComponent">
<ROW Directory="APPDIR" Directory_Parent="TARGETDIR" DefaultDir="APPDIR:." IsPseudoRoot="1"/>
<ROW Directory="ASC.ClearEvents_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.CLE|ASC.ClearEvents"/>
<ROW Directory="ASC.Data.Backup.BackgroundTasks_Dir" Directory_Parent="services_Dir" DefaultDir="ASCDAT~2.BAC|ASC.Data.Backup.BackgroundTasks"/>
<ROW Directory="ASC.Data.Backup_Dir" Directory_Parent="services_Dir" DefaultDir="ASCDAT~1.BAC|ASC.Data.Backup"/>
<ROW Directory="ASC.Files.Service_Dir" Directory_Parent="services_Dir" DefaultDir="ASCFIL~1.SER|ASC.Files.Service"/>
<ROW Directory="ASC.Files_Dir" Directory_Parent="products_Dir" DefaultDir="ASC~1.FIL|ASC.Files"/>
<ROW Directory="ASC.Migration.Runner_Dir" Directory_Parent="services_Dir" DefaultDir="ASCMIG~1.RUN|ASC.Migration.Runner"/>
<ROW Directory="ASC.Migration_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.MIG|ASC.Migration"/>
<ROW Directory="ASC.Notify_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.NOT|ASC.Notify"/>
<ROW Directory="ASC.People_Dir" Directory_Parent="products_Dir" DefaultDir="ASC~1.PEO|ASC.People"/>
<ROW Directory="ASC.Socket.IO_Dir" Directory_Parent="services_Dir" DefaultDir="ASCSOC~1.IO|ASC.Socket.IO"/>
<ROW Directory="ASC.SsoAuth_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.SSO|ASC.SsoAuth"/>
<ROW Directory="ASC.Studio.Notify_Dir" Directory_Parent="services_Dir" DefaultDir="ASCSTU~1.NOT|ASC.Studio.Notify"/>
<ROW Directory="ASC.TelegramService_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.TEL|ASC.TelegramService"/>
<ROW Directory="ASC.UrlShortener_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.URL|ASC.UrlShortener"/>
<ROW Directory="ASC.Web.Api_Dir" Directory_Parent="services_Dir" DefaultDir="ASCWEB~1.API|ASC.Web.Api"/>
<ROW Directory="ASC.Web.Studio_Dir" Directory_Parent="services_Dir" DefaultDir="ASCWEB~1.STU|ASC.Web.Studio"/>
<ROW Directory="ASC.Webhooks.Service_Dir" Directory_Parent="services_Dir" DefaultDir="ASCWEB~1.SER|ASC.Webhooks.Service"/>
<ROW Directory="NewFolder_1_Dir" Directory_Parent="service_1_Dir" DefaultDir="config"/>
<ROW Directory="NewFolder_3_Dir" Directory_Parent="ASC.Webhooks.Service_Dir" DefaultDir="service"/>
<ROW Directory="NewFolder_Dir" Directory_Parent="ASC.UrlShortener_Dir" DefaultDir="service"/>
<ROW Directory="APPDIR" Directory_Parent="TARGETDIR" DefaultDir="APPDIR:." IsPseudoRoot="1" DirectoryOptions="12"/>
<ROW Directory="ASC.ClearEvents_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.CLE|ASC.ClearEvents" DirectoryOptions="12"/>
<ROW Directory="ASC.Data.Backup.BackgroundTasks_Dir" Directory_Parent="services_Dir" DefaultDir="ASCDAT~2.BAC|ASC.Data.Backup.BackgroundTasks" DirectoryOptions="12"/>
<ROW Directory="ASC.Data.Backup_Dir" Directory_Parent="services_Dir" DefaultDir="ASCDAT~1.BAC|ASC.Data.Backup" DirectoryOptions="12"/>
<ROW Directory="ASC.Files.Service_Dir" Directory_Parent="services_Dir" DefaultDir="ASCFIL~1.SER|ASC.Files.Service" DirectoryOptions="12"/>
<ROW Directory="ASC.Files_Dir" Directory_Parent="products_Dir" DefaultDir="ASC~1.FIL|ASC.Files" DirectoryOptions="12"/>
<ROW Directory="ASC.Login_Dir" Directory_Parent="products_Dir" DefaultDir="ASC~1.LOG|ASC.Login" DirectoryOptions="12"/>
<ROW Directory="ASC.Migration.Runner_Dir" Directory_Parent="services_Dir" DefaultDir="ASCMIG~1.RUN|ASC.Migration.Runner" DirectoryOptions="12"/>
<ROW Directory="ASC.Migration_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.MIG|ASC.Migration" DirectoryOptions="12"/>
<ROW Directory="ASC.Notify_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.NOT|ASC.Notify" DirectoryOptions="12"/>
<ROW Directory="ASC.People_Dir" Directory_Parent="products_Dir" DefaultDir="ASC~1.PEO|ASC.People" DirectoryOptions="12"/>
<ROW Directory="ASC.Socket.IO_Dir" Directory_Parent="services_Dir" DefaultDir="ASCSOC~1.IO|ASC.Socket.IO" DirectoryOptions="12"/>
<ROW Directory="ASC.SsoAuth_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.SSO|ASC.SsoAuth" DirectoryOptions="12"/>
<ROW Directory="ASC.Studio.Notify_Dir" Directory_Parent="services_Dir" DefaultDir="ASCSTU~1.NOT|ASC.Studio.Notify" DirectoryOptions="12"/>
<ROW Directory="ASC.TelegramService_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.TEL|ASC.TelegramService" DirectoryOptions="12"/>
<ROW Directory="ASC.UrlShortener_Dir" Directory_Parent="services_Dir" DefaultDir="ASC~1.URL|ASC.UrlShortener" DirectoryOptions="12"/>
<ROW Directory="ASC.Web.Api_Dir" Directory_Parent="services_Dir" DefaultDir="ASCWEB~1.API|ASC.Web.Api" DirectoryOptions="12"/>
<ROW Directory="ASC.Web.Studio_Dir" Directory_Parent="services_Dir" DefaultDir="ASCWEB~1.STU|ASC.Web.Studio" DirectoryOptions="12"/>
<ROW Directory="ASC.Webhooks.Service_Dir" Directory_Parent="services_Dir" DefaultDir="ASCWEB~1.SER|ASC.Webhooks.Service" DirectoryOptions="12"/>
<ROW Directory="Logs_Dir" Directory_Parent="APPDIR" DefaultDir="Logs" DirectoryOptions="12"/>
<ROW Directory="NewFolder_1_Dir" Directory_Parent="service_1_Dir" DefaultDir="config" DirectoryOptions="12"/>
<ROW Directory="NewFolder_3_Dir" Directory_Parent="ASC.Webhooks.Service_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="NewFolder_Dir" Directory_Parent="ASC.UrlShortener_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="TARGETDIR" DefaultDir="SourceDir"/>
<ROW Directory="config_1_Dir" Directory_Parent="NewFolder_Dir" DefaultDir="config"/>
<ROW Directory="config_2_Dir" Directory_Parent="service_5_Dir" DefaultDir="config"/>
<ROW Directory="config_Dir" Directory_Parent="APPDIR" DefaultDir="config"/>
<ROW Directory="products_Dir" Directory_Parent="APPDIR" DefaultDir="products"/>
<ROW Directory="public_Dir" Directory_Parent="APPDIR" DefaultDir="public"/>
<ROW Directory="server_2_Dir" Directory_Parent="ASC.Files_Dir" DefaultDir="server"/>
<ROW Directory="server_5_Dir" Directory_Parent="ASC.People_Dir" DefaultDir="server"/>
<ROW Directory="service_11_Dir" Directory_Parent="ASC.Studio.Notify_Dir" DefaultDir="service"/>
<ROW Directory="service_12_Dir" Directory_Parent="ASC.TelegramService_Dir" DefaultDir="service"/>
<ROW Directory="service_15_Dir" Directory_Parent="ASC.Web.Api_Dir" DefaultDir="service"/>
<ROW Directory="service_16_Dir" Directory_Parent="ASC.Web.Studio_Dir" DefaultDir="service"/>
<ROW Directory="service_1_Dir" Directory_Parent="ASC.Socket.IO_Dir" DefaultDir="service"/>
<ROW Directory="service_2_Dir" Directory_Parent="ASC.Data.Backup_Dir" DefaultDir="service"/>
<ROW Directory="service_3_Dir" Directory_Parent="ASC.Data.Backup.BackgroundTasks_Dir" DefaultDir="service"/>
<ROW Directory="service_4_Dir" Directory_Parent="ASC.Migration_Dir" DefaultDir="service"/>
<ROW Directory="service_5_Dir" Directory_Parent="ASC.SsoAuth_Dir" DefaultDir="service"/>
<ROW Directory="service_6_Dir" Directory_Parent="ASC.Migration.Runner_Dir" DefaultDir="service"/>
<ROW Directory="service_7_Dir" Directory_Parent="ASC.Files.Service_Dir" DefaultDir="service"/>
<ROW Directory="service_9_Dir" Directory_Parent="ASC.Notify_Dir" DefaultDir="service"/>
<ROW Directory="service_Dir" Directory_Parent="ASC.ClearEvents_Dir" DefaultDir="service"/>
<ROW Directory="services_Dir" Directory_Parent="APPDIR" DefaultDir="services"/>
<ROW Directory="tools_Dir" Directory_Parent="APPDIR" DefaultDir="tools"/>
<ROW Directory="conf_Dir" Directory_Parent="nginx_Dir" DefaultDir="conf" DirectoryOptions="12"/>
<ROW Directory="config_1_Dir" Directory_Parent="NewFolder_Dir" DefaultDir="config" DirectoryOptions="12"/>
<ROW Directory="config_2_Dir" Directory_Parent="service_5_Dir" DefaultDir="config" DirectoryOptions="12"/>
<ROW Directory="config_Dir" Directory_Parent="APPDIR" DefaultDir="config" DirectoryOptions="12"/>
<ROW Directory="editor_Dir" Directory_Parent="ASC.Files_Dir" DefaultDir="editor" DirectoryOptions="12"/>
<ROW Directory="includes_Dir" Directory_Parent="conf_Dir" DefaultDir="includes" DirectoryOptions="12"/>
<ROW Directory="login_Dir" Directory_Parent="ASC.Login_Dir" DefaultDir="login" DirectoryOptions="12"/>
<ROW Directory="logs_Dir" Directory_Parent="nginx_Dir" DefaultDir="logs" DirectoryOptions="12"/>
<ROW Directory="nginx_Dir" Directory_Parent="APPDIR" DefaultDir="nginx" DirectoryOptions="12"/>
<ROW Directory="products_Dir" Directory_Parent="APPDIR" DefaultDir="products" DirectoryOptions="12"/>
<ROW Directory="server_2_Dir" Directory_Parent="ASC.Files_Dir" DefaultDir="server" DirectoryOptions="12"/>
<ROW Directory="server_5_Dir" Directory_Parent="ASC.People_Dir" DefaultDir="server" DirectoryOptions="12"/>
<ROW Directory="service_11_Dir" Directory_Parent="ASC.Studio.Notify_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_12_Dir" Directory_Parent="ASC.TelegramService_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_15_Dir" Directory_Parent="ASC.Web.Api_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_16_Dir" Directory_Parent="ASC.Web.Studio_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_1_Dir" Directory_Parent="ASC.Socket.IO_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_2_Dir" Directory_Parent="ASC.Data.Backup_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_3_Dir" Directory_Parent="ASC.Data.Backup.BackgroundTasks_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_4_Dir" Directory_Parent="ASC.Migration_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_5_Dir" Directory_Parent="ASC.SsoAuth_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_6_Dir" Directory_Parent="ASC.Migration.Runner_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_7_Dir" Directory_Parent="ASC.Files.Service_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_9_Dir" Directory_Parent="ASC.Notify_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="service_Dir" Directory_Parent="ASC.ClearEvents_Dir" DefaultDir="service" DirectoryOptions="12"/>
<ROW Directory="services_Dir" Directory_Parent="APPDIR" DefaultDir="services" DirectoryOptions="12"/>
<ROW Directory="temp_10_Dir" Directory_Parent="service_16_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_11_Dir" Directory_Parent="NewFolder_3_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_12_Dir" Directory_Parent="service_12_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_13_Dir" Directory_Parent="server_2_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_14_Dir" Directory_Parent="server_5_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_1_Dir" Directory_Parent="service_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_2_Dir" Directory_Parent="service_3_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_3_Dir" Directory_Parent="service_7_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_4_Dir" Directory_Parent="service_2_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_5_Dir" Directory_Parent="service_4_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_6_Dir" Directory_Parent="service_6_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_7_Dir" Directory_Parent="service_9_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_8_Dir" Directory_Parent="service_11_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_9_Dir" Directory_Parent="service_15_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="temp_Dir" Directory_Parent="nginx_Dir" DefaultDir="temp" DirectoryOptions="12"/>
<ROW Directory="tools_Dir" Directory_Parent="APPDIR" DefaultDir="tools" DirectoryOptions="12"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiCompsComponent">
<ROW Component="AI_CustomARPName" ComponentId="{5283455D-3786-42EC-9887-FCF453E2FBF9}" Directory_="APPDIR" Attributes="4" KeyPath="DisplayName" Options="1"/>
<ROW Component="AI_DisableModify" ComponentId="{E036B14F-E2E4-4247-B9AB-55C1F6142BF9}" Directory_="APPDIR" Attributes="4" KeyPath="NoModify" Options="1"/>
<ROW Component="AI_ExePath" ComponentId="{EDF666FF-8C56-4EB7-8255-67DA879A090C}" Directory_="APPDIR" Attributes="4" KeyPath="AI_ExePath"/>
<ROW Component="APPDIR" ComponentId="{E32A4F89-E985-4E8E-AB26-DFCD685A316B}" Directory_="APPDIR" Attributes="0"/>
<ROW Component="ASC.ClearEvents" ComponentId="{73FB7C9B-9AA8-4BB6-A2C3-E85F6B5BE1D5}" Directory_="ASC.ClearEvents_Dir" Attributes="0"/>
<ROW Component="ASC.ClearEvents.exe" ComponentId="{208F2E9D-F72D-47D8-8B6E-0B85E3EAD12E}" Directory_="service_Dir" Attributes="0" KeyPath="ASC.ClearEvents.exe"/>
<ROW Component="ASC.Data.Backup" ComponentId="{DDE1435C-947F-4507-B55B-B0594193F8E4}" Directory_="ASC.Data.Backup_Dir" Attributes="0"/>
<ROW Component="ASC.Data.Backup.BackgroundTasks" ComponentId="{E6D04525-2108-45E9-8DC2-AD692A66026A}" Directory_="ASC.Data.Backup.BackgroundTasks_Dir" Attributes="0"/>
<ROW Component="ASC.Data.Backup.BackgroundTasks.exe" ComponentId="{CB715B3B-BFC0-4A4D-8B47-B1DB7A99A49E}" Directory_="service_3_Dir" Attributes="0" KeyPath="ASC.Data.Backup.BackgroundTasks.exe"/>
<ROW Component="ASC.Data.Backup.exe" ComponentId="{240665F1-DDCF-4FFB-ABEE-2F784ACD87E6}" Directory_="service_2_Dir" Attributes="256" KeyPath="ASC.Data.Backup.exe"/>
<ROW Component="ASC.Files" ComponentId="{7D4356CB-8A55-4528-8CF6-E3C6181DC119}" Directory_="ASC.Files_Dir" Attributes="0"/>
<ROW Component="ASC.Files.Service" ComponentId="{10E5C648-6B24-40DB-926A-4E26E7ABBE7E}" Directory_="ASC.Files.Service_Dir" Attributes="0"/>
<ROW Component="ASC.Files.Service.exe" ComponentId="{14D153CC-E7A6-4818-A310-9CE1F332DCDA}" Directory_="service_7_Dir" Attributes="256" KeyPath="ASC.Files.Service.exe"/>
<ROW Component="ASC.Files.exe" ComponentId="{4D48DD81-BABF-4E1C-A216-C72C1EA8428B}" Directory_="server_2_Dir" Attributes="256" KeyPath="ASC.Files.exe"/>
<ROW Component="ASC.Login" ComponentId="{323B1636-C7E9-4DA2-8575-92D939FA381F}" Directory_="ASC.Login_Dir" Attributes="0"/>
<ROW Component="ASC.Migration" ComponentId="{26C33C84-C6FC-4DDB-8DFA-F7012F29C4EC}" Directory_="ASC.Migration_Dir" Attributes="0"/>
<ROW Component="ASC.Migration.Runner" ComponentId="{C03F968B-6259-4CE7-89C7-3236EDD2170C}" Directory_="ASC.Migration.Runner_Dir" Attributes="0"/>
<ROW Component="ASC.Migration.Runner.exe" ComponentId="{124E8A20-2ECA-4DC0-ACD9-DBEA64CCF2CF}" Directory_="service_6_Dir" Attributes="256" KeyPath="ASC.Migration.Runner.exe"/>
<ROW Component="ASC.Migration.exe" ComponentId="{C65B4FF9-AAE7-41EF-B05F-737FF78DEB4F}" Directory_="service_4_Dir" Attributes="0" KeyPath="ASC.Migration.exe"/>
<ROW Component="ASC.Notify" ComponentId="{A94C4D5B-1426-4B3D-ACF5-0C316E4E792D}" Directory_="ASC.Notify_Dir" Attributes="0"/>
<ROW Component="ASC.Notify.exe" ComponentId="{7457E31A-B6FC-4A71-A5C0-174C9E965051}" Directory_="service_9_Dir" Attributes="256" KeyPath="ASC.Notify.exe"/>
<ROW Component="ASC.People" ComponentId="{8FDAD389-26DF-47BE-8DC5-A9DE5DF3BD22}" Directory_="ASC.People_Dir" Attributes="0"/>
<ROW Component="ASC.People.exe" ComponentId="{044D57BC-8BAC-4D64-AB36-141BAA1F2E15}" Directory_="server_5_Dir" Attributes="256" KeyPath="ASC.People.exe"/>
<ROW Component="ASC.Socket.IO" ComponentId="{A22A1FDB-2706-4133-812D-0AA1E5B5BF02}" Directory_="ASC.Socket.IO_Dir" Attributes="0"/>
<ROW Component="ASC.SsoAuth" ComponentId="{0A4502F2-6D3B-491B-86B1-BDC54C78FE18}" Directory_="ASC.SsoAuth_Dir" Attributes="0"/>
<ROW Component="ASC.Studio.Notify" ComponentId="{49CD6FD5-5B49-4CB9-8EDD-654922F11F88}" Directory_="ASC.Studio.Notify_Dir" Attributes="0"/>
<ROW Component="ASC.Studio.Notify.exe" ComponentId="{AFB3D13A-4F5B-46E1-8819-3517A228C22B}" Directory_="service_11_Dir" Attributes="256" KeyPath="ASC.Studio.Notify.exe"/>
<ROW Component="ASC.TelegramService" ComponentId="{57B76E6A-DEF4-4242-96D4-E43AEBC68A97}" Directory_="ASC.TelegramService_Dir" Attributes="0"/>
<ROW Component="ASC.TelegramService.exe" ComponentId="{475A1DBC-3864-434E-86E2-497D70D39BDE}" Directory_="service_12_Dir" Attributes="256" KeyPath="ASC.TelegramService.exe"/>
<ROW Component="ASC.UrlShortener" ComponentId="{B5FB450A-789E-4096-BE2D-7E9E92FA665C}" Directory_="ASC.UrlShortener_Dir" Attributes="0"/>
<ROW Component="ASC.Web.Api" ComponentId="{CFFB4D5A-23D0-4BD6-BB8D-A62FCE92B883}" Directory_="ASC.Web.Api_Dir" Attributes="0"/>
<ROW Component="ASC.Web.Api.exe" ComponentId="{E726DF21-2E7E-4C62-8F6E-C63C65B041EC}" Directory_="service_15_Dir" Attributes="256" KeyPath="ASC.Web.Api.exe"/>
<ROW Component="ASC.Web.Studio" ComponentId="{8C58AEA7-5FC3-4506-ACF6-611A801D0426}" Directory_="ASC.Web.Studio_Dir" Attributes="0"/>
<ROW Component="ASC.Web.Studio.exe" ComponentId="{00F95035-98D9-44AD-9DB4-B34306EE2170}" Directory_="service_16_Dir" Attributes="256" KeyPath="ASC.Web.Studio.exe"/>
<ROW Component="ASC.Webhooks.Service" ComponentId="{9B39D301-7EAD-48C8-A88C-A3570C132D08}" Directory_="ASC.Webhooks.Service_Dir" Attributes="0"/>
<ROW Component="ASC.Webhooks.Service.exe" ComponentId="{9D6002C5-A610-4B28-982C-2DB794571878}" Directory_="NewFolder_3_Dir" Attributes="0" KeyPath="ASC.Webhooks.Service.exe"/>
<ROW Component="DocEditor.exe" ComponentId="{FBE9155F-9ACD-4A1A-9198-891ED73BA90C}" Directory_="tools_Dir" Attributes="0" KeyPath="DocEditor.exe"/>
<ROW Component="Login.exe" ComponentId="{FBE9155F-9ACD-4A1A-9198-891ED73BA202}" Directory_="tools_Dir" Attributes="0" KeyPath="Login.exe"/>
<ROW Component="Logs" ComponentId="{6C28AF1C-0190-4DE3-A753-430496711F3C}" Directory_="Logs_Dir" Attributes="0"/>
<ROW Component="ProductInformation" ComponentId="{5FB28D19-6A7D-4078-901F-58C2DF0DE176}" Directory_="APPDIR" Attributes="4" KeyPath="Version"/>
<ROW Component="Proxy.exe" ComponentId="{913596AD-5C75-4418-8C3A-FAB2A70530DB}" Directory_="tools_Dir" Attributes="0" KeyPath="Proxy.exe"/>
<ROW Component="Socket.IO.exe" ComponentId="{D08CDE1C-FB16-49AB-98A2-92FD887774F1}" Directory_="tools_Dir" Attributes="0" KeyPath="Socket.IO.exe"/>
<ROW Component="SsoAuth.exe" ComponentId="{B4A48C44-5FC0-43D8-9CFB-EB4A4AAB4169}" Directory_="tools_Dir" Attributes="0" KeyPath="SsoAuth.exe"/>
<ROW Component="UrlShortener.exe" ComponentId="{1F1D4189-385A-4AE1-8011-A82ED137DA22}" Directory_="tools_Dir" Attributes="0" KeyPath="UrlShortener.exe"/>
<ROW Component="conf" ComponentId="{88EC3AED-DF73-4B66-A228-9A87CFB5519D}" Directory_="conf_Dir" Attributes="0"/>
<ROW Component="config" ComponentId="{B58E086D-0CB4-4F53-8411-3AE5A46D1DE4}" Directory_="config_Dir" Attributes="0"/>
<ROW Component="config_socketio" ComponentId="{4F28A197-AD56-48D0-9E97-9F88A73BE24E}" Directory_="NewFolder_1_Dir" Attributes="0"/>
<ROW Component="config_ssoauth" ComponentId="{D51A4591-143D-4C91-8665-BED153555AC0}" Directory_="config_2_Dir" Attributes="0"/>
<ROW Component="config_urlshortener" ComponentId="{3A8A13E2-9BAA-485B-9E09-A6AD3EF70127}" Directory_="config_1_Dir" Attributes="0"/>
<ROW Component="favicon.ico" ComponentId="{31B18A50-6FF2-4C5E-8A1F-018247C8C55C}" Directory_="public_Dir" Attributes="0" KeyPath="favicon.ico" Type="0"/>
<ROW Component="proxy.exe" ComponentId="{913596AD-5C75-4418-8C3A-FAB2A70530DB}" Directory_="tools_Dir" Attributes="0" KeyPath="proxy.exe"/>
<ROW Component="proxy.xml" ComponentId="{92B2BA6A-009B-4731-A0E2-A6C729DC8A68}" Directory_="tools_Dir" Attributes="0" KeyPath="proxy.xml" Type="0"/>
<ROW Component="public" ComponentId="{025757D9-89DC-4136-A278-2B273D3A741A}" Directory_="public_Dir" Attributes="0"/>
<ROW Component="editor" ComponentId="{7BB6D12C-B38B-435D-8A86-2D5D2AB0543F}" Directory_="editor_Dir" Attributes="0"/>
<ROW Component="includes" ComponentId="{6F7827D0-7F14-4F09-BB3C-98E0633F5D1B}" Directory_="includes_Dir" Attributes="0"/>
<ROW Component="login" ComponentId="{17166A18-3A7B-44FF-A6A3-0938FD45B107}" Directory_="login_Dir" Attributes="0"/>
<ROW Component="logs" ComponentId="{183C2BF5-A348-407D-BEB4-8A5A6C3D7DB8}" Directory_="logs_Dir" Attributes="0"/>
<ROW Component="nginx" ComponentId="{F6782189-7D44-4DDE-B1A5-5DF8D2B839F5}" Directory_="nginx_Dir" Attributes="0"/>
<ROW Component="products" ComponentId="{5A3B0279-AFE0-456F-9685-5422D5E731B6}" Directory_="products_Dir" Attributes="0"/>
<ROW Component="server_ASC.Files" ComponentId="{8B02814C-6260-4A36-8C09-26AF31CDE52A}" Directory_="server_2_Dir" Attributes="0"/>
<ROW Component="server_ASC.People" ComponentId="{BDBA6378-A15F-44CC-BD6E-232FB7CFBA59}" Directory_="server_5_Dir" Attributes="0"/>
<ROW Component="service_ASC.ClearEvents" ComponentId="{1BDE62CE-18DF-4372-9B95-41287FA84740}" Directory_="service_Dir" Attributes="0"/>
<ROW Component="service_ASC.Data.Backup" ComponentId="{F5899AA1-8093-4BB3-862C-34A782831A72}" Directory_="service_2_Dir" Attributes="0"/>
<ROW Component="service_ASC.Data.Backup.BachgroundTasks" ComponentId="{CCF47514-0441-44B9-A77D-C4E5619638BB}" Directory_="service_3_Dir" Attributes="0"/>
<ROW Component="service_ASC.File.Service" ComponentId="{C94C9F5B-91E0-4AE3-8A7B-752198128A1E}" Directory_="service_7_Dir" Attributes="0"/>
<ROW Component="service_ASC.Migration" ComponentId="{F209787D-632E-4E20-8415-7D71DBAE5B5A}" Directory_="service_4_Dir" Attributes="0"/>
<ROW Component="service_ASC.Migration.Runner" ComponentId="{A21DD084-2228-4E0E-9F32-7A04F6766F8D}" Directory_="service_6_Dir" Attributes="0"/>
<ROW Component="service_ASC.Notify" ComponentId="{1A0897FF-9EBE-4D01-AFC5-3CBF264CA6C2}" Directory_="service_9_Dir" Attributes="0"/>
<ROW Component="service_ASC.Socket.IO" ComponentId="{F050F8C3-24CF-45F6-AFA4-05F2C121BA1E}" Directory_="service_1_Dir" Attributes="0"/>
<ROW Component="service_ASC.SsoAuth" ComponentId="{1DD71548-898E-4C6D-9D54-7DB4ABF7E976}" Directory_="service_5_Dir" Attributes="0"/>
<ROW Component="service_ASC.Studio.Notify" ComponentId="{C30289A6-F81B-4C4B-9C77-969DBD83EF66}" Directory_="service_11_Dir" Attributes="0"/>
<ROW Component="service_ASC.TelegramService" ComponentId="{1CB6D2E9-EE2F-4FEC-82E6-77B775303032}" Directory_="service_12_Dir" Attributes="0"/>
<ROW Component="service_ASC.Urlshortner" ComponentId="{B8D83118-B7EA-4C8D-85AD-01A0098561D9}" Directory_="NewFolder_Dir" Attributes="0"/>
<ROW Component="service_ASC.Web.Studio" ComponentId="{24E30A59-BC9C-4497-9B31-9FDD1130851B}" Directory_="service_16_Dir" Attributes="0"/>
<ROW Component="service_ASC.WebApi" ComponentId="{C9664C57-4333-4E95-B94E-E78C6CB28058}" Directory_="service_15_Dir" Attributes="0"/>
<ROW Component="service_ASC.Webhooks.Service" ComponentId="{EB2FD18F-FEAD-4C36-9B8B-556E7D84AE28}" Directory_="NewFolder_3_Dir" Attributes="0"/>
<ROW Component="services" ComponentId="{8F9FE4E0-772E-487A-A61D-7019807D88D4}" Directory_="services_Dir" Attributes="0"/>
<ROW Component="temp_ASC.ClearEvents" ComponentId="{0D0BC98A-425B-4217-B420-4DA6B25F23DD}" Directory_="temp_1_Dir" Attributes="0"/>
<ROW Component="temp_ASC.Data.Backup.BackgroundTasks" ComponentId="{29E2557D-6012-44B2-A9D4-D773157411E2}" Directory_="temp_2_Dir" Attributes="0"/>
<ROW Component="temp_ASC.Data.Buckup" ComponentId="{53DD808E-59C8-471C-8F2B-05F7ED92D2A7}" Directory_="temp_4_Dir" Attributes="0"/>
<ROW Component="temp_ASC.File.Service" ComponentId="{D36D733E-3659-46FB-9127-876F179702BD}" Directory_="temp_3_Dir" Attributes="0"/>
<ROW Component="temp_ASC.Files" ComponentId="{B25665D3-EB6F-4010-A93A-2423983A426A}" Directory_="temp_13_Dir" Attributes="0"/>
<ROW Component="temp_ASC.Migration" ComponentId="{BEA71B3C-222C-4565-B0D1-A5671BE029F5}" Directory_="temp_5_Dir" Attributes="0"/>
<ROW Component="temp_ASC.Migration.Runner" ComponentId="{3B95B108-8CEE-487D-AE0B-2E93C1749611}" Directory_="temp_6_Dir" Attributes="0"/>
<ROW Component="temp_ASC.Notify" ComponentId="{471221C5-3F91-476D-B87F-F504AC55D9A6}" Directory_="temp_7_Dir" Attributes="0"/>
<ROW Component="temp_ASC.People" ComponentId="{F4E45171-654B-455B-A261-A7C52830AEC0}" Directory_="temp_14_Dir" Attributes="0"/>
<ROW Component="temp_ASC.Studio.Notify" ComponentId="{F61A9699-F7DF-47F7-BE8B-B57ED43CCAC6}" Directory_="temp_8_Dir" Attributes="0"/>
<ROW Component="temp_ASC.TelegramService" ComponentId="{0BF04783-7F52-4926-B269-E1C6B9C90CF8}" Directory_="temp_12_Dir" Attributes="0"/>
<ROW Component="temp_ASC.Web.Api" ComponentId="{BBE4771E-AF81-4B40-84C8-AACD26A8AAEE}" Directory_="temp_9_Dir" Attributes="0"/>
<ROW Component="temp_ASC.Web.Studio" ComponentId="{50C05886-70FB-42A5-B4F9-333B317B1E25}" Directory_="temp_10_Dir" Attributes="0"/>
<ROW Component="temp_ASC.Webhooks.Service" ComponentId="{21F5F636-660F-4116-9DB2-9BFDC0365708}" Directory_="temp_11_Dir" Attributes="0"/>
<ROW Component="temp_nginx" ComponentId="{44C32C3C-30B2-4FB2-B6C0-F88B4C3F3F26}" Directory_="temp_Dir" Attributes="0"/>
<ROW Component="tools" ComponentId="{3BE057FE-EC94-4514-8961-A8660D9E6EB4}" Directory_="tools_Dir" Attributes="0"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiFeatsComponent">
<ROW Feature="MainFeature" Title="MainFeature" Description="Description" Display="1" Level="1" Directory_="APPDIR" Attributes="0"/>
@ -174,20 +262,17 @@
<ROW File="ASC.TelegramService.exe" Component_="ASC.TelegramService.exe" FileName="ASCTEL~1.EXE|ASC.TelegramService.exe" Attributes="0" SourcePath="Files\services\ASC.TelegramService\service\ASC.TelegramService.exe" SelfReg="false" DigSign="true"/>
<ROW File="ASC.Web.Studio.exe" Component_="ASC.Web.Studio.exe" FileName="ASCWEB~1.EXE|ASC.Web.Studio.exe" Attributes="0" SourcePath="Files\services\ASC.Web.Studio\service\ASC.Web.Studio.exe" SelfReg="false" DigSign="true"/>
<ROW File="ASC.Web.Api.exe" Component_="ASC.Web.Api.exe" FileName="ASCWEB~1.EXE|ASC.Web.Api.exe" Attributes="0" SourcePath="Files\services\ASC.Web.Api\service\ASC.Web.Api.exe" SelfReg="false" DigSign="true"/>
<ROW File="proxy.exe" Component_="proxy.exe" FileName="ONLYO~13.EXE|proxy.exe" Attributes="0" SourcePath="Files\tools\proxy.exe" SelfReg="false" DigSign="true"/>
<ROW File="proxy.xml" Component_="proxy.xml" FileName="ONLYO~13.XML|proxy.xml" Attributes="0" SourcePath="Files\tools\proxy.xml" SelfReg="false"/>
<ROW File="Proxy.exe" Component_="Proxy.exe" FileName="Proxy.exe" Attributes="0" SourcePath="Files\tools\Proxy.exe" SelfReg="false" DigSign="true"/>
<ROW File="Socket.IO.exe" Component_="Socket.IO.exe" FileName="SOCKET~1.EXE|Socket.IO.exe" Attributes="0" SourcePath="Files\tools\Socket.IO.exe" SelfReg="false" DigSign="true"/>
<ROW File="Socket.IO.xml" Component_="proxy.xml" FileName="SOCKET~1.XML|Socket.IO.xml" Attributes="0" SourcePath="Files\tools\Socket.IO.xml" SelfReg="false"/>
<ROW File="SsoAuth.exe" Component_="SsoAuth.exe" FileName="SsoAuth.exe" Attributes="0" SourcePath="Files\tools\SsoAuth.exe" SelfReg="false" DigSign="true"/>
<ROW File="SsoAuth.xml" Component_="proxy.xml" FileName="SsoAuth.xml" Attributes="0" SourcePath="Files\tools\SsoAuth.xml" SelfReg="false"/>
<ROW File="UrlShortener.exe" Component_="UrlShortener.exe" FileName="URLSHO~1.EXE|UrlShortener.exe" Attributes="0" SourcePath="Files\tools\UrlShortener.exe" SelfReg="false" DigSign="true"/>
<ROW File="UrlShortener.xml" Component_="proxy.xml" FileName="URLSHO~1.XML|UrlShortener.xml" Attributes="0" SourcePath="Files\tools\UrlShortener.xml" SelfReg="false"/>
<ROW File="ASC.ClearEvents.exe" Component_="ASC.ClearEvents.exe" FileName="ASCCLE~1.EXE|ASC.ClearEvents.exe" Attributes="0" SourcePath="Files\services\ASC.ClearEvents\service\ASC.ClearEvents.exe" SelfReg="false" DigSign="true"/>
<ROW File="ASC.Data.Backup.BackgroundTasks.exe" Component_="ASC.Data.Backup.BackgroundTasks.exe" FileName="ASCDAT~1.EXE|ASC.Data.Backup.BackgroundTasks.exe" Attributes="0" SourcePath="Files\services\ASC.Data.Backup.BackgroundTasks\service\ASC.Data.Backup.BackgroundTasks.exe" SelfReg="false" DigSign="true"/>
<ROW File="ASC.Migration.exe" Component_="ASC.Migration.exe" FileName="ASCMIG~1.EXE|ASC.Migration.exe" Attributes="0" SourcePath="Files\services\ASC.Migration\service\ASC.Migration.exe" SelfReg="false" DigSign="true"/>
<ROW File="ASC.Webhooks.Service.exe" Component_="ASC.Webhooks.Service.exe" FileName="ASCWEB~1.EXE|ASC.Webhooks.Service.exe" Attributes="0" SourcePath="Files\services\ASC.Webhooks.Service\service\ASC.Webhooks.Service.exe" SelfReg="false" DigSign="true"/>
<ROW File="ASC.Migration.Runner.exe" Component_="ASC.Migration.Runner.exe" FileName="ASCMIG~2.EXE|ASC.Migration.Runner.exe" Attributes="0" SourcePath="Files\services\ASC.Migration.Runner\service\ASC.Migration.Runner.exe" SelfReg="false" DigSign="true"/>
<ROW File="favicon.ico" Component_="favicon.ico" FileName="favicon.ico" Attributes="0" SourcePath="Files\public\favicon.ico" SelfReg="false" DigSign="true"/>
<ROW File="DocEditor.exe" Component_="DocEditor.exe" FileName="DOCEDI~1.EXE|DocEditor.exe" Attributes="0" SourcePath="Files\tools\DocEditor.exe" SelfReg="false" DigSign="true"/>
<ROW File="Login.exe" Component_="Login.exe" FileName="LOGIN~1.EXE|Login.exe" Attributes="0" SourcePath="Files\tools\Login.exe" SelfReg="false" DigSign="true"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.BootstrOptComponent">
<ROW BootstrOptKey="GlobalOptions" DownloadFolder="[AppDataFolder][|Manufacturer]\[|ProductName]\prerequisites" Options="2"/>
@ -222,15 +307,79 @@
<ROW Fragment="WelcomePrereqDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\WelcomePrereqDlg.aip"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.JsonFileComponent">
<ROW JsonFile="Newfile.json_1" FileName="APPSET~1.JSO|appsettings.test.json" DirProperty="config_Dir" Component="AI_ExePath" RootProperty="Root_1" Flags="6" IndentUnits="2"/>
<ROW JsonFile="Newfile.json" FileName="ELASTI~1.JSO|elastic.test.json" DirProperty="config_Dir" Component="config" RootProperty="Root" Flags="6" IndentUnits="2"/>
<ROW JsonFile="Newfile.json_1" FileName="APPSET~1.JSO|appsettings.test.json" DirProperty="config_Dir" Component="config" RootProperty="Root_1" Flags="6" IndentUnits="2"/>
<ROW JsonFile="Newfile.json_2" FileName="RABBIT~1.JSO|rabbitmq.test.json" DirProperty="config_Dir" Component="config" RootProperty="Root_2" Flags="6" IndentUnits="2"/>
<ROW JsonFile="Newfile.json_3" FileName="REDIST~1.JSO|redis.test.json" DirProperty="config_Dir" Component="config" RootProperty="Root_3" Flags="6" IndentUnits="2"/>
<ROW JsonFile="Newfile.json_4" FileName="APPSET~2.JSO|appsettings.services.json" DirProperty="config_Dir" Component="config" RootProperty="Root_4" Flags="6" IndentUnits="2"/>
<ROW JsonFile="Newfile.json_5" FileName="APPSET~3.JSO|appsettings.json" DirProperty="config_Dir" Component="config" RootProperty="Root_5" Flags="6" IndentUnits="2"/>
<ROW JsonFile="Newfile.json_6" FileName="CONFIG~1.JSO|config.json" DirProperty="NewFolder_1_Dir" Component="config_socketio" RootProperty="Root_6" Flags="6" IndentUnits="2"/>
<ROW JsonFile="config.json" FileName="CONFIG~1.JSO|config.json" DirProperty="config_2_Dir" Component="config_ssoauth" RootProperty="Root_7" Flags="6" IndentUnits="2"/>
<ROW JsonFile="config.json_1" FileName="CONFIG~1.JSO|config.json" DirProperty="config_1_Dir" Component="config_urlshortener" RootProperty="Root_8" Flags="6" IndentUnits="2"/>
<ROW JsonFile="config.json_2" FileName="CONFIG~1.JSO|config.json" DirProperty="login_Dir" Component="login" RootProperty="Root_9" Flags="6" IndentUnits="2"/>
<ROW JsonFile="config.json_3" FileName="CONFIG~1.JSO|config.json" DirProperty="editor_Dir" Component="editor" RootProperty="Root_10" Flags="6" IndentUnits="2"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.JsonPropertyComponent">
<ROW JsonProperty="ConnectionStrings_1" Parent="Root_1" Name="ConnectionStrings" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Host" Parent="elastic" Name="Host" Condition="1" Order="0" Flags="57" Value="[ELASTICSEARCH_HOST]"/>
<ROW JsonProperty="Host_1" Parent="_" Name="Host" Condition="1" Order="0" Flags="57" Value="[REDIS_HOST_PROP]"/>
<ROW JsonProperty="Hostname" Parent="RabbitMQ" Name="Hostname" Condition="1" Order="0" Flags="57" Value="[RABBITMQ_HOSTNAME_PROP]"/>
<ROW JsonProperty="Hosts" Parent="Redis" Name="Hosts" Condition="1" Order="0" Flags="61"/>
<ROW JsonProperty="PORT" Parent="Root_9" Name="PORT" Condition="1" Order="1" Flags="57" Value="[Login_Port]"/>
<ROW JsonProperty="PORT_1" Parent="Root_10" Name="PORT" Condition="1" Order="1" Flags="57" Value="[Editor_Port]"/>
<ROW JsonProperty="Password" Parent="RabbitMQ" Name="Password" Condition="1" Order="2" Flags="57" Value="[RABBITMQ_PASSWORD_PROP]"/>
<ROW JsonProperty="Port" Parent="elastic" Name="Port" Condition="1" Order="2" Flags="57" Value="[ELASTICSEARCH_PORT]"/>
<ROW JsonProperty="Port_1" Parent="RabbitMQ" Name="Port" Condition="1" Order="3" Flags="59" Value="[RABBITMQ_PORT_PROP]"/>
<ROW JsonProperty="Port_2" Parent="_" Name="Port" Condition="1" Order="1" Flags="57" Value="[REDIS_PORT_PROP]"/>
<ROW JsonProperty="RabbitMQ" Parent="Root_2" Name="RabbitMQ" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Redis" Parent="Root_3" Name="Redis" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_1" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_10" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_2" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_3" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_4" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_5" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_6" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_7" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_8" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_9" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Scheme" Parent="elastic" Name="Scheme" Condition="1" Order="1" Flags="57" Value="[ELASTICSEARCH_SCHEME]"/>
<ROW JsonProperty="UserName" Parent="RabbitMQ" Name="UserName" Condition="1" Order="1" Flags="57" Value="[RABBITMQ_USERNAME_PROP]"/>
<ROW JsonProperty="VirtualHost" Parent="RabbitMQ" Name="VirtualHost" Condition="1" Order="4" Flags="57" Value="[RABBITMQ_VIRTUALHOST_PROP]"/>
<ROW JsonProperty="_" Parent="Hosts" Name="0" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="app" Parent="Root_6" Name="app" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="app_1" Parent="Root_7" Name="app" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="app_2" Parent="Root_8" Name="app" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="app_3" Parent="Root_9" Name="app" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="app_4" Parent="Root_10" Name="app" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="appsettings" Parent="app" Name="appsettings" Condition="1" Order="1" Flags="57" Value="[APPDIR_FORWARD_SLASH]config"/>
<ROW JsonProperty="appsettings_1" Parent="app_1" Name="appsettings" Condition="1" Order="1" Flags="57" Value="[APPDIR_FORWARD_SLASH]config"/>
<ROW JsonProperty="appsettings_2" Parent="app_2" Name="appsettings" Condition="1" Order="1" Flags="57" Value="[APPDIR_FORWARD_SLASH]config"/>
<ROW JsonProperty="appsettings_3" Parent="app_3" Name="appsettings" Condition="1" Order="0" Flags="57" Value="[APPDIR_FORWARD_SLASH]config"/>
<ROW JsonProperty="appsettings_4" Parent="app_4" Name="appsettings" Condition="1" Order="0" Flags="57" Value="[APPDIR_FORWARD_SLASH]config"/>
<ROW JsonProperty="connectionString_1" Parent="default_1" Name="connectionString" Condition="1" Order="0" Flags="57" Value="Server=[SERVER_PROP];Port=3306;Database=[DATABASE_PROP];User ID=[USERNAME_PROP];Password=[PASSWORD_PROP];Pooling=true;Character Set=utf8;AutoEnlist=false;SSL Mode=none"/>
<ROW JsonProperty="core" Parent="Root_4" Name="core" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="core_1" Parent="Root_5" Name="core" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="core_2" Parent="Root_1" Name="core" Condition="1" Order="2" Flags="60"/>
<ROW JsonProperty="default_1" Parent="ConnectionStrings_1" Name="default" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="elastic" Parent="Root" Name="elastic" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="enabled" Parent="migration" Name="enabled" Condition="1" Order="0" Flags="57" Value="[DATABASE_MIGRATION]"/>
<ROW JsonProperty="environment" Parent="app" Name="environment" Condition="1" Order="2" Flags="57" Value="[ENVIRONMENT]"/>
<ROW JsonProperty="environment_1" Parent="app_1" Name="environment" Condition="1" Order="2" Flags="57" Value="[ENVIRONMENT]"/>
<ROW JsonProperty="environment_2" Parent="app_2" Name="environment" Condition="1" Order="2" Flags="57" Value="[ENVIRONMENT]"/>
<ROW JsonProperty="folder" Parent="products" Name="folder" Condition="1" Order="0" Flags="57" Value="[APPDIR_FORWARD_SLASH]products"/>
<ROW JsonProperty="folder_1" Parent="products_1" Name="folder" Condition="1" Order="0" Flags="57" Value="[APPDIR_FORWARD_SLASH]products"/>
<ROW JsonProperty="logPath" Parent="Root_4" Name="logPath" Condition="1" Order="1" Flags="57" Value="[APPDIR_FORWARD_SLASH]Logs"/>
<ROW JsonProperty="machinekey" Parent="core_2" Name="machinekey" Condition="1" Order="0" Flags="57" Value="[MACHINE_KEY]"/>
<ROW JsonProperty="machinekey_1" Parent="app_1" Name="machinekey" Condition="1" Order="3" Flags="57" Value="[MACHINE_KEY]"/>
<ROW JsonProperty="machinekey_2" Parent="core_1" Name="machinekey" Condition="1" Order="0" Flags="57" Value="[MACHINE_KEY]"/>
<ROW JsonProperty="migration" Parent="Root_1" Name="migration" Condition="1" Order="1" Flags="60"/>
<ROW JsonProperty="port" Parent="app" Name="port" Condition="1" Order="0" Flags="57" Value="[Socket.IO_Port]"/>
<ROW JsonProperty="port_1" Parent="app_1" Name="port" Condition="1" Order="0" Flags="57" Value="[SsoAuth_port]"/>
<ROW JsonProperty="port_2" Parent="app_2" Name="port" Condition="1" Order="0" Flags="57" Value="[UrlShortener_Port]"/>
<ROW JsonProperty="products" Parent="core" Name="products" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="products_1" Parent="core_2" Name="products" Condition="1" Order="1" Flags="60"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiActionTextComponent">
<ROW Action="AI_ConfigFailActions" Description="Configure service failure actions" DescriptionLocId="ActionText.Description.AI_ConfigFailActions" Template="Service: [1]" TemplateLocId="ActionText.Template.AI_ConfigFailActions"/>
@ -255,7 +404,6 @@
<ROW Property="AI_SETUPEXEPATH" Signature_="AI_EXE_PATH_CU" Builds="DefaultBuild"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiBinaryComponent">
<ROW Name="PowerShellScriptLauncher.dll" SourcePath="&lt;AI_CUSTACTS&gt;PowerShellScriptLauncher.dll"/>
<ROW Name="Prereq.dll" SourcePath="&lt;AI_CUSTACTS&gt;Prereq.dll"/>
<ROW Name="SoftwareDetector.dll" SourcePath="&lt;AI_CUSTACTS&gt;SoftwareDetector.dll"/>
<ROW Name="TxtUpdater.dll" SourcePath="&lt;AI_CUSTACTS&gt;TxtUpdater.dll"/>
@ -265,6 +413,7 @@
<ROW Name="dialog.bmp" SourcePath="Resources\dialog.bmp"/>
<ROW Name="jsonCfg.dll" SourcePath="&lt;AI_CUSTACTS&gt;jsonCfg.dll"/>
<ROW Name="lzmaextractor.dll" SourcePath="&lt;AI_CUSTACTS&gt;lzmaextractor.dll"/>
<ROW Name="userAccounts.dll" SourcePath="&lt;AI_CUSTACTS&gt;userAccounts.dll"/>
<ROW Name="utils.vbs" SourcePath="utils.vbs"/>
<ROW Name="viewer.exe" SourcePath="&lt;AI_CUSTACTS&gt;viewer.exe"/>
</COMPONENT>
@ -578,12 +727,72 @@
<ROW Directory_="config_1_Dir" Component_="config_urlshortener" ManualDelete="false"/>
<ROW Directory_="config_2_Dir" Component_="config_ssoauth" ManualDelete="false"/>
<ROW Directory_="NewFolder_1_Dir" Component_="config_socketio" ManualDelete="false"/>
<ROW Directory_="public_Dir" Component_="public" ManualDelete="true"/>
<ROW Directory_="login_Dir" Component_="login" ManualDelete="false"/>
<ROW Directory_="editor_Dir" Component_="editor" ManualDelete="false"/>
<ROW Directory_="conf_Dir" Component_="conf" ManualDelete="false"/>
<ROW Directory_="includes_Dir" Component_="includes" ManualDelete="false"/>
<ROW Directory_="nginx_Dir" Component_="nginx" ManualDelete="false"/>
<ROW Directory_="tools_Dir" Component_="tools" ManualDelete="false"/>
<ROW Directory_="products_Dir" Component_="products" ManualDelete="false"/>
<ROW Directory_="ASC.Files_Dir" Component_="ASC.Files" ManualDelete="false"/>
<ROW Directory_="server_2_Dir" Component_="server_ASC.Files" ManualDelete="false"/>
<ROW Directory_="ASC.Login_Dir" Component_="ASC.Login" ManualDelete="false"/>
<ROW Directory_="ASC.People_Dir" Component_="ASC.People" ManualDelete="false"/>
<ROW Directory_="server_5_Dir" Component_="server_ASC.People" ManualDelete="false"/>
<ROW Directory_="services_Dir" Component_="services" ManualDelete="false"/>
<ROW Directory_="ASC.Migration.Runner_Dir" Component_="ASC.Migration.Runner" ManualDelete="false"/>
<ROW Directory_="service_6_Dir" Component_="service_ASC.Migration.Runner" ManualDelete="false"/>
<ROW Directory_="ASC.ClearEvents_Dir" Component_="ASC.ClearEvents" ManualDelete="false"/>
<ROW Directory_="service_Dir" Component_="service_ASC.ClearEvents" ManualDelete="false"/>
<ROW Directory_="ASC.UrlShortener_Dir" Component_="ASC.UrlShortener" ManualDelete="false"/>
<ROW Directory_="NewFolder_Dir" Component_="service_ASC.Urlshortner" ManualDelete="false"/>
<ROW Directory_="ASC.Data.Backup.BackgroundTasks_Dir" Component_="ASC.Data.Backup.BackgroundTasks" ManualDelete="false"/>
<ROW Directory_="service_3_Dir" Component_="service_ASC.Data.Backup.BachgroundTasks" ManualDelete="false"/>
<ROW Directory_="ASC.Socket.IO_Dir" Component_="ASC.Socket.IO" ManualDelete="false"/>
<ROW Directory_="service_1_Dir" Component_="service_ASC.Socket.IO" ManualDelete="false"/>
<ROW Directory_="ASC.Data.Backup_Dir" Component_="ASC.Data.Backup" ManualDelete="false"/>
<ROW Directory_="service_2_Dir" Component_="service_ASC.Data.Backup" ManualDelete="false"/>
<ROW Directory_="ASC.Migration_Dir" Component_="ASC.Migration" ManualDelete="false"/>
<ROW Directory_="service_4_Dir" Component_="service_ASC.Migration" ManualDelete="false"/>
<ROW Directory_="ASC.Files.Service_Dir" Component_="ASC.Files.Service" ManualDelete="false"/>
<ROW Directory_="service_7_Dir" Component_="service_ASC.File.Service" ManualDelete="false"/>
<ROW Directory_="ASC.TelegramService_Dir" Component_="ASC.TelegramService" ManualDelete="false"/>
<ROW Directory_="service_12_Dir" Component_="service_ASC.TelegramService" ManualDelete="false"/>
<ROW Directory_="ASC.Notify_Dir" Component_="ASC.Notify" ManualDelete="false"/>
<ROW Directory_="service_9_Dir" Component_="service_ASC.Notify" ManualDelete="false"/>
<ROW Directory_="ASC.SsoAuth_Dir" Component_="ASC.SsoAuth" ManualDelete="false"/>
<ROW Directory_="service_5_Dir" Component_="service_ASC.SsoAuth" ManualDelete="false"/>
<ROW Directory_="ASC.Studio.Notify_Dir" Component_="ASC.Studio.Notify" ManualDelete="false"/>
<ROW Directory_="service_11_Dir" Component_="service_ASC.Studio.Notify" ManualDelete="false"/>
<ROW Directory_="ASC.Web.Api_Dir" Component_="ASC.Web.Api" ManualDelete="false"/>
<ROW Directory_="service_15_Dir" Component_="service_ASC.WebApi" ManualDelete="false"/>
<ROW Directory_="ASC.Web.Studio_Dir" Component_="ASC.Web.Studio" ManualDelete="false"/>
<ROW Directory_="service_16_Dir" Component_="service_ASC.Web.Studio" ManualDelete="false"/>
<ROW Directory_="ASC.Webhooks.Service_Dir" Component_="ASC.Webhooks.Service" ManualDelete="false"/>
<ROW Directory_="NewFolder_3_Dir" Component_="service_ASC.Webhooks.Service" ManualDelete="false"/>
<ROW Directory_="Logs_Dir" Component_="Logs" ManualDelete="false"/>
<ROW Directory_="temp_Dir" Component_="temp_nginx" ManualDelete="false"/>
<ROW Directory_="logs_Dir" Component_="logs" ManualDelete="false"/>
<ROW Directory_="temp_1_Dir" Component_="temp_ASC.ClearEvents" ManualDelete="false"/>
<ROW Directory_="temp_2_Dir" Component_="temp_ASC.Data.Backup.BackgroundTasks" ManualDelete="false"/>
<ROW Directory_="temp_3_Dir" Component_="temp_ASC.File.Service" ManualDelete="false"/>
<ROW Directory_="temp_4_Dir" Component_="temp_ASC.Data.Buckup" ManualDelete="false"/>
<ROW Directory_="temp_5_Dir" Component_="temp_ASC.Migration" ManualDelete="false"/>
<ROW Directory_="temp_6_Dir" Component_="temp_ASC.Migration.Runner" ManualDelete="false"/>
<ROW Directory_="temp_7_Dir" Component_="temp_ASC.Notify" ManualDelete="false"/>
<ROW Directory_="temp_8_Dir" Component_="temp_ASC.Studio.Notify" ManualDelete="false"/>
<ROW Directory_="temp_9_Dir" Component_="temp_ASC.Web.Api" ManualDelete="false"/>
<ROW Directory_="temp_10_Dir" Component_="temp_ASC.Web.Studio" ManualDelete="false"/>
<ROW Directory_="temp_11_Dir" Component_="temp_ASC.Webhooks.Service" ManualDelete="false"/>
<ROW Directory_="temp_12_Dir" Component_="temp_ASC.TelegramService" ManualDelete="false"/>
<ROW Directory_="temp_13_Dir" Component_="temp_ASC.Files" ManualDelete="false"/>
<ROW Directory_="temp_14_Dir" Component_="temp_ASC.People" ManualDelete="false"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiCustActComponent">
<ROW Action="AI_AppSearchEx" Type="1" Source="Prereq.dll" Target="DoAppSearchEx"/>
<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_ConfigPermissions" Type="1" Source="userAccounts.dll" Target="OnConfigPermissions" AdditionalSeq="AI_DATA_SETTER_4"/>
<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="HOST=[ELASTICSEARCH_HOST];PORT=[ELASTICSEARCH_PORT];OUTPUT=ELK_CONNECTION"/>
<ROW Action="AI_DATA_SETTER_10" Type="51" Source="CustomActionData" Target="MySQL80"/>
@ -594,6 +803,7 @@
<ROW Action="AI_DATA_SETTER_18" Type="51" Source="CustomActionData" Target="[RabbitMQServerConnectionError] |[ProductName] Setup |MB_OK,MB_ICONWARNING,MB_DEFBUTTON1||[CLIENTPROCESSID]"/>
<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_4" Type="51" Source="CustomActionData" Target="[~]"/>
<ROW Action="AI_DATA_SETTER_5" Type="51" Source="CustomActionData" Target="[RedisServerConnectionError] |[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_7" Type="51" Source="CustomActionData" Target="[~]"/>
@ -620,13 +830,17 @@
<ROW Action="AI_JsonRollback" Type="11521" Source="jsonCfg.dll" Target="OnJsonRollback" WithoutSeq="true"/>
<ROW Action="AI_JsonUninstall" Type="1" Source="jsonCfg.dll" Target="OnJsonUninstall" AdditionalSeq="AI_DATA_SETTER_8"/>
<ROW Action="AI_PREPARE_UPGRADE" Type="65" Source="aicustact.dll" Target="PrepareUpgrade"/>
<ROW Action="AI_PrepareRevokePermissions" Type="1" Source="userAccounts.dll" Target="OnPrepareRevokePermissions"/>
<ROW Action="AI_ProcessFailActions" Type="1" Source="aicustact.dll" Target="ProcessFailActions" AdditionalSeq="AI_DATA_SETTER_3"/>
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH" Target="[AI_SETUPEXEPATH_ORIGINAL]"/>
<ROW Action="AI_RESTORE_LOCATION" Type="65" Source="aicustact.dll" Target="RestoreLocation"/>
<ROW Action="AI_ResolveKnownFolders" Type="1" Source="aicustact.dll" Target="AI_ResolveKnownFolders"/>
<ROW Action="AI_ResolveLocalizedCredentials" Type="1" Source="aicustact.dll" Target="GetLocalizedCredentials"/>
<ROW Action="AI_RestartElevated" Type="1" Source="aicustact.dll" Target="RestartElevated"/>
<ROW Action="AI_RevokePermissions" Type="11265" Source="userAccounts.dll" Target="OnRevokePermissions" WithoutSeq="true"/>
<ROW Action="AI_SHOW_LOG" Type="65" Source="aicustact.dll" Target="LaunchLogFile" WithoutSeq="true"/>
<ROW Action="AI_STORE_LOCATION" Type="51" Source="ARPINSTALLLOCATION" Target="[APPDIR]"/>
<ROW Action="AI_SetPermissions" Type="11265" Source="userAccounts.dll" Target="OnSetPermissions" WithoutSeq="true"/>
<ROW Action="AI_TxtUpdaterCommit" Type="11777" Source="TxtUpdater.dll" Target="OnTxtUpdaterCommit" WithoutSeq="true"/>
<ROW Action="AI_TxtUpdaterConfig" Type="11265" Source="TxtUpdater.dll" Target="OnTxtUpdaterConfig" WithoutSeq="true"/>
<ROW Action="AI_TxtUpdaterInstall" Type="1" Source="TxtUpdater.dll" Target="OnTxtUpdaterInstall"/>
@ -639,9 +853,10 @@
<ROW Action="SET_APPDIR" Type="307" Source="APPDIR" Target="[ProgramFilesFolder][Manufacturer]\[ProductName]" MultiBuildTarget="DefaultBuild:[ProgramFilesFolder][INSTALL_ROOT_FOLDER_NAME]\DocSpace"/>
<ROW Action="SET_SHORTCUTDIR" Type="307" Source="SHORTCUTDIR" Target="[ProgramMenuFolder][ProductName]" MultiBuildTarget="DefaultBuild:[ProgramMenuFolder][INSTALL_ROOT_FOLDER_NAME]\DocSpace"/>
<ROW Action="SET_TARGETDIR_TO_APPDIR" Type="51" Source="TARGETDIR" Target="[APPDIR]"/>
<ROW Action="SetMACHINEKEY" Type="51" Source="MACHINE_KEY" Target="[ComputerName]"/>
<ROW Action="Set_APPDIR_FORWARD_SLASH" Type="38" Target="Script Text" TargetUnformatted="Session.Property(&quot;APPDIR_FORWARD_SLASH&quot;) = Replace(Session.Property(&quot;APPDIR&quot;), &quot;\&quot;, &quot;/&quot;)&#13;&#10;" AdditionalSeq="AI_DATA_SETTER_6"/>
<ROW Action="StartElasticSearchService" Type="3073" Source="aicustact.dll" Target="StartWinService" Options="1" AdditionalSeq="AI_DATA_SETTER_13"/>
<ROW Action="StartMigrationRunner" Type="3106" Source="service_6_Dir" Target="&quot;[APPDIR]services\ASC.Migration.Runner\service\ASC.Migration.Runner.exe&quot;"/>
<ROW Action="StartMigrationRunner" Type="3074" Source="viewer.exe" Target="/EnforcedRunAsAdmin /RunAsAdmin /HideWindow /dir &quot;[APPDIR]\services\ASC.Migration.Runner\service&quot; &quot;[APPDIR]services\ASC.Migration.Runner\service\ASC.Migration.Runner.exe&quot;" Options="1"/>
<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="StopMySQLService" Type="1" Source="aicustact.dll" Target="StopWinService" Options="1" AdditionalSeq="AI_DATA_SETTER_10"/>
@ -675,8 +890,7 @@
<ROW Feature_="MainFeature" Component_="ASC.Web.Studio.exe"/>
<ROW Feature_="MainFeature" Component_="ASC.Files.exe"/>
<ROW Feature_="MainFeature" Component_="ASC.Web.Api.exe"/>
<ROW Feature_="MainFeature" Component_="proxy.xml"/>
<ROW Feature_="MainFeature" Component_="proxy.exe"/>
<ROW Feature_="MainFeature" Component_="Proxy.exe"/>
<ROW Feature_="MainFeature" Component_="config"/>
<ROW Feature_="MainFeature" Component_="AI_CustomARPName"/>
<ROW Feature_="MainFeature" Component_="AI_DisableModify"/>
@ -691,8 +905,68 @@
<ROW Feature_="MainFeature" Component_="ASC.Migration.exe"/>
<ROW Feature_="MainFeature" Component_="ASC.Webhooks.Service.exe"/>
<ROW Feature_="MainFeature" Component_="ASC.Migration.Runner.exe"/>
<ROW Feature_="MainFeature" Component_="favicon.ico"/>
<ROW Feature_="MainFeature" Component_="public"/>
<ROW Feature_="MainFeature" Component_="DocEditor.exe"/>
<ROW Feature_="MainFeature" Component_="Login.exe"/>
<ROW Feature_="MainFeature" Component_="login"/>
<ROW Feature_="MainFeature" Component_="editor"/>
<ROW Feature_="MainFeature" Component_="conf"/>
<ROW Feature_="MainFeature" Component_="includes"/>
<ROW Feature_="MainFeature" Component_="nginx"/>
<ROW Feature_="MainFeature" Component_="tools"/>
<ROW Feature_="MainFeature" Component_="products"/>
<ROW Feature_="MainFeature" Component_="ASC.Files"/>
<ROW Feature_="MainFeature" Component_="server_ASC.Files"/>
<ROW Feature_="MainFeature" Component_="ASC.Login"/>
<ROW Feature_="MainFeature" Component_="ASC.People"/>
<ROW Feature_="MainFeature" Component_="server_ASC.People"/>
<ROW Feature_="MainFeature" Component_="services"/>
<ROW Feature_="MainFeature" Component_="ASC.Migration.Runner"/>
<ROW Feature_="MainFeature" Component_="service_ASC.Migration.Runner"/>
<ROW Feature_="MainFeature" Component_="ASC.ClearEvents"/>
<ROW Feature_="MainFeature" Component_="service_ASC.ClearEvents"/>
<ROW Feature_="MainFeature" Component_="ASC.UrlShortener"/>
<ROW Feature_="MainFeature" Component_="service_ASC.Urlshortner"/>
<ROW Feature_="MainFeature" Component_="ASC.Data.Backup.BackgroundTasks"/>
<ROW Feature_="MainFeature" Component_="service_ASC.Data.Backup.BachgroundTasks"/>
<ROW Feature_="MainFeature" Component_="ASC.Socket.IO"/>
<ROW Feature_="MainFeature" Component_="service_ASC.Socket.IO"/>
<ROW Feature_="MainFeature" Component_="ASC.Data.Backup"/>
<ROW Feature_="MainFeature" Component_="service_ASC.Data.Backup"/>
<ROW Feature_="MainFeature" Component_="ASC.Migration"/>
<ROW Feature_="MainFeature" Component_="service_ASC.Migration"/>
<ROW Feature_="MainFeature" Component_="ASC.Files.Service"/>
<ROW Feature_="MainFeature" Component_="service_ASC.File.Service"/>
<ROW Feature_="MainFeature" Component_="ASC.TelegramService"/>
<ROW Feature_="MainFeature" Component_="service_ASC.TelegramService"/>
<ROW Feature_="MainFeature" Component_="ASC.Notify"/>
<ROW Feature_="MainFeature" Component_="service_ASC.Notify"/>
<ROW Feature_="MainFeature" Component_="ASC.SsoAuth"/>
<ROW Feature_="MainFeature" Component_="service_ASC.SsoAuth"/>
<ROW Feature_="MainFeature" Component_="ASC.Studio.Notify"/>
<ROW Feature_="MainFeature" Component_="service_ASC.Studio.Notify"/>
<ROW Feature_="MainFeature" Component_="ASC.Web.Api"/>
<ROW Feature_="MainFeature" Component_="service_ASC.WebApi"/>
<ROW Feature_="MainFeature" Component_="ASC.Web.Studio"/>
<ROW Feature_="MainFeature" Component_="service_ASC.Web.Studio"/>
<ROW Feature_="MainFeature" Component_="ASC.Webhooks.Service"/>
<ROW Feature_="MainFeature" Component_="service_ASC.Webhooks.Service"/>
<ROW Feature_="MainFeature" Component_="Logs"/>
<ROW Feature_="MainFeature" Component_="temp_nginx"/>
<ROW Feature_="MainFeature" Component_="logs"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.ClearEvents"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.Data.Backup.BackgroundTasks"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.File.Service"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.Data.Buckup"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.Migration"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.Migration.Runner"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.Notify"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.Studio.Notify"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.Web.Api"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.Web.Studio"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.Webhooks.Service"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.TelegramService"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.Files"/>
<ROW Feature_="MainFeature" Component_="temp_ASC.People"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiIconsComponent">
<ROW Name="icon.exe" SourcePath="Resources\icon.ico" Index="0"/>
@ -702,8 +976,8 @@
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=&quot;&quot;" Sequence="749"/>
<ROW Action="AI_STORE_LOCATION" Condition="(Not Installed) OR REINSTALL" Sequence="1501"/>
<ROW Action="AI_PREPARE_UPGRADE" Condition="AI_UPGRADE=&quot;No&quot; AND (Not Installed)" Sequence="1397"/>
<ROW Action="AI_ResolveKnownFolders" Sequence="52"/>
<ROW Action="AI_EnableDebugLog" Sequence="51"/>
<ROW Action="AI_ResolveKnownFolders" Sequence="53"/>
<ROW Action="AI_EnableDebugLog" Sequence="52"/>
<ROW Action="AI_AppSearchEx" Sequence="103"/>
<ROW Action="AI_DetectSoftware" Sequence="102"/>
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Sequence="99" Builds="DefaultBuild"/>
@ -724,35 +998,42 @@
<ROW Action="AI_DATA_SETTER_7" Condition="(REMOVE &lt;&gt; &quot;ALL&quot;)" Sequence="5101"/>
<ROW Action="AI_JsonUninstall" Condition="(REMOVE)" Sequence="3102"/>
<ROW Action="AI_DATA_SETTER_8" Condition="(REMOVE)" Sequence="3101"/>
<ROW Action="StopMySQLService" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE &lt;&gt; &quot;Not Found&quot; )" Sequence="1605"/>
<ROW Action="AI_DATA_SETTER_10" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE &lt;&gt; &quot;Not Found&quot; )" Sequence="1604"/>
<ROW Action="StartMySQLService" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE &lt;&gt; &quot;Not Found&quot; )" Sequence="1607"/>
<ROW Action="AI_DATA_SETTER_11" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE &lt;&gt; &quot;Not Found&quot; )" Sequence="1606"/>
<ROW Action="Set_APPDIR_FORWARD_SLASH" Condition="( NOT Installed )" Sequence="1615"/>
<ROW Action="AI_DATA_SETTER_6" Condition="( NOT Installed )" Sequence="1614"/>
<ROW Action="MySQLConfigure" Condition="( NOT Installed )" Sequence="1601"/>
<ROW Action="DetectMySQLService" Condition="( ( NOT Installed AND NOT OLDPRODUCTS ) OR ( Installed AND REMOVE &lt;&gt; &quot;ALL&quot; AND AI_INSTALL_MODE &lt;&gt; &quot;Remove&quot; ) )" Sequence="1603"/>
<ROW Action="AI_DATA_SETTER_9" Condition="( ( NOT Installed AND NOT OLDPRODUCTS ) OR ( Installed AND REMOVE &lt;&gt; &quot;ALL&quot; AND AI_INSTALL_MODE &lt;&gt; &quot;Remove&quot; ) )" Sequence="1602"/>
<ROW Action="ElasticSearchSetup" Condition="( NOT Installed )" Sequence="1611"/>
<ROW Action="StopElasticSearchService" Condition="( NOT Installed )" Sequence="1609"/>
<ROW Action="AI_DATA_SETTER_12" Condition="( NOT Installed )" Sequence="1608"/>
<ROW Action="ElasticSearchInstallPlugin" Condition="( NOT Installed )" Sequence="1610"/>
<ROW Action="StartElasticSearchService" Condition="( NOT Installed )" Sequence="1613"/>
<ROW Action="AI_DATA_SETTER_13" Condition="( NOT Installed )" Sequence="1612"/>
<ROW Action="StopMySQLService" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE &lt;&gt; &quot;Not Found&quot; )" Sequence="1606"/>
<ROW Action="AI_DATA_SETTER_10" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE &lt;&gt; &quot;Not Found&quot; )" Sequence="1605"/>
<ROW Action="Set_APPDIR_FORWARD_SLASH" Condition="( NOT Installed )" Sequence="1616"/>
<ROW Action="AI_DATA_SETTER_6" Condition="( NOT Installed )" Sequence="1615"/>
<ROW Action="MySQLConfigure" Condition="( NOT Installed )" Sequence="1602"/>
<ROW Action="DetectMySQLService" Condition="( ( NOT Installed AND NOT OLDPRODUCTS ) OR ( Installed AND REMOVE &lt;&gt; &quot;ALL&quot; AND AI_INSTALL_MODE &lt;&gt; &quot;Remove&quot; ) )" Sequence="1604"/>
<ROW Action="AI_DATA_SETTER_9" Condition="( ( NOT Installed AND NOT OLDPRODUCTS ) OR ( Installed AND REMOVE &lt;&gt; &quot;ALL&quot; AND AI_INSTALL_MODE &lt;&gt; &quot;Remove&quot; ) )" Sequence="1603"/>
<ROW Action="ElasticSearchSetup" Condition="( NOT Installed )" Sequence="1612"/>
<ROW Action="StopElasticSearchService" Condition="( NOT Installed )" Sequence="1610"/>
<ROW Action="AI_DATA_SETTER_12" Condition="( NOT Installed )" Sequence="1609"/>
<ROW Action="ElasticSearchInstallPlugin" Condition="( NOT Installed )" Sequence="1611"/>
<ROW Action="StartElasticSearchService" Condition="( NOT Installed )" Sequence="1614"/>
<ROW Action="AI_DATA_SETTER_13" Condition="( NOT Installed )" Sequence="1613"/>
<ROW Action="AI_GetArpIconPath" Sequence="1401"/>
<ROW Action="StartMySQLService" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE &lt;&gt; &quot;Not Found&quot; )" Sequence="1608"/>
<ROW Action="AI_DATA_SETTER_11" Condition="( NOT Installed AND NOT OLDPRODUCTS ) AND ( AI_PROCESS_STATE &lt;&gt; &quot;Not Found&quot; )" Sequence="1607"/>
<ROW Action="StartMigrationRunner" Condition="( NOT Installed )" Sequence="5826"/>
<ROW Action="SetMACHINEKEY" Condition="( NOT Installed )" Sequence="1601"/>
<ROW Action="AI_DETECT_MODERNWIN" Condition="(VersionNT &gt;= 603)" Sequence="54" MsiKey="AI_DETECT_MODERNWIN"/>
<ROW Action="AI_ResolveLocalizedCredentials" Sequence="51"/>
<ROW Action="AI_ConfigPermissions" Condition="REMOVE &lt;&gt; &quot;ALL&quot;" Sequence="5852"/>
<ROW Action="AI_DATA_SETTER_4" Condition="REMOVE &lt;&gt; &quot;ALL&quot;" Sequence="5851"/>
<ROW Action="AI_PrepareRevokePermissions" Condition="REMOVE = &quot;ALL&quot;" Sequence="1699"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstallUISequenceComponent">
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=&quot;&quot;" Sequence="749"/>
<ROW Action="AI_ResolveKnownFolders" Sequence="54"/>
<ROW Action="AI_DpiContentScale" Sequence="53"/>
<ROW Action="AI_EnableDebugLog" Sequence="52"/>
<ROW Action="AI_ResolveKnownFolders" Sequence="55"/>
<ROW Action="AI_DpiContentScale" Sequence="54"/>
<ROW Action="AI_EnableDebugLog" Sequence="53"/>
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Sequence="99"/>
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Condition="AI_SETUPEXEPATH_ORIGINAL" Sequence="103"/>
<ROW Action="AI_AppSearchEx" Sequence="102"/>
<ROW Action="AI_DetectSoftware" Sequence="101"/>
<ROW Action="MySQLConfigureGUI" Condition="( NOT Installed )" Sequence="1101"/>
<ROW Action="AI_RestartElevated" Sequence="51"/>
<ROW Action="AI_RestartElevated" Sequence="52"/>
<ROW Action="AI_ResolveLocalizedCredentials" Sequence="51"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiLaunchConditionsComponent">
<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"/>
@ -762,6 +1043,73 @@
<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] cannot be installed on [WindowsType9XDisplay]." DescriptionLocId="AI.LaunchCondition.No9X" IsPredefined="true" Builds="DefaultBuild"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiLockPermComponent">
<ROW LockObject="APPDIR" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="config_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="nginx_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="conf_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="includes_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="tools_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="products_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="editor_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Files_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="login_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="server_2_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Login_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.People_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="server_5_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="services_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Migration.Runner_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_6_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.ClearEvents_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.UrlShortener_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="NewFolder_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="config_1_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="NewFolder_1_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Data.Backup.BackgroundTasks_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_3_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Socket.IO_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_1_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Data.Backup_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_2_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Migration_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_4_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Files.Service_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_7_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.TelegramService_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_12_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Notify_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_9_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.SsoAuth_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="config_2_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_5_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Studio.Notify_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_11_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Web.Api_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_15_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Web.Studio_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="service_16_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="ASC.Webhooks.Service_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="NewFolder_3_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1179785" Flags="2"/>
<ROW LockObject="Logs_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="logs_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_1_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_2_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_3_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_4_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_5_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_6_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_7_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_8_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_9_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_10_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_11_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_12_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_13_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_14_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
</COMPONENT>
<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_LM" Root="2" Key="Software\Caphyon\Advanced Installer\LZMA\[ProductCode]\[ProductVersion]" Name="AI_ExePath" Type="2"/>
@ -795,12 +1143,14 @@
<ROW MsiServiceConfig="ServiceName_BackgroundTasks" Name="[ServiceName_BackgroundTasks]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Data.Backup.BackgroundTasks.exe"/>
<ROW MsiServiceConfig="ServiceName_BackupService" Name="[ServiceName_BackupService]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Data.Backup.exe"/>
<ROW MsiServiceConfig="ServiceName_ClearEvents" Name="[ServiceName_ClearEvents]" Event="1" ConfigType="3" Argument="1" Component_="ASC.ClearEvents.exe"/>
<ROW MsiServiceConfig="ServiceName_DocEditor" Name="[ServiceName_DocEditor]" Event="1" ConfigType="3" Argument="1" Component_="DocEditor.exe"/>
<ROW MsiServiceConfig="ServiceName_FileServer" Name="[ServiceName_FileServer]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Files.exe"/>
<ROW MsiServiceConfig="ServiceName_FileService" Name="[ServiceName_FileService]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Files.Service.exe"/>
<ROW MsiServiceConfig="ServiceName_Login" Name="[ServiceName_Login]" Event="1" ConfigType="3" Argument="1" Component_="Login.exe"/>
<ROW MsiServiceConfig="ServiceName_Migration" Name="[ServiceName_Migration]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Migration.exe"/>
<ROW MsiServiceConfig="ServiceName_NotifyService" Name="[ServiceName_NotifyService]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Notify.exe"/>
<ROW MsiServiceConfig="ServiceName_PeopleServer" Name="[ServiceName_PeopleServer]" Event="1" ConfigType="3" Argument="1" Component_="ASC.People.exe"/>
<ROW MsiServiceConfig="ServiceName_Proxy" Name="[ServiceName_Proxy]" Event="1" ConfigType="3" Argument="1" Component_="proxy.exe"/>
<ROW MsiServiceConfig="ServiceName_Proxy" Name="[ServiceName_Proxy]" Event="1" ConfigType="3" Argument="1" Component_="Proxy.exe"/>
<ROW MsiServiceConfig="ServiceName_Socket.IO" Name="[ServiceName_Socket.IO]" Event="1" ConfigType="3" Argument="1" Component_="Socket.IO.exe"/>
<ROW MsiServiceConfig="ServiceName_SsoAuth" Name="[ServiceName_SsoAuth]" Event="1" ConfigType="3" Argument="1" Component_="SsoAuth.exe"/>
<ROW MsiServiceConfig="ServiceName_StudioNotifyService" Name="[ServiceName_StudioNotifyService]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Studio.Notify.exe"/>
@ -811,35 +1161,38 @@
<ROW MsiServiceConfig="ServiceName_WebhooksService" Name="[ServiceName_WebhooksService]" Event="1" ConfigType="3" Argument="1" Component_="ASC.Webhooks.Service.exe"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiServConfigFailureActionsComponent">
<ROW MsiServiceConfigFailureActions="ServiceName_BackgroundTasks" Name="[ServiceName_BackgroundTasks]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Data.Backup.BackgroundTasks.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_BackupService" Name="[ServiceName_BackupService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Data.Backup.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_ClearEvents" Name="[ServiceName_ClearEvents]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.ClearEvents.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_FileServer" Name="[ServiceName_FileServer]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Files.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_FileService" Name="[ServiceName_FileService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Files.Service.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_Migration" Name="[ServiceName_Migration]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Migration.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_NotifyService" Name="[ServiceName_NotifyService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Notify.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_PeopleServer" Name="[ServiceName_PeopleServer]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.People.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_Proxy" Name="[ServiceName_Proxy]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="proxy.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_Socket.IO" Name="[ServiceName_Socket.IO]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="Socket.IO.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_SsoAuth" Name="[ServiceName_SsoAuth]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="SsoAuth.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_StudioNotifyService" Name="[ServiceName_StudioNotifyService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Studio.Notify.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_TelegramService" Name="[ServiceName_TelegramService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.TelegramService.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_UrlShortenerService" Name="[ServiceName_UrlShortenerService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="UrlShortener.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_WebApi" Name="[ServiceName_WebApi]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Web.Api.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_WebStudio" Name="[ServiceName_WebStudio]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Web.Studio.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_WebhooksService" Name="[ServiceName_WebhooksService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="0[~]1[~]1" Component_="ASC.Webhooks.Service.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_BackgroundTasks" Name="[ServiceName_BackgroundTasks]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Data.Backup.BackgroundTasks.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_BackupService" Name="[ServiceName_BackupService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Data.Backup.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_ClearEvents" Name="[ServiceName_ClearEvents]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.ClearEvents.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_DocEditor" Name="[ServiceName_DocEditor]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="DocEditor.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_FileServer" Name="[ServiceName_FileServer]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Files.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_FileService" Name="[ServiceName_FileService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Files.Service.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_Login" Name="[ServiceName_Login]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="Login.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_Migration" Name="[ServiceName_Migration]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Migration.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_NotifyService" Name="[ServiceName_NotifyService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Notify.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_PeopleServer" Name="[ServiceName_PeopleServer]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.People.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_Proxy" Name="[ServiceName_Proxy]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="Proxy.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_Socket.IO" Name="[ServiceName_Socket.IO]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="Socket.IO.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_SsoAuth" Name="[ServiceName_SsoAuth]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="SsoAuth.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_StudioNotifyService" Name="[ServiceName_StudioNotifyService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Studio.Notify.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_TelegramService" Name="[ServiceName_TelegramService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.TelegramService.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_UrlShortenerService" Name="[ServiceName_UrlShortenerService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="UrlShortener.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_WebApi" Name="[ServiceName_WebApi]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Web.Api.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_WebStudio" Name="[ServiceName_WebStudio]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Web.Studio.exe"/>
<ROW MsiServiceConfigFailureActions="ServiceName_WebhooksService" Name="[ServiceName_WebhooksService]" Event="1" ResetPeriod="0" Actions="1[~]1[~]1" DelayActions="1[~]1[~]1" Component_="ASC.Webhooks.Service.exe"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiServCtrlComponent">
<ROW ServiceControl="ASC.ClearEvents.exe" Name="[ServiceName_ClearEvents]" Event="161" Wait="0" Component_="ASC.ClearEvents.exe"/>
<ROW ServiceControl="ASC.Data.Backup.BackgroundTasks.exe" Name="[ServiceName_BackgroundTasks]" Event="161" Wait="0" Component_="ASC.Data.Backup.BackgroundTasks.exe"/>
<ROW ServiceControl="ASC.Migration.exe" Name="[ServiceName_Migration]" Event="161" Wait="0" Component_="ASC.Migration.exe"/>
<ROW ServiceControl="ASC.Webhooks.Service.exe" Name="[ServiceName_WebhooksService]" Event="161" Wait="0" Component_="ASC.Webhooks.Service.exe"/>
<ROW ServiceControl="ServiceName_BackgroundTasks" Name="[ServiceName_BackgroundTasks]" Event="161" Wait="0" Component_="ASC.Data.Backup.BackgroundTasks.exe"/>
<ROW ServiceControl="ServiceName_BackupService" Name="[ServiceName_BackupService]" Event="161" Wait="0" Component_="ASC.Data.Backup.exe"/>
<ROW ServiceControl="ServiceName_ClearEvents" Name="[ServiceName_ClearEvents]" Event="161" Wait="0" Component_="ASC.ClearEvents.exe"/>
<ROW ServiceControl="ServiceName_DocEditor" Name="[ServiceName_DocEditor]" Event="161" Wait="0" Component_="DocEditor.exe"/>
<ROW ServiceControl="ServiceName_FileServer" Name="[ServiceName_FileServer]" Event="161" Wait="0" Component_="ASC.Files.exe"/>
<ROW ServiceControl="ServiceName_FileService" Name="[ServiceName_FileService]" Event="161" Wait="0" Component_="ASC.Files.Service.exe"/>
<ROW ServiceControl="ServiceName_Login" Name="[ServiceName_Login]" Event="161" Wait="0" Component_="Login.exe"/>
<ROW ServiceControl="ServiceName_Migration" Name="[ServiceName_Migration]" Event="161" Wait="0" Component_="ASC.Migration.exe"/>
<ROW ServiceControl="ServiceName_NotifyService" Name="[ServiceName_NotifyService]" Event="161" Wait="0" Component_="ASC.Notify.exe"/>
<ROW ServiceControl="ServiceName_PeopleServer" Name="[ServiceName_PeopleServer]" Event="161" Wait="0" Component_="ASC.People.exe"/>
<ROW ServiceControl="ServiceName_Proxy" Name="[ServiceName_Proxy]" Event="161" Wait="0" Component_="proxy.exe"/>
<ROW ServiceControl="ServiceName_Proxy" Name="[ServiceName_Proxy]" Event="161" Wait="0" Component_="Proxy.exe"/>
<ROW ServiceControl="ServiceName_Socket.IO" Name="[ServiceName_Socket.IO]" Event="161" Wait="0" Component_="Socket.IO.exe"/>
<ROW ServiceControl="ServiceName_SsoAuth" Name="[ServiceName_SsoAuth]" Event="161" Wait="0" Component_="SsoAuth.exe"/>
<ROW ServiceControl="ServiceName_StudioNotifyService" Name="[ServiceName_StudioNotifyService]" Event="161" Wait="0" Component_="ASC.Studio.Notify.exe"/>
@ -847,25 +1200,28 @@
<ROW ServiceControl="ServiceName_UrlShortenerService" Name="[ServiceName_UrlShortenerService]" Event="161" Wait="0" Component_="UrlShortener.exe"/>
<ROW ServiceControl="ServiceName_WebApi" Name="[ServiceName_WebApi]" Event="161" Wait="0" Component_="ASC.Web.Api.exe"/>
<ROW ServiceControl="ServiceName_WebStudio" Name="[ServiceName_WebStudio]" Event="161" Wait="0" Component_="ASC.Web.Studio.exe"/>
<ROW ServiceControl="ServiceName_WebhooksService" Name="[ServiceName_WebhooksService]" Event="161" Wait="0" Component_="ASC.Webhooks.Service.exe"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiServInstComponent">
<ROW ServiceInstall="ASC.ClearEvents.exe" Name="[ServiceName_ClearEvents]" DisplayName="[ServiceName_ClearEvents]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5027 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.ClearEvents.exe"/>
<ROW ServiceInstall="ASC.Data.Backup.BackgroundTasks.exe" Name="[ServiceName_BackgroundTasks]" DisplayName="[ServiceName_BackgroundTasks]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5032 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Data.Backup.BackgroundTasks.exe"/>
<ROW ServiceInstall="ASC.Migration.exe" Name="[ServiceName_Migration]" DisplayName="[ServiceName_Migration]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5018 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Migration.exe"/>
<ROW ServiceInstall="ASC.Webhooks.Service.exe" Name="[ServiceName_WebhooksService]" DisplayName="[ServiceName_WebhooksService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5031 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Webhooks.Service.exe"/>
<ROW ServiceInstall="ServiceName_BackupService" Name="[ServiceName_BackupService]" DisplayName="[ServiceName_BackupService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5012 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Data.Backup.exe"/>
<ROW ServiceInstall="ServiceName_FileServer" Name="[ServiceName_FileServer]" DisplayName="[ServiceName_FileServer]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5007 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_FileServer] [SUBFOLDER_SERVER]" Component_="ASC.Files.exe"/>
<ROW ServiceInstall="ServiceName_FileService" Name="[ServiceName_FileService]" DisplayName="[ServiceName_FileService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5009 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_FileService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Files.Service.exe"/>
<ROW ServiceInstall="ServiceName_NotifyService" Name="[ServiceName_NotifyService]" DisplayName="[ServiceName_NotifyService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5005 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_NotifyService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Notify.exe"/>
<ROW ServiceInstall="ServiceName_PeopleServer" Name="[ServiceName_PeopleServer]" DisplayName="[ServiceName_PeopleServer]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5004 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_PeopleServer] [SUBFOLDER_SERVER]" Component_="ASC.People.exe"/>
<ROW ServiceInstall="ServiceName_Proxy" Name="[ServiceName_Proxy]" DisplayName="[ServiceName_Proxy]" ServiceType="16" StartType="2" ErrorControl="1" Component_="proxy.exe"/>
<ROW ServiceInstall="ServiceName_Socket.IO" Name="[ServiceName_Socket.IO]" DisplayName="[ServiceName_Socket.IO]" ServiceType="16" StartType="2" ErrorControl="1" Component_="Socket.IO.exe"/>
<ROW ServiceInstall="ServiceName_SsoAuth" Name="[ServiceName_SsoAuth]" DisplayName="[ServiceName_SsoAuth]" ServiceType="16" StartType="2" ErrorControl="1" Component_="SsoAuth.exe"/>
<ROW ServiceInstall="ServiceName_StudioNotifyService" Name="[ServiceName_StudioNotifyService]" DisplayName="[ServiceName_StudioNotifyService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5006 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_StudioNotifyService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Studio.Notify.exe"/>
<ROW ServiceInstall="ServiceName_TelegramService" Name="[ServiceName_TelegramService]" DisplayName="[ServiceName_TelegramService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:51702 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_TelegramService] [SUBFOLDER_SERVER]" Component_="ASC.TelegramService.exe"/>
<ROW ServiceInstall="ServiceName_UrlShortenerService" Name="[ServiceName_UrlShortenerService]" DisplayName="[ServiceName_UrlShortenerService]" ServiceType="16" StartType="2" ErrorControl="1" Component_="UrlShortener.exe"/>
<ROW ServiceInstall="ServiceName_WebApi" Name="[ServiceName_WebApi]" DisplayName="[ServiceName_WebApi]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5000 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_WebApi] [SUBFOLDER_SERVER]" Component_="ASC.Web.Api.exe"/>
<ROW ServiceInstall="ServiceName_WebStudio" Name="[ServiceName_WebStudio]" DisplayName="[ServiceName_WebStudio]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5003 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_WebStudio] [SUBFOLDER_SERVER]" Component_="ASC.Web.Studio.exe"/>
<ROW ServiceInstall="ServiceName_BackgroundTasks" Name="[ServiceName_BackgroundTasks]" DisplayName="[ServiceName_BackgroundTasks]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5032 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Data.Backup.BackgroundTasks.exe"/>
<ROW ServiceInstall="ServiceName_BackupService" Name="[ServiceName_BackupService]" DisplayName="[ServiceName_BackupService]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5012 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Data.Backup.exe"/>
<ROW ServiceInstall="ServiceName_ClearEvents" Name="[ServiceName_ClearEvents]" DisplayName="[ServiceName_ClearEvents]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5027 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.ClearEvents.exe"/>
<ROW ServiceInstall="ServiceName_DocEditor" Name="[ServiceName_DocEditor]" DisplayName="[ServiceName_DocEditor]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Component_="DocEditor.exe"/>
<ROW ServiceInstall="ServiceName_FileServer" Name="[ServiceName_FileServer]" DisplayName="[ServiceName_FileServer]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5007 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_FileServer] [SUBFOLDER_SERVER]" Component_="ASC.Files.exe"/>
<ROW ServiceInstall="ServiceName_FileService" Name="[ServiceName_FileService]" DisplayName="[ServiceName_FileService]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5009 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_FileService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Files.Service.exe"/>
<ROW ServiceInstall="ServiceName_Login" Name="[ServiceName_Login]" DisplayName="[ServiceName_Login]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Component_="Login.exe"/>
<ROW ServiceInstall="ServiceName_Migration" Name="[ServiceName_Migration]" DisplayName="[ServiceName_Migration]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5018 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Migration.exe"/>
<ROW ServiceInstall="ServiceName_NotifyService" Name="[ServiceName_NotifyService]" DisplayName="[ServiceName_NotifyService]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5005 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_NotifyService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Notify.exe"/>
<ROW ServiceInstall="ServiceName_PeopleServer" Name="[ServiceName_PeopleServer]" DisplayName="[ServiceName_PeopleServer]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5004 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_PeopleServer] [SUBFOLDER_SERVER]" Component_="ASC.People.exe"/>
<ROW ServiceInstall="ServiceName_Proxy" Name="[ServiceName_Proxy]" DisplayName="[ServiceName_Proxy]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Component_="Proxy.exe"/>
<ROW ServiceInstall="ServiceName_Socket.IO" Name="[ServiceName_Socket.IO]" DisplayName="[ServiceName_Socket.IO]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Component_="Socket.IO.exe"/>
<ROW ServiceInstall="ServiceName_SsoAuth" Name="[ServiceName_SsoAuth]" DisplayName="[ServiceName_SsoAuth]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Component_="SsoAuth.exe"/>
<ROW ServiceInstall="ServiceName_StudioNotifyService" Name="[ServiceName_StudioNotifyService]" DisplayName="[ServiceName_StudioNotifyService]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5006 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_StudioNotifyService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Studio.Notify.exe"/>
<ROW ServiceInstall="ServiceName_TelegramService" Name="[ServiceName_TelegramService]" DisplayName="[ServiceName_TelegramService]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:51702 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_TelegramService] [SUBFOLDER_SERVER]" Component_="ASC.TelegramService.exe"/>
<ROW ServiceInstall="ServiceName_UrlShortenerService" Name="[ServiceName_UrlShortenerService]" DisplayName="[ServiceName_UrlShortenerService]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Component_="UrlShortener.exe"/>
<ROW ServiceInstall="ServiceName_WebApi" Name="[ServiceName_WebApi]" DisplayName="[ServiceName_WebApi]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5000 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_WebApi] [SUBFOLDER_SERVER]" Component_="ASC.Web.Api.exe"/>
<ROW ServiceInstall="ServiceName_WebStudio" Name="[ServiceName_WebStudio]" DisplayName="[ServiceName_WebStudio]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5003 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_WebStudio] [SUBFOLDER_SERVER]" Component_="ASC.Web.Studio.exe"/>
<ROW ServiceInstall="ServiceName_WebhooksService" Name="[ServiceName_WebhooksService]" DisplayName="[ServiceName_WebhooksService]" ServiceType="16" StartType="2" ErrorControl="1" StartName="NT AUTHORITY\LocalService" Arguments="--urls=[APP_URLS]:5031 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Webhooks.Service.exe"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiThemeComponent">
<ATTRIBUTE name="UsedTheme" value="classic"/>
@ -930,19 +1286,15 @@
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.TxtUpdateComponent">
<ROW Name="ReplaceAppDir" TxtUpdateSet="xml" FindPattern="{APPDIR}" ReplacePattern="[APPDIR]" Options="2" Order="0" FileEncoding="-1"/>
<ROW Name="ReplaceAppDir" TxtUpdateSet="appsettings.test.json" FindPattern="{APPDIRCONF}" ReplacePattern="[APPDIR_FORWARD_SLASH]" Options="2" Order="0" FileEncoding="-1"/>
<ROW Name="ReplaceElasticHost" TxtUpdateSet="YourFile.txt" FindPattern=".Host.:.*" ReplacePattern="&quot;Host&quot;: &quot;localhost&quot;," Options="3" Order="0" FileEncoding="-1"/>
<ROW Name="ReplaceWinVol" TxtUpdateSet="xml" FindPattern="{WindowsVolume}" ReplacePattern="[WindowsVolume]" Options="2" Order="1" FileEncoding="-1"/>
<ROW Name="ReplaceAppDir" TxtUpdateSet="json" FindPattern="{APPDIRCONF}" ReplacePattern="[APPDIR_FORWARD_SLASH]" Options="2" Order="0" FileEncoding="-1"/>
<ROW Name="ReplaceAppDir" TxtUpdateSet="config.json" FindPattern="{APPDIRCONF}" ReplacePattern="[APPDIR_FORWARD_SLASH]" Options="2" Order="0" FileEncoding="-1"/>
<ROW Name="ReplaceAppDir" TxtUpdateSet="config.json_1" FindPattern="{APPDIRCONF}" ReplacePattern="[APPDIR_FORWARD_SLASH]" Options="2" Order="0" FileEncoding="-1"/>
<ROW Name="ReplaceInclude" TxtUpdateSet="YourFile.txt" FindPattern="/etc/nginx/includes" ReplacePattern="includes" Options="2" Order="0" FileEncoding="-1"/>
<ROW Name="ReplaceRoot" TxtUpdateSet="YourFile.txt_1" FindPattern="/var/www" ReplacePattern=".." Options="2" Order="0" FileEncoding="-1"/>
<ROW Name="ReplaceRoot" TxtUpdateSet="YourFile.txt_2" FindPattern="/var/www" ReplacePattern=".." Options="2" Order="0" FileEncoding="-1"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.TxtUpdateSetComponent">
<ROW Key="YourFile.txt" Component="AI_ExePath" FileName="elastic.json" Directory="config_Dir" Options="17"/>
<ROW Key="appsettings.test.json" Component="Socket.IO.exe" FileName="*.json" Directory="config_Dir" Options="17"/>
<ROW Key="config.json" Component="proxy.xml" FileName="config.json" Directory="config_2_Dir" Options="17"/>
<ROW Key="config.json_1" Component="proxy.xml" FileName="config.json" Directory="NewFolder_1_Dir" Options="17"/>
<ROW Key="json" Component="proxy.xml" FileName="config.json" Directory="config_1_Dir" Options="17"/>
<ROW Key="YourFile.txt" Component="conf" FileName="onlyoffice.conf" Directory="conf_Dir" Options="17"/>
<ROW Key="YourFile.txt_1" Component="conf" FileName="onlyoffice-client.conf" Directory="conf_Dir" Options="17"/>
<ROW Key="YourFile.txt_2" Component="includes" FileName="onlyoffice-public.conf" Directory="includes_Dir" Options="17"/>
<ROW Key="xml" Component="AI_ExePath" FileName="*.xml" Directory="tools_Dir" Options="17"/>
</COMPONENT>
</DOCUMENT>

View File

@ -4,14 +4,12 @@ echo #####################
echo # build backend #
echo #####################
set SRC_PATH=%~s2
pushd %~1
call dotnet build ASC.Web.sln
echo "== Build ASC.Thumbnails =="
pushd common\ASC.Thumbnails
call yarn install --frozen-lockfile
popd
call dotnet build ASC.Web.slnf
call dotnet build ASC.Migrations.sln -o %SRC_PATH%\services\ASC.Migration.Runner\service
echo "== Build ASC.UrlShortener =="
pushd common\ASC.UrlShortener

View File

@ -1,88 +1,61 @@
REM echo ######## Set variables ########
set "publisher="Ascensio System SIA""
set "zookeeper_version=3.7.1"
set "kafka_version=2.8.0"
set "nginx_version=1.21.1"
set "scala_version=2.12"
set "nuget="%cd%\thirdparty\SimpleRestServices\src\.nuget\NuGet.exe""
REM echo ######## Extracting and preparing files to build ########
%sevenzip% x build\install\win\nginx-%nginx_version%.zip -o"build\install\win\Files" -y
xcopy "build\install\win\Files\nginx-%nginx_version%" "build\install\win\Files\nginx" /s /y /b /i
rmdir build\install\win\Files\nginx-%nginx_version% /s /q
rmdir build\install\win\kafka-zookeeper /s /q
md build\install\win\kafka-zookeeper
md build\install\win\Files\nginx\temp
md build\install\win\Files\nginx\logs
%tar% -xvf build\install\win\apache-zookeeper-%zookeeper_version%-bin.tar.gz -C build\install\win\kafka-zookeeper
%tar% -xvf build\install\win\kafka_%scala_version%-%kafka_version%.tgz -C build\install\win\kafka-zookeeper
ren build\install\win\kafka-zookeeper\apache-zookeeper-%zookeeper_version%-bin zookeeper
ren build\install\win\kafka-zookeeper\kafka_%scala_version%-%kafka_version% kafka
md build\install\win\kafka-zookeeper\kafka\tools
md build\install\win\Files\tools
copy build\install\win\WinSW.NET4new.exe "build\install\win\kafka-zookeeper\kafka\tools\kafka.exe" /y
copy build\install\win\WinSW.NET4new.exe "build\install\win\kafka-zookeeper\kafka\tools\zookeeper.exe" /y
copy build\install\win\tools\zookeeper.xml "build\install\win\kafka-zookeeper\kafka\tools\zookeeper.xml" /y
copy build\install\win\tools\kafka.xml "build\install\win\kafka-zookeeper\kafka\tools\kafka.xml" /y
del /f /q build\install\win\apache-zookeeper-%zookeeper_version%-bin.*
del /f /q build\install\win\kafka_%scala_version%-%kafka_version%.*
copy build\install\win\WinSW.NET4.exe "build\install\win\Files\tools\proxy.exe" /y
copy build\install\win\tools\proxy.xml "build\install\win\Files\tools\proxy.xml" /y
md build\install\win\Files\Logs
md build\install\win\Files\service\
md build\install\win\Files\products\ASC.Files\server\temp
md build\install\win\Files\products\ASC.People\server\temp
md build\install\win\Files\services\ASC.Data.Backup\service\temp
md build\install\win\Files\services\ASC.Files.Service\service\temp
md build\install\win\Files\services\ASC.Notify\service\temp
md build\install\win\Files\services\ASC.Studio.Notify\service\temp
md build\install\win\Files\services\ASC.TelegramService\service\temp
md build\install\win\Files\services\ASC.Data.Backup.BackgroundTasks\service\temp
md build\install\win\Files\services\ASC.ClearEvents\service\temp
md build\install\win\Files\services\ASC.Migration\service\temp
md build\install\win\Files\services\ASC.Webhooks.Service\service\temp
md build\install\win\Files\services\ASC.Web.Api\service\temp
md build\install\win\Files\services\ASC.Web.Studio\service\temp
copy build\install\win\WinSW.NET4.exe "build\install\win\Files\tools\Proxy.exe" /y
copy build\install\win\tools\Proxy.xml "build\install\win\Files\tools\Proxy.xml" /y
copy build\install\win\WinSW3.0.0.exe "build\install\win\Files\tools\Socket.IO.exe" /y
copy build\install\win\tools\Socket.IO.xml "build\install\win\Files\tools\Socket.IO.xml" /y
copy build\install\win\WinSW3.0.0.exe "build\install\win\Files\tools\UrlShortener.exe" /y
copy build\install\win\tools\UrlShortener.xml "build\install\win\Files\tools\UrlShortener.xml" /y
copy build\install\win\WinSW3.0.0.exe "build\install\win\Files\tools\SsoAuth.exe" /y
copy build\install\win\tools\SsoAuth.xml "build\install\win\Files\tools\SsoAuth.xml" /y
copy build\install\win\WinSW3.0.0.exe "build\install\win\Files\tools\DocEditor.exe" /y
copy build\install\win\tools\DocEditor.xml "build\install\win\Files\tools\DocEditor.xml" /y
copy build\install\win\WinSW3.0.0.exe "build\install\win\Files\tools\Login.exe" /y
copy build\install\win\tools\Login.xml "build\install\win\Files\tools\Login.xml" /y
copy "build\install\win\nginx.conf" "build\install\win\Files\nginx\conf\nginx.conf" /y
copy "build\install\win\kafka-zookeeper\zookeeper\conf\zoo_sample.cfg" "build\install\win\kafka-zookeeper\zookeeper\conf\zoo.cfg" /y
del /f /q "build\install\win\kafka-zookeeper\zookeeper\conf\zoo_sample.cfg"
rmdir build\install\win\publish /s /q
del /f /q build\install\win\Files\nginx\conf\onlyoffice-login.conf
REM echo ######## Build Utils ########
%nuget% install %cd%\build\install\win\CustomActions\C#\Utils\packages.config -OutputDirectory %cd%\build\install\win\CustomActions\C#\Utils\packages
%msbuild% 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 ########
%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/\(zookeeper.connect\)=.*/\1=localhost:2181/g" build/install/win/kafka-zookeeper/kafka/config/server.properties
%sed% -i "s/\(clientPort\)=.*/\1=2181/g" build/install/win/kafka-zookeeper/kafka/config/zookeeper.properties
%sed% -i "s/\(dataDir\).*/\1=.\/..\/zookeeper\/Data/g" build/install/win/kafka-zookeeper/kafka/config/zookeeper.properties
%sed% -i "s/\(bootstrap.servers\)=.*/\1=localhost:9092/g" build/install/win/kafka-zookeeper/kafka/config/consumer.properties
%sed% -i "s/\(bootstrap.servers\)=.*/\1=localhost:9092/g" build/install/win/kafka-zookeeper/kafka/config/connect-standalone.properties
%sed% -i "s/\(offset.storage.file.filename\)=.*/\1=kafka-offsets/g" build/install/win/kafka-zookeeper/kafka/config/connect-standalone.properties
%sed% -i "s/\(logger.kafka.controller\)=.*,/\1=INFO,/g" build/install/win/kafka-zookeeper/kafka/config/log4j.properties
%sed% -i "s/\(logger.state.change.logger\)=.*,/\1=INFO,/g" build/install/win/kafka-zookeeper/kafka/config/log4j.properties
echo log4j.logger.kafka.producer.async.DefaultEventHandler=INFO, kafkaAppender >> build/install/win/kafka-zookeeper/kafka/config/log4j.properties
echo exit /b 1 >> build/install/win/kafka-zookeeper/kafka/bin/windows/zookeeper-server-start.bat
echo exit /b 1 >> build/install/win/kafka-zookeeper/kafka/bin/windows/kafka-server-start.bat
REM echo ######## Edit nginx conf files ########
%sed% -i "s!#rewrite!rewrite!g" build/install/win/Files/nginx/conf/onlyoffice.conf
%sed% -i "s!/etc/nginx/includes!includes!g" build/install/win/Files/nginx/conf/onlyoffice.conf
%sed% -i "s!/var/www!..!g" build/install/win/Files/nginx/conf/onlyoffice-*.conf
%sed% -i "s!/var/www!..!g" build/install/win/Files/nginx/conf/includes/onlyoffice-*.conf
REM echo ######## Edit json files ########
%sed% -i "s!\(\"machinekey\":\).\".*\"!\1 \"1123askdasjklasbnd\"!g" build/install/win/Files/config/appsettings*.json
%sed% -i "s!\(\"folder\":\).\".*\"!\1 \"{APPDIRCONF}products\"!g" build/install/win/Files/config/appsettings*.json
%sed% -i "s!\(\"path\":\).\".*\"!\1 \"{APPDIRCONF}services\/ASC.Socket.IO\/service\"!g" build/install/win/Files/config/socket*.json
%sed% -i "s!\(\"path\":\).\".*\"!\1 \"{APPDIRCONF}services\/ASC.Thumbnails\/service\"!g" build/install/win/Files/config/thumb*.json
%sed% -i "s!\(\"path\":\).\".*\"!\1 \"{APPDIRCONF}services\/ASC.UrlShortener\/service\/index.js\"!g" build/install/win/Files/config/urlshortener*.json
%sed% -i "s!\(\"path\":\).\".*\"!\1 \"{APPDIRCONF}services\/ASC.SsoAuth\/service\"!g" build/install/win/Files/config/ssoauth*.json
%sed% -i "s!\(\"path\":\).\".*\"!\1 \"{APPDIRCONF}services\/ASC.UrlShortener\/service\/index.js\"!g" build/install/win/Files/config/appsettings.services.json
%sed% -i "s!\(\"log\":\).\".*\"!\1 \"{APPDIRCONF}Logs\/urlshortener.log\"!g" build/install/win/Files/config/appsettings.services.json
REM echo ######## Delete temp files ########
del /f /q build\install\win\Files\config\sed*
del /f /q build\install\win\Files\nginx\conf\sed*
del /f /q build\install\win\Files\nginx\conf\includes\sed*
del /f /q build\install\win\kafka-zookeeper\zookeeper\conf\sed*
del /f /q build\install\win\kafka-zookeeper\kafka\config\sed*
del /f /q build\install\win\Files\services\*\service\config\sed*
del /f /q build\install\win\*.back.*
REM echo ######## Build kafka/zookeeper ########
%AdvancedInstaller% /rebuild "build\install\win\Apache ZooKeeper.aip"
copy "build\install\win\publish\Apache ZooKeeper.msi" "build\install\win\Apache ZooKeeper.msi" /y
%AdvancedInstaller% /rebuild "build\install\win\Apache Kafka.aip"
copy "build\install\win\publish\Apache Kafka.msi" "build\install\win\Apache Kafka.msi" /y
REM echo ######## Build MySQL Server Installer ########
iscc /Qp /S"byparam="signtool" sign /a /n "%publisher%" /t http://timestamp.digicert.com $f" "build\install\win\MySQL Server Installer Runner.iss"

View File

@ -29,9 +29,6 @@ function DownloadComponents {
}
}
$zookeeper_version = '3.7.1'
$kafka_version = '2.8.0'
$scala_version = '2.12'
$nginx_version = '1.21.1'
$path_prereq = "${pwd}\build\install\win\"
@ -43,17 +40,6 @@ $prerequisites = @(
link = "https://nginx.org/download/nginx-${nginx_version}.zip";
}
@{
download_allways = $false;
name = "apache-zookeeper-${zookeeper_version}-bin.tar.gz";
link = "https://dlcdn.apache.org/zookeeper/zookeeper-${zookeeper_version}/apache-zookeeper-${zookeeper_version}-bin.tar.gz";
}
@{
download_allways = $false;
name = "kafka_${scala_version}-${kafka_version}.tgz";
link = "https://archive.apache.org/dist/kafka/${kafka_version}/kafka_${scala_version}-${kafka_version}.tgz";
}
@{
download_allways = $false;
name = "WinSW.NET4new.exe";
@ -61,4 +47,16 @@ $prerequisites = @(
}
)
$path_nuget_packages = "${pwd}\.nuget\packages\"
$nuget_packages = @(
@{
download_allways = $false;
name = "rabbitmq.client.3.6.5.nupkg";
link = "https://www.nuget.org/api/v2/package/RabbitMQ.Client/3.6.5";
}
)
DownloadComponents $prerequisites $path_prereq
DownloadComponents $nuget_packages $path_nuget_packages

View File

@ -4,9 +4,12 @@ echo ######################
echo # build frontend #
echo ######################
pushd %~1
set DEBUG_INFO=%~2
pushd %~s1
call yarn install
if "%DEBUG_INFO%"=="true" yarn debug-info
call yarn build
call yarn deploy

View File

@ -17,10 +17,6 @@ if defined SecondArg (
)
xcopy "%PathToRepository%\build\deploy\public" "%PathToAppFolder%\public" /s /y /b /i
xcopy "%PathToRepository%\build\deploy\studio\client" "%PathToAppFolder%\studio\client" /s /y /b /i
xcopy "%PathToRepository%\build\deploy\studio\login" "%PathToAppFolder%\studio\login" /s /y /b /i
xcopy "%PathToRepository%\build\deploy\products\ASC.Files\client" "%PathToAppFolder%\products\ASC.Files\client" /s /y /b /i
xcopy "%PathToRepository%\build\deploy\products\ASC.Files\editor" "%PathToAppFolder%\products\ASC.Files\editor" /s /y /b /i
xcopy "%PathToRepository%\build\deploy\products\ASC.People\client" "%PathToAppFolder%\products\ASC.People\client" /s /y /b /i
xcopy "%PathToRepository%\build\deploy\client" "%PathToAppFolder%\client" /s /y /b /i
xcopy "%PathToRepository%\config\nginx" "%PathToAppFolder%\nginx\conf" /s /y /b /i
xcopy "%PathToRepository%\config\*" "%PathToAppFolder%\config" /y /b /i

View File

@ -32,54 +32,7 @@ http {
keepalive_timeout 65;
#gzip on;
server {
set $public_root ../public;
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
include onlyoffice.conf;
include onlyoffice-*.conf;
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}

View File

@ -16,34 +16,24 @@ if defined SecondArg (
set PathToAppFolder=%FirstArg%\publish
)
rem publish in directory 'products'
REM dotnet publish "%PathToRepository%\products\ASC.Calendar\server\ASC.Calendar.csproj" -c Release --self-contained false -o "%PathToAppFolder%\products\ASC.Calendar\server"
REM dotnet publish "%PathToRepository%\products\ASC.CRM\server\ASC.CRM.csproj" -c Release --self-contained false -o "%PathToAppFolder%\products\ASC.CRM\server"
rem backend services (dotnet) in directory 'products'
dotnet publish "%PathToRepository%\products\ASC.Files\server\ASC.Files.csproj" -c Release --self-contained false -o "%PathToAppFolder%\products\ASC.Files\server"
REM dotnet publish "%PathToRepository%\products\ASC.Mail\server\ASC.Mail.csproj" -c Release --self-contained false -o "%PathToAppFolder%\products\ASC.Mail\server"
dotnet publish "%PathToRepository%\products\ASC.People\server\ASC.People.csproj" -c Release --self-contained false -o "%PathToAppFolder%\products\ASC.People\server"
REM dotnet publish "%PathToRepository%\products\ASC.Projects\server\ASC.Projects.csproj" -c Release --self-contained false -o "%PathToAppFolder%\products\ASC.Projects\server"
rem publish in directory 'services'
dotnet publish "%PathToRepository%\common\services\ASC.ApiSystem\ASC.ApiSystem.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.ApiSystem\service"
rem backend services (dotnet) in directory 'services'
dotnet publish "%PathToRepository%\common\services\ASC.Data.Backup\ASC.Data.Backup.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Data.Backup\service"
dotnet publish "%PathToRepository%\common\services\ASC.Data.Storage.Encryption\ASC.Data.Storage.Encryption.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Data.Storage.Encryption\service"
dotnet publish "%PathToRepository%\products\ASC.Files\service\ASC.Files.Service.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Files.Service\service"
dotnet publish "%PathToRepository%\common\services\ASC.Data.Storage.Migration\ASC.Data.Storage.Migration.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Data.Storage.Migration\service"
dotnet publish "%PathToRepository%\common\services\ASC.Notify\ASC.Notify.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Notify\service"
dotnet publish "%PathToRepository%\common\services\ASC.Socket.IO.Svc\ASC.Socket.IO.Svc.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Socket.IO.Svc\service"
dotnet publish "%PathToRepository%\common\services\ASC.Studio.Notify\ASC.Studio.Notify.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Studio.Notify\service"
dotnet publish "%PathToRepository%\common\services\ASC.TelegramService\ASC.TelegramService.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.TelegramService\service"
dotnet publish "%PathToRepository%\common\services\ASC.Thumbnails.Svc\ASC.Thumbnails.Svc.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Thumbnails.Svc\service"
dotnet publish "%PathToRepository%\common\services\ASC.UrlShortener.Svc\ASC.UrlShortener.Svc.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.UrlShortener.Svc\service"
dotnet publish "%PathToRepository%\common\services\ASC.Data.Backup.BackgroundTasks\ASC.Data.Backup.BackgroundTasks.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Data.Backup.BackgroundTasks\service"
dotnet publish "%PathToRepository%\common\services\ASC.ClearEvents\ASC.ClearEvents.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.ClearEvents\service"
dotnet publish "%PathToRepository%\common\ASC.Migration\ASC.Migration.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Migration\service"
dotnet publish "%PathToRepository%\common\services\ASC.Webhooks.Service\ASC.Webhooks.Service.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Webhooks.Service\service"
dotnet publish "%PathToRepository%\web\ASC.Web.Api\ASC.Web.Api.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Web.Api\service"
dotnet publish "%PathToRepository%\web\ASC.Web.Studio\ASC.Web.Studio.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.Web.Studio\service"
dotnet publish "%PathToRepository%\common\services\ASC.SsoAuth.Svc\ASC.SsoAuth.Svc.csproj" -c Release --self-contained false -o "%PathToAppFolder%\services\ASC.SsoAuth.Svc\service"
rem Publish backend services (Nodejs)
mkdir "%PathToAppFolder%\services\ASC.Thumbnails\service"
xcopy "%PathToRepository%\common\ASC.Thumbnails" "%PathToAppFolder%\services\ASC.Thumbnails\service" /s /y /b /i
rem backend services (Nodejs) in directory 'services'
mkdir "%PathToAppFolder%\services\ASC.UrlShortener\service"
xcopy "%PathToRepository%\common\ASC.UrlShortener" "%PathToAppFolder%\services\ASC.UrlShortener\service" /s /y /b /i
@ -52,3 +42,10 @@ xcopy "%PathToRepository%\common\ASC.Socket.IO" "%PathToAppFolder%\services\ASC.
mkdir "%PathToAppFolder%\services\ASC.SsoAuth\service"
xcopy "%PathToRepository%\common\ASC.SsoAuth" "%PathToAppFolder%\services\ASC.SsoAuth\service" /s /y /b /i
rem backend services (Nodejs) in directory 'products'
mkdir "%PathToAppFolder%\products\ASC.Login\login"
xcopy "%PathToRepository%\build\deploy\login" "%PathToAppFolder%\products\ASC.Login\login" /s /y /b /i
mkdir "%PathToAppFolder%\products\ASC.Files\editor"
xcopy "%PathToRepository%\build\deploy\editor" "%PathToAppFolder%\products\ASC.Files\editor" /s /y /b /i

View File

@ -0,0 +1,14 @@
<service>
<id>ASC.DocEditor</id>
<name>ASC.DocEditor</name>
<description>This service runs ASC.DocEditor</description>
<priority>RealTime</priority>
<startmode>Automatic</startmode>
<onfailure action="restart" delay="10 sec"/>
<executable>node</executable>
<arguments>&quot;{APPDIR}products\ASC.Files\editor\server.js&quot;</arguments>
<log mode="roll-by-size">
<sizeThreshold>10240</sizeThreshold>
<keepFiles>8</keepFiles>
</log>
</service>

View File

@ -0,0 +1,14 @@
<service>
<id>ASC.Login</id>
<name>ASC.Login</name>
<description>This service runs ASC.Login</description>
<priority>RealTime</priority>
<startmode>Automatic</startmode>
<onfailure action="restart" delay="10 sec"/>
<executable>node</executable>
<arguments>&quot;{APPDIR}products\ASC.Login\login\server.js&quot;</arguments>
<log mode="roll-by-size">
<sizeThreshold>10240</sizeThreshold>
<keepFiles>8</keepFiles>
</log>
</service>

View File

@ -0,0 +1,14 @@
<service>
<id>ASC.Socket.IO</id>
<name>ASC.Socket.IO</name>
<description>This service runs ASC.Socket.IO</description>
<priority>RealTime</priority>
<startmode>Automatic</startmode>
<onfailure action="restart" delay="10 sec"/>
<executable>node</executable>
<arguments>&quot;{APPDIR}services\ASC.Socket.IO\service\server.js&quot;</arguments>
<log mode="roll-by-size">
<sizeThreshold>10240</sizeThreshold>
<keepFiles>8</keepFiles>
</log>
</service>

View File

@ -0,0 +1,14 @@
<service>
<id>ASC.SsoAuth</id>
<name>ASC.SsoAuth</name>
<description>This service runs ASC.SsoAuth</description>
<priority>RealTime</priority>
<startmode>Automatic</startmode>
<onfailure action="restart" delay="10 sec"/>
<executable>node</executable>
<arguments>&quot;{APPDIR}services\ASC.SsoAuth\service\app.js&quot;</arguments>
<log mode="roll-by-size">
<sizeThreshold>10240</sizeThreshold>
<keepFiles>8</keepFiles>
</log>
</service>

View File

@ -0,0 +1,14 @@
<service>
<id>ASC.UrlShortener</id>
<name>ASC.UrlShortener</name>
<description>This service runs ASC.UrlShortener</description>
<priority>RealTime</priority>
<startmode>Automatic</startmode>
<onfailure action="restart" delay="10 sec"/>
<executable>node</executable>
<arguments>&quot;{APPDIR}services\ASC.UrlShortener\service\index.js&quot;</arguments>
<log mode="roll-by-size">
<sizeThreshold>10240</sizeThreshold>
<keepFiles>8</keepFiles>
</log>
</service>

View File

@ -1,15 +0,0 @@
<service>
<id>kafka</id>
<name>kafka</name>
<description>This service runs kafka</description>
<priority>RealTime</priority>
<startmode>Automatic</startmode>
<onfailure action="restart" delay="1 sec"/>
<executable>{WindowsVolume}Apache\kafka\bin\windows\kafka-server-start.bat</executable>
<arguments>{WindowsVolume}Apache\kafka\config\server.properties</arguments>
<workingdirectory>{WindowsVolume}Apache\kafka</workingdirectory>
<log mode="roll-by-size">
<sizeThreshold>10240</sizeThreshold>
<keepFiles>8</keepFiles>
</log>
</service>

View File

@ -1,15 +0,0 @@
<service>
<id>zookeeper</id>
<name>zookeeper</name>
<description>This service runs zookeeper</description>
<priority>RealTime</priority>
<startmode>Automatic</startmode>
<onfailure action="restart" delay="1 sec"/>
<executable>{WindowsVolume}Apache\kafka\bin\windows\zookeeper-server-start.bat</executable>
<arguments>{WindowsVolume}Apache\kafka\config\zookeeper.properties</arguments>
<workingdirectory>{WindowsVolume}Apache\kafka</workingdirectory>
<log mode="roll-by-size">
<sizeThreshold>10240</sizeThreshold>
<keepFiles>8</keepFiles>
</log>
</service>

View File

@ -72,6 +72,9 @@ const EmptyFolderWrapper = styled.div`
line-height: unset;
${NoUserSelect}
}
.empty-folder_container_up-image {
${NoUserSelect}
}
.empty-folder_container-icon {
height: 20px;

View File

@ -93,9 +93,11 @@ export default inject(({ filesStore, selectedFolderStore }) => {
let isRootRoom, isRoom, id;
if (navigationPath && navigationPath.length) {
isRootRoom = navigationPath[navigationPath.length - 1].isRootRoom;
isRoom = navigationPath[navigationPath.length - 1].isRoom;
id = navigationPath[navigationPath.length - 1].id;
const elem = navigationPath[0];
isRootRoom = elem.isRootRoom;
isRoom = elem.isRoom;
id = elem.id;
}
return {

View File

@ -69,6 +69,8 @@ const RootFolderContainer = (props) => {
t("PrivateRoomDescriptionUnbreakable"),
];
const roomHeader = "Welcome to DocSpace";
const [showLoader, setShowLoader] = React.useState(false);
React.useEffect(() => {
@ -164,7 +166,7 @@ const RootFolderContainer = (props) => {
};
case FolderType.Rooms:
return {
headerText: "Welcome to DocSpace!",
headerText: roomHeader,
descriptionText: roomsDescription,
imageSrc: "images/empty_screen_corporate.png",
buttons: roomsButtons,
@ -277,7 +279,7 @@ const RootFolderContainer = (props) => {
alt="plus_icon"
/>
<Link onClick={onCreateRoom} {...linkStyles}>
Create room
{t("CreateEditRoomDialog:CreateRoom")}
</Link>
</div>
);
@ -391,4 +393,8 @@ export default inject(
setIsEmptyPage,
};
}
)(withTranslation("Files")(observer(RootFolderContainer)));
)(
withTranslation(["Files", "CreateEditRoomDialog"])(
observer(RootFolderContainer)
)
);

View File

@ -101,7 +101,7 @@ const Panels = (props) => {
onSelectFile={createMasterForm}
isPanelVisible={selectFileDialogVisible}
onClose={onClose}
foldersType="exceptPrivacyTrashFolders"
filteredType="exceptPrivacyTrashArchiveFolders"
ByExtension
searchParam={".docx"}
dialogName={t("Translations:CreateMasterFormFromFile")}

View File

@ -2,21 +2,12 @@ import React from "react";
import TreeMenu from "@docspace/components/tree-menu";
import TreeNode from "@docspace/components/tree-menu/sub-components/tree-node";
import styled from "styled-components";
import {
ConflictResolveType,
FolderType,
ShareAccessRights,
} from "@docspace/common/constants";
import toastr from "@docspace/components/toast/toastr";
import { FolderType, ShareAccessRights } from "@docspace/common/constants";
import { onConvertFiles } from "../../helpers/files-converter";
import { ReactSVG } from "react-svg";
import ExpanderDownIcon from "PUBLIC_DIR/images/expander-down.react.svg";
import ExpanderRightIcon from "PUBLIC_DIR/images/expander-right.react.svg";
import commonIconsStyles from "@docspace/components/utils/common-icons-style";
import withLoader from "../../HOCs/withLoader";
import Loaders from "@docspace/common/components/Loaders";
import { observer, inject } from "mobx-react";
import { runInAction } from "mobx";
import { withTranslation } from "react-i18next";
@ -83,7 +74,7 @@ class TreeFolders extends React.Component {
constructor(props) {
super(props);
this.state = { isExpand: false };
this.state = { isExpand: false, isLoading: false };
this.selectionFoldersId = [];
}
@ -107,7 +98,7 @@ class TreeFolders extends React.Component {
};
getFolderIcon = (item) => {
let iconUrl = "images/catalog.folder.react.svg";
let iconUrl = "/static/images/catalog.folder.react.svg";
switch (item.rootFolderType) {
case FolderType.USER:
@ -181,14 +172,7 @@ class TreeFolders extends React.Component {
};
showDragItems = (item) => {
const {
isAdmin,
myId,
commonId,
//rootFolderType,
currentId,
draggableItems,
} = this.props;
const { isAdmin, myId, commonId, currentId, draggableItems } = this.props;
if (item.id === currentId) {
return false;
}
@ -196,10 +180,6 @@ class TreeFolders extends React.Component {
if (!draggableItems || draggableItems.find((x) => x.id === item.id))
return false;
// const isMy = rootFolderType === FolderType.USER;
// const isCommon = rootFolderType === FolderType.COMMON;
// const isShare = rootFolderType === FolderType.SHARE;
if (
item.rootFolderType === FolderType.SHARE &&
item.access === ShareAccessRights.FullAccess
@ -208,7 +188,6 @@ class TreeFolders extends React.Component {
}
if (isAdmin) {
//if (isMy || isCommon || isShare) {
if (
(item.pathParts &&
(item.pathParts[0] === myId || item.pathParts[0] === commonId)) ||
@ -217,24 +196,19 @@ class TreeFolders extends React.Component {
) {
return true;
}
//}
} else {
//if (isMy || isCommon || isShare) {
if (
(item.pathParts && item.pathParts[0] === myId) ||
item.rootFolderType === FolderType.USER
) {
return true;
}
//}
}
return false;
};
getItems = (data) => {
const { theme } = this.props;
return data.map((item) => {
const dragging = this.props.dragging ? this.showDragItems(item) : false;
const showBadge = false;
@ -245,9 +219,18 @@ class TreeFolders extends React.Component {
disableNodeValue = "";
if (dragging) value = `${item.id} dragging ${provider}`;
const { roomsFolderId, expandedPanelKeys } = this.props;
let isDisabledNode = false;
if (item.id == roomsFolderId) {
isDisabledNode = expandedPanelKeys?.includes(roomsFolderId + "");
}
if (this.selectionFoldersId && this.selectionFoldersId.includes(item.id))
disableNodeValue = "disable-node";
if (isDisabledNode) disableNodeValue += " disable-folder ";
if ((item.folders && item.folders.length > 0) || serviceFolder) {
return (
<TreeNode
@ -397,11 +380,14 @@ class TreeFolders extends React.Component {
};
onLoadData = (treeNode, isExpand) => {
const { data: incomingDate, certainFolders } = this.props;
const { data: incomingDate, certainFolders, roomsFolderId } = this.props;
isExpand && this.setState({ isExpand: true });
this.props.setIsLoading && this.props.setIsLoading(true);
//console.log("load data...", treeNode);
this.setState({
isLoading: true,
});
if (this.state.isExpand && !isExpand) {
return Promise.resolve();
}
@ -418,25 +404,47 @@ class TreeFolders extends React.Component {
this.getNewTreeData(treeData, listIds, data.folders, data.level);
!certainFolders && this.props.setTreeFolders(treeData);
if (data.listIds[0] == roomsFolderId && this.props.onSelect) {
const roomsIndex = treeData.findIndex((f) => f.id == roomsFolderId);
const firstRoomsNodeId = treeData[roomsIndex]?.folders[0]?.id;
this.props.onSelect([firstRoomsNodeId], treeNode);
}
})
.catch((err) => console.log("err", err))
.finally(() => {
this.setState({ isExpand: false });
this.props.setIsLoading && this.props.setIsLoading(false);
this.setState({ isExpand: false, isLoading: false });
});
};
onExpand = (expandedKeys, treeNode) => {
onExpand = (expandedKeys, treeNode, isRoom = false) => {
this.expand = true;
if (treeNode.node && !treeNode.node.children) {
if (treeNode.expanded) {
this.onLoadData(treeNode.node, true);
}
} else if (isRoom) {
this.props.onSelect([treeNode.node.children[0].id], treeNode);
}
this.props.setExpandedPanelKeys(expandedKeys);
};
onSelect = (folder, treeNode) => {
const { onSelect, expandedPanelKeys, roomsFolderId } = this.props;
const newExpandedPanelKeys = JSON.parse(JSON.stringify(expandedPanelKeys));
newExpandedPanelKeys.push(folder[0]);
if (folder[0] == roomsFolderId) {
this.onExpand(newExpandedPanelKeys, treeNode, true);
return;
}
onSelect && onSelect(folder, treeNode);
};
onDragOver = (data) => {
const parentElement = data.event.target.parentElement;
const existElement = parentElement.classList.contains(
@ -486,22 +494,21 @@ class TreeFolders extends React.Component {
firstLoadScroll();
}
};
render() {
const {
selectedKeys,
isLoading,
onSelect,
dragging,
expandedPanelKeys,
treeFolders,
data,
disabled,
theme,
isPanel,
isLoadingNodes,
} = this.props;
const { isLoading } = this.state;
return (
<StyledTreeMenu
isPanel={isPanel}
@ -512,7 +519,7 @@ class TreeFolders extends React.Component {
multiple={false}
showIcon
switcherIcon={this.switcherIcon}
onSelect={onSelect}
onSelect={this.onSelect}
selectedKeys={selectedKeys}
loadData={this.onLoadData}
expandedKeys={expandedPanelKeys}
@ -542,54 +549,42 @@ export default inject(
{ auth, filesStore, treeFoldersStore, selectedFolderStore },
{ useDefaultSelectedKeys, selectedKeys }
) => {
const {
selection,
setIsLoading,
isLoading,
dragging,
setDragging,
} = filesStore;
const { selection, dragging, setDragging } = filesStore;
const {
treeFolders,
setTreeFolders,
myFolderId,
commonFolderId,
isPrivacyFolder,
setExpandedPanelKeys,
getSubfolders,
setIsLoadingNodes,
isLoadingNodes,
roomsFolderId,
} = treeFoldersStore;
const {
id,
parentId: selectedNodeParentId /* rootFolderType */,
} = selectedFolderStore;
const { id, parentId: selectedNodeParentId } = selectedFolderStore;
return {
isAdmin: auth.isAdmin,
isDesktop: auth.settingsStore.isDesktopClient,
dragging,
//rootFolderType,
currentId: id,
myId: myFolderId,
commonId: commonFolderId,
isPrivacy: isPrivacyFolder,
draggableItems: dragging ? selection : null,
treeFolders,
isLoading,
selectedKeys: useDefaultSelectedKeys
? treeFoldersStore.selectedKeys
: selectedKeys,
setDragging,
setIsLoading,
setTreeFolders,
setExpandedPanelKeys,
getSubfolders,
setIsLoadingNodes,
isLoadingNodes,
selectedNodeParentId,
roomsFolderId,
};
}
)(withTranslation(["Files", "Common"])(observer(TreeFolders)));

View File

@ -46,8 +46,10 @@ const CreateEvent = ({
replaceFileStream,
setEncryptionAccess,
setEventDialogVisible,
eventDialogVisible,
}) => {
const [visible, setVisible] = React.useState(false);
const [headerTitle, setHeaderTitle] = React.useState(null);
const [startValue, setStartValue] = React.useState("");
@ -65,7 +67,7 @@ const CreateEvent = ({
}
setHeaderTitle(defaultName);
setVisible(true);
setEventDialogVisible(true);
}, [extension, title, fromTemplate]);
const onSave = (e, value, open = true) => {
@ -132,7 +134,7 @@ const CreateEvent = ({
toastr.error(t("Translations:FileProtected"), t("Common:Warning"));
setVisible(false);
setEventDialogVisible(false);
setFormCreationInfo({
newTitle: `${newValue}.${extension}`,
@ -233,7 +235,7 @@ const CreateEvent = ({
return (
<Dialog
t={t}
visible={visible}
visible={eventDialogVisible}
title={headerTitle}
startValue={startValue}
onSave={onSave}
@ -280,11 +282,14 @@ export default inject(
const {
setConvertPasswordDialogVisible,
setEventDialogVisible,
setFormCreationInfo,
eventDialogVisible,
} = dialogsStore;
return {
setEventDialogVisible,
eventDialogVisible,
setIsLoading,
createFile,
createFolder,

View File

@ -21,9 +21,10 @@ const RenameEvent = ({
editCompleteAction,
clearActiveOperations,
}) => {
const [visible, setVisible] = React.useState(false);
setEventDialogVisible,
eventDialogVisible,
}) => {
const [startValue, setStartValue] = React.useState("");
const { t } = useTranslation(["Files"]);
@ -31,7 +32,7 @@ const RenameEvent = ({
React.useEffect(() => {
setStartValue(getTitleWithoutExst(item, false));
setVisible(true);
setEventDialogVisible(true);
}, [item]);
const onUpdate = React.useCallback((e, value) => {
@ -47,6 +48,8 @@ const RenameEvent = ({
if (isSameTitle) {
setStartValue(originalTitle);
setIsLoading(false);
onClose();
return editCompleteAction(item, type);
} else {
@ -112,7 +115,7 @@ const RenameEvent = ({
return (
<Dialog
t={t}
visible={visible}
visible={eventDialogVisible}
title={t("Home: Rename")}
startValue={startValue}
onSave={onUpdate}
@ -122,21 +125,31 @@ const RenameEvent = ({
);
};
export default inject(({ filesStore, filesActionsStore, uploadDataStore }) => {
const { setIsLoading, addActiveItems, updateFile, renameFolder } = filesStore;
export default inject(
({ filesStore, filesActionsStore, uploadDataStore, dialogsStore }) => {
const {
setIsLoading,
addActiveItems,
updateFile,
renameFolder,
} = filesStore;
const { editCompleteAction } = filesActionsStore;
const { editCompleteAction } = filesActionsStore;
const { clearActiveOperations } = uploadDataStore;
const { clearActiveOperations } = uploadDataStore;
const { setEventDialogVisible, eventDialogVisible } = dialogsStore;
return {
setIsLoading,
addActiveItems,
updateFile,
renameFolder,
return {
setIsLoading,
addActiveItems,
updateFile,
renameFolder,
editCompleteAction,
editCompleteAction,
clearActiveOperations,
};
})(observer(RenameEvent));
clearActiveOperations,
setEventDialogVisible,
eventDialogVisible,
};
}
)(observer(RenameEvent));

View File

@ -1,4 +1,4 @@
import React from "react";
import React, { useEffect, useCallback, useState } from "react";
import { inject, observer } from "mobx-react";
import toastr from "@docspace/components/toast/toastr";
@ -6,6 +6,7 @@ import ModalDialog from "@docspace/components/modal-dialog";
import TextInput from "@docspace/components/text-input";
import Button from "@docspace/components/button";
import ComboBox from "@docspace/components/combobox";
import { isSafari, isTablet } from "react-device-detect";
const Dialog = ({
t,
@ -20,14 +21,29 @@ const Dialog = ({
onCancel,
onClose,
}) => {
const [value, setValue] = React.useState("");
const [isDisabled, setIsDisabled] = React.useState(false);
const [value, setValue] = useState("");
const [isDisabled, setIsDisabled] = useState(false);
React.useEffect(() => {
useEffect(() => {
if (startValue) setValue(startValue);
}, [startValue]);
const onChange = React.useCallback((e) => {
const onKeyUpHandler = useCallback(
(e) => {
if (e.keyCode === 27) onCancelAction(e);
if (e.keyCode === 13) onSaveAction(e);
},
[value]
);
useEffect(() => {
document.addEventListener("keyup", onKeyUpHandler, false);
return () => {
document.removeEventListener("keyup", onKeyUpHandler, false);
};
}, [onKeyUpHandler]);
const onChange = useCallback((e) => {
let newValue = e.target.value;
if (newValue.match(folderFormValidation)) {
@ -39,28 +55,39 @@ const Dialog = ({
setValue(newValue);
}, []);
const onFocus = React.useCallback((e) => {
const onFocus = useCallback((e) => {
e.target.select();
}, []);
const onSaveAction = React.useCallback(
const returnWindowPositionAfterKeyboard = () => {
isSafari && isTablet && window.scrollTo(0, 0);
};
const onSaveAction = useCallback(
(e) => {
returnWindowPositionAfterKeyboard();
setIsDisabled(true);
onSave && onSave(e, value);
},
[onSave, value]
);
const onCancelAction = React.useCallback((e) => {
const onCancelAction = useCallback((e) => {
returnWindowPositionAfterKeyboard();
onCancel && onCancel(e);
}, []);
const onCloseAction = useCallback((e) => {
returnWindowPositionAfterKeyboard();
onClose && onClose(e);
}, []);
return (
<ModalDialog
visible={visible}
displayType={"modal"}
scale={true}
onClose={onClose}
onClose={onCloseAction}
>
<ModalDialog.Header>{title}</ModalDialog.Header>
<ModalDialog.Body>

View File

@ -2,7 +2,7 @@ import React from "react";
import PropTypes from "prop-types";
import styled from "styled-components";
import Scrollbar from "@docspace/components/scrollbar";
import { isMobileOnly, isDesktop } from "react-device-detect";
import { isMobileOnly, isMobile } from "react-device-detect";
import { Base } from "@docspace/components/themes";
const StyledNav = styled.nav`
@ -29,7 +29,7 @@ const StyledNav = styled.nav`
${(props) =>
props.numberOfModules &&
`@media (max-height: ${props.numberOfModules * 52 + 80}px) {
position: ${isDesktop && "relative"};
position: ${!isMobile && "relative"};
margin-top: 16px;
}`}

View File

@ -8,7 +8,7 @@ import { withTranslation } from "react-i18next";
import ModalDialogContainer from "../ModalDialogContainer";
import toastr from "@docspace/components/toast/toastr";
import Link from "@docspace/components/link";
import { isDesktop } from "react-device-detect";
import { isMobile } from "react-device-detect";
const StyledModal = styled(ModalDialogContainer)`
.backup-codes-counter {
@ -118,7 +118,7 @@ class BackupCodesDialogComponent extends React.Component {
size="normal"
onClick={this.props.onClose}
/>
{isDesktop && (
{!isMobile && (
<div className="backup-codes-print-link-wrapper">
<Link
type="action"

View File

@ -153,7 +153,7 @@ const OperationsPanelComponent = (props) => {
<SelectFolderDialog
selectionFiles={selection}
isDisableTree={isLoading}
foldersType="exceptSortedByTags"
filteredType="exceptSortedByTags"
isPanelVisible={isVisible}
onSubmit={onSubmit}
onClose={onClose}

View File

@ -26,7 +26,7 @@ const SelectFileDialogAsideView = ({
resultingFolderTree,
footer,
fileId,
foldersType,
filteredType,
onCloseSelectFolderDialog,
onClickInput,
isFolderPanelVisible,
@ -59,7 +59,7 @@ const SelectFileDialogAsideView = ({
onClose={onCloseSelectFolderDialog}
onSelectFolder={onSelectFolder}
isPanelVisible={isFolderPanelVisible}
foldersType={foldersType}
filteredType={filteredType}
withoutProvider={withoutProvider}
id={folderId}
onSelectFile={onSelectFile}
@ -70,7 +70,7 @@ const SelectFileDialogAsideView = ({
files={files}
folderTree={resultingFolderTree}
isFolderTreeLoading={!!!resultingFolderTree}
isNeedArrowIcon
withFileSelectDialog
maxInputWidth={maxInputWidth ? maxInputWidth : "446px"}
/>

View File

@ -1,280 +0,0 @@
import React from "react";
import { StyledAsidePanel, StyledSelectFilePanel } from "../StyledPanels";
import ModalDialog from "@docspace/components/modal-dialog";
import SelectFolderDialog from "../SelectFolderDialog";
import FolderTreeBody from "../../FolderTreeBody";
import FilesListBody from "./FilesListBody";
import Button from "@docspace/components/button";
import Text from "@docspace/components/text";
import { isArrayEqual } from "@docspace/components/utils/array";
import { getFoldersTree } from "@docspace/common/api/files";
import {
exceptSortedByTagsFolders,
exceptPrivacyTrashFolders,
} from "../SelectFolderDialog/ExceptionFoldersConstants";
class SelectFileDialogModalView extends React.Component {
constructor(props) {
super(props);
this.state = {
isLoading: true,
isAvailable: true,
};
this.folderList = "";
this.noTreeSwitcher = false;
}
componentDidMount() {
const { onSetLoadingData } = this.props;
this.setState({ isLoadingData: true }, function () {
onSetLoadingData && onSetLoadingData(true);
this.trySwitch();
});
}
trySwitch = async () => {
const {
foldersType,
onSelectFolder,
selectedFolder,
passedId,
foldersList,
} = this.props;
switch (foldersType) {
case "exceptSortedByTags":
try {
const foldersTree = await getFoldersTree();
[
this.folderList,
this.noTreeSwitcher,
] = SelectFolderDialog.convertFolders(
foldersTree,
exceptSortedByTagsFolders
);
this.onSetSelectedFolder();
} catch (err) {
console.error(err);
}
this.loadersCompletes();
break;
case "exceptPrivacyTrashFolders":
try {
const foldersTree = await getFoldersTree();
[
this.folderList,
this.noTreeSwitcher,
] = SelectFolderDialog.convertFolders(
foldersTree,
exceptPrivacyTrashFolders
);
this.onSetSelectedFolder();
} catch (err) {
console.error(err);
}
this.loadersCompletes();
break;
case "common":
try {
this.folderList = await SelectFolderDialog.getCommonFolders();
!selectedFolder &&
onSelectFolder &&
onSelectFolder(
`${
selectedFolder
? selectedFolder
: passedId
? passedId
: this.folderList[0].id
}`
);
} catch (err) {
console.error(err);
}
this.loadersCompletes();
break;
case "third-party":
try {
this.folderList = foldersList
? foldersList
: await SelectFolderDialog.getCommonThirdPartyList();
this.folderList.length !== 0
? this.onSetSelectedFolder()
: this.setState({ isAvailable: false });
} catch (err) {
console.error(err);
}
this.loadersCompletes();
break;
}
};
loadersCompletes = () => {
const { onSetLoadingData } = this.props;
onSetLoadingData && onSetLoadingData(false);
this.setState({
isLoading: false,
});
};
onSetSelectedFolder = () => {
const { onSelectFolder, selectedFolder, passedId } = this.props;
onSelectFolder &&
onSelectFolder(
`${
selectedFolder
? selectedFolder
: passedId
? passedId
: this.folderList[0].id
}`
);
};
onSelect = (folder) => {
const { onSelectFolder, selectedFolder } = this.props;
if (isArrayEqual([folder[0]], [selectedFolder])) {
return;
}
onSelectFolder && onSelectFolder(folder[0]);
};
onMouseEvent = (event) => {
event.stopPropagation();
};
render() {
const {
t,
isPanelVisible,
onClose,
zIndex,
withoutProvider,
expandedKeys,
filter,
onSelectFile,
filesList,
hasNextPage,
isNextPageLoading,
loadNextPage,
selectedFolder,
titleFilesList,
loadingText,
selectedFile,
onClickSave,
headerName,
primaryButtonName,
theme,
} = this.props;
const { isLoading, isAvailable } = this.state;
const isHeaderChildren = !!titleFilesList;
return (
<StyledAsidePanel
theme={theme}
visible={isPanelVisible}
onMouseUp={this.onMouseEvent}
onMouseDown={this.onMouseEvent}
>
<ModalDialog
theme={theme}
visible={isPanelVisible}
zIndex={zIndex}
onClose={onClose}
className="select-file-modal-dialog"
style={{ maxWidth: "725px" }}
displayType="modal"
isLoading={isLoading}
autoMaxHeight
autoMaxWidth
withFooterBorder
>
<ModalDialog.Header theme={theme} className={"SELECTFILEDIALOG"}>
{headerName ? headerName : t("SelectFile")}
</ModalDialog.Header>
<ModalDialog.Body
theme={theme}
className="select-file_body-modal-dialog"
>
<StyledSelectFilePanel
isHeaderChildren={isHeaderChildren}
theme={theme}
displayType="modal"
noTreeSwitcher={this.noTreeSwitcher}
>
<div className="modal-dialog_body">
<div className="modal-dialog_tree-body">
<FolderTreeBody
theme={theme}
expandedKeys={expandedKeys}
folderList={this.folderList}
onSelect={this.onSelect}
withoutProvider={withoutProvider}
certainFolders
isAvailable={isAvailable}
filter={filter}
selectedKeys={[selectedFolder]}
isHeaderChildren={isHeaderChildren}
displayType="modal"
/>
</div>
<div className="modal-dialog_files-body">
<>
{titleFilesList && (
<Text theme={theme} className="modal-dialog-filter-title">
{titleFilesList}
</Text>
)}
{selectedFolder && (
<FilesListBody
theme={theme}
filesList={filesList}
onSelectFile={onSelectFile}
hasNextPage={hasNextPage}
isNextPageLoading={isNextPageLoading}
loadNextPage={loadNextPage}
selectedFolder={selectedFolder}
loadingText={loadingText}
selectedFile={selectedFile}
listHeight={isHeaderChildren ? 260 : 303}
onSetLoadingData={this.onSetLoadingData}
displayType={"modal"}
/>
)}
</>
</div>
</div>
</StyledSelectFilePanel>
</ModalDialog.Body>
<ModalDialog.Footer theme={theme}>
<Button
theme={theme}
className="select-file-modal-dialog-buttons-save"
primary
size="normal"
label={primaryButtonName}
onClick={onClickSave}
isDisabled={selectedFile.length === 0}
/>
<Button
theme={theme}
className="modal-dialog-button"
size="normal"
label={t("Common:CancelButton")}
onClick={onClose}
/>
</ModalDialog.Footer>
</ModalDialog>
</StyledAsidePanel>
);
}
}
export default SelectFileDialogModalView;

View File

@ -5,7 +5,7 @@ import PropTypes from "prop-types";
import throttle from "lodash/throttle";
import SelectFileDialogAsideView from "./AsideView";
import utils from "@docspace/components/utils";
import { FilterType } from "@docspace/common/constants";
import { FilterType, FolderType } from "@docspace/common/constants";
import isEqual from "lodash/isEqual";
import SelectionPanel from "../SelectionPanel/SelectionPanelBody";
import toastr from "@docspace/components/toast/toastr";
@ -14,13 +14,15 @@ const { desktop } = utils.device;
class SelectFileDialog extends React.Component {
constructor(props) {
super(props);
const { filter } = props;
const { filter, folderId, fileInfo } = props;
this.state = {
isVisible: false,
files: [],
selectedFileInfo: {},
displayType: this.getDisplayType(),
isAvailableFolderList: true,
selectedFolderId: folderId,
selectedFileInfo: fileInfo,
};
this.throttledResize = throttle(this.setDisplayType, 300);
this.newFilter = filter.clone();
@ -81,14 +83,10 @@ class SelectFileDialog extends React.Component {
async componentDidMount() {
const {
treeFolders,
foldersType,
onSetBaseFolderPath,
filteredType,
onSelectFolder,
foldersList,
treeFromInput,
passedFoldersTree,
displayType,
setFolderId,
folderId,
withoutBasicSelection,
} = this.props;
@ -99,18 +97,23 @@ class SelectFileDialog extends React.Component {
let resultingFolderTree, resultingId;
const treeFolders = await this.props.fetchTreeFolders();
const roomsFolder = treeFolders.find(
(f) => f.rootFolderType == FolderType.Rooms
);
const hasSharedFolder =
roomsFolder && roomsFolder.foldersCount ? true : false;
try {
[
resultingFolderTree,
resultingId,
] = await SelectionPanel.getBasicFolderInfo(
treeFolders,
foldersType,
filteredType,
folderId,
onSetBaseFolderPath,
onSelectFolder,
foldersList,
withoutBasicSelection
passedFoldersTree,
hasSharedFolder
);
} catch (e) {
toastr.error(e);
@ -118,7 +121,7 @@ class SelectFileDialog extends React.Component {
return;
}
const tree = treeFromInput ? treeFromInput : resultingFolderTree;
const tree = resultingFolderTree;
if (tree.length === 0) {
this.setState({ isAvailable: false });
@ -126,10 +129,13 @@ class SelectFileDialog extends React.Component {
return;
}
setFolderId(resultingId);
if (!withoutBasicSelection) {
onSelectFolder && onSelectFolder(resultingId);
}
this.setState({
resultingFolderTree: tree,
selectedFolderId: resultingId,
});
}
@ -140,20 +146,8 @@ class SelectFileDialog extends React.Component {
}
componentWillUnmount() {
const {
setFolderId,
setFile,
setExpandedPanelKeys,
withoutResetFolderTree,
} = this.props;
this.throttledResize && this.throttledResize.cancel();
window.removeEventListener("resize", this.throttledResize);
if (!withoutResetFolderTree) {
setExpandedPanelKeys(null);
setFolderId(null);
setFile(null);
}
}
getDisplayType = () => {
@ -183,25 +177,33 @@ class SelectFileDialog extends React.Component {
onSelectFolder = (folder) => {
const { displayType } = this.state;
const { setFolderId, setFile, folderId } = this.props;
const { folderId } = this.props;
const id = displayType === "aside" ? folder : folder[0];
if (id !== folderId) {
setFolderId(id);
setFile(null);
this.setState({
selectedFolderId: id,
});
}
};
onSelectFile = (item, index) => {
const { setFile } = this.props;
setFile(item);
this.setState({
selectedFileInfo: item,
});
};
onClickSave = () => {
const { onClose, onSelectFile, fileInfo } = this.props;
const { onClose, onSelectFile, setFile, setFolderId } = this.props;
const { selectedFileInfo, selectedFolderId } = this.state;
onSelectFile && onSelectFile(fileInfo);
setFile(selectedFileInfo);
if (selectedFileInfo.folderId.toString() === selectedFolderId.toString()) {
setFolderId(selectedFolderId);
}
onSelectFile && onSelectFile(selectedFileInfo);
onClose && onClose();
};
@ -210,7 +212,7 @@ class SelectFileDialog extends React.Component {
t,
isPanelVisible,
onClose,
foldersType,
filteredType,
withoutProvider,
filesListTitle,
theme,
@ -219,8 +221,6 @@ class SelectFileDialog extends React.Component {
dialogName,
creationButtonPrimary,
maxInputWidth,
folderId,
fileInfo,
} = this.props;
const {
isVisible,
@ -228,6 +228,8 @@ class SelectFileDialog extends React.Component {
isAvailableFolderList,
resultingFolderTree,
isLoadingData,
selectedFileInfo,
selectedFolderId,
} = this.state;
const buttonName = creationButtonPrimary
@ -244,7 +246,7 @@ class SelectFileDialog extends React.Component {
isFolderPanelVisible={isVisible}
onClose={onClose}
withoutProvider={withoutProvider}
folderId={folderId}
folderId={selectedFolderId}
resultingFolderTree={resultingFolderTree}
onButtonClick={this.onClickSave}
header={header}
@ -256,9 +258,9 @@ class SelectFileDialog extends React.Component {
onSelectFolder={this.onSelectFolder}
onSelectFile={this.onSelectFile}
filesListTitle={filesListTitle}
fileId={fileInfo?.id}
fileId={selectedFileInfo.id}
newFilter={this.newFilter}
foldersType={foldersType}
filteredType={filteredType}
onClickInput={this.onClickInput}
onCloseSelectFolderDialog={this.onCloseSelectFolderDialog}
maxInputWidth={maxInputWidth}
@ -270,7 +272,7 @@ class SelectFileDialog extends React.Component {
isPanelVisible={isPanelVisible}
onClose={onClose}
withoutProvider={withoutProvider}
folderId={folderId}
folderId={selectedFolderId}
resultingFolderTree={resultingFolderTree}
onButtonClick={this.onClickSave}
header={header}
@ -282,7 +284,7 @@ class SelectFileDialog extends React.Component {
onSelectFolder={this.onSelectFolder}
onSelectFile={this.onSelectFile}
filesListTitle={filesListTitle}
fileId={fileInfo?.id}
fileId={selectedFileInfo.id}
newFilter={this.newFilter}
/>
);
@ -292,26 +294,20 @@ SelectFileDialog.propTypes = {
onClose: PropTypes.func.isRequired,
isPanelVisible: PropTypes.bool.isRequired,
onSelectFile: PropTypes.func.isRequired,
foldersType: PropTypes.oneOf([
"common",
"third-party",
filteredType: PropTypes.oneOf([
"exceptSortedByTags",
"exceptPrivacyTrashFolders",
"exceptPrivacyTrashArchiveFolders",
]),
id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
withoutProvider: PropTypes.bool,
ignoreSelectedFolderTree: PropTypes.bool,
headerName: PropTypes.string,
filesListTitle: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
withoutResetFolderTree: PropTypes.bool,
};
SelectFileDialog.defaultProps = {
id: "",
filesListTitle: "",
withoutProvider: false,
ignoreSelectedFolderTree: false,
withoutResetFolderTree: false,
};
export default inject(
@ -329,7 +325,7 @@ export default inject(
setFile,
} = selectFileDialogStore;
const { treeFolders, setExpandedPanelKeys } = treeFoldersStore;
const { setExpandedPanelKeys, fetchTreeFolders } = treeFoldersStore;
const { filter } = filesStore;
const { id: storeFolderId } = selectedFolderStore;
@ -342,12 +338,12 @@ export default inject(
setFile,
setFolderId,
filter,
treeFolders,
storeFolderId,
folderId,
theme: theme,
setExpandedPanelKeys,
fetchTreeFolders,
};
}
)(

View File

@ -6,20 +6,23 @@ import StyledComponent from "./StyledSelectFileInput";
import SimpleFileInput from "../../SimpleFileInput";
class SelectFileInput extends React.PureComponent {
constructor(props) {
super(props);
const { setExpandedPanelKeys, setFolderId, setFile } = props;
setExpandedPanelKeys(null);
setFolderId(null);
setFile(null);
}
componentDidMount() {
this.props.setFirstLoad(false);
}
componentWillUnmount() {
const {
setExpandedPanelKeys,
setFolderId,
setFile,
onSelectFile,
} = this.props;
setExpandedPanelKeys(null);
setFolderId(null);
setFile({});
onSelectFile && onSelectFile({});
}
render() {
const {
onClickInput,

View File

@ -22,7 +22,7 @@ const SelectFolderDialogAsideView = ({
isPanelVisible,
onClose,
withoutProvider,
isNeedArrowIcon,
withFileSelectDialog,
isAvailable,
folderId,
isLoadingData,
@ -50,7 +50,7 @@ const SelectFolderDialogAsideView = ({
>
<ModalDialog.Header theme={theme}>
<StyledAsideHeader>
{isNeedArrowIcon && (
{withFileSelectDialog && (
<IconButton
theme={theme}
className="selection-panel_aside-header-icon"

View File

@ -7,10 +7,11 @@ import SelectFolderDialogAsideView from "./AsideView";
import utils from "@docspace/components/utils";
import toastr from "@docspace/components/toast/toastr";
import SelectionPanel from "../SelectionPanel/SelectionPanelBody";
import { FilterType } from "@docspace/common/constants";
import { FilterType, FolderType } from "@docspace/common/constants";
const { desktop } = utils.device;
let treeFolders = [];
class SelectFolderDialog extends React.Component {
constructor(props) {
super(props);
@ -28,39 +29,47 @@ class SelectFolderDialog extends React.Component {
async componentDidMount() {
const {
treeFolders,
foldersType,
filteredType,
onSetBaseFolderPath,
onSelectFolder,
foldersList,
passedFoldersTree,
displayType,
isNeedArrowIcon = false,
withFileSelectDialog = false,
folderTree,
setFolderId,
withInput,
setResultingFolderId,
selectFolderInputExist,
id,
storeFolderId,
withoutBasicSelection = false,
withoutBasicSelection,
setResultingFoldersTree,
} = this.props;
!displayType && window.addEventListener("resize", this.throttledResize);
const initialFolderId = withInput ? id : storeFolderId;
const initialFolderId = selectFolderInputExist ? id : storeFolderId;
let resultingFolderTree, resultingId;
if (!withInput && !isNeedArrowIcon) {
if (!withFileSelectDialog) {
treeFolders = await this.props.fetchTreeFolders();
const roomsFolder = treeFolders.find(
(f) => f.rootFolderType == FolderType.Rooms
);
const hasSharedFolder =
roomsFolder && roomsFolder.foldersCount ? true : false;
try {
[
resultingFolderTree,
resultingId,
] = await SelectionPanel.getBasicFolderInfo(
treeFolders,
foldersType,
filteredType,
initialFolderId,
onSetBaseFolderPath,
onSelectFolder,
foldersList
passedFoldersTree,
hasSharedFolder
);
} catch (e) {
toastr.error(e);
@ -69,46 +78,35 @@ class SelectFolderDialog extends React.Component {
}
}
const tree =
isNeedArrowIcon || withInput ? folderTree : resultingFolderTree;
const tree = withFileSelectDialog ? folderTree : resultingFolderTree;
if (tree.length === 0) {
this.setState({ isAvailable: false });
onSelectFolder(null);
onSelectFolder && onSelectFolder(null);
return;
}
const resId = isNeedArrowIcon || withInput ? id : resultingId;
!withoutBasicSelection && onSelectFolder && onSelectFolder(resId);
//isNeedArrowIcon && onSetBaseFolderPath(resId);
setResultingFoldersTree(tree);
setFolderId(resId);
const resId = withFileSelectDialog ? id : resultingId;
this.setState({
resultingFolderTree: tree,
});
}
componentDidUpdate(prevProps) {
const { isReset } = this.props;
if (isReset && isReset !== prevProps.isReset) {
this.onResetInfo();
if (!withoutBasicSelection) {
onSelectFolder && onSelectFolder(resId);
onSetBaseFolderPath && onSetBaseFolderPath(resId);
}
setResultingFolderId(resId);
}
componentWillUnmount() {
const { setFolderTitle, setProviderKey, setFolderId } = this.props;
//console.log("componentWillUnmount");
const { toDefault } = this.props;
if (this.throttledResize) {
this.throttledResize && this.throttledResize.cancel();
window.removeEventListener("resize", this.throttledResize);
}
setFolderTitle("");
setProviderKey(null);
setFolderId(null);
toDefault();
}
getDisplayType = () => {
const displayType =
@ -124,23 +122,27 @@ class SelectFolderDialog extends React.Component {
};
onSelect = async (folder, treeNode) => {
const { setFolderId, folderId } = this.props;
const { setResultingFolderId, resultingFolderId } = this.props;
if (+folderId === +folder[0]) return;
if (+resultingFolderId === +folder[0]) return;
setFolderId(folder[0]);
setResultingFolderId(folder[0]);
};
onClose = () => {
const {
setExpandedPanelKeys,
onClose,
treeFolders,
withInput,
isNeedArrowIcon,
selectFolderInputExist,
withFileSelectDialog,
} = this.props;
if (!treeFolders.length && !withInput && !isNeedArrowIcon) {
if (
!treeFolders.length &&
!selectFolderInputExist &&
!withFileSelectDialog
) {
setExpandedPanelKeys(null);
}
onClose && onClose();
@ -161,25 +163,20 @@ class SelectFolderDialog extends React.Component {
providerKey,
folderTitle,
folderId,
resultingFolderId,
setSelectedItems,
} = this.props;
setSelectedItems();
onSubmit && onSubmit(folderId, folderTitle, providerKey);
onSave && onSave(e, folderId);
onSetNewFolderPath && onSetNewFolderPath(folderId);
onSelectFolder && onSelectFolder(folderId);
onSubmit && onSubmit(resultingFolderId, folderTitle, providerKey);
onSave && onSave(e, resultingFolderId);
onSetNewFolderPath && onSetNewFolderPath(resultingFolderId);
onSelectFolder && onSelectFolder(resultingFolderId);
//setResultingFolderId(resultingFolderId);
!withoutImmediatelyClose && this.onClose();
};
onResetInfo = async () => {
const { id, setFolderId } = this.props;
setFolderId(id);
};
render() {
const {
t,
@ -187,13 +184,13 @@ class SelectFolderDialog extends React.Component {
isPanelVisible,
zIndex,
withoutProvider,
isNeedArrowIcon, //for aside view when selected file
withFileSelectDialog,
header,
dialogName,
footer,
buttonName,
isDisableTree,
folderId,
resultingFolderId,
folderTitle,
expandedKeys,
isDisableButton,
@ -201,13 +198,9 @@ class SelectFolderDialog extends React.Component {
currentFolderId,
selectionFiles,
sharedRoomId,
} = this.props;
const {
displayType,
isLoadingData,
isAvailable,
resultingFolderTree,
} = this.state;
} = this.props;
const { displayType, isLoadingData, isAvailable } = this.state;
const primaryButtonName = buttonName
? buttonName
@ -217,7 +210,12 @@ class SelectFolderDialog extends React.Component {
// console.log("Render Folder Component?", this.state);
const folderSelectionDisabled =
folderId === sharedRoomId || folderId === sharedRoomId?.toString();
resultingFolderId === sharedRoomId ||
resultingFolderId === sharedRoomId?.toString();
const buttonIsDisabled =
isDisableButton ||
(isRecycleBin && currentFolderId === resultingFolderId);
return displayType === "aside" ? (
<SelectFolderDialogAsideView
@ -229,24 +227,24 @@ class SelectFolderDialog extends React.Component {
zIndex={zIndex}
onClose={this.onCloseAside}
withoutProvider={withoutProvider}
isNeedArrowIcon={isNeedArrowIcon}
withFileSelectDialog={withFileSelectDialog}
certainFolders={true}
folderId={folderId}
folderId={resultingFolderId}
resultingFolderTree={resultingFolderTree}
onSelectFolder={this.onSelect}
onButtonClick={this.onButtonClick}
header={header}
dialogName={isNeedArrowIcon ? t("Translations:FolderSelection") : name}
dialogName={
withFileSelectDialog ? t("Translations:FolderSelection") : name
}
footer={footer}
isLoadingData={isLoadingData}
primaryButtonName={
isNeedArrowIcon ? t("Common:SelectAction") : primaryButtonName
withFileSelectDialog ? t("Common:SelectAction") : primaryButtonName
}
isAvailable={isAvailable}
isDisableTree={isDisableTree}
isDisableButton={
isDisableButton || (isRecycleBin && currentFolderId === folderId)
}
isDisableButton={buttonIsDisabled}
/>
) : (
<SelectionPanel
@ -257,7 +255,7 @@ class SelectFolderDialog extends React.Component {
isPanelVisible={isPanelVisible}
onClose={this.onClose}
withoutProvider={withoutProvider}
folderId={folderId}
folderId={resultingFolderId}
resultingFolderTree={resultingFolderTree}
onButtonClick={this.onButtonClick}
header={header}
@ -272,9 +270,7 @@ class SelectFolderDialog extends React.Component {
isDisableTree={isDisableTree}
folderSelection
newFilter={this.newFilter}
isDisableButton={
isDisableButton || (isRecycleBin && currentFolderId === folderId)
}
isDisableButton={buttonIsDisabled}
/>
);
}
@ -284,12 +280,9 @@ SelectFolderDialog.propTypes = {
onSelectFolder: PropTypes.func,
onClose: PropTypes.func,
isPanelVisible: PropTypes.bool.isRequired,
foldersType: PropTypes.oneOf([
"common",
"third-party",
filteredType: PropTypes.oneOf([
"exceptSortedByTags",
"exceptPrivacyTrashFolders",
"rooms",
"exceptPrivacyTrashArchiveFolders",
"",
]),
displayType: PropTypes.oneOf(["aside", "modal"]),
@ -303,6 +296,7 @@ SelectFolderDialog.defaultProps = {
withoutProvider: false,
withoutImmediatelyClose: false,
isDisableTree: false,
filteredType: "",
};
export default inject(
@ -318,9 +312,9 @@ export default inject(
{ selectedId }
) => {
const {
treeFolders,
setExpandedPanelKeys,
sharedRoomId,
fetchTreeFolders,
} = treeFoldersStore;
const { filter } = filesStore;
@ -328,12 +322,16 @@ export default inject(
const { id } = selectedFolderStore;
const {
setFolderId,
setResultingFolderId,
setFolderTitle,
setProviderKey,
providerKey,
folderTitle,
folderId,
resultingFolderId,
setIsLoading,
resultingFolderTree,
setResultingFoldersTree,
toDefault,
} = selectFolderDialogStore;
const { settingsStore } = auth;
@ -345,15 +343,19 @@ export default inject(
storeFolderId: selectedFolderId,
providerKey,
folderTitle,
folderId,
resultingFolderId,
setExpandedPanelKeys,
setFolderId,
setResultingFolderId,
setFolderTitle,
setProviderKey,
treeFolders,
filter,
setSelectedItems,
sharedRoomId,
fetchTreeFolders,
setIsLoading,
resultingFolderTree,
toDefault,
setResultingFoldersTree,
};
}
)(

View File

@ -12,111 +12,25 @@ import { FolderType } from "@docspace/common/constants";
class SelectFolderInput extends React.PureComponent {
constructor(props) {
super(props);
const { id, foldersType, withoutBasicSelection } = this.props;
const { id, withoutBasicSelection, setIsLoading } = this.props;
const isNeedLoader =
!!id || !withoutBasicSelection || foldersType === "common";
this.state = {
isLoading: isNeedLoader,
baseFolderPath: "",
newFolderPath: "",
resultingFolderTree: [],
baseId: "",
};
const isNeedLoadPath = !!id || !withoutBasicSelection;
setIsLoading(isNeedLoadPath);
this._isMount = false;
}
setBaseInfo = async () => {
const {
foldersType,
id,
onSelectFolder,
foldersList,
withoutBasicSelection,
} = this.props;
let resultingFolderTree, resultingId;
try {
[
resultingFolderTree,
resultingId,
] = await SelectionPanel.getBasicFolderInfo(
null,
foldersType,
id,
this.onSetBaseFolderPath,
onSelectFolder,
foldersList,
withoutBasicSelection
);
} catch (e) {
toastr.error(e);
this._isMount &&
this.setState({
isLoading: false,
});
return;
}
this._isMount &&
this.setState({
isPathError: false,
resultingFolderTree,
baseId: resultingId,
baseFolderPath: "",
newFolderPath: "",
...(withoutBasicSelection && { isLoading: false }),
});
};
componentDidMount() {
this._isMount = true;
const { setFirstLoad, isWaitingUpdate } = this.props;
const { setFirstLoad } = this.props;
setFirstLoad(false);
!isWaitingUpdate && this.setBaseInfo();
}
componentDidUpdate(prevProps) {
const {
isSuccessSave,
isReset,
id,
isWaitingUpdate,
} = this.props;
const { newFolderPath, baseFolderPath } = this.state;
if (!isSuccessSave && isSuccessSave !== prevProps.isSuccessSave) {
newFolderPath &&
this.setState({
baseFolderPath: newFolderPath,
baseId: id,
newId: null,
isPathError: false,
});
}
if (!isReset && isReset !== prevProps.isReset) {
this.setState({
newFolderPath: baseFolderPath,
baseId: id,
newId: null,
isPathError: false,
});
}
if (!isWaitingUpdate && isWaitingUpdate !== prevProps.isWaitingUpdate) {
this.setBaseInfo();
}
}
componentWillUnmount() {
this._isMount = false;
this.props.toDefault();
}
setFolderPath = async (folderId) => {
const foldersArray = await getFolderPath(folderId);
@ -143,48 +57,53 @@ class SelectFolderInput extends React.PureComponent {
return convertFoldersArray;
};
onSetNewFolderPath = async (folderId) => {
const { setIsLoading, setNewFolderPath, setIsPathError } = this.props;
let timerId = setTimeout(() => {
this._isMount && this.setState({ isLoading: true });
setIsLoading(true);
}, 500);
try {
const convertFoldersArray = await this.setFolderPath(folderId);
clearTimeout(timerId);
timerId = null;
this._isMount &&
this.setState({
newFolderPath: convertFoldersArray,
isLoading: false,
newId: folderId,
isPathError: false,
});
} catch (e) {
toastr.error(e);
clearTimeout(timerId);
timerId = null;
this._isMount &&
this.setState({
isLoading: false,
isPathError: true,
});
}
};
onSetBaseFolderPath = async (folderId) => {
try {
const convertFoldersArray = await this.setFolderPath(folderId);
this._isMount &&
this.setState({
baseFolderPath: convertFoldersArray,
isLoading: false,
...(!convertFoldersArray && { isPathError: true }),
});
setNewFolderPath(convertFoldersArray);
clearTimeout(timerId);
timerId = null;
setIsPathError(false);
setIsLoading(false);
} catch (e) {
toastr.error(e);
this._isMount &&
this.setState({
isLoading: false,
isPathError: true,
});
clearTimeout(timerId);
setIsLoading(false);
timerId = null;
setIsPathError(true);
}
};
onSetBaseFolderPath = async (folderId) => {
const {
setIsLoading,
setBaseFolderPath,
setIsPathError,
setResultingFolderId,
resultingFolderTree,
} = this.props;
try {
const convertFoldersArray = await this.setFolderPath(folderId);
setBaseFolderPath(convertFoldersArray);
setIsLoading(false);
if (!convertFoldersArray) {
setIsPathError(true);
this.onSetFolderInfo(resultingFolderTree[0].id);
setResultingFolderId(resultingFolderTree[0].id);
}
} catch (e) {
toastr.error(e);
setIsLoading(false);
setIsPathError(true);
this.onSetFolderInfo(resultingFolderTree[0].id);
setResultingFolderId(resultingFolderTree[0].id);
}
};
onSelectFolder = (folderId) => {
@ -195,25 +114,19 @@ class SelectFolderInput extends React.PureComponent {
};
onSetFolderInfo = (folderId) => {
const { setExpandedPanelKeys, setParentId } = this.props;
getFolder(folderId)
.then((data) => {
const pathParts = data.pathParts.map((item) => item.toString());
pathParts?.pop();
setExpandedPanelKeys(pathParts);
setParentId(data.current.parentId);
})
.catch((e) => toastr.error(e));
};
render() {
const {
isLoading,
baseFolderPath,
newFolderPath,
baseId,
resultingFolderTree,
newId,
isPathError,
} = this.state;
const {
onClickInput,
isError,
@ -222,14 +135,19 @@ class SelectFolderInput extends React.PureComponent {
maxInputWidth,
isDisabled,
isPanelVisible,
id,
theme,
isFolderTreeLoading = false,
onSelectFolder,
isLoading,
newFolderPath,
baseFolderPath,
isPathError,
isWaitingUpdate,
...rest
} = this.props;
const passedId = newId ? newId : baseId;
const isReady = !isFolderTreeLoading && !isWaitingUpdate;
return (
<StyledComponent maxWidth={maxInputWidth}>
@ -240,19 +158,12 @@ class SelectFolderInput extends React.PureComponent {
isError={isError || isPathError}
onClickInput={onClickInput}
placeholder={placeholder}
isDisabled={
isFolderTreeLoading ||
isDisabled ||
isLoading ||
resultingFolderTree?.length === 0
}
isDisabled={isFolderTreeLoading || isDisabled || isLoading}
/>
{!isFolderTreeLoading && isPanelVisible && (
{isReady && (
<SelectFolderDialog
{...rest}
withInput={true}
folderTree={resultingFolderTree}
id={passedId}
selectFolderInputExist
isPanelVisible={isPanelVisible}
onSetBaseFolderPath={this.onSetBaseFolderPath}
onSetNewFolderPath={this.onSetNewFolderPath}
@ -268,14 +179,10 @@ SelectFolderInput.propTypes = {
onClickInput: PropTypes.func,
hasError: PropTypes.bool,
isDisabled: PropTypes.bool,
isUpdateInfo: PropTypes.bool,
placeholder: PropTypes.string,
foldersType: PropTypes.oneOf([
"common",
"third-party",
filteredType: PropTypes.oneOf([
"exceptSortedByTags",
"exceptPrivacyTrashFolders",
"rooms",
"exceptPrivacyTrashArchiveFolders",
"",
]),
};
@ -285,7 +192,7 @@ SelectFolderInput.defaultProps = {
isDisabled: false,
isWaitingUpdate: false,
placeholder: "",
foldersType: "",
filteredType: "",
};
export default inject(
@ -297,14 +204,36 @@ export default inject(
}) => {
const { setFirstLoad } = filesStore;
const { setExpandedPanelKeys } = treeFoldersStore;
const { setFolderId } = selectFolderDialogStore;
const {
isLoading,
setIsLoading,
baseFolderPath,
setBaseFolderPath,
newFolderPath,
setNewFolderPath,
toDefault,
setIsPathError,
isPathError,
resultingFolderTree,
setResultingFolderId,
} = selectFolderDialogStore;
const { setParentId } = selectedFolderStore;
return {
setFirstLoad,
setFolderId,
setExpandedPanelKeys,
setParentId,
isLoading,
setIsLoading,
setBaseFolderPath,
baseFolderPath,
newFolderPath,
setNewFolderPath,
toDefault,
setIsPathError,
isPathError,
resultingFolderTree,
setResultingFolderId,
};
}
)(observer(withTranslation("Translations")(SelectFolderInput)));

View File

@ -8,4 +8,8 @@ export const exceptSortedByTagsFolders = [
FolderType.Archive,
];
export const exceptPrivacyTrashFolders = [FolderType.Privacy, FolderType.TRASH];
export const exceptPrivacyTrashArchiveFolders = [
FolderType.Privacy,
FolderType.TRASH,
FolderType.Archive,
];

View File

@ -55,7 +55,7 @@ class FilesListWrapper extends React.Component {
folderId,
setFolderTitle,
setProviderKey,
setFolderId,
setResultingFolderId,
folderSelection,
} = this.props;
@ -89,7 +89,7 @@ class FilesListWrapper extends React.Component {
if (page === 0 && folderSelection) {
setFolderTitle(data.current.title);
setProviderKey(data.current.providerKey);
setFolderId(folderId);
setResultingFolderId(folderId);
}
const finalData = [...data.files];
@ -144,7 +144,7 @@ export default inject(
({ selectedFolderStore, selectFolderDialogStore, auth }) => {
const { id } = selectedFolderStore;
const {
setFolderId,
setResultingFolderId,
setFolderTitle,
setProviderKey,
} = selectFolderDialogStore;
@ -155,7 +155,7 @@ export default inject(
return {
theme: theme,
storeFolderId: id,
setFolderId,
setResultingFolderId,
setFolderTitle,
setProviderKey,
};

View File

@ -13,11 +13,13 @@ import {
import toastr from "@docspace/components/toast/toastr";
import {
exceptSortedByTagsFolders,
exceptPrivacyTrashFolders,
exceptPrivacyTrashArchiveFolders,
} from "./ExceptionFoldersConstants";
import { StyledBody, StyledModalDialog } from "./StyledSelectionPanel";
import Text from "@docspace/components/text";
import Loaders from "@docspace/common/components/Loaders";
import { FolderType } from "@docspace/common/constants";
const SelectionPanelBody = ({
t,
isPanelVisible,
@ -172,53 +174,20 @@ class SelectionPanel extends React.Component {
};
static getBasicFolderInfo = async (
treeFolders,
foldersType,
filteredType,
id,
onSetBaseFolderPath,
onSelectFolder,
foldersList,
withoutBasicSelection = false
passedFoldersTree = [],
hasSharedFolder
) => {
const getRequestFolderTree = () => {
switch (foldersType) {
case "exceptSortedByTags":
case "exceptPrivacyTrashFolders":
try {
return getFoldersTree();
} catch (err) {
console.error(err);
}
break;
case "common":
try {
return getCommonFoldersTree();
} catch (err) {
console.error(err);
}
break;
case "third-party":
try {
return getThirdPartyCommonFolderTree();
} catch (err) {
console.error(err);
}
break;
default:
try {
return getFoldersTree();
} catch (err) {
console.error(err);
}
}
};
const filterFoldersTree = (folders, arrayOfExceptions) => {
const arr = !hasSharedFolder
? [...arrayOfExceptions, FolderType.Rooms]
: arrayOfExceptions;
let newArray = [];
for (let i = 0; i < folders.length; i++) {
if (!arrayOfExceptions.includes(folders[i].rootFolderType)) {
if (!arr.includes(folders[i].rootFolderType)) {
newArray.push(folders[i]);
}
}
@ -227,43 +196,27 @@ class SelectionPanel extends React.Component {
};
const getExceptionsFolders = (treeFolders) => {
switch (foldersType) {
switch (filteredType) {
case "exceptSortedByTags":
return filterFoldersTree(treeFolders, exceptSortedByTagsFolders);
case "exceptPrivacyTrashFolders":
return filterFoldersTree(treeFolders, exceptPrivacyTrashFolders);
case "exceptPrivacyTrashArchiveFolders":
return filterFoldersTree(
treeFolders,
exceptPrivacyTrashArchiveFolders
);
}
};
let requestedTreeFolders, filteredTreeFolders;
const treeFoldersLength = treeFolders?.length;
if (treeFoldersLength === 0 || !treeFoldersLength) {
try {
requestedTreeFolders = foldersList
? foldersList
: await getRequestFolderTree();
} catch (e) {
toastr.error(e);
return;
}
}
let filteredTreeFolders;
const foldersTree =
treeFoldersLength > 0 ? treeFolders : requestedTreeFolders;
passedFoldersTree.length > 0 ? passedFoldersTree : treeFolders;
const passedId = id ? id : foldersTree[0]?.id;
!withoutBasicSelection &&
onSetBaseFolderPath &&
onSetBaseFolderPath(passedId);
!withoutBasicSelection && onSelectFolder && onSelectFolder(passedId);
const passedId = id ? id : foldersTree[0].id;
if (
foldersType === "exceptSortedByTags" ||
foldersType === "exceptPrivacyTrashFolders"
filteredType === "exceptSortedByTags" ||
filteredType === "exceptPrivacyTrashArchiveFolders"
) {
filteredTreeFolders = getExceptionsFolders(foldersTree);
}

View File

@ -6,14 +6,14 @@ import NoUserSelect from "@docspace/components/utils/commonStyles";
import { useTranslation } from "react-i18next";
import styled from "styled-components";
import { ReactSVG } from "react-svg";
import { isDesktop, isMobile } from "react-device-detect";
import { isMobile } from "react-device-detect";
import { ColorTheme, ThemeType } from "@docspace/common/components/ColorTheme";
const StyledAboutBody = styled.div`
width: 100%;
.avatar {
margin-top: ${isDesktop ? "0px" : "32px"};
margin-top: ${!isMobile ? "0px" : "32px"};
margin-bottom: 16px;
}

View File

@ -2,7 +2,7 @@ import React from "react";
import Tile from "./sub-components/Tile";
import { SimpleFilesTileContent } from "./StyledTileView";
import Link from "@docspace/components/link";
import { isDesktop } from "react-device-detect";
import { isMobile } from "react-device-detect";
const FileTile = (props) => {
const { item } = props;
@ -16,7 +16,7 @@ const FileTile = (props) => {
containerWidth="100%"
type="page"
fontWeight="600"
fontSize={isDesktop ? "13px" : "14px"}
fontSize={!isMobile ? "13px" : "14px"}
target="_blank"
isTextOverflow
>

View File

@ -66,13 +66,6 @@ class Tile extends React.PureComponent {
);
};
onFileIconClick = () => {
if (isDesktop) return;
const { onSelect, item } = this.props;
onSelect && onSelect(true, item);
};
getContextModel = () => {
return [
{
@ -153,7 +146,6 @@ class Tile extends React.PureComponent {
isSelected={isSelected}
onContextMenu={onContextMenu}
isActive={isActive}
isDesktop={isDesktop}
showHotkeyBorder={showHotkeyBorder}
onDoubleClick={this.onCreateForm}
onClick={this.onSelectForm}
@ -163,9 +155,7 @@ class Tile extends React.PureComponent {
<StyledFileTileBottom isSelected={isSelected} isActive={isActive}>
<div className="file-icon_container">
<div className="file-icon" onClick={this.onFileIconClick}>
{element}
</div>
<div className="file-icon">{element}</div>
</div>
<StyledContent>{children}</StyledContent>
@ -201,7 +191,6 @@ Tile.propTypes = {
contextOptions: PropTypes.array,
data: PropTypes.object,
id: PropTypes.string,
onSelect: PropTypes.func,
tileContextClick: PropTypes.func,
};

View File

@ -39,6 +39,7 @@ const StyledWrapper = styled.div`
const StyledSimpleFilesRow = styled(Row)`
${(props) => (props.checked || props.isActive) && checkedStyle};
${(props) => props.dragging && draggingStyle}
height: 57px;
${(props) =>
!isMobile &&
@ -114,12 +115,6 @@ const StyledSimpleFilesRow = styled(Row)`
margin-right: 7px;
}
.row_context-menu-wrapper {
width: fit-content;
justify-content: space-between;
flex: 1 1 auto;
}
.row_content {
${(props) =>
props.sectionWidth > 500 && `max-width: fit-content;`}//min-width: auto
@ -136,13 +131,9 @@ const StyledSimpleFilesRow = styled(Row)`
margin-right: 8px;
}
${(props) =>
props.sectionWidth > 500 &&
`
.badge:last-child {
margin-right: 0px;
}
`}
.badge:last-child {
margin-right: 0px;
}
.lock-file {
cursor: ${(props) => (props.withAccess ? "pointer" : "default")};
@ -156,43 +147,35 @@ const StyledSimpleFilesRow = styled(Row)`
margin-top: 1px;
}
.expandButton {
margin-left: 6px;
padding-top: 7px;
.row_context-menu-wrapper {
width: min-content;
justify-content: space-between;
flex: 0 1 auto;
}
${(props) =>
((props.sectionWidth <= 1024 && props.sectionWidth > 500) || isTablet) &&
`
.row_context-menu-wrapper{
width: min-content;
justify-content: space-between;
flex: 0 1 auto;
}
.row_content {
max-width: none;
min-width: 0;
}
.row_content {
max-width: none;
min-width: 0;
}
.badges {
margin-bottom: 0px;
}
.badges {
margin-bottom: 0px;
.badge {
margin-right: 24px;
}
.lock-file {
svg {
height: 16px;
}
}
.badge {
margin-right: 24px;
}
.lock-file{
svg {
height: 16px;
}
}
.expandButton {
padding-top: 0px;
}
`}
.expandButton {
margin-left: 6px;
padding-top: 0px;
}
`;
StyledSimpleFilesRow.defaultProps = { theme: Base };

View File

@ -414,13 +414,8 @@ export default inject(
roomsFilter,
fetchRooms,
} = filesStore;
const {
isPrivacyFolder,
isRecentFolder,
isPersonalRoom,
} = treeFoldersStore;
const withContent = canShare || (canShare && isPrivacyFolder && isDesktop);
const { isRecentFolder, isPersonalRoom } = treeFoldersStore;
const withContent = canShare;
const sortingVisible = !isRecentFolder;
const { personal, withPaging } = auth.settingsStore;

View File

@ -9,7 +9,7 @@ import Link from "@docspace/components/link";
import TileContent from "./sub-components/TileContent";
import withContent from "../../../../../HOCs/withContent";
import withBadges from "../../../../../HOCs/withBadges";
import { isDesktop } from "react-device-detect";
import { isMobile } from "react-device-detect";
const SimpleFilesTileContent = styled(TileContent)`
.row-main-container {
@ -79,7 +79,7 @@ const FilesTileContent = ({ item, titleWithoutExt, linkStyles, theme }) => {
type="page"
title={title}
fontWeight="600"
fontSize={isDesktop ? "13px" : "14px"}
fontSize={!isMobile ? "13px" : "14px"}
target="_blank"
{...linkStyles}
color={theme.filesSection.tilesView.color}

View File

@ -6,8 +6,7 @@ import { ReactSVG } from "react-svg";
import styled, { css } from "styled-components";
import ContextMenu from "@docspace/components/context-menu";
import { tablet } from "@docspace/components/utils/device";
import { isDesktop, isMobile } from "react-device-detect";
import { isMobile } from "react-device-detect";
import Link from "@docspace/components/link";
import Loader from "@docspace/components/loader";
import { Base } from "@docspace/components/themes";
@ -191,7 +190,6 @@ const StyledTile = styled.div`
:hover {
${(props) =>
!props.dragging &&
props.isDesktop &&
!props.inProgress &&
!isMobile &&
css`
@ -414,7 +412,7 @@ class Tile extends React.PureComponent {
};
onFileIconClick = () => {
if (isDesktop) return;
if (!isMobile) return;
const { onSelect, item } = this.props;
onSelect && onSelect(true, item);
@ -525,7 +523,6 @@ class Tile extends React.PureComponent {
isActive={isActive}
isRoom={isRoom}
inProgress={inProgress}
isDesktop={isDesktop}
showHotkeyBorder={showHotkeyBorder}
onClick={this.onFileClick}
>

View File

@ -2,7 +2,7 @@ import React, { useState, useEffect } from "react";
import { withTranslation } from "react-i18next";
import { inject, observer } from "mobx-react";
import { isDesktop } from "react-device-detect";
import { isMobile } from "react-device-detect";
import withLoading from "SRC_DIR/HOCs/withLoading";
import Whitelabel from "./settingsBranding/whitelabel";
@ -49,7 +49,7 @@ const StyledComponent = styled.div`
const Branding = (props) => {
const [isPortalPaid, setIsPortalPaid] = useState(true);
if (!isDesktop) return <ForbiddenPage />;
if (isMobile) return <ForbiddenPage />;
return (
<StyledComponent>

View File

@ -213,12 +213,14 @@ class AutomaticBackup extends React.PureComponent {
toDefault,
isCheckedThirdParty,
isCheckedDocuments,
setResetProcess,
resetNewFolderPath,
defaultFolderId,
} = this.props;
console.log("defaultFolderId", defaultFolderId);
toDefault();
(isCheckedThirdParty || isCheckedDocuments) && setResetProcess(true);
(isCheckedThirdParty || isCheckedDocuments) &&
resetNewFolderPath(defaultFolderId);
this.setState({
...(isError && { isError: false }),
});
@ -326,11 +328,11 @@ class AutomaticBackup extends React.PureComponent {
isCheckedThirdParty,
isCheckedDocuments,
setSavingProcess,
updateBaseFolderPath,
} = this.props;
try {
(isCheckedThirdParty || isCheckedDocuments) && setSavingProcess(true);
(isCheckedThirdParty || isCheckedDocuments) && updateBaseFolderPath();
await createBackupSchedule(
storageType,
@ -354,7 +356,7 @@ class AutomaticBackup extends React.PureComponent {
} catch (e) {
toastr.error(e);
(isCheckedThirdParty || isCheckedDocuments) && setSavingProcess(true);
(isCheckedThirdParty || isCheckedDocuments) && updateBaseFolderPath();
this.setState({
isLoadingData: false,
@ -498,12 +500,7 @@ class AutomaticBackup extends React.PureComponent {
{t("ThirdPartyResourceDescription")}
</Text>
{isCheckedThirdParty && (
<ThirdPartyModule
{...commonProps}
isError={isError}
defaultSelectedFolder={this.defaultSelectedFolder}
onSetDefaultFolderPath={this.onSetDefaultFolderPath}
/>
<ThirdPartyModule {...commonProps} isError={isError} />
)}
</StyledModules>
<StyledModules>
@ -545,91 +542,100 @@ class AutomaticBackup extends React.PureComponent {
);
}
}
export default inject(({ auth, backup, treeFoldersStore }) => {
const { language, settingsStore } = auth;
const { organizationName, theme } = settingsStore;
const {
downloadingProgress,
backupSchedule,
//commonThirdPartyList,
clearProgressInterval,
deleteSchedule,
getProgress,
setThirdPartyStorage,
setDefaultOptions,
setBackupSchedule,
selectedStorageType,
seStorageType,
//setCommonThirdPartyList,
selectedPeriodLabel,
selectedWeekdayLabel,
selectedWeekday,
selectedHour,
selectedMonthDay,
selectedMaxCopiesNumber,
selectedPeriodNumber,
selectedFolderId,
selectedStorageId,
toDefault,
isFormReady,
getStorageParams,
setSelectedEnableSchedule,
selectedEnableSchedule,
updatePathSettings,
setSavingProcess,
setResetProcess,
setStorageRegions,
} = backup;
export default inject(
({ auth, backup, treeFoldersStore, selectFolderDialogStore }) => {
const { language, settingsStore } = auth;
const { organizationName, theme } = settingsStore;
const {
downloadingProgress,
backupSchedule,
//commonThirdPartyList,
clearProgressInterval,
deleteSchedule,
getProgress,
setThirdPartyStorage,
setDefaultOptions,
setBackupSchedule,
selectedStorageType,
seStorageType,
//setCommonThirdPartyList,
selectedPeriodLabel,
selectedWeekdayLabel,
selectedWeekday,
selectedHour,
selectedMonthDay,
selectedMaxCopiesNumber,
selectedPeriodNumber,
selectedFolderId,
selectedStorageId,
toDefault,
isFormReady,
getStorageParams,
setSelectedEnableSchedule,
selectedEnableSchedule,
updatePathSettings,
const isCheckedDocuments = selectedStorageType === `${DocumentModuleType}`;
const isCheckedThirdParty = selectedStorageType === `${ResourcesModuleType}`;
const isCheckedThirdPartyStorage =
selectedStorageType === `${StorageModuleType}`;
setStorageRegions,
defaultFolderId,
} = backup;
const { rootFoldersTitles, fetchTreeFolders } = treeFoldersStore;
return {
fetchTreeFolders,
rootFoldersTitles,
downloadingProgress,
theme,
language,
isFormReady,
organizationName,
backupSchedule,
//commonThirdPartyList,
clearProgressInterval,
deleteSchedule,
getProgress,
setThirdPartyStorage,
setDefaultOptions,
setBackupSchedule,
selectedStorageType,
seStorageType,
//setCommonThirdPartyList,
selectedPeriodLabel,
selectedWeekdayLabel,
selectedWeekday,
selectedHour,
selectedMonthDay,
selectedMaxCopiesNumber,
selectedPeriodNumber,
selectedFolderId,
selectedStorageId,
const {
updateBaseFolderPath,
resetNewFolderPath,
} = selectFolderDialogStore;
toDefault,
const isCheckedDocuments = selectedStorageType === `${DocumentModuleType}`;
const isCheckedThirdParty =
selectedStorageType === `${ResourcesModuleType}`;
const isCheckedThirdPartyStorage =
selectedStorageType === `${StorageModuleType}`;
isCheckedThirdPartyStorage,
isCheckedThirdParty,
isCheckedDocuments,
const { rootFoldersTitles, fetchTreeFolders } = treeFoldersStore;
return {
defaultFolderId,
fetchTreeFolders,
rootFoldersTitles,
downloadingProgress,
theme,
language,
isFormReady,
organizationName,
backupSchedule,
//commonThirdPartyList,
clearProgressInterval,
deleteSchedule,
getProgress,
setThirdPartyStorage,
setDefaultOptions,
setBackupSchedule,
selectedStorageType,
seStorageType,
//setCommonThirdPartyList,
selectedPeriodLabel,
selectedWeekdayLabel,
selectedWeekday,
selectedHour,
selectedMonthDay,
selectedMaxCopiesNumber,
selectedPeriodNumber,
selectedFolderId,
selectedStorageId,
getStorageParams,
toDefault,
setSelectedEnableSchedule,
selectedEnableSchedule,
isCheckedThirdPartyStorage,
isCheckedThirdParty,
isCheckedDocuments,
updatePathSettings,
setSavingProcess,
setResetProcess,
setStorageRegions,
};
})(withTranslation(["Settings", "Common"])(observer(AutomaticBackup)));
getStorageParams,
setSelectedEnableSchedule,
selectedEnableSchedule,
updatePathSettings,
resetNewFolderPath,
setStorageRegions,
updateBaseFolderPath,
};
}
)(withTranslation(["Settings", "Common"])(observer(AutomaticBackup)));

View File

@ -9,18 +9,11 @@ const ButtonContainer = ({
onCancelModuleSettings,
isChanged,
isThirdStorageChanged,
setSavingProcess,
t,
setResetProcess,
}) => {
const prevChange = useRef();
useEffect(() => {
if (!isChanged && isChanged !== prevChange.current) {
setSavingProcess(false);
setResetProcess(false);
}
}, [isChanged]);
useEffect(() => {
prevChange.current = isChanged;
@ -50,17 +43,10 @@ const ButtonContainer = ({
};
export default inject(({ backup }) => {
const {
isChanged,
isThirdStorageChanged,
setSavingProcess,
setResetProcess,
} = backup;
const { isChanged, isThirdStorageChanged } = backup;
return {
isChanged,
isThirdStorageChanged,
setSavingProcess,
setResetProcess,
};
})(observer(ButtonContainer));

View File

@ -50,12 +50,11 @@ class RoomsModule extends React.PureComponent {
onClickInput={this.onClickInput}
isPanelVisible={isPanelVisible}
isError={isError}
foldersType="exceptSortedByTags"
filteredType="exceptSortedByTags"
withoutProvider
isDisabled={isLoadingData}
id={passedId}
isReset={isResetProcess}
isSuccessSave={isSavingProcess}
withoutBasicSelection={isDocumentsDefault ? false : true}
/>
</div>

View File

@ -55,39 +55,16 @@ class ThirdPartyModule extends React.PureComponent {
isError,
isLoadingData,
isReset,
isSuccessSave,
passedId,
//commonThirdPartyList,
isResourcesDefault,
isResetProcess,
isSavingProcess,
t,
...rest
} = this.props;
return (
<>
{/* {!isDocSpace ? (
<div className="auto-backup_folder-input">
<SelectFolderInput
onSelectFolder={this.onSelectFolder}
onClose={this.onClose}
onClickInput={this.onClickInput}
isPanelVisible={isPanelVisible}
isError={isError}
foldersType="third-party"
isDisabled={commonThirdPartyList.length === 0 || isLoadingData}
id={passedId}
isReset={isResetProcess}
isSuccessSave={isSavingProcess}
foldersList={commonThirdPartyList}
withoutBasicSelection={isResourcesDefault ? false : true}
/>
</div>
) : ( */}
{/* )} */}
<div className="auto-backup_third-party-module">
<DirectThirdPartyConnection
t={t}
@ -98,8 +75,6 @@ class ThirdPartyModule extends React.PureComponent {
isPanelVisible={isPanelVisible}
withoutBasicSelection={isResourcesDefault ? false : true}
isError={isError}
isReset={isResetProcess}
isSuccessSave={isSavingProcess}
id={passedId}
/>
</div>
@ -115,8 +90,6 @@ export default inject(({ backup }) => {
defaultStorageType,
commonThirdPartyList,
defaultFolderId,
isResetProcess,
isSavingProcess,
} = backup;
const isResourcesDefault =
@ -124,8 +97,6 @@ export default inject(({ backup }) => {
const passedId = isResourcesDefault ? defaultFolderId : "";
return {
isResetProcess,
isSavingProcess,
setSelectedFolder,
passedId,
commonThirdPartyList,

View File

@ -33,8 +33,6 @@ const DirectThirdPartyConnection = (props) => {
isPanelVisible,
isError,
id,
isReset,
isSuccessSave,
withoutBasicSelection,
onSelectFile,
isFileSelection = false,
@ -337,7 +335,7 @@ const DirectThirdPartyConnection = (props) => {
{isFileSelection ? (
<SelectFileInput
foldersList={[folderList]}
passedFoldersTree={[folderList]}
onClose={onClose}
onSelectFile={onSelectFile}
onClickInput={onClickInput}
@ -370,10 +368,8 @@ const DirectThirdPartyConnection = (props) => {
}
isPanelVisible={isPanelVisible}
isError={isError}
foldersList={[folderList]}
passedFoldersTree={[folderList]}
withoutBasicSelection={withoutBasicSelection}
isReset={isReset}
isSuccessSave={isSuccessSave}
isWaitingUpdate={isInitialLoading || isUpdatingInfo ? true : false}
/>
)}

View File

@ -80,7 +80,7 @@ class RoomsModule extends React.Component {
onClickInput={this.onClickInput}
isPanelVisible={isPanelVisible}
isDisabled={isModuleDisabled}
foldersType="exceptSortedByTags"
filteredType="exceptSortedByTags"
{...(selectedFolder && { id: selectedFolder })}
withoutBasicSelection={selectedFolder ? false : true}
/>

View File

@ -122,42 +122,6 @@ class ThirdPartyModule extends React.Component {
const isModuleDisabled = !isMaxProgress || isStartCopy || isLoadingData;
return (
// !isDocSpace ? (
// <>
// <div className="manual-backup_folder-input">
// <SelectFolderInput
// onSelectFolder={this.onSelectFolder}
// name={"thirdParty"}
// onClose={this.onClose}
// onClickInput={this.onClickInput}
// onSetLoadingData={this.onSetLoadingData}
// isDisabled={isModuleDisabled}
// isPanelVisible={isPanelVisible}
// isError={isError}
// foldersType="third-party"
// foldersList={commonThirdPartyList}
// withoutBasicSelection
// />
// </div>
// <div className="manual-backup_buttons">
// <Button
// label={t("Common:Duplicate")}
// onClick={this.onMakeCopy}
// primary
// isDisabled={isModuleDisabled || selectedFolder?.trim() === ""}
// size={buttonSize}
// />
// {!isMaxProgress && (
// <Button
// label={t("Common:CopyOperation") + "..."}
// isDisabled={true}
// size={buttonSize}
// style={{ marginLeft: "8px" }}
// />
// )}
// </div>
// </>
// ) : (
<div className="manual-backup_third-party-module">
<DirectThirdPartyConnection
t={t}
@ -176,7 +140,7 @@ class ThirdPartyModule extends React.Component {
label={t("Common:Duplicate")}
onClick={this.onMakeCopy}
primary
isDisabled={isModuleDisabled || selectedFolder?.trim() === ""}
isDisabled={isModuleDisabled || selectedFolder === ""}
size={buttonSize}
/>
</div>

View File

@ -1,4 +1,4 @@
import React from "react";
import React, { useEffect } from "react";
import FileInput from "@docspace/components/file-input";
const LocalFile = ({ onSelectLocalFile, hasError }) => {
@ -8,6 +8,12 @@ const LocalFile = ({ onSelectLocalFile, hasError }) => {
onSelectLocalFile(data);
};
useEffect(() => {
return () => {
onSelectLocalFile("");
};
}, []);
return (
<FileInput
hasError={hasError}

View File

@ -7,13 +7,12 @@ class RoomsModule extends React.Component {
return (
<SelectFileInputWrapper
{...this.props}
foldersType="exceptSortedByTags"
filteredType="exceptSortedByTags"
withoutProvider
isArchiveOnly
searchParam=".gz"
filesListTitle={t("SelectFileInGZFormat")}
withoutResetFolderTree
ignoreSelectedFolderTree
withSubfolders={false}
maxFolderInputWidth="446px"
withoutBasicSelection
/>

View File

@ -4,18 +4,6 @@ import DirectThirdPartyConnection from "../../common-container/DirectThirdPartyC
const ThirdPartyResources = (props) => {
return (
// return !isDocSpace ? (
// <SelectFileInput
// {...props}
// foldersType="third-party"
// searchParam=".gz"
// filesListTitle={t("SelectFileInGZFormat")}
// withoutResetFolderTree
// ignoreSelectedFolderTree
// isArchiveOnly
// maxFolderInputWidth="446px"
// />
// ) : (
<div className={"restore-backup_third-party-module"}>
<DirectThirdPartyConnection
{...props}

View File

@ -1,5 +1,5 @@
import React, { useEffect } from "react";
import { isDesktop } from "react-device-detect";
import { isMobile } from "react-device-detect";
import { inject, observer } from "mobx-react";
import { useTranslation } from "react-i18next";
@ -21,7 +21,7 @@ const SingleSignOn = (props) => {
const { load, serviceProviderSettings, spMetadata } = props;
const { t } = useTranslation("SingleSignOn");
if (!isDesktop) return <ForbiddenPage />;
if (isMobile) return <ForbiddenPage />;
useEffect(() => {
load();

View File

@ -4,6 +4,8 @@ import { withRouter } from "react-router";
import Layout from "./Layout";
import { combineUrl } from "@docspace/common/utils";
import AppServerConfig from "@docspace/common/constants/AppServerConfig";
import Panels from "../../components/FilesPanels";
const SecuritySettings = lazy(() => import("./categories/security/index.js"));
const TfaPage = lazy(() => import("./categories/security/access-portal/tfa"));
@ -159,6 +161,7 @@ const ERROR_404_URL = combineUrl(AppServerConfig.proxyURL, "/error/404");
const Settings = () => {
return (
<Layout key="1">
<Panels />
<Suspense fallback={null}>
<Switch>
<Route exact path={COMMON_URLS} component={CommonSettings} />

View File

@ -22,7 +22,9 @@ const Header = (props) => {
history,
isAdmin,
filter,
setFilter,
profile,
isMe,
setChangeEmailVisible,
@ -80,9 +82,9 @@ const Header = (props) => {
return (
<StyledHeader
showContextButton={(isAdmin && !profile?.isOwner) || isMe}
isVisitor={profile.isVisitor}
isVisitor={!isAdmin}
>
{!profile.isVisitor && (
{isAdmin && (
<IconButton
iconName="/static/images/arrow.path.react.svg"
size="17"
@ -122,6 +124,7 @@ const Header = (props) => {
export default withRouter(
inject(({ auth, peopleStore }) => {
const { isAdmin } = auth;
const { targetUserStore, filterStore } = peopleStore;
const { filter, setFilterParams } = filterStore;
@ -137,7 +140,9 @@ export default withRouter(
return {
isAdmin,
filter,
setFilter: setFilterParams,
profile: targetUser,
isMe,
setChangeEmailVisible,

View File

@ -62,9 +62,6 @@ class BackupStore {
selectedEnableSchedule = false;
defaultEnableSchedule = false;
isSavingProcess = false;
isResetProcess = false;
storageRegions = [];
constructor() {
@ -574,13 +571,6 @@ class BackupStore {
const isEnable = this.selectedEnableSchedule;
this.selectedEnableSchedule = !isEnable;
};
setSavingProcess = (process) => {
if (process !== this.isSavingProcess) this.isSavingProcess = process;
};
setResetProcess = (process) => {
if (process !== this.isResetProcess) this.isResetProcess = process;
};
convertServiceName = (serviceName) => {
//Docusign, OneDrive, Wordpress

View File

@ -29,6 +29,7 @@ class DialogsStore {
isFolderActions = false;
roomCreation = false;
restoreAllPanelVisible = false;
eventDialogVisible = false;
removeItem = null;
connectItem = null;
@ -116,6 +117,10 @@ class DialogsStore {
this.deleteDialogVisible = deleteDialogVisible;
};
setEventDialogVisible = (eventDialogVisible) => {
this.eventDialogVisible = eventDialogVisible;
};
setDownloadDialogVisible = (downloadDialogVisible) => {
!downloadDialogVisible && this.deselectActiveFiles();
this.downloadDialogVisible = downloadDialogVisible;
@ -263,7 +268,8 @@ class DialogsStore {
this.convertDialogVisible ||
this.selectFileDialogVisible ||
this.authStore.settingsStore.hotkeyPanelVisible ||
this.versionHistoryStore.isVisible
this.versionHistoryStore.isVisible ||
this.eventDialogVisible
);
}

View File

@ -689,17 +689,13 @@ class FilesActionStore {
};
finalizeVersionAction = (id) => {
const { setFile, setIsLoading } = this.filesStore;
const { setFile } = this.filesStore;
setIsLoading(true);
return finalizeVersion(id, 0, false)
.then((res) => {
if (res && res[0]) {
setFile(res[0]);
}
})
.finally(() => setIsLoading(false));
return finalizeVersion(id, 0, false).then((res) => {
if (res && res[0]) {
setFile(res[0]);
}
});
};
duplicateAction = (item, label) => {
@ -1159,8 +1155,6 @@ class FilesActionStore {
const { userAccess } = this.filesStore;
switch (option) {
case "share":
return isAccessedSelected && !personal; //isFavoritesFolder ||isRecentFolder
case "showInfo":
case "copy":
case "download":
@ -1276,16 +1270,6 @@ class FilesActionStore {
} = this.dialogsStore;
switch (option) {
case "share":
if (!this.isAvailableOption("share")) return null;
else
return {
label: t("Share"),
onClick: () => setSharingPanelVisible(true),
iconUrl: "/static/images/share.react.svg",
title: t("Translations:ButtonShareAccess"),
};
case "copy":
if (!this.isAvailableOption("copy")) return null;
else
@ -1416,7 +1400,6 @@ class FilesActionStore {
};
getAnotherFolderOptions = (itemsCollection, t) => {
const share = this.getOption("share", t);
const download = this.getOption("download", t);
const downloadAs = this.getOption("downloadAs", t);
const moveTo = this.getOption("moveTo", t);
@ -1425,7 +1408,6 @@ class FilesActionStore {
const showInfo = this.getOption("showInfo", t);
itemsCollection
.set("share", share)
.set("download", download)
.set("downloadAs", downloadAs)
.set("moveTo", moveTo)
@ -1437,14 +1419,13 @@ class FilesActionStore {
};
getRecentFolderOptions = (itemsCollection, t) => {
const share = this.getOption("share", t);
const download = this.getOption("download", t);
const downloadAs = this.getOption("downloadAs", t);
const copy = this.getOption("copy", t);
const showInfo = this.getOption("showInfo", t);
itemsCollection
.set("share", share)
.set("download", download)
.set("downloadAs", downloadAs)
.set("copy", copy)
@ -1456,14 +1437,13 @@ class FilesActionStore {
getShareFolderOptions = (itemsCollection, t) => {
const { setDeleteDialogVisible, setUnsubscribe } = this.dialogsStore;
const share = this.getOption("share", t);
const download = this.getOption("download", t);
const downloadAs = this.getOption("downloadAs", t);
const copy = this.getOption("copy", t);
const showInfo = this.getOption("showInfo", t);
itemsCollection
.set("share", share)
.set("download", download)
.set("downloadAs", downloadAs)
.set("copy", copy)
@ -1497,15 +1477,12 @@ class FilesActionStore {
getFavoritesFolderOptions = (itemsCollection, t) => {
const { selection } = this.filesStore;
const share = this.getOption("share", t);
const download = this.getOption("download", t);
const downloadAs = this.getOption("downloadAs", t);
const copy = this.getOption("copy", t);
const showInfo = this.getOption("showInfo", t);
itemsCollection
.set("share", share)
.set("download", download)
.set("downloadAs", downloadAs)
.set("copy", copy)

View File

@ -2598,13 +2598,13 @@ class FilesStore {
// const filterTotal = isRoom ? this.roomsFilterTotal : this.filterTotal;
const filterTotal = isRooms ? this.roomsFilter.total : this.filter.total;
console.log("hasMoreFiles isRooms", isRooms);
console.log("hasMoreFiles filesList", this.filesList.length);
console.log("hasMoreFiles this.filterTotal", this.filterTotal);
console.log("hasMoreFiles this.roomsFilterTotal", this.roomsFilterTotal);
console.log("hasMoreFiles filterTotal", filterTotal);
console.log("hasMoreFiles", this.filesList.length < filterTotal);
console.log("----------------------------");
// console.log("hasMoreFiles isRooms", isRooms);
// console.log("hasMoreFiles filesList", this.filesList.length);
// console.log("hasMoreFiles this.filterTotal", this.filterTotal);
// console.log("hasMoreFiles this.roomsFilterTotal", this.roomsFilterTotal);
// console.log("hasMoreFiles filterTotal", filterTotal);
// console.log("hasMoreFiles", this.filesList.length < filterTotal);
// console.log("----------------------------");
if (this.isLoading) return false;
return this.filesList.length < filterTotal;

View File

@ -580,6 +580,10 @@ class HotkeyStore {
// }
}
if (nextForTileDown.isFolder === undefined) {
nextForTileDown.isFolder = !!nextForTileDown.parentId;
}
return nextForTileDown;
}
@ -611,6 +615,11 @@ class HotkeyStore {
} else if (!prevTileFile) {
prevForTileUp = hotkeyCaret;
}
if (prevForTileUp.isFolder === undefined) {
prevForTileUp.isFolder = !!prevForTileUp.parentId;
}
return prevForTileUp;
}

View File

@ -60,8 +60,14 @@ class ProfileActionsStore {
};
onProfileClick = () => {
this.selectedFolderStore.setSelectedFolder(null);
this.treeFoldersStore.setSelectedNode(["accounts"]);
//TODO: add check manager
const { isAdmin, isOwner } = this.authStore.userStore.user;
if (isAdmin || isOwner) {
this.selectedFolderStore.setSelectedFolder(null);
this.treeFoldersStore.setSelectedNode(["accounts"]);
}
history.push(PROFILE_SELF_URL);
};

View File

@ -1,17 +1,11 @@
import { makeObservable, action, observable } from "mobx";
import { makeAutoObservable } from "mobx";
class SelectFileDialogStore {
folderId = null;
fileInfo = null;
fileInfo = {};
constructor() {
makeObservable(this, {
fileInfo: observable,
folderId: observable,
setFolderId: action,
setFile: action,
});
makeAutoObservable(this);
}
setFolderId = (id) => {

View File

@ -1,27 +1,55 @@
import { makeObservable, action, observable } from "mobx";
import { makeAutoObservable } from "mobx";
class SelectFolderDialogStore {
folderId = null;
resultingFolderId = null;
fileInfo = null;
folderTitle = "";
providerKey = null;
baseFolderPath = "";
newFolderPath = "";
isPathError = false;
isLoading = false;
resultingFolderTree = [];
constructor() {
makeObservable(this, {
fileInfo: observable,
folderId: observable,
folderTitle: observable,
providerKey: observable,
setFolderId: action,
setProviderKey: action,
setFolderTitle: action,
});
makeAutoObservable(this);
}
setFolderId = (id) => {
this.folderId = id;
toDefault = () => {
this.resultingFolderId = null;
this.resultingFolderTree = [];
this.baseFolderPath = "";
this.newFolderPath = "";
this.folderTitle = "";
this.isLoading = false;
this.isPathError = false;
this.setProviderKey(null);
};
updateBaseFolderPath = () => {
this.baseFolderPath = this.newFolderPath;
this.setIsPathError(false);
};
resetNewFolderPath = (id) => {
this.newFolderPath = this.baseFolderPath;
this.setIsPathError(false);
this.setResultingFolderId(id);
};
setBaseFolderPath = (baseFolderPath) => {
this.baseFolderPath = baseFolderPath;
};
setIsPathError = (isPathError) => {
this.isPathError = isPathError;
};
setNewFolderPath = (newFolderPath) => {
this.newFolderPath = newFolderPath;
};
setResultingFolderId = (id) => {
this.resultingFolderId = id;
};
setFolderTitle = (title) => {
@ -31,6 +59,14 @@ class SelectFolderDialogStore {
setProviderKey = (providerKey) => {
this.providerKey = providerKey;
};
setIsLoading = (isLoading) => {
this.isLoading = isLoading;
};
setResultingFoldersTree = (tree) => {
this.resultingFolderTree = tree;
};
}
export default new SelectFolderDialogStore();

View File

@ -1,11 +1,6 @@
import styled, { css } from "styled-components";
import {
isMobile,
isMobileOnly,
isTablet,
isDesktop,
} from "react-device-detect";
import { isMobile, isMobileOnly, isTablet } from "react-device-detect";
import {
mobile,
tablet,
@ -82,7 +77,6 @@ const StyledArticle = styled.article`
.scroll-body {
overflow-x: hidden !important;
height: calc(100% - 200px);
${!isDesktop && "padding-top: 16px"};
padding: 0 20px;
@media ${tablet} {

View File

@ -1,7 +1,4 @@
import styled, { css } from "styled-components";
import { isDesktop } from "react-device-detect";
import SearchInput from "@docspace/components/search-input";
const StyledFilterInput = styled.div`

View File

@ -1,7 +1,7 @@
import Base from "@docspace/components/themes/base";
import styled, { keyframes, css } from "styled-components";
import { desktop, tablet } from "@docspace/components/utils/device";
import { isDesktop } from "react-device-detect";
import { isMobile } from "react-device-detect";
const StyledFloatingButtonWrapper = styled.div`
@media ${desktop} {
@ -10,7 +10,7 @@ const StyledFloatingButtonWrapper = styled.div`
right: 0;
bottom: 0;
${isDesktop &&
${!isMobile &&
css`
width: 100px;
height: 70px;

View File

@ -3,7 +3,7 @@ import PropTypes from "prop-types";
import styled, { css } from "styled-components";
//import equal from "fast-deep-equal/react";
//import { LayoutContextConsumer } from "client/Layout/context";
import { isMobile, isMobileOnly, isDesktop } from "react-device-detect";
import { isMobile, isMobileOnly } from "react-device-detect";
import { inject, observer } from "mobx-react";
import Scrollbar from "@docspace/components/scrollbar";
@ -110,7 +110,7 @@ const commonStyles = css`
.files-row-container {
margin-top: -22px;
${isDesktop &&
${!isMobile &&
css`
margin-top: -17px;
`}

View File

@ -139,6 +139,8 @@ const StyledAvatar = styled.div`
font-family: ${(props) => props.theme.fontFamily};
font-style: normal;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
.admin_icon {
rect:nth-child(1) {
fill: ${(props) => props.theme.avatar.administrator.fill};

View File

@ -31,23 +31,39 @@ const StyledScroll = styled.div`
const rowStyles = css`
margin-left: -20px;
width: ${({ width }) => width + 20 + "px !important"};
width: ${({ width }) => width + 36 + "px !important"};
.ReactVirtualized__Grid__innerScrollContainer {
max-width: ${({ width }) => width + 20 + "px !important"};
max-width: ${({ width }) => width + 36 + "px !important"};
}
@media ${tablet} {
width: ${({ width }) => width + 36 + "px !important"};
.ReactVirtualized__Grid__innerScrollContainer {
max-width: ${({ width }) => width + 36 + "px !important"};
}
}
@media ${mobile} {
width: ${({ width }) => width + 28 + "px !important"};
.ReactVirtualized__Grid__innerScrollContainer {
max-width: ${({ width }) => width + 28 + "px !important"};
}
}
.row-list-item {
padding-left: 16px;
width: calc(100% - 16px) !important;
width: calc(100% - 32px) !important;
@media ${tablet} {
padding-left: 20px;
width: calc(100% - 20px) !important;
width: calc(100% - 36px) !important;
}
@media ${mobile} {
width: calc(100% - 20px) !important;
width: calc(100% - 28px) !important;
}
}
`;

View File

@ -2,7 +2,7 @@ let timer = null;
const startInterval = () => {
const elem = document.getElementById("infinite-page-loader");
elem.style.display = "block";
if (elem) elem.style.display = "block";
};
export function showLoader() {

View File

@ -77,6 +77,8 @@ const StyledCheckbox = styled.div`
justify-content: center;
align-items: center;
min-width: 41px;
width: 41px;
${(props) =>
props.mode == "modern" &&
!isMobile &&

View File

@ -8,6 +8,11 @@ import Badge from "../badge";
import Base from "../themes/base";
const StyledTree = styled(Tree)`
span.rc-tree-node-content-wrapper,
span.rc-tree-switcher {
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
.rc-tree-list-holder-inner {
.disable-node {
span.rc-tree-node-content-wrapper {
@ -33,6 +38,22 @@ const StyledTree = styled(Tree)`
}
}
.disable-folder {
span.rc-tree-node-content-wrapper {
pointer-events: none;
span.rc-tree-iconEle {
svg {
path {
fill: ${(props) => props.theme.treeNode.disableColor};
}
}
}
span.rc-tree-title {
color: ${(props) => props.theme.treeNode.disableColor} !important;
}
}
}
.rc-tree-treenode {
height: 36px;
display: flex;

View File

@ -22,7 +22,7 @@ const SelectFileDialog = ({
module: "./SelectFileDialog",
}}
resetTreeFolders
foldersType="exceptPrivacyTrashFolders"
filteredType="exceptPrivacyTrashArchiveFolders"
isPanelVisible={isVisible}
onClose={onCloseFileDialog}
onSelectFile={onSelectFile}

View File

@ -63,7 +63,7 @@ const SelectFolderDialog = ({
folderId={folderId}
isPanelVisible={isVisible}
onClose={onCloseFolderDialog}
foldersType="exceptSortedByTags"
filteredType="exceptSortedByTags"
onSave={onClickSaveSelectFolder}
isDisableButton={!titleSelectorFolder.trim()}
{...headerProps}