mirror of
https://github.com/finos/SymphonyElectron.git
synced 2025-02-25 18:55:29 -06:00
Merge branch 'master' into SDA-1959b
This commit is contained in:
commit
0266bfb7be
@ -1,5 +1,5 @@
|
||||
{
|
||||
"url":"https://foundation-dev.symphony.com",
|
||||
"url":"https://my.symphony.com",
|
||||
"minimizeOnClose" : "ENABLED",
|
||||
"launchOnStartup" : "ENABLED",
|
||||
"alwaysOnTop" : "DISABLED",
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
## Overview
|
||||
|
||||
Using [Packages](http://s.sudre.free.fr/Software/Packages/about.html), we can build a .pkg file for an existing app (.app). The tool allows us to customise the installation procedure so as to capture the user entered pod url amongst other settings.
|
||||
Using [Packages](http://s.sudre.free.fr/Software/Packages/about.html), we can build a .pkg file for an existing app (.app). The tool allows us to customise the installation procedure to capture the admin entered values from `/tmp/sym_settings.txt` and `/tmp/sym_permissions.txt`
|
||||
|
||||
## Pre-requisites
|
||||
|
||||
@ -17,27 +17,21 @@ Once we have [Packages](http://s.sudre.free.fr/Software/Packages/about.html) ins
|
||||
|
||||
The above command creates the build 'Symphony.pkg' and places it into the directory `installer/mac/build` relative to the project root.
|
||||
|
||||
Also note that the packages project file 'symphony-mac-packager.pkgproj' contains link to the plugin bundle and the post install script both of which are relative to 'symphony-mac-packager.pkgproj'.
|
||||
Note that the packages project file 'symphony-mac-packager.pkgproj' contains link to the pre install and the post install scripts both of which are relative to 'symphony-mac-packager.pkgproj'.
|
||||
|
||||
[More command line documentation here](http://s.sudre.free.fr/Software/documentation/Packages/en/Project_Building.html#4)
|
||||
|
||||
## Notes
|
||||
|
||||
Currently, both the plugin source code and the plugin bundle are in the `installer/mac` directory. This helps us create builds in a quicker way than having to maintain another repo and building the plugin every time we build the pkg.
|
||||
|
||||
## Implementation Details
|
||||
|
||||
- The plugin captures data entered by the user and copied it to a temp file
|
||||
- The post installation script then reads data from the temp file and replaces the values in the 'Symphony.config' file in the installed app
|
||||
- Pre installation script checks to see if the version we are installing is higher than the already installed version. If the installed version is lower, it deletes the installed version.
|
||||
- Post installation script reads data from the temp files and replaces the values in the 'Symphony.config' file in the installed app
|
||||
|
||||
## Known Issues
|
||||
|
||||
- During installation, there is a section called "Destination Select" which is skipped based on the OS and it's settings. This is a [known bug](https://stackoverflow.com/questions/4647416/mac-packagemaker-destination-select-step-a-skipping-boption-permanently-disa).
|
||||
- Only macOS 10.7+ versions are supported with the installer plugin
|
||||
- During installation, there is a section called "Destination Select" which is skipped based on the OS and it's settings. This is a [known bug](https://stackoverflow.com/questions/4647416/mac-packagemaker-destination-select-step-a-skipping-boption-permanently-disa).
|
||||
|
||||
## Related links
|
||||
|
||||
- [Packages Mac](http://s.sudre.free.fr/Software/Packages/about.html)
|
||||
- [Packages User Guide](http://s.sudre.free.fr/Software/documentation/Packages/en/Packages_Installation.html)
|
||||
- [Destination Select Bug](https://stackoverflow.com/questions/4647416/mac-packagemaker-destination-select-step-a-skipping-boption-permanently-disa)
|
||||
|
||||
|
@ -1,52 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>BuildMachineOSBuild</key>
|
||||
<string>19C57</string>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>SymphonySettingsPlugin</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.symphony.SymphonySettingsPlugin</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>SymphonySettingsPlugin</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>BNDL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>4.0</string>
|
||||
<key>CFBundleSupportedPlatforms</key>
|
||||
<array>
|
||||
<string>MacOSX</string>
|
||||
</array>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>DTCompiler</key>
|
||||
<string>com.apple.compilers.llvm.clang.1_0</string>
|
||||
<key>DTPlatformBuild</key>
|
||||
<string>11C29</string>
|
||||
<key>DTPlatformVersion</key>
|
||||
<string>GM</string>
|
||||
<key>DTSDKBuild</key>
|
||||
<string>19B90</string>
|
||||
<key>DTSDKName</key>
|
||||
<string>macosx10.15</string>
|
||||
<key>DTXcode</key>
|
||||
<string>1130</string>
|
||||
<key>DTXcodeBuild</key>
|
||||
<string>11C29</string>
|
||||
<key>InstallerSectionTitle</key>
|
||||
<string>Pod Settings</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>10.10</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>Copyright © 2017 Symphony. All rights reserved.</string>
|
||||
<key>NSMainNibFile</key>
|
||||
<string>MyInstallerPane</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string>InstallerSection</string>
|
||||
</dict>
|
||||
</plist>
|
Binary file not shown.
Binary file not shown.
@ -1,16 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>SectionOrder</key>
|
||||
<array>
|
||||
<string>Introduction</string>
|
||||
<string>ReadMe</string>
|
||||
<string>License</string>
|
||||
<string>SymphonySettingsPlugin.bundle</string>
|
||||
<string>Target</string>
|
||||
<string>PackageSelection</string>
|
||||
<string>Install</string>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
Binary file not shown.
Binary file not shown.
@ -1,191 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>files</key>
|
||||
<dict>
|
||||
<key>Resources/Base.lproj/MyInstallerPane.nib</key>
|
||||
<data>
|
||||
YqJEUs+O0NAGFaXYG/PL5/LjGRY=
|
||||
</data>
|
||||
<key>Resources/InstallerSections.plist</key>
|
||||
<data>
|
||||
htLpJqbvPLRCEJWl7tW5JtJh57U=
|
||||
</data>
|
||||
<key>Resources/en.lproj/InfoPlist.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
MKMIqMmrq5wHe2WIb39Zx7uopYM=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>Resources/en.lproj/Localizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
BNnst4BtRwVgmY7KjJHnv/Gi9bA=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>files2</key>
|
||||
<dict>
|
||||
<key>Resources/Base.lproj/MyInstallerPane.nib</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
YqJEUs+O0NAGFaXYG/PL5/LjGRY=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
vrmW//WHQVaIHJrMeFnpvRK5qq2445PL7k/PHsv18/k=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Resources/InstallerSections.plist</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
htLpJqbvPLRCEJWl7tW5JtJh57U=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
s4rwjWW7Gd+XrsmL4BJfMLfOoaUnr8TRXs1Fc6Ieb24=
|
||||
</data>
|
||||
</dict>
|
||||
<key>Resources/en.lproj/InfoPlist.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
MKMIqMmrq5wHe2WIb39Zx7uopYM=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
6fmnl10zA3TcGk73XQtxuW2uRXRq0TLb3Oiprz+uW1M=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>Resources/en.lproj/Localizable.strings</key>
|
||||
<dict>
|
||||
<key>hash</key>
|
||||
<data>
|
||||
BNnst4BtRwVgmY7KjJHnv/Gi9bA=
|
||||
</data>
|
||||
<key>hash2</key>
|
||||
<data>
|
||||
N91Gfh6N6xvbnmDSlWU/PARxExcPoyutwL88q2opqak=
|
||||
</data>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>rules</key>
|
||||
<dict>
|
||||
<key>^Resources/</key>
|
||||
<true/>
|
||||
<key>^Resources/.*\.lproj/</key>
|
||||
<dict>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>1000</real>
|
||||
</dict>
|
||||
<key>^Resources/.*\.lproj/locversion.plist$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>1100</real>
|
||||
</dict>
|
||||
<key>^Resources/Base\.lproj/</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>1010</real>
|
||||
</dict>
|
||||
<key>^version.plist$</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>rules2</key>
|
||||
<dict>
|
||||
<key>.*\.dSYM($|/)</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>11</real>
|
||||
</dict>
|
||||
<key>^(.*/)?\.DS_Store$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>2000</real>
|
||||
</dict>
|
||||
<key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
|
||||
<dict>
|
||||
<key>nested</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>10</real>
|
||||
</dict>
|
||||
<key>^.*</key>
|
||||
<true/>
|
||||
<key>^Info\.plist$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
<key>^PkgInfo$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
<key>^Resources/</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
<key>^Resources/.*\.lproj/</key>
|
||||
<dict>
|
||||
<key>optional</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>1000</real>
|
||||
</dict>
|
||||
<key>^Resources/.*\.lproj/locversion.plist$</key>
|
||||
<dict>
|
||||
<key>omit</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>1100</real>
|
||||
</dict>
|
||||
<key>^Resources/Base\.lproj/</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>1010</real>
|
||||
</dict>
|
||||
<key>^[^/]+$</key>
|
||||
<dict>
|
||||
<key>nested</key>
|
||||
<true/>
|
||||
<key>weight</key>
|
||||
<real>10</real>
|
||||
</dict>
|
||||
<key>^embedded\.provisionprofile$</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
<key>^version\.plist$</key>
|
||||
<dict>
|
||||
<key>weight</key>
|
||||
<real>20</real>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
@ -1,339 +0,0 @@
|
||||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 46;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
3A10EBD41ED4336D0083702F /* MyInstallerPane.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A10EBD31ED4336D0083702F /* MyInstallerPane.m */; };
|
||||
3A10EBD71ED4336D0083702F /* MyInstallerPane.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3A10EBD51ED4336D0083702F /* MyInstallerPane.xib */; };
|
||||
3A10EBDA1ED4336D0083702F /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3A10EBD81ED4336D0083702F /* Localizable.strings */; };
|
||||
3A10EBDC1ED4336D0083702F /* InstallerSections.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3A10EBDB1ED4336D0083702F /* InstallerSections.plist */; };
|
||||
3A10EBE01ED4336D0083702F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3A10EBDE1ED4336D0083702F /* InfoPlist.strings */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
3A10EBCF1ED4336D0083702F /* SymphonySettingsPlugin.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SymphonySettingsPlugin.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
3A10EBD21ED4336D0083702F /* MyInstallerPane.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyInstallerPane.h; sourceTree = "<group>"; };
|
||||
3A10EBD31ED4336D0083702F /* MyInstallerPane.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyInstallerPane.m; sourceTree = "<group>"; };
|
||||
3A10EBD61ED4336D0083702F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MyInstallerPane.xib; sourceTree = "<group>"; };
|
||||
3A10EBD91ED4336D0083702F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
3A10EBDB1ED4336D0083702F /* InstallerSections.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = InstallerSections.plist; sourceTree = "<group>"; };
|
||||
3A10EBDD1ED4336D0083702F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
3A10EBDF1ED4336D0083702F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
3A10EBCC1ED4336D0083702F /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
3A10EBC61ED4336D0083702F = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3A10EBD11ED4336D0083702F /* SymphonySettingsPlugin */,
|
||||
3A10EBD01ED4336D0083702F /* Products */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3A10EBD01ED4336D0083702F /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3A10EBCF1ED4336D0083702F /* SymphonySettingsPlugin.bundle */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3A10EBD11ED4336D0083702F /* SymphonySettingsPlugin */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3A10EBD21ED4336D0083702F /* MyInstallerPane.h */,
|
||||
3A10EBD31ED4336D0083702F /* MyInstallerPane.m */,
|
||||
3A10EBD51ED4336D0083702F /* MyInstallerPane.xib */,
|
||||
3A10EBD81ED4336D0083702F /* Localizable.strings */,
|
||||
3A10EBDB1ED4336D0083702F /* InstallerSections.plist */,
|
||||
3A10EBDD1ED4336D0083702F /* Info.plist */,
|
||||
3A10EBDE1ED4336D0083702F /* InfoPlist.strings */,
|
||||
);
|
||||
path = SymphonySettingsPlugin;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
3A10EBCE1ED4336D0083702F /* SymphonySettingsPlugin */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 3A10EBE31ED4336D0083702F /* Build configuration list for PBXNativeTarget "SymphonySettingsPlugin" */;
|
||||
buildPhases = (
|
||||
3A10EBCB1ED4336D0083702F /* Sources */,
|
||||
3A10EBCC1ED4336D0083702F /* Frameworks */,
|
||||
3A10EBCD1ED4336D0083702F /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = SymphonySettingsPlugin;
|
||||
productName = SymphonySettingsPlugin;
|
||||
productReference = 3A10EBCF1ED4336D0083702F /* SymphonySettingsPlugin.bundle */;
|
||||
productType = "com.apple.product-type.bundle";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
3A10EBC71ED4336D0083702F /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastUpgradeCheck = 1100;
|
||||
ORGANIZATIONNAME = Symphony;
|
||||
TargetAttributes = {
|
||||
3A10EBCE1ED4336D0083702F = {
|
||||
CreatedOnToolsVersion = 8.3.2;
|
||||
DevelopmentTeam = 7S74264P3V;
|
||||
ProvisioningStyle = Automatic;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 3A10EBCA1ED4336D0083702F /* Build configuration list for PBXProject "SymphonySettingsPlugin" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
developmentRegion = en;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
Base,
|
||||
);
|
||||
mainGroup = 3A10EBC61ED4336D0083702F;
|
||||
productRefGroup = 3A10EBD01ED4336D0083702F /* Products */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
3A10EBCE1ED4336D0083702F /* SymphonySettingsPlugin */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
3A10EBCD1ED4336D0083702F /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
3A10EBD71ED4336D0083702F /* MyInstallerPane.xib in Resources */,
|
||||
3A10EBE01ED4336D0083702F /* InfoPlist.strings in Resources */,
|
||||
3A10EBDA1ED4336D0083702F /* Localizable.strings in Resources */,
|
||||
3A10EBDC1ED4336D0083702F /* InstallerSections.plist in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
3A10EBCB1ED4336D0083702F /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
3A10EBD41ED4336D0083702F /* MyInstallerPane.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
3A10EBD51ED4336D0083702F /* MyInstallerPane.xib */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
3A10EBD61ED4336D0083702F /* Base */,
|
||||
);
|
||||
name = MyInstallerPane.xib;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3A10EBD81ED4336D0083702F /* Localizable.strings */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
3A10EBD91ED4336D0083702F /* en */,
|
||||
);
|
||||
name = Localizable.strings;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3A10EBDE1ED4336D0083702F /* InfoPlist.strings */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
3A10EBDF1ED4336D0083702F /* en */,
|
||||
);
|
||||
name = InfoPlist.strings;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXVariantGroup section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
3A10EBE11ED4336D0083702F /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_IDENTITY = "-";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.10;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
3A10EBE21ED4336D0083702F /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_IDENTITY = "-";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.10;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = macosx;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
3A10EBE41ED4336D0083702F /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEVELOPMENT_TEAM = 7S74264P3V;
|
||||
INFOPLIST_FILE = SymphonySettingsPlugin/Info.plist;
|
||||
INSTALL_PATH = "$(HOME)/Library/Bundles";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.10;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.symphony.SymphonySettingsPlugin;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
WRAPPER_EXTENSION = bundle;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
3A10EBE51ED4336D0083702F /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEVELOPMENT_TEAM = 7S74264P3V;
|
||||
INFOPLIST_FILE = SymphonySettingsPlugin/Info.plist;
|
||||
INSTALL_PATH = "$(HOME)/Library/Bundles";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.10;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.symphony.SymphonySettingsPlugin;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
WRAPPER_EXTENSION = bundle;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
3A10EBCA1ED4336D0083702F /* Build configuration list for PBXProject "SymphonySettingsPlugin" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
3A10EBE11ED4336D0083702F /* Debug */,
|
||||
3A10EBE21ED4336D0083702F /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
3A10EBE31ED4336D0083702F /* Build configuration list for PBXNativeTarget "SymphonySettingsPlugin" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
3A10EBE41ED4336D0083702F /* Debug */,
|
||||
3A10EBE51ED4336D0083702F /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 3A10EBC71ED4336D0083702F /* Project object */;
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "self:SymphonySettingsPlugin.xcodeproj">
|
||||
</FileRef>
|
||||
</Workspace>
|
@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>IDEDidComputeMac32BitWarning</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
@ -1,76 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1100"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "3A10EBCE1ED4336D0083702F"
|
||||
BuildableName = "SymphonySettingsPlugin.bundle"
|
||||
BlueprintName = "SymphonySettingsPlugin"
|
||||
ReferencedContainer = "container:SymphonySettingsPlugin.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Release"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "3A10EBCE1ED4336D0083702F"
|
||||
BuildableName = "SymphonySettingsPlugin.bundle"
|
||||
BlueprintName = "SymphonySettingsPlugin"
|
||||
ReferencedContainer = "container:SymphonySettingsPlugin.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "3A10EBCE1ED4336D0083702F"
|
||||
BuildableName = "SymphonySettingsPlugin.bundle"
|
||||
BlueprintName = "SymphonySettingsPlugin"
|
||||
ReferencedContainer = "container:SymphonySettingsPlugin.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
@ -1,27 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>SchemeUserState</key>
|
||||
<dict>
|
||||
<key>Run - Debug.xcscheme</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<key>SymphonySettingsPlugin.xcscheme</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>SuppressBuildableAutocreation</key>
|
||||
<dict>
|
||||
<key>3A10EBCE1ED4336D0083702F</key>
|
||||
<dict>
|
||||
<key>primary</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
@ -1,427 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
||||
<dependencies>
|
||||
<deployment identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14460.31"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<customObject id="-2" userLabel="File's Owner" customClass="InstallerSection">
|
||||
<connections>
|
||||
<outlet property="firstPane" destination="Qsn-FY-4qK" id="Dhh-1H-QYh"/>
|
||||
</connections>
|
||||
</customObject>
|
||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||
<customObject id="Qsn-FY-4qK" customClass="MyInstallerPane">
|
||||
<connections>
|
||||
<outlet property="alwaysOnTopCheckBox" destination="xJR-Fr-mRt" id="WhA-p1-kga"/>
|
||||
<outlet property="autoLaunchCheckBox" destination="Zqh-0e-vtD" id="ETW-F7-I4U"/>
|
||||
<outlet property="bringToFrontCheckBox" destination="2Me-7N-GvD" id="pH5-dt-hyv"/>
|
||||
<outlet property="contentView" destination="TUK-W2-vig" id="gTd-A7-dof"/>
|
||||
<outlet property="devToolsCheckBox" destination="TGe-oB-TBf" id="qqn-SW-zAf"/>
|
||||
<outlet property="fullScreenCheckBox" destination="duA-yQ-iEf" id="0dM-Fa-K6i"/>
|
||||
<outlet property="geoLocationCheckBox" destination="L6E-73-ezq" id="iLj-hy-quO"/>
|
||||
<outlet property="mediaCheckBox" destination="B4Z-uk-s4I" id="NOT-XU-pPs"/>
|
||||
<outlet property="midiSysexCheckBox" destination="EpT-Lf-0g8" id="Ddj-13-1M2"/>
|
||||
<outlet property="minimizeOnCloseCheckBox" destination="pJv-Z5-S8c" id="hy7-4l-Y2A"/>
|
||||
<outlet property="notificationsCheckBox" destination="X7P-UH-q4X" id="2vt-Ew-8lN"/>
|
||||
<outlet property="openExternalAppCheckBox" destination="5NZ-5a-PIB" id="Abc-i1-mRt"/>
|
||||
<outlet property="parentSection" destination="-2" id="FB7-UV-e8k"/>
|
||||
<outlet property="podUrlAlertTextBox" destination="lha-ib-BpX" id="2Hp-DE-0mS"/>
|
||||
<outlet property="podUrlTextBox" destination="bt3-SN-uKp" id="rpG-WU-oG1"/>
|
||||
<outlet property="pointerLockCheckBox" destination="AuA-RI-UYn" id="6i4-GB-w1Z"/>
|
||||
<outlet property="pointerLockCheckbox" destination="AuA-RI-UYn" id="3FH-1x-REu"/>
|
||||
<outlet property="ssoCheckBox" destination="YPX-1k-Fs4" id="laJ-aN-s7A"/>
|
||||
</connections>
|
||||
</customObject>
|
||||
<customView id="TUK-W2-vig" userLabel="View">
|
||||
<rect key="frame" x="0.0" y="0.0" width="445" height="365"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<tabView toolTip="Pod Settings" fixedFrame="YES" drawsBackground="NO" allowsTruncatedLabels="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QyG-6U-OmT">
|
||||
<rect key="frame" x="-7" y="-10" width="459" height="381"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
<tabViewItems>
|
||||
<tabViewItem label="Settings" identifier="" id="bcH-AH-92V">
|
||||
<view key="view" ambiguous="YES" id="ltw-L5-z8g">
|
||||
<rect key="frame" x="10" y="33" width="439" height="335"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="bt3-SN-uKp">
|
||||
<rect key="frame" x="152" y="278" width="201" height="22"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" title="https://[POD].symphony.com" drawsBackground="YES" usesSingleLineMode="YES" id="4WS-yY-IPf">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hdX-B9-o0w">
|
||||
<rect key="frame" x="15" y="281" width="131" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Symphony Pod URL" id="R21-b3-R67">
|
||||
<font key="font" metaFont="systemBold"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="lRj-wz-i1m">
|
||||
<rect key="frame" x="244" y="222" width="122" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Minimize on Close" id="VXX-cj-1fp">
|
||||
<font key="font" metaFont="systemBold"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="pJv-Z5-S8c">
|
||||
<rect key="frame" x="244" y="152" width="79" height="27"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<buttonCell key="cell" type="check" title="Enable" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="Wks-ms-Dds">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
</button>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Oc1-Dm-yfg">
|
||||
<rect key="frame" x="244" y="114" width="93" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Bring to Front" id="nNz-Ll-NWY">
|
||||
<font key="font" metaFont="systemBold"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="2Me-7N-GvD">
|
||||
<rect key="frame" x="244" y="45" width="79" height="27"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<buttonCell key="cell" type="check" title="Enable" bezelStyle="regularSquare" imagePosition="left" inset="2" id="xdK-SE-fCI">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
</button>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="INy-Sf-8qZ">
|
||||
<rect key="frame" x="15" y="221" width="124" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Launch on Startup" id="m0Q-sb-lur">
|
||||
<font key="font" metaFont="systemBold"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Zqh-0e-vtD">
|
||||
<rect key="frame" x="15" y="152" width="79" height="27"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<buttonCell key="cell" type="check" title="Enable" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="961-eU-jAZ">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
</button>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1Xi-cm-l1K">
|
||||
<rect key="frame" x="244" y="185" width="175" height="28"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Minimize Symphony when closed" id="YlU-cU-Dpo">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="4up-16-Exw">
|
||||
<rect key="frame" x="15" y="185" width="175" height="28"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Launch Symphony when computer starts" id="Gdo-1v-GBn">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="mch-Fi-uVp">
|
||||
<rect key="frame" x="244" y="78" width="175" height="28"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Bring Symphony to front when message is received" id="eaz-Rv-tsn">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Wzo-bc-Yl0">
|
||||
<rect key="frame" x="15" y="114" width="99" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Always on Top" id="hAT-ho-9sn">
|
||||
<font key="font" metaFont="systemBold"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="KDh-Sm-XR0">
|
||||
<rect key="frame" x="15" y="77" width="175" height="28"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Keep Symphony on top of other applications" id="hun-gL-63Y">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="xJR-Fr-mRt">
|
||||
<rect key="frame" x="15" y="44" width="79" height="27"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<buttonCell key="cell" type="check" title="Enable" bezelStyle="regularSquare" imagePosition="left" inset="2" id="9CK-aX-XOH">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
</button>
|
||||
<textField verticalHuggingPriority="750" fixedFrame="YES" allowsExpansionToolTips="YES" textCompletion="NO" translatesAutoresizingMaskIntoConstraints="NO" id="lha-ib-BpX">
|
||||
<rect key="frame" x="150" y="247" width="274" height="22"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" state="on" id="BfU-TS-qd2">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="systemRedColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="YPX-1k-Fs4">
|
||||
<rect key="frame" x="359" y="279" width="49" height="18"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<buttonCell key="cell" type="check" title="SSO" bezelStyle="regularSquare" imagePosition="left" inset="2" id="dgn-Hd-UcT">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<action selector="handleSSOCheckboxStateChange:" target="Qsn-FY-4qK" id="LyC-VX-uCH"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
</view>
|
||||
</tabViewItem>
|
||||
<tabViewItem label="Permissions" identifier="" id="Tgb-j9-73A">
|
||||
<view key="view" id="50f-DH-wx7">
|
||||
<rect key="frame" x="10" y="33" width="439" height="335"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="lmJ-xu-7sT">
|
||||
<rect key="frame" x="17" y="301" width="101" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Media" id="dGH-H5-EpA">
|
||||
<font key="font" metaFont="systemBold"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="B4Z-uk-s4I">
|
||||
<rect key="frame" x="17" y="238" width="69" height="27"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<buttonCell key="cell" type="check" title=" Allow" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="TkH-Ca-6a3">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
</button>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="8ma-2K-tuH">
|
||||
<rect key="frame" x="17" y="261" width="126" height="32"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Access to Camera, Audio, Microphone" id="OYI-4m-8XD">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="x9w-2S-xbk">
|
||||
<rect key="frame" x="17" y="203" width="88" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Notifications" id="Lyz-nb-hmB">
|
||||
<font key="font" metaFont="systemBold"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="X7P-UH-q4X">
|
||||
<rect key="frame" x="17" y="140" width="69" height="27"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<buttonCell key="cell" type="check" title=" Allow" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="ubi-Bn-kql">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
</button>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="qTp-QP-l7r">
|
||||
<rect key="frame" x="17" y="163" width="126" height="32"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Chrome Native Notifications" id="vHI-Mt-ZV2">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="V1I-f0-O6n">
|
||||
<rect key="frame" x="17" y="105" width="101" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Geo Location" id="ckp-zw-fJC">
|
||||
<font key="font" metaFont="systemBold"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ogb-gv-9Wz">
|
||||
<rect key="frame" x="17" y="65" width="126" height="32"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Symphony Accessing user location" id="wAZ-do-onR">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="L6E-73-ezq">
|
||||
<rect key="frame" x="17" y="35" width="69" height="27"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<buttonCell key="cell" type="check" title=" Allow" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="Vzz-Is-k3v">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
</button>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6L4-kr-but">
|
||||
<rect key="frame" x="159" y="301" width="101" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Pointer Lock" id="H1v-Lk-USy">
|
||||
<font key="font" metaFont="systemBold"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="AuA-RI-UYn">
|
||||
<rect key="frame" x="159" y="238" width="69" height="27"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<buttonCell key="cell" type="check" title=" Allow" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="2Qa-wv-TEa">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
</button>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="4eD-lV-xNb">
|
||||
<rect key="frame" x="159" y="261" width="126" height="32"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Locking a pointer in Symphony context" id="b6W-z1-jFL">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="7yg-Fe-7yk">
|
||||
<rect key="frame" x="159" y="203" width="101" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Full Screen" id="NFT-4J-chs">
|
||||
<font key="font" metaFont="systemBold"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="duA-yQ-iEf">
|
||||
<rect key="frame" x="159" y="140" width="69" height="27"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<buttonCell key="cell" type="check" title=" Allow" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="gFe-lr-eb0">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
</button>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="jz5-3O-sm5">
|
||||
<rect key="frame" x="159" y="163" width="126" height="32"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Accessing full screen in Symphony context" id="UC5-bq-a56">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="I1n-yg-bzf">
|
||||
<rect key="frame" x="159" y="105" width="126" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Open External App" id="Wew-Lc-ypX">
|
||||
<font key="font" metaFont="systemBold"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hYH-Vt-anY">
|
||||
<rect key="frame" x="159" y="65" width="126" height="32"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Opening External app from Symphony" id="HnH-UO-NrW">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="5NZ-5a-PIB">
|
||||
<rect key="frame" x="159" y="35" width="69" height="27"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<buttonCell key="cell" type="check" title=" Allow" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="GbH-xy-gh2">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
</button>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ZsT-ns-fQ1">
|
||||
<rect key="frame" x="298" y="301" width="70" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="MidiSysex" id="Sgj-S7-tne">
|
||||
<font key="font" metaFont="systemBold"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="EpT-Lf-0g8">
|
||||
<rect key="frame" x="298" y="238" width="69" height="27"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<buttonCell key="cell" type="check" title=" Allow" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="aSo-6F-oCF">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
</button>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="CB1-IS-bIc">
|
||||
<rect key="frame" x="298" y="261" width="126" height="32"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Access to external connected devices" id="r4B-Jw-Y03">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
</subviews>
|
||||
</view>
|
||||
</tabViewItem>
|
||||
<tabViewItem label="Security" identifier="" id="vrn-fr-Dgw" userLabel="Security">
|
||||
<view key="view" id="m10-37-sFo">
|
||||
<rect key="frame" x="10" y="33" width="439" height="335"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="gme-WH-3ls">
|
||||
<rect key="frame" x="15" y="284" width="114" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="Enable Dev Tools" id="UlB-kZ-FRf">
|
||||
<font key="font" metaFont="systemBold"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="TGe-oB-TBf">
|
||||
<rect key="frame" x="15" y="215" width="79" height="27"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<buttonCell key="cell" type="check" title="Enable" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="ftT-x5-nva">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
</button>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ggB-Ig-gRa">
|
||||
<rect key="frame" x="15" y="248" width="112" height="28"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Enable dev tools for troubleshooting" id="XrC-xT-jAS">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
</subviews>
|
||||
</view>
|
||||
</tabViewItem>
|
||||
</tabViewItems>
|
||||
</tabView>
|
||||
</subviews>
|
||||
<point key="canvasLocation" x="152.5" y="186.5"/>
|
||||
</customView>
|
||||
</objects>
|
||||
</document>
|
@ -1,30 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>BNDL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>4.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>InstallerSectionTitle</key>
|
||||
<string>Pod Settings</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>Copyright © 2017 Symphony. All rights reserved.</string>
|
||||
<key>NSMainNibFile</key>
|
||||
<string>MyInstallerPane</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string>InstallerSection</string>
|
||||
</dict>
|
||||
</plist>
|
@ -1,16 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>SectionOrder</key>
|
||||
<array>
|
||||
<string>Introduction</string>
|
||||
<string>ReadMe</string>
|
||||
<string>License</string>
|
||||
<string>SymphonySettingsPlugin.bundle</string>
|
||||
<string>Target</string>
|
||||
<string>PackageSelection</string>
|
||||
<string>Install</string>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
@ -1,31 +0,0 @@
|
||||
//
|
||||
// MyInstallerPane.h
|
||||
// SymphonySettingsPlugin
|
||||
//
|
||||
// Copyright © 2017 Symphony. All rights reserved.
|
||||
//
|
||||
|
||||
#import <InstallerPlugins/InstallerPlugins.h>
|
||||
|
||||
@interface MyInstallerPane : InstallerPane<NSTextFieldDelegate>
|
||||
|
||||
@property (weak) IBOutlet NSButton *minimizeOnCloseCheckBox;
|
||||
@property (weak) IBOutlet NSButton *autoLaunchCheckBox;
|
||||
@property (weak) IBOutlet NSTextField *podUrlTextBox;
|
||||
@property (weak) IBOutlet NSButton *alwaysOnTopCheckBox;
|
||||
@property (weak) IBOutlet NSTextField *podUrlAlertTextBox;
|
||||
@property (weak) IBOutlet NSButton *bringToFrontCheckBox;
|
||||
@property (weak) IBOutlet NSButton *devToolsCheckBox;
|
||||
|
||||
@property (weak) IBOutlet NSButton *mediaCheckBox;
|
||||
@property (weak) IBOutlet NSButton *geoLocationCheckBox;
|
||||
@property (weak) IBOutlet NSButton *notificationsCheckBox;
|
||||
|
||||
@property (weak) IBOutlet NSButton *pointerLockCheckBox;
|
||||
@property (weak) IBOutlet NSButton *fullScreenCheckBox;
|
||||
@property (weak) IBOutlet NSButton *openExternalAppCheckBox;
|
||||
@property (weak) IBOutlet NSButton *midiSysexCheckBox;
|
||||
|
||||
@property (weak) IBOutlet NSButton *ssoCheckBox;
|
||||
|
||||
@end
|
@ -1,193 +0,0 @@
|
||||
//
|
||||
// MyInstallerPane.m
|
||||
// SymphonySettingsPlugin
|
||||
//
|
||||
// Copyright © 2017 Symphony. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MyInstallerPane.h"
|
||||
|
||||
@implementation MyInstallerPane
|
||||
|
||||
- (NSString *)title
|
||||
{
|
||||
return [[NSBundle bundleForClass:[self class]] localizedStringForKey:@"PaneTitle" value:nil table:nil];
|
||||
}
|
||||
|
||||
- (void)willEnterPane:(InstallerSectionDirection)dir {
|
||||
// By default, set the value of the error message textbox to an empty string
|
||||
_podUrlAlertTextBox.stringValue = @"";
|
||||
[_podUrlTextBox setToolTip:@"Enter pod url in the format \"https://corporate.symphony.com\""];
|
||||
|
||||
[_ssoCheckBox setToolTip:@"Only check this option if your Symphony POD has been configured for SSO, in doubt do not check - contact your Symphony Admin"];
|
||||
}
|
||||
|
||||
- (BOOL)shouldExitPane:(InstallerSectionDirection)dir {
|
||||
|
||||
NSString *podUrl = [_podUrlTextBox stringValue];
|
||||
|
||||
// Now, validate the url against a url regex
|
||||
NSString *regex = @"^(https:\\/\\/)?(www.)?[a-zA-Z0-9]+([\\-\\.]{1}[a-zA-Z0-9]+)*\\.[a-zA-Z]{2,}(:[0-9]{1,5})?(\\/[a-zA-Z0-9-_.+!*'(),;\\/?:@=&$]*)?$";
|
||||
|
||||
NSPredicate *podUrlTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
|
||||
|
||||
if (![podUrlTest evaluateWithObject:podUrl]) {
|
||||
_podUrlAlertTextBox.stringValue = @"Please enter a valid Pod url.";
|
||||
return NO;
|
||||
}
|
||||
|
||||
if ([podUrl rangeOfString:@"[POD]"].location != NSNotFound) {
|
||||
_podUrlAlertTextBox.stringValue = @"Please enter a valid Pod url.";
|
||||
return NO;
|
||||
}
|
||||
|
||||
// Double confirmation for disabling media
|
||||
if ([_mediaCheckBox state] == 0) {
|
||||
|
||||
NSAlert *alert = [[NSAlert alloc] init];
|
||||
[alert setMessageText: @"Are you sure you wish to disable the camera, microphone, and speakers?"];
|
||||
[alert setInformativeText:@"Once disabled, users won't be able to participate in RTC calls effectively"];
|
||||
[alert addButtonWithTitle:@"No"];
|
||||
[alert addButtonWithTitle:@"Yes"];
|
||||
[alert setAlertStyle:NSWarningAlertStyle];
|
||||
|
||||
NSInteger button = [alert runModal];
|
||||
|
||||
if (button == NSAlertFirstButtonReturn) {
|
||||
return NO;
|
||||
}
|
||||
|
||||
return YES;
|
||||
|
||||
}
|
||||
|
||||
return YES;
|
||||
|
||||
}
|
||||
|
||||
- (void)willExitPane:(InstallerSectionDirection)dir {
|
||||
|
||||
[self writeSettingsToFile];
|
||||
[self writePermissionsToFile];
|
||||
|
||||
}
|
||||
|
||||
- (void)writeSettingsToFile {
|
||||
|
||||
NSString *podUrl = [_podUrlTextBox stringValue];
|
||||
|
||||
NSString *securePrefix = @"https://";
|
||||
if (![podUrl hasPrefix:securePrefix]) {
|
||||
podUrl = [securePrefix stringByAppendingString:podUrl];
|
||||
[_podUrlTextBox setStringValue:podUrl];
|
||||
}
|
||||
|
||||
// By default, set autoLaunchOnStart and minimizeOnClose to true
|
||||
NSString *autoLaunchOnStart = @"true";
|
||||
NSString *minimizeOnClose = @"true";
|
||||
NSString *alwaysOnTop = @"false";
|
||||
NSString *bringToFront = @"false";
|
||||
NSString *devToolsEnabled = @"true\n";
|
||||
|
||||
// If the checkbox is changed, set the auto launch value accordingly
|
||||
if ([_autoLaunchCheckBox state] == 0) {
|
||||
autoLaunchOnStart = @"false";
|
||||
}
|
||||
|
||||
// If the checkbox is changed, set the minimize on close value accordingly
|
||||
if ([_minimizeOnCloseCheckBox state] == 0) {
|
||||
minimizeOnClose = @"false";
|
||||
}
|
||||
|
||||
// If the checkbox is changed, set the always on top value accordingly
|
||||
if ([_alwaysOnTopCheckBox state] == 1) {
|
||||
alwaysOnTop = @"true";
|
||||
}
|
||||
|
||||
// If the checkbox is changed, set the bring to front value accordingly
|
||||
if ([_bringToFrontCheckBox state] == 1) {
|
||||
bringToFront = @"true";
|
||||
}
|
||||
|
||||
// If the checkbox is changed, set the dev tools enabled value accordingly
|
||||
if ([_devToolsCheckBox state] == 0) {
|
||||
devToolsEnabled = @"false\n";
|
||||
}
|
||||
|
||||
// Create an array with the selected options
|
||||
NSArray *symSettings = [[NSArray alloc] initWithObjects:podUrl, minimizeOnClose, autoLaunchOnStart, alwaysOnTop, bringToFront, devToolsEnabled, nil];
|
||||
|
||||
// Create a string from the array with new-line as the separator
|
||||
NSString *symSettingsString = [symSettings componentsJoinedByString:@"\n"];
|
||||
|
||||
// Write all the above settings to file
|
||||
[symSettingsString writeToFile:@"/tmp/sym_settings.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
|
||||
|
||||
}
|
||||
|
||||
- (void)writePermissionsToFile {
|
||||
|
||||
// By default, set all the values to true
|
||||
NSString *media = @"true";
|
||||
NSString *geoLocation = @"true";
|
||||
NSString *notifications = @"true";
|
||||
NSString *pointerLock = @"true";
|
||||
NSString *fullScreen = @"true";
|
||||
NSString *openExternalApp = @"true";
|
||||
NSString *midiSysex = @"true";
|
||||
|
||||
if ([_mediaCheckBox state] == 0) {
|
||||
media = @"false";
|
||||
}
|
||||
|
||||
if ([_geoLocationCheckBox state] == 0) {
|
||||
geoLocation = @"false";
|
||||
}
|
||||
|
||||
if ([_notificationsCheckBox state] == 0) {
|
||||
notifications = @"false";
|
||||
}
|
||||
|
||||
if ([_pointerLockCheckBox state] == 0) {
|
||||
pointerLock = @"false";
|
||||
}
|
||||
|
||||
if ([_fullScreenCheckBox state] == 0) {
|
||||
fullScreen = @"false";
|
||||
}
|
||||
|
||||
if ([_openExternalAppCheckBox state] == 0) {
|
||||
openExternalApp = @"false";
|
||||
}
|
||||
|
||||
if ([_midiSysexCheckBox state] == 0) {
|
||||
midiSysex = @"false";
|
||||
}
|
||||
|
||||
// Create an array with the selected options
|
||||
NSArray *symPermissions = [[NSArray alloc] initWithObjects:media, geoLocation, notifications, midiSysex, pointerLock, fullScreen, openExternalApp, nil];
|
||||
|
||||
// Create a string from the array with new-line as the separator
|
||||
NSString *symPermissionsString = [symPermissions componentsJoinedByString:@"\n"];
|
||||
|
||||
// Write all the above settings to file
|
||||
[symPermissionsString writeToFile:@"/tmp/sym_permissions.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
|
||||
|
||||
}
|
||||
|
||||
- (IBAction)handleSSOCheckboxStateChange:(id)sender {
|
||||
|
||||
NSString *podUrl = [_podUrlTextBox stringValue];
|
||||
|
||||
NSString *ssoUrl = @"/login/sso/initsso";
|
||||
if ([_ssoCheckBox state] == 1) {
|
||||
podUrl = [podUrl stringByAppendingString:ssoUrl];
|
||||
[_podUrlTextBox setStringValue:podUrl];
|
||||
} else {
|
||||
podUrl = [podUrl substringToIndex:podUrl.length - ssoUrl.length];
|
||||
[_podUrlTextBox setStringValue:podUrl];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@end
|
@ -1,2 +0,0 @@
|
||||
InstallerSectionTitle = "Pod Settings";
|
||||
|
@ -1,3 +0,0 @@
|
||||
/* Localized versions of Info.plist keys */
|
||||
|
||||
"PaneTitle" = "Pod Settings";
|
@ -15,22 +15,13 @@ always_on_top=$(sed -n '4p' ${settingsFilePath});
|
||||
bring_to_front=$(sed -n '5p' ${settingsFilePath});
|
||||
dev_tools_enabled=$(sed -n '6p' ${settingsFilePath});
|
||||
|
||||
if [ "$pod_url" == "" ]; then
|
||||
pod_url="https://my.symphony.com"
|
||||
fi
|
||||
|
||||
## If any of the above values turn out to be empty, set default values ##
|
||||
if [ "$pod_url" == "" ]; then pod_url="https://my.symphony.com"; fi
|
||||
if [ "$minimize_on_close" == "" ] || [ "$minimize_on_close" == 'true' ]; then minimize_on_close='ENABLED'; else minimize_on_close='DISABLED'; fi
|
||||
|
||||
if [ "$launch_on_startup" == "" ] || [ "$launch_on_startup" == 'true' ]; then launch_on_startup='ENABLED'; else launch_on_startup='DISABLED'; fi
|
||||
|
||||
if [ "$always_on_top" == "" ] || [ "$always_on_top" == 'false' ]; then always_on_top='DISABLED'; else always_on_top='ENABLED'; fi
|
||||
|
||||
if [ "$bring_to_front" == "" ] || [ "$bring_to_front" == 'false' ]; then bring_to_front='DISABLED'; else bring_to_front='ENABLED'; fi
|
||||
|
||||
if [ "$dev_tools_enabled" == "" ]; then
|
||||
dev_tools_enabled=true;
|
||||
fi
|
||||
|
||||
if [ "$dev_tools_enabled" == "" ]; then dev_tools_enabled=true; fi
|
||||
pod_url_escaped=$(sed 's#[&/\]#\\&#g' <<<"$pod_url")
|
||||
|
||||
## Replace the default settings with the user selected settings ##
|
||||
@ -41,9 +32,6 @@ sed -i "" -E "s#\"launchOnStartup\" ?: ?\"([Ee][Nn][Aa][Bb][Ll][Ee][Dd]|[Dd][Ii]
|
||||
sed -i "" -E "s#\"bringToFront\" ?: ?\"([Ee][Nn][Aa][Bb][Ll][Ee][Dd]|[Dd][Ii][Ss][Aa][Bb][Ll][Ee][Dd])\"#\"bringToFront\":\ \"$bring_to_front\"#g" ${newPath}
|
||||
sed -i "" -E "s#\"devToolsEnabled\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])#\"devToolsEnabled\":\ $dev_tools_enabled#g" ${newPath}
|
||||
|
||||
## Remove the temp settings file created ##
|
||||
rm -f ${settingsFilePath}
|
||||
|
||||
## Get Symphony Permissions from the temp file ##
|
||||
media=$(sed -n '1p' ${permissionsFilePath});
|
||||
geo_location=$(sed -n '2p' ${permissionsFilePath});
|
||||
@ -53,33 +41,14 @@ pointer_lock=$(sed -n '5p' ${permissionsFilePath});
|
||||
full_screen=$(sed -n '6p' ${permissionsFilePath});
|
||||
open_external_app=$(sed -n '7p' ${permissionsFilePath});
|
||||
|
||||
if [ "$media" == "" ]; then
|
||||
media=true;
|
||||
fi
|
||||
|
||||
if [ "$geo_location" == "" ]; then
|
||||
geo_location=true;
|
||||
fi
|
||||
|
||||
if [ "$notifications" == "" ]; then
|
||||
notifications=true;
|
||||
fi
|
||||
|
||||
if [ "$midi_sysex" == "" ]; then
|
||||
midi_sysex=true;
|
||||
fi
|
||||
|
||||
if [ "$pointer_lock" == "" ]; then
|
||||
pointer_lock=true;
|
||||
fi
|
||||
|
||||
if [ "$full_screen" == "" ]; then
|
||||
full_screen=true;
|
||||
fi
|
||||
|
||||
if [ "$open_external_app" == "" ]; then
|
||||
open_external_app=true;
|
||||
fi
|
||||
## If any of the above values turn out to be empty, set default values ##
|
||||
if [ "$media" == "" ]; then media=true; fi
|
||||
if [ "$geo_location" == "" ]; then geo_location=true; fi
|
||||
if [ "$notifications" == "" ]; then notifications=true; fi
|
||||
if [ "$midi_sysex" == "" ]; then midi_sysex=true; fi
|
||||
if [ "$pointer_lock" == "" ]; then pointer_lock=true;fi
|
||||
if [ "$full_screen" == "" ]; then full_screen=true; fi
|
||||
if [ "$open_external_app" == "" ]; then open_external_app=true; fi
|
||||
|
||||
## Replace the default permissions with the user selected permissions ##
|
||||
sed -i "" -E "s#\"media\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])#\"media\":\ $media#g" ${newPath}
|
||||
@ -90,6 +59,6 @@ sed -i "" -E "s#\"pointerLock\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])#\"po
|
||||
sed -i "" -E "s#\"fullscreen\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])#\"fullscreen\":\ $full_screen#g" ${newPath}
|
||||
sed -i "" -E "s#\"openExternal\" ?: ?([Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee])#\"openExternal\":\ $open_external_app#g" ${newPath}
|
||||
|
||||
|
||||
## Remove the temp permissions file created ##
|
||||
## Remove the temp settings & permissions file created ##
|
||||
rm -f ${settingsFilePath}
|
||||
rm -f ${permissionsFilePath}
|
||||
|
@ -494,7 +494,7 @@
|
||||
<key>FOLLOW_SYMBOLIC_LINKS</key>
|
||||
<false/>
|
||||
<key>IDENTIFIER</key>
|
||||
<string>com.symphony.symphony-desktop</string>
|
||||
<string>com.symphony.electron-desktop</string>
|
||||
<key>LOCATION</key>
|
||||
<integer>0</integer>
|
||||
<key>NAME</key>
|
||||
@ -510,7 +510,7 @@
|
||||
<key>USE_HFS+_COMPRESSION</key>
|
||||
<false/>
|
||||
<key>VERSION</key>
|
||||
<string>2.0.0</string>
|
||||
<string>8.0.0</string>
|
||||
</dict>
|
||||
<key>TYPE</key>
|
||||
<integer>0</integer>
|
||||
@ -661,17 +661,6 @@
|
||||
<key>LIST_TITLE_KEY</key>
|
||||
<string>InstallerSectionTitle</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
|
||||
<string>ICPresentationViewInstallerPluginController</string>
|
||||
<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_INSTALLERPLUGIN_PATH</key>
|
||||
<dict>
|
||||
<key>PATH</key>
|
||||
<string>SymphonySettingsPlugin.bundle</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
|
||||
<string>ICPresentationViewDestinationSelectController</string>
|
||||
@ -715,9 +704,9 @@
|
||||
<key>VALUE</key>
|
||||
<dict>
|
||||
<key>PATH</key>
|
||||
<string>intro.html</string>
|
||||
<string>/Users/vishwas/Code/symphony/SymphonyElectron/installer/mac/intro.html</string>
|
||||
<key>PATH_TYPE</key>
|
||||
<integer>3</integer>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
</array>
|
||||
@ -766,7 +755,7 @@
|
||||
<key>IC_REQUIREMENT_OS_DISTRIBUTION_TYPE</key>
|
||||
<integer>0</integer>
|
||||
<key>IC_REQUIREMENT_OS_MINIMUM_VERSION</key>
|
||||
<integer>100700</integer>
|
||||
<integer>100900</integer>
|
||||
</dict>
|
||||
<key>IC_REQUIREMENT_CHECK_TYPE</key>
|
||||
<integer>1</integer>
|
||||
@ -781,11 +770,11 @@
|
||||
</dict>
|
||||
<dict>
|
||||
<key>BEHAVIOR</key>
|
||||
<integer>3</integer>
|
||||
<integer>2</integer>
|
||||
<key>DICTIONARY</key>
|
||||
<dict>
|
||||
<key>IC_REQUIREMENT_RAM_MINIMUM_SIZE_INDEX</key>
|
||||
<integer>5</integer>
|
||||
<integer>6</integer>
|
||||
</dict>
|
||||
<key>IC_REQUIREMENT_CHECK_TYPE</key>
|
||||
<integer>0</integer>
|
||||
@ -800,7 +789,7 @@
|
||||
</dict>
|
||||
<dict>
|
||||
<key>BEHAVIOR</key>
|
||||
<integer>3</integer>
|
||||
<integer>2</integer>
|
||||
<key>DICTIONARY</key>
|
||||
<dict>
|
||||
<key>IC_REQUIREMENT_CPU_ARCHITECTURE_FAMILY</key>
|
||||
@ -810,7 +799,7 @@
|
||||
<key>IC_REQUIREMENT_CPU_MINIMUM_CPU_CORES_COUNT</key>
|
||||
<integer>1</integer>
|
||||
<key>IC_REQUIREMENT_CPU_MINIMUM_FREQUENCY</key>
|
||||
<integer>0</integer>
|
||||
<integer>2000000</integer>
|
||||
<key>IC_REQUIREMENT_CPU_POWERPC_ARCHITECTURE_TYPE</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
|
8
package-lock.json
generated
8
package-lock.json
generated
@ -17739,16 +17739,16 @@
|
||||
}
|
||||
},
|
||||
"screen-share-indicator-frame": {
|
||||
"version": "1.4.4",
|
||||
"resolved": "git+https://github.com/symphonyoss/ScreenShareIndicatorFrame.git#e389ca1e037d174de4b5facb69e435c32c74db76",
|
||||
"version": "1.4.6",
|
||||
"resolved": "git+https://github.com/symphonyoss/ScreenShareIndicatorFrame.git#32472243f7c840c6f1310fde56b5498598eeb0a8",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"run-script-os": "1.0.7"
|
||||
}
|
||||
},
|
||||
"screen-snippet": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "git+https://github.com/symphonyoss/ScreenSnippet2.git#c493f35831d7bf2a8164945f83c2669781dde3a7",
|
||||
"version": "1.0.7",
|
||||
"resolved": "git+https://github.com/symphonyoss/ScreenSnippet2.git#de0b90b92113b866cbc30a1c0a5f3c8fc0f6a418",
|
||||
"optional": true
|
||||
},
|
||||
"semver": {
|
||||
|
@ -75,8 +75,7 @@
|
||||
"library/indexvalidator.exec",
|
||||
"library/libsymphonysearch.dylib",
|
||||
"library/cryptoLib.dylib",
|
||||
"library/dictionary",
|
||||
"installer/mac/SymphonySettingsPlugin.bundle/Contents/MacOS/SymphonySettingsPlugin"
|
||||
"library/dictionary"
|
||||
]
|
||||
},
|
||||
"win": {
|
||||
|
@ -86,8 +86,8 @@ echo "Running snyk security tests"
|
||||
snyk test --file=package.json --org="$SNYK_ORG"
|
||||
|
||||
# Replace url in config
|
||||
echo "Setting default pod url to https://corporate.symphony.com"
|
||||
sed -i -e 's/\"url\"[[:space:]]*\:[[:space:]]*\".*\"/\"url\":\"https:\/\/corporate.symphony.com\"/g' config/Symphony.config
|
||||
echo "Setting default pod url to https://my.symphony.com"
|
||||
sed -i -e 's/\"url\"[[:space:]]*\:[[:space:]]*\".*\"/\"url\":\"https:\/\/my.symphony.com\"/g' config/Symphony.config
|
||||
|
||||
# Setup the build version
|
||||
echo "Setting build version to ${PARENT_BUILD_VERSION}"
|
||||
|
63
spec/__snapshots__/welcome.spec.ts.snap
Normal file
63
spec/__snapshots__/welcome.spec.ts.snap
Normal file
@ -0,0 +1,63 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`welcome should render correctly 1`] = `
|
||||
<div
|
||||
className="Welcome"
|
||||
lang="en-US"
|
||||
>
|
||||
<div
|
||||
className="Welcome-image-container"
|
||||
>
|
||||
<img
|
||||
alt="Symphony Logo"
|
||||
src="../renderer/assets/symphony-logo-plain.png"
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
className="Welcome-main-container"
|
||||
>
|
||||
<h3
|
||||
className="Welcome-name"
|
||||
>
|
||||
Pod URL
|
||||
</h3>
|
||||
<div
|
||||
className="Welcome-main-container-input-div"
|
||||
>
|
||||
<div
|
||||
className="Welcome-main-container-input-selection"
|
||||
>
|
||||
<input
|
||||
className="Welcome-main-container-podurl-box"
|
||||
onChange={[Function]}
|
||||
type="url"
|
||||
value="https://my.symphony.com"
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
className="Welcome-main-container-sso-box"
|
||||
title="Enable Single Sign On"
|
||||
>
|
||||
<label>
|
||||
<input
|
||||
checked={false}
|
||||
onChange={[Function]}
|
||||
type="checkbox"
|
||||
/>
|
||||
SSO
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<label
|
||||
className="Welcome-message-label"
|
||||
/>
|
||||
<button
|
||||
className="Welcome-continue-button"
|
||||
disabled={false}
|
||||
onClick={[Function]}
|
||||
>
|
||||
Continue
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
132
spec/welcome.spec.ts
Normal file
132
spec/welcome.spec.ts
Normal file
@ -0,0 +1,132 @@
|
||||
import { shallow } from 'enzyme';
|
||||
import * as React from 'react';
|
||||
import Welcome from '../src/renderer/components/welcome';
|
||||
import { ipcRenderer } from './__mocks__/electron';
|
||||
|
||||
describe('welcome', () => {
|
||||
const welcomeLabel = 'welcome';
|
||||
const welcomeMock = {
|
||||
url: 'https://my.symphony.com',
|
||||
message: '',
|
||||
urlValid: true,
|
||||
sso: false,
|
||||
};
|
||||
const onLabelEvent = 'on';
|
||||
const removeListenerLabelEvent = 'removeListener';
|
||||
|
||||
it('should render correctly', () => {
|
||||
const wrapper = shallow(React.createElement(Welcome));
|
||||
expect(wrapper).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it('should call `welcome` event when component is mounted', () => {
|
||||
const spy = jest.spyOn(ipcRenderer, onLabelEvent);
|
||||
shallow(React.createElement(Welcome));
|
||||
expect(spy).toBeCalledWith(welcomeLabel, expect.any(Function));
|
||||
});
|
||||
|
||||
it('should remove listener `welcome` when component is unmounted', () => {
|
||||
const spyMount = jest.spyOn(ipcRenderer, onLabelEvent);
|
||||
const spyUnmount = jest.spyOn(ipcRenderer, removeListenerLabelEvent);
|
||||
|
||||
const wrapper = shallow(React.createElement(Welcome));
|
||||
expect(spyMount).toBeCalledWith(welcomeLabel, expect.any(Function));
|
||||
|
||||
wrapper.unmount();
|
||||
expect(spyUnmount).toBeCalledWith(welcomeLabel, expect.any(Function));
|
||||
});
|
||||
|
||||
it('should call `updateState` when component is mounted', () => {
|
||||
const spy = jest.spyOn(Welcome.prototype, 'setState');
|
||||
shallow(React.createElement(Welcome));
|
||||
|
||||
ipcRenderer.send('welcome', welcomeMock);
|
||||
|
||||
expect(spy).toBeCalledWith(welcomeMock);
|
||||
});
|
||||
|
||||
it('should change pod url in text box', () => {
|
||||
const podUrlMock = {
|
||||
url: 'https://corporate.symphony.com',
|
||||
message: '',
|
||||
urlValid: true,
|
||||
sso: false,
|
||||
};
|
||||
|
||||
const spy = jest.spyOn(Welcome.prototype, 'setState');
|
||||
const updatePodUrlSpy = jest.spyOn(Welcome.prototype, 'updatePodUrl');
|
||||
|
||||
const wrapper = shallow(React.createElement(Welcome));
|
||||
ipcRenderer.send('welcome', welcomeMock);
|
||||
|
||||
const welcomePodUrlBox = `input.Welcome-main-container-podurl-box`;
|
||||
const input = wrapper.find(welcomePodUrlBox);
|
||||
|
||||
input.simulate('focus');
|
||||
input.simulate('change', {target: {value: 'https://corporate.symphony.com'}});
|
||||
|
||||
expect(updatePodUrlSpy).toBeCalled();
|
||||
expect(spy).toBeCalledWith(podUrlMock);
|
||||
});
|
||||
|
||||
it('should show message for invalid pod url', () => {
|
||||
const podUrlMock = {
|
||||
url: 'abcdef',
|
||||
message: 'Please enter a valid url',
|
||||
urlValid: false,
|
||||
sso: false,
|
||||
};
|
||||
|
||||
const spy = jest.spyOn(Welcome.prototype, 'setState');
|
||||
const updatePodUrlSpy = jest.spyOn(Welcome.prototype, 'updatePodUrl');
|
||||
|
||||
const wrapper = shallow(React.createElement(Welcome));
|
||||
ipcRenderer.send('welcome', welcomeMock);
|
||||
|
||||
const welcomePodUrlBox = `input.Welcome-main-container-podurl-box`;
|
||||
const input = wrapper.find(welcomePodUrlBox);
|
||||
|
||||
input.simulate('focus');
|
||||
input.simulate('change', {target: {value: 'abcdef'}});
|
||||
|
||||
expect(updatePodUrlSpy).toBeCalled();
|
||||
expect(spy).toBeCalledWith(podUrlMock);
|
||||
});
|
||||
|
||||
it('should click sso checkbox', () => {
|
||||
const podUrlMock = {
|
||||
url: 'https://my.symphony.com',
|
||||
message: '',
|
||||
urlValid: true,
|
||||
sso: true,
|
||||
};
|
||||
|
||||
const spy = jest.spyOn(Welcome.prototype, 'setState');
|
||||
const updatePodUrlSpy = jest.spyOn(Welcome.prototype, 'updateSsoCheckbox');
|
||||
|
||||
const wrapper = shallow(React.createElement(Welcome));
|
||||
ipcRenderer.send('welcome', welcomeMock);
|
||||
|
||||
const welcomePodUrlBox = `input[type="checkbox"]`;
|
||||
const input = wrapper.find(welcomePodUrlBox);
|
||||
|
||||
input.simulate('focus');
|
||||
input.simulate('change', {target: {checked: true}});
|
||||
|
||||
expect(updatePodUrlSpy).toBeCalled();
|
||||
expect(spy).toBeCalledWith(podUrlMock);
|
||||
});
|
||||
|
||||
it('should set pod url', () => {
|
||||
const spy = jest.spyOn(Welcome.prototype, 'setState');
|
||||
const setPodUrlSpy = jest.spyOn(Welcome.prototype, 'setPodUrl');
|
||||
|
||||
const wrapper = shallow(React.createElement(Welcome));
|
||||
ipcRenderer.send('welcome', welcomeMock);
|
||||
const welcomeContinueButton = `button.Welcome-continue-button`;
|
||||
wrapper.find(welcomeContinueButton).simulate('click');
|
||||
|
||||
expect(setPodUrlSpy).toBeCalled();
|
||||
expect(spy).toBeCalledWith(welcomeMock);
|
||||
});
|
||||
});
|
@ -22,12 +22,8 @@ export enum ClientSwitchType {
|
||||
CLIENT_2_0_DAILY = 'CLIENT_2_0_DAILY',
|
||||
}
|
||||
|
||||
export interface IGlobalConfig {
|
||||
url: string;
|
||||
contextIsolation: boolean;
|
||||
}
|
||||
|
||||
export interface IConfig {
|
||||
url: string;
|
||||
minimizeOnClose: CloudConfigDataTypes;
|
||||
launchOnStartup: CloudConfigDataTypes;
|
||||
alwaysOnTop: CloudConfigDataTypes;
|
||||
@ -51,6 +47,11 @@ export interface IConfig {
|
||||
clientSwitch: ClientSwitchType;
|
||||
}
|
||||
|
||||
export interface IGlobalConfig {
|
||||
url: string;
|
||||
contextIsolation: boolean;
|
||||
}
|
||||
|
||||
export interface ICloudConfig {
|
||||
configVersion?: string;
|
||||
podLevelEntitlements: IPodLevelEntitlements;
|
||||
@ -214,13 +215,13 @@ class Config {
|
||||
* @param data {IConfig}
|
||||
*/
|
||||
public async updateUserConfig(data: Partial<IConfig>): Promise<void> {
|
||||
logger.info(`config-handler: updating user config values with the data`, data);
|
||||
logger.info(`config-handler: updating user config values with the data`, JSON.stringify(data));
|
||||
this.userConfig = { ...this.userConfig, ...data };
|
||||
try {
|
||||
await writeFile(this.userConfigPath, JSON.stringify(this.userConfig), { encoding: 'utf8' });
|
||||
logger.info(`config-handler: updated user config values with the data ${data}`);
|
||||
logger.info(`config-handler: updated user config values with the data ${JSON.stringify(data)}`);
|
||||
} catch (error) {
|
||||
logger.error(`config-handler: failed to update user config file with ${data}`, error);
|
||||
logger.error(`config-handler: failed to update user config file with ${JSON.stringify(data)}`, error);
|
||||
dialog.showErrorBox(`Update failed`, `Failed to update user config due to error: ${error}`);
|
||||
}
|
||||
}
|
||||
@ -323,7 +324,8 @@ class Config {
|
||||
await app.whenReady();
|
||||
await this.readGlobalConfig();
|
||||
logger.info(`config-handler: user config doesn't exist! will create new one and update config`);
|
||||
await this.updateUserConfig({ configVersion: app.getVersion().toString(), buildNumber, ...this.globalConfig } as IConfig);
|
||||
const { url, ...rest } = this.globalConfig as IConfig;
|
||||
await this.updateUserConfig({ configVersion: app.getVersion().toString(), buildNumber, ...rest } as IConfig);
|
||||
}
|
||||
this.userConfig = this.parseConfigData(fs.readFileSync(this.userConfigPath, 'utf8'));
|
||||
logger.info(`config-handler: User configuration: `, this.userConfig);
|
||||
|
@ -51,8 +51,8 @@ export interface ICustomBrowserWindow extends Electron.BrowserWindow {
|
||||
}
|
||||
|
||||
// Default window width & height
|
||||
const DEFAULT_WIDTH: number = 900;
|
||||
const DEFAULT_HEIGHT: number = 900;
|
||||
let DEFAULT_WIDTH: number = 900;
|
||||
let DEFAULT_HEIGHT: number = 900;
|
||||
|
||||
export class WindowHandler {
|
||||
|
||||
@ -88,10 +88,12 @@ export class WindowHandler {
|
||||
private readonly backgroundThrottling: boolean;
|
||||
private readonly windowOpts: ICustomBrowserWindowConstructorOpts;
|
||||
private readonly globalConfig: IGlobalConfig;
|
||||
private readonly userConfig: IConfig;
|
||||
private readonly config: IConfig;
|
||||
// Window reference
|
||||
private readonly windows: object;
|
||||
|
||||
private shouldShowWelcomeScreen: boolean = false;
|
||||
private loadFailError: string | undefined;
|
||||
private mainWindow: ICustomBrowserWindow | null = null;
|
||||
private aboutAppWindow: Electron.BrowserWindow | null = null;
|
||||
@ -105,13 +107,15 @@ export class WindowHandler {
|
||||
// Use these variables only on initial setup
|
||||
this.config = config.getConfigFields([ 'isCustomTitleBar', 'mainWinPos', 'minimizeOnClose', 'notificationSettings', 'alwaysOnTop', 'locale', 'customFlags', 'clientSwitch' ]);
|
||||
logger.info(`window-handler: main windows initialized with following config data`, this.config);
|
||||
|
||||
this.globalConfig = config.getGlobalConfigFields([ 'url', 'contextIsolation' ]);
|
||||
const { disableThrottling } = config.getCloudConfigFields([ 'disableThrottling' ]) as any;
|
||||
const { url, contextIsolation }: IGlobalConfig = this.globalConfig;
|
||||
this.userConfig = config.getUserConfigFields([ 'url' ]);
|
||||
|
||||
const { customFlags } = this.config;
|
||||
const { disableThrottling } = config.getCloudConfigFields([ 'disableThrottling' ]) as any;
|
||||
|
||||
this.windows = {};
|
||||
this.contextIsolation = contextIsolation || false;
|
||||
this.contextIsolation = this.globalConfig.contextIsolation || false;
|
||||
this.backgroundThrottling = (customFlags.disableThrottling !== CloudConfigDataTypes.ENABLED || disableThrottling !== CloudConfigDataTypes.ENABLED);
|
||||
this.isCustomTitleBar = isWindowsOS && this.config.isCustomTitleBar === CloudConfigDataTypes.ENABLED;
|
||||
this.windowOpts = {
|
||||
@ -146,7 +150,7 @@ export class WindowHandler {
|
||||
i18n.setLocale(locale);
|
||||
|
||||
try {
|
||||
const extra = {podUrl: url, process: 'main'};
|
||||
const extra = {podUrl: this.userConfig.url ? this.userConfig.url : this.globalConfig.url, process: 'main'};
|
||||
const defaultOpts = {uploadToServer: false, companyName: 'Symphony', submitURL: ''};
|
||||
crashReporter.start({...defaultOpts, extra});
|
||||
} catch (e) {
|
||||
@ -160,12 +164,28 @@ export class WindowHandler {
|
||||
*/
|
||||
public async createApplication() {
|
||||
|
||||
this.updateVersionInfo();
|
||||
await this.updateVersionInfo();
|
||||
this.spellchecker = new SpellChecker();
|
||||
logger.info(`window-handler: initialized spellchecker module with locale ${this.spellchecker.locale}`);
|
||||
|
||||
logger.info('window-handler: createApplication mainWinPos: ' + JSON.stringify(this.config.mainWinPos));
|
||||
|
||||
let {isFullScreen, isMaximized} = this.config.mainWinPos ? this.config.mainWinPos : {isFullScreen: false, isMaximized: false};
|
||||
|
||||
this.url = WindowHandler.getValidUrl(this.userConfig.url ? this.userConfig.url : this.globalConfig.url);
|
||||
logger.info(`window-handler: setting url ${this.url} from config file!`);
|
||||
|
||||
if (this.globalConfig.url.startsWith('https://my.symphony.com') && !this.userConfig.url) {
|
||||
this.shouldShowWelcomeScreen = true;
|
||||
isMaximized = false;
|
||||
isFullScreen = false;
|
||||
DEFAULT_HEIGHT = 333;
|
||||
DEFAULT_WIDTH = 542;
|
||||
this.windowOpts.resizable = false;
|
||||
this.windowOpts.maximizable = false;
|
||||
this.windowOpts.fullscreenable = false;
|
||||
}
|
||||
|
||||
// set window opts with additional config
|
||||
this.mainWindow = new BrowserWindow({
|
||||
...this.windowOpts, ...getBounds(this.config.mainWinPos, DEFAULT_WIDTH, DEFAULT_HEIGHT),
|
||||
@ -180,31 +200,6 @@ export class WindowHandler {
|
||||
logger.info('window-handler: this.mainWindow.getBounds: ' + JSON.stringify(this.mainWindow.getBounds()));
|
||||
|
||||
this.mainWindow.winName = apiName.mainWindowName;
|
||||
const {isFullScreen, isMaximized} = this.config.mainWinPos ? this.config.mainWinPos : {isFullScreen: false, isMaximized: false};
|
||||
if (isMaximized) {
|
||||
this.mainWindow.maximize();
|
||||
logger.info(`window-handler: window is maximized!`);
|
||||
}
|
||||
|
||||
if (isFullScreen) {
|
||||
logger.info(`window-handler: window is in full screen!`);
|
||||
this.mainWindow.setFullScreen(true);
|
||||
}
|
||||
|
||||
// Event needed to hide native menu bar on Windows 10 as we use custom menu bar
|
||||
this.mainWindow.webContents.once('did-start-loading', () => {
|
||||
logger.info(`window-handler: main window web contents started loading!`);
|
||||
if ((this.config.isCustomTitleBar === CloudConfigDataTypes.ENABLED && isWindowsOS) && this.mainWindow && windowExists(this.mainWindow)) {
|
||||
this.mainWindow.setMenuBarVisibility(false);
|
||||
}
|
||||
// monitors network connection and
|
||||
// displays error banner on failure
|
||||
monitorNetworkInterception();
|
||||
});
|
||||
|
||||
this.url = WindowHandler.getValidUrl(this.globalConfig.url);
|
||||
logger.info(`window-handler: setting url ${this.url} from config file!`);
|
||||
|
||||
// Get url to load from cmd line or from global config file
|
||||
const urlFromCmd = getCommandLineArgs(process.argv, '--url=', false);
|
||||
|
||||
@ -219,22 +214,59 @@ export class WindowHandler {
|
||||
logger.info(`window-handler: url from command line is whitelisted in the config file.`);
|
||||
logger.info(`window-handler: setting ${commandLineUrl} from the command line as the main window url.`);
|
||||
this.url = commandLineUrl;
|
||||
this.shouldShowWelcomeScreen = false;
|
||||
isMaximized = true;
|
||||
isFullScreen = false;
|
||||
this.mainWindow.resizable = true;
|
||||
this.mainWindow.maximizable = true;
|
||||
this.mainWindow.fullScreenable = true;
|
||||
} else {
|
||||
logger.info(`window-handler: url ${commandLineUrl} from command line is NOT WHITELISTED in the config file.`);
|
||||
}
|
||||
} else {
|
||||
logger.info(`window-handler: setting ${commandLineUrl} from the command line as the main window url since pod whitelist is empty.`);
|
||||
this.url = commandLineUrl;
|
||||
this.shouldShowWelcomeScreen = false;
|
||||
isMaximized = true;
|
||||
isFullScreen = false;
|
||||
this.mainWindow.resizable = true;
|
||||
this.mainWindow.maximizable = true;
|
||||
this.mainWindow.fullScreenable = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (isMaximized) {
|
||||
this.mainWindow.maximize();
|
||||
logger.info(`window-handler: window is maximized!`);
|
||||
}
|
||||
|
||||
if (isFullScreen) {
|
||||
logger.info(`window-handler: window is in full screen!`);
|
||||
this.mainWindow.setFullScreen(true);
|
||||
}
|
||||
|
||||
this.startUrl = this.url;
|
||||
if (this.shouldShowWelcomeScreen) {
|
||||
this.handleWelcomeScreen();
|
||||
}
|
||||
// loads the main window with url from config/cmd line
|
||||
this.mainWindow.loadURL(this.url);
|
||||
// check for build expiry in case of test builds
|
||||
this.checkExpiry(this.mainWindow);
|
||||
// need this for postMessage origin
|
||||
this.mainWindow.origin = this.globalConfig.url;
|
||||
|
||||
// Event needed to hide native menu bar on Windows 10 as we use custom menu bar
|
||||
this.mainWindow.webContents.once('did-start-loading', () => {
|
||||
logger.info(`window-handler: main window web contents started loading!`);
|
||||
if ((this.config.isCustomTitleBar === CloudConfigDataTypes.ENABLED && isWindowsOS) && this.mainWindow && windowExists(this.mainWindow)) {
|
||||
this.mainWindow.setMenuBarVisibility(false);
|
||||
}
|
||||
// monitors network connection and
|
||||
// displays error banner on failure
|
||||
monitorNetworkInterception();
|
||||
});
|
||||
|
||||
this.mainWindow.webContents.on('did-finish-load', async () => {
|
||||
logger.info(`window-handler: main window web contents finished loading!`);
|
||||
// early exit if the window has already been destroyed
|
||||
@ -380,6 +412,45 @@ export class WindowHandler {
|
||||
return this.mainWindow;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the use case of showing
|
||||
* welcome screen for first time installs
|
||||
*/
|
||||
public handleWelcomeScreen() {
|
||||
|
||||
if (!this.url || !this.mainWindow) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.url.startsWith('https://my.symphony.com')) {
|
||||
this.url = format({
|
||||
pathname: require.resolve('../renderer/react-window.html'),
|
||||
protocol: 'file',
|
||||
query: {
|
||||
componentName: 'welcome',
|
||||
locale: i18n.getLocale(),
|
||||
},
|
||||
slashes: true,
|
||||
});
|
||||
}
|
||||
|
||||
this.mainWindow.webContents.on('did-finish-load', () => {
|
||||
if (!this.url || !this.mainWindow) {
|
||||
return;
|
||||
}
|
||||
if (this.url.indexOf('welcome')) {
|
||||
this.mainWindow.webContents.send('page-load-welcome', { locale: i18n.getLocale(), resource: i18n.loadedResources });
|
||||
this.mainWindow.webContents.send('welcome', { url: this.startUrl, message: '', urlValid: true, sso: false });
|
||||
}
|
||||
});
|
||||
|
||||
ipcMain.on('set-pod-url', async (_event, newPodUrl: string) => {
|
||||
await config.updateUserConfig({url: newPodUrl, mainWinPos: { ...this.mainWindow!.getPosition(), ...{ height: 900, width: 900 } } });
|
||||
app.relaunch();
|
||||
app.exit();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the main window
|
||||
*/
|
||||
|
@ -195,6 +195,15 @@
|
||||
"Undo": "Undo",
|
||||
"Updating Title bar style requires Symphony to relaunch.": "Updating Title bar style requires Symphony to relaunch.",
|
||||
"View": "View",
|
||||
"Welcome": {
|
||||
"Continue": "Continue",
|
||||
"Enable Single Sign On": "Enable Single Sign On",
|
||||
"Please enter a valid url": "Please enter a valid url",
|
||||
"Pod URL": "Pod URL",
|
||||
"SSO": "SSO",
|
||||
"Symphony Logo": "Symphony",
|
||||
"WelcomeText": "Welcome"
|
||||
},
|
||||
"Window": "Window",
|
||||
"Would you like to restart and apply these new settings now?": "Would you like to restart and apply these new settings now?",
|
||||
"Your administrator has disabled": "Your administrator has disabled",
|
||||
|
@ -195,6 +195,15 @@
|
||||
"Undo": "Undo",
|
||||
"Updating Title bar style requires Symphony to relaunch.": "Updating Title bar style requires Symphony to relaunch.",
|
||||
"View": "View",
|
||||
"Welcome": {
|
||||
"Continue": "Continue",
|
||||
"Enable Single Sign On": "Enable Single Sign On",
|
||||
"Please enter a valid url": "Please enter a valid url",
|
||||
"Pod URL": "Pod URL",
|
||||
"SSO": "SSO",
|
||||
"Symphony Logo": "Symphony",
|
||||
"WelcomeText": "Welcome"
|
||||
},
|
||||
"Window": "Window",
|
||||
"Would you like to restart and apply these new settings now?": "Would you like to restart and apply these new settings now?",
|
||||
"Your administrator has disabled": "Your administrator has disabled",
|
||||
|
@ -196,6 +196,15 @@
|
||||
"Undo": "Annuler la dernière opération",
|
||||
"Updating Title bar style requires Symphony to relaunch.": "La mise à jour du style de la barre de titre nécessite le redémarrage de Symphony.",
|
||||
"View": "Visualiser",
|
||||
"Welcome": {
|
||||
"Continue": "Continuer",
|
||||
"Enable Single Sign On": "Activer la SSO",
|
||||
"Please enter a valid url": "Veuillez saisir une URL valide",
|
||||
"Pod URL": "URL du pod",
|
||||
"SSO": "SSO",
|
||||
"Symphony Logo": "Symphony",
|
||||
"WelcomeText": "Bienvenue"
|
||||
},
|
||||
"Window": "Fenêtre",
|
||||
"Would you like to restart and apply these new settings now?": "Voulez-vous redémarrer et appliquer ce nouveau paramètre maintenant?",
|
||||
"Your administrator has disabled": "Votre administrateur a désactivé",
|
||||
|
@ -195,6 +195,15 @@
|
||||
"Undo": "Annuler la dernière opération",
|
||||
"Updating Title bar style requires Symphony to relaunch.": "La mise à jour du style de la barre de titre nécessite le redémarrage de Symphony.",
|
||||
"View": "Visualiser",
|
||||
"Welcome": {
|
||||
"Continue": "Continuer",
|
||||
"Enable Single Sign On": "Activer la SSO",
|
||||
"Please enter a valid url": "Veuillez saisir une URL valide",
|
||||
"Pod URL": "URL du pod",
|
||||
"SSO": "SSO",
|
||||
"Symphony Logo": "Symphony",
|
||||
"WelcomeText": "Bienvenue"
|
||||
},
|
||||
"Window": "Fenêtre",
|
||||
"Would you like to restart and apply these new settings now?": "Voulez-vous redémarrer et appliquer ce nouveau paramètre maintenant?",
|
||||
"Your administrator has disabled": "Votre administrateur a désactivé",
|
||||
|
@ -195,6 +195,15 @@
|
||||
"Undo": "元に戻す",
|
||||
"Updating Title bar style requires Symphony to relaunch.": "タイトルバーのスタイルを更新するには、Symphonyが再起動する必要があります。",
|
||||
"View": "ビュー",
|
||||
"Welcome": {
|
||||
"Continue": "持続する",
|
||||
"Enable Single Sign On": "シングルサインオンを有効にする",
|
||||
"Please enter a valid url": "有効なURLを入力してください",
|
||||
"Pod URL": "ポッドURL",
|
||||
"SSO": "SSO",
|
||||
"Symphony Logo": "Symphony",
|
||||
"WelcomeText": "ようこそ"
|
||||
},
|
||||
"Window": "ウインドウ",
|
||||
"Would you like to restart and apply these new settings now?": "今すぐ再起動して、新しい設定を適用しますか?",
|
||||
"Your administrator has disabled": "管理者によて無効にされています",
|
||||
|
@ -195,6 +195,15 @@
|
||||
"Undo": "元に戻す",
|
||||
"Updating Title bar style requires Symphony to relaunch.": "タイトルバーのスタイルを更新するには、Symphonyが再起動する必要があります。",
|
||||
"View": "ビュー",
|
||||
"Welcome": {
|
||||
"Continue": "持続する",
|
||||
"Enable Single Sign On": "シングルサインオンを有効にする",
|
||||
"Please enter a valid url": "有効なURLを入力してください",
|
||||
"Pod URL": "ポッドURL",
|
||||
"SSO": "SSO",
|
||||
"Symphony Logo": "Symphony",
|
||||
"WelcomeText": "ようこそ"
|
||||
},
|
||||
"Window": "ウインドウ",
|
||||
"Would you like to restart and apply these new settings now?": "今すぐ再起動して、新しい設定を適用しますか?",
|
||||
"Your administrator has disabled": "管理者によて無効にされています",
|
||||
|
BIN
src/renderer/assets/symphony-logo-plain.png
Normal file
BIN
src/renderer/assets/symphony-logo-plain.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 76 KiB |
141
src/renderer/components/welcome.tsx
Normal file
141
src/renderer/components/welcome.tsx
Normal file
@ -0,0 +1,141 @@
|
||||
import { ipcRenderer } from 'electron';
|
||||
import * as React from 'react';
|
||||
import { i18n } from '../../common/i18n-preload';
|
||||
|
||||
interface IState {
|
||||
url: string;
|
||||
message: string;
|
||||
urlValid: boolean;
|
||||
sso: boolean;
|
||||
}
|
||||
|
||||
const WELCOME_NAMESPACE = 'Welcome';
|
||||
|
||||
export default class Welcome extends React.Component<{}, IState> {
|
||||
|
||||
private readonly eventHandlers = {
|
||||
onSetPodUrl: () => this.setPodUrl(),
|
||||
};
|
||||
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
url: 'https://my.symphony.com',
|
||||
message: '',
|
||||
urlValid: true,
|
||||
sso: false,
|
||||
};
|
||||
this.updateState = this.updateState.bind(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Render the component
|
||||
*/
|
||||
public render(): JSX.Element {
|
||||
const { url, message, urlValid, sso } = this.state;
|
||||
return (
|
||||
<div className='Welcome' lang={i18n.getLocale()}>
|
||||
<div className='Welcome-image-container'>
|
||||
<img
|
||||
src='../renderer/assets/symphony-logo-plain.png'
|
||||
alt={i18n.t('Symphony Logo', WELCOME_NAMESPACE)()}
|
||||
/>
|
||||
</div>
|
||||
<div className='Welcome-main-container'>
|
||||
<h3 className='Welcome-name'>{i18n.t('Pod URL', WELCOME_NAMESPACE)()}</h3>
|
||||
<div className='Welcome-main-container-input-div'>
|
||||
<div className='Welcome-main-container-input-selection'>
|
||||
<input className='Welcome-main-container-podurl-box'
|
||||
type='url' value={url}
|
||||
onChange={this.updatePodUrl.bind(this)}>
|
||||
</input>
|
||||
</div>
|
||||
<div className='Welcome-main-container-sso-box'
|
||||
title={i18n.t('Enable Single Sign On', WELCOME_NAMESPACE)()}>
|
||||
<label>
|
||||
<input type='checkbox' checked={sso} onChange={this.updateSsoCheckbox.bind(this)}/>
|
||||
{i18n.t('SSO', WELCOME_NAMESPACE)()}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<label className='Welcome-message-label'>{message}</label>
|
||||
<button className={!urlValid ? 'Welcome-continue-button-disabled' : 'Welcome-continue-button'}
|
||||
disabled={!urlValid}
|
||||
onClick={this.eventHandlers.onSetPodUrl}>
|
||||
{i18n.t('Continue', WELCOME_NAMESPACE)()}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform actions on component being mounted
|
||||
*/
|
||||
public componentDidMount(): void {
|
||||
ipcRenderer.on('welcome', this.updateState);
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform actions on component being unmounted
|
||||
*/
|
||||
public componentWillUnmount(): void {
|
||||
ipcRenderer.removeListener('welcome', this.updateState);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set pod url and pass it to the main process
|
||||
*/
|
||||
public setPodUrl(): void {
|
||||
const { url, sso } = this.state;
|
||||
let ssoPath = '/login/sso/initsso';
|
||||
if (url.endsWith('/')) {
|
||||
ssoPath = 'login/sso/initsso';
|
||||
}
|
||||
ipcRenderer.send('set-pod-url', sso ? `${url}${ssoPath}` : url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update pod url from the text box
|
||||
* @param _event
|
||||
*/
|
||||
public updatePodUrl(_event): void {
|
||||
const url = _event.target.value;
|
||||
const match = url.match(/(https?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)/g) != null;
|
||||
if (!match) {
|
||||
this.updateState(_event, {
|
||||
url,
|
||||
message: i18n.t('Please enter a valid url', WELCOME_NAMESPACE)(),
|
||||
urlValid: false,
|
||||
sso: this.state.sso,
|
||||
});
|
||||
return;
|
||||
}
|
||||
this.updateState(_event, { url, message: '', urlValid: true, sso: this.state.sso });
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the SSO checkbox
|
||||
* @param _event Event occurred upon action
|
||||
* on the checkbox
|
||||
*/
|
||||
public updateSsoCheckbox(_event): void {
|
||||
const ssoCheckBox = _event.target.checked;
|
||||
this.updateState(_event, {
|
||||
url: this.state.url,
|
||||
message: this.state.message,
|
||||
urlValid: this.state.urlValid,
|
||||
sso: ssoCheckBox,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Update state
|
||||
* @param _event
|
||||
* @param data
|
||||
*/
|
||||
private updateState(_event, data): void {
|
||||
this.setState(data as IState);
|
||||
}
|
||||
|
||||
}
|
@ -10,6 +10,7 @@ import NotificationSettings from './components/notification-settings';
|
||||
import ScreenPicker from './components/screen-picker';
|
||||
import ScreenSharingFrame from './components/screen-sharing-frame';
|
||||
import ScreenSharingIndicator from './components/screen-sharing-indicator';
|
||||
import Welcome from './components/welcome';
|
||||
|
||||
const enum components {
|
||||
aboutApp = 'about-app',
|
||||
@ -19,6 +20,7 @@ const enum components {
|
||||
basicAuth = 'basic-auth',
|
||||
notification = 'notification-comp',
|
||||
notificationSettings = 'notification-settings',
|
||||
welcome = 'welcome',
|
||||
}
|
||||
|
||||
const loadStyle = (style) => {
|
||||
@ -72,6 +74,11 @@ const load = () => {
|
||||
loadStyle(components.notificationSettings);
|
||||
component = NotificationSettings;
|
||||
break;
|
||||
case components.welcome:
|
||||
document.title = i18n.t('WelcomeText', 'Welcome')();
|
||||
loadStyle(components.welcome);
|
||||
component = Welcome;
|
||||
break;
|
||||
}
|
||||
const element = React.createElement(component);
|
||||
ReactDOM.render(element, document.getElementById('Root'));
|
||||
|
@ -9,6 +9,7 @@ import DownloadManager from './components/download-manager';
|
||||
import MessageBanner from './components/message-banner';
|
||||
import NetworkError from './components/network-error';
|
||||
import SnackBar from './components/snack-bar';
|
||||
import Welcome from './components/welcome';
|
||||
import WindowsTitleBar from './components/windows-title-bar';
|
||||
import { SSFApi } from './ssf-api';
|
||||
|
||||
@ -148,6 +149,20 @@ ipcRenderer.on('page-load', (_event, { locale, resources, enableCustomTitleBar }
|
||||
banner.showBanner(false, 'error');
|
||||
});
|
||||
|
||||
ipcRenderer.on('page-load-welcome', (_event, data) => {
|
||||
const { locale, resource } = data;
|
||||
i18n.setResource(locale, resource);
|
||||
// Renders component as soon as the page is ready
|
||||
document.title = i18n.t('WelcomeText', 'Welcome')();
|
||||
const styles = document.createElement('link');
|
||||
styles.rel = 'stylesheet';
|
||||
styles.type = 'text/css';
|
||||
styles.href = `./styles/welcome.css`;
|
||||
document.getElementsByTagName('head')[0].appendChild(styles);
|
||||
const element = React.createElement(Welcome);
|
||||
ReactDOM.render(element, document.getElementById('Root'));
|
||||
});
|
||||
|
||||
// When the window fails to load
|
||||
ipcRenderer.on('page-load-failed', (_event, { locale, resources }) => {
|
||||
i18n.setResource(locale, resources);
|
||||
|
186
src/renderer/styles/welcome.less
Normal file
186
src/renderer/styles/welcome.less
Normal file
@ -0,0 +1,186 @@
|
||||
@import "theme";
|
||||
|
||||
@white: rgb(255, 255, 255, 1);
|
||||
@version-text-color: rgb(47, 47, 47, 1);
|
||||
@text-padding: 10px;
|
||||
|
||||
body {
|
||||
background-color: white;
|
||||
margin: 0;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.Welcome:lang(ja-JP) {
|
||||
font-family: @font-family-ja;
|
||||
|
||||
h4 {
|
||||
margin: 3px 0;
|
||||
}
|
||||
|
||||
.Welcome-symphony-section {
|
||||
padding-left: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.Welcome:lang(fr-FR) {
|
||||
|
||||
.Welcome-symphony-section {
|
||||
padding-left: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.Welcome {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: 10px;
|
||||
font-family: @font-family;
|
||||
|
||||
&-image-container {
|
||||
text-align: center;
|
||||
margin: 50px 0 10px;
|
||||
}
|
||||
|
||||
&-image-container img {
|
||||
width: 200px;
|
||||
}
|
||||
|
||||
&-header-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
&-main-container {
|
||||
padding: 10px 20%;
|
||||
}
|
||||
|
||||
&-main-container-input-div {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
&-main-container-input-selection {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
&-main-container-podurl-box {
|
||||
float: left;
|
||||
width: 100%;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #000;
|
||||
padding: 5px;
|
||||
max-width: -webkit-fill-available;
|
||||
}
|
||||
|
||||
&-main-container-sso-box {
|
||||
float: left;
|
||||
width: 30%;
|
||||
font-size: 12px;
|
||||
padding-left: 5px;
|
||||
}
|
||||
|
||||
&-name {
|
||||
font-size: 1.0em;
|
||||
font-weight: bold;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
&-message-label {
|
||||
font-size: 12px;
|
||||
margin-left: 2px;
|
||||
color: red;
|
||||
}
|
||||
|
||||
&-logo {
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
&-symphony-section {
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
hr {
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style: none;
|
||||
clear: both;
|
||||
display: table;
|
||||
text-align: right;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
h4 {
|
||||
text-align: start;
|
||||
margin: 6px 0;
|
||||
}
|
||||
|
||||
li {
|
||||
display: table-row;
|
||||
text-align: left;
|
||||
line-height: 20px;
|
||||
}
|
||||
|
||||
b {
|
||||
display: table-cell;
|
||||
padding-right: 1em;
|
||||
text-align: left;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
&-continue-button {
|
||||
text-transform: capitalize;
|
||||
}
|
||||
|
||||
&-continue-button {
|
||||
box-shadow: none;
|
||||
border: none;
|
||||
border-radius: 20px;
|
||||
font-size: 0.8rem;
|
||||
text-align: center;
|
||||
padding: 10px 32px;
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
line-height: 12px;
|
||||
background-color: #3da2fd;
|
||||
color: #ffffff;
|
||||
cursor: pointer;
|
||||
text-transform: uppercase;
|
||||
float: right;
|
||||
margin: 24px 30px 4px 0;
|
||||
|
||||
&:focus {
|
||||
box-shadow: 0 0 10px rgba(61, 162, 253, 1);
|
||||
outline: none;
|
||||
}
|
||||
}
|
||||
|
||||
&-continue-button-disabled {
|
||||
box-shadow: none;
|
||||
border: none;
|
||||
border-radius: 20px;
|
||||
font-size: 0.8rem;
|
||||
text-align: center;
|
||||
padding: 10px 32px;
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
line-height: 12px;
|
||||
color: #ffffff;
|
||||
text-transform: uppercase;
|
||||
float: right;
|
||||
margin: 24px 30px 4px 0;
|
||||
cursor: not-allowed;
|
||||
background-color: #cccccc;
|
||||
pointer-events: none;
|
||||
|
||||
&:focus {
|
||||
box-shadow: 0 0 10px rgba(61, 162, 253, 1);
|
||||
outline: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user