First create solution

This commit is contained in:
2017-03-08 11:21:27 +01:00
commit a2fb86bacf
5508 changed files with 1082238 additions and 0 deletions
@@ -0,0 +1,301 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>0d7464f8-698a-4a14-9ce3-a92892f8d6a1</ProjectGuid>
<AutoAssignPort>True</AutoAssignPort>
<RunInSimulator>True</RunInSimulator>
<UploadPluginsToTheCourier>True</UploadPluginsToTheCourier>
<RootNamespace>Nuvolar_Scanner_Android</RootNamespace>
<ApplicationPage>index.html</ApplicationPage>
<Name>Nuvolar.Scanner.Android.Mobile</Name>
<SccProjectName>SAK</SccProjectName>
<SccProvider>SAK</SccProvider>
<SccAuxPath>SAK</SccAuxPath>
<SccLocalPath>SAK</SccLocalPath>
<DebugSitePortNumber>555666</DebugSitePortNumber>
<UseWebDev>False</UseWebDev>
<DefaultDevice>androidPhone</DefaultDevice>
<DeviceOrientation>Portrait</DeviceOrientation>
<DisplayUnhandledExceptions>True</DisplayUnhandledExceptions>
<ApkDexFilePackageName>Nuvolar.Mobile</ApkDexFilePackageName>
<XapPackagePublisherID>{b1f923b4-0504-451c-8339-0a300aea152f}</XapPackagePublisherID>
<XapPackageProductID>{9d89ef66-ebbd-49b6-8433-31c19d6b59c6}</XapPackageProductID>
<PhoneGapTokenKey>sbceJNNnGU-jwgGgEFix</PhoneGapTokenKey>
<KeyIpaPath>certificates\ios_certificate.p12</KeyIpaPath>
<ProvisionProfile>certificates\NuvolarScanner.mobileprovision</ProvisionProfile>
<IpaPrivateKeyFile>certificates\ios_private_key.txt</IpaPrivateKeyFile>
<TemplateFileIpa />
<UseCustomTemplateNameIpa>False</UseCustomTemplateNameIpa>
<IpaDevicesFamily>iPhone</IpaDevicesFamily>
<BundleIdentifier>Nuvolar.Scanner.Android.Mobile</BundleIdentifier>
<IpaSupportedLanguages />
<KeyApkPath>certificates\android_certificate.p12</KeyApkPath>
<KeyApkAlias>tmpl</KeyApkAlias>
<VersionCode>2</VersionCode>
<TemplateFileApk>templates\ApplicationTemplate.apk</TemplateFileApk>
<UseCustomTemplateNameApk>True</UseCustomTemplateNameApk>
<KeyDebuggable>False</KeyDebuggable>
<ScreenOrientation>Default</ScreenOrientation>
<ApplicationTitle>Nuvolar Mobile Scanner</ApplicationTitle>
<VersionPackage>1.0.1.350</VersionPackage>
<ShowSplashScreen>True</ShowSplashScreen>
<UpgradeNotifyShown>16.2.3</UpgradeNotifyShown>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\Debug\</OutputPath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<DebugSymbols>false</DebugSymbols>
<OutputPath>bin\Release\</OutputPath>
</PropertyGroup>
<ItemGroup>
<Content Include="certificates\android_certificate.p12">
<SubType>Content</SubType>
</Content>
<Content Include="index.html" />
<Content Include="index.css" />
<Content Include="cordova.js" />
<Content Include="Resources\PackageIcons.Android.ic_launcher_36_36.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.Android.ic_launcher_48_48.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.Android.ic_launcher_72_72.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.Android.ic_launcher_96_96.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.Android.splash_1280_720.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.Android.splash_200_320.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.Android.splash_320_200.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.Android.splash_320_480.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.Android.splash_480_320.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.Android.splash_480_800.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.Android.splash_720_1280.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.Android.splash_800_480.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.iOS.Default%402x~iphone.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.iOS.Default-568h%402x.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.iOS.Default-Landscape%402x~ipad.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.iOS.Default-Landscape~ipad.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.iOS.Default-Portrait%402x~ipad.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.iOS.Default-Portrait~ipad.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.iOS.Default~iphone.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.iOS.icon%402x.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.iOS.icon-72%402x.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.iOS.icon-72.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.iOS.icon.png">
<SubType>Content</SubType>
</Content>
<Content Include="Resources\PackageIcons.iOS.iTunesArtwork.png">
<SubType>Content</SubType>
</Content>
<Content Include="views\Discount.dxview">
<SubType>Content</SubType>
</Content>
<Content Include="views\Discount.js">
<SubType>Content</SubType>
</Content>
<Content Include="views\FoldUnfold\StorageLocationFoldEdit.dxview">
<SubType>Content</SubType>
</Content>
<Content Include="views\FoldUnfold\StorageLocationFoldEdit.js">
<SubType>Content</SubType>
</Content>
<Content Include="views\FoldUnfold\StorageLocationFoldSelect.dxview">
<SubType>Content</SubType>
</Content>
<Content Include="views\FoldUnfold\StorageLocationFoldSelect.js">
<SubType>Content</SubType>
</Content>
<Content Include="views\Login.css">
<SubType>Content</SubType>
</Content>
<Content Include="views\navigation.dxview">
<SubType>Content</SubType>
</Content>
<Content Include="views\navigation.js">
<SubType>Content</SubType>
</Content>
<Content Include="views\ProductsInfo.dxview">
<SubType>Content</SubType>
</Content>
<Content Include="views\ProductsInfo.js">
<SubType>Content</SubType>
</Content>
<Content Include="views\StorageInHeaderSelect.dxview">
<SubType>Content</SubType>
</Content>
<Content Include="views\StorageInHeaderSelect.js">
<SubType>Content</SubType>
</Content>
<Content Include="views\StorageInRowsEdit.dxview">
<SubType>Content</SubType>
</Content>
<Content Include="views\StorageInRowsEdit.js">
<SubType>Content</SubType>
</Content>
<Content Include="views\StorageOutHeaderSelect.dxview">
<SubType>Content</SubType>
</Content>
<Content Include="views\StorageOutHeaderSelect.js">
<SubType>Content</SubType>
</Content>
<Content Include="views\StorageOutRowsEdit.dxview">
<SubType>Content</SubType>
</Content>
<Content Include="views\StorageOutRowsEdit.js">
<SubType>Content</SubType>
</Content>
<Content Include="views\StoragePDACollectionEdit.css">
<SubType>Content</SubType>
</Content>
<Content Include="views\StoragePDACollectionEdit.dxview">
<SubType>Content</SubType>
</Content>
<Content Include="views\StoragePDACollectionEdit.js">
<SubType>Content</SubType>
</Content>
<Content Include="views\StoragePDACollectionSelect.dxview">
<SubType>Content</SubType>
</Content>
<Content Include="views\StoragePDACollectionSelect.js">
<SubType>Content</SubType>
</Content>
<Content Include="views\Test\Test.dxview">
<SubType>Content</SubType>
</Content>
<Content Include="views\Test\Test.js">
<SubType>Content</SubType>
</Content>
<None Include="certificates\ios_certificate.cer" />
<None Include="certificates\ios_certificate.p12" />
<None Include="certificates\ios_certificate_request.txt" />
<None Include="certificates\ios_private_key.txt" />
<None Include="config.xml" />
<Content Include="index.js">
<SubType>Content</SubType>
</Content>
<Content Include="layouts\Navbar\NavbarLayout.css" />
<Content Include="layouts\Navbar\NavbarLayout.html" />
<Content Include="layouts\Navbar\NavbarLayout.js" />
<Content Include="layouts\Pivot\PivotLayout.css" />
<Content Include="layouts\Pivot\PivotLayout.html" />
<Content Include="layouts\Pivot\PivotLayout.js" />
<Content Include="layouts\SlideOut\SlideOutLayout.css" />
<Content Include="layouts\SlideOut\SlideOutLayout.html" />
<Content Include="layouts\SlideOut\SlideOutLayout.js" />
<Content Include="layouts\Empty\EmptyLayout.css" />
<Content Include="layouts\Empty\EmptyLayout.html" />
<Content Include="layouts\Empty\EmptyLayout.js" />
<Content Include="layouts\Simple\SimpleLayout.css" />
<Content Include="layouts\Simple\SimpleLayout.html" />
<Content Include="layouts\Simple\SimpleLayout.js" />
<Content Include="layouts\Popup\PopupLayout.css" />
<Content Include="layouts\Popup\PopupLayout.html" />
<Content Include="layouts\Popup\PopupLayout.js" />
<Content Include="layouts\Split\SplitLayout.css" />
<Content Include="layouts\Split\SplitLayout.html" />
<Content Include="layouts\Split\SplitLayout.js" />
<Content Include="Nuvolar_scanner_android.config.js">
<SubType>Content</SubType>
</Content>
<Content Include="views\Login.dxview">
<SubType>Content</SubType>
</Content>
<Content Include="views\Login.js">
<SubType>Content</SubType>
</Content>
<Content Include="views\readme.txt" />
<None Include="templates\ApplicationTemplate.apk" />
</ItemGroup>
<ItemGroup>
<Folder Include="css\" />
<Folder Include="js\" />
<Folder Include="layouts\" />
<Folder Include="layouts\Empty\" />
<Folder Include="layouts\Navbar\" />
<Folder Include="layouts\Pivot\" />
<Folder Include="layouts\Popup\" />
<Folder Include="layouts\Simple\" />
<Folder Include="layouts\SlideOut\" />
<Folder Include="layouts\Split\" />
<Folder Include="certificates" />
<Folder Include="Resources" />
<Folder Include="templates\" />
<Folder Include="views\" />
<Folder Include="views\FoldUnfold" />
<Folder Include="views\Test" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Nuvolar.Scanner.Android.Shared\Nuvolar.Scanner.Android.Shared.dxjsproj">
<Name>Nuvolar.Scanner.Android.Shared</Name>
<Project>{5ceb93d3-3f0b-481d-821d-4ec40ad1d5dd}</Project>
<Private>True</Private>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.Common.targets" />
<Target Name="ResolveReferences">
<Message Text="Copying references to output dir..." Importance="high" />
<MSBuild Targets="Build" Projects="@(ProjectReference)" Properties="OutputPath=$([System.IO.Path]::GetFullPath('$(OutputPath)'))">
</MSBuild>
</Target>
<Target Name="CopyFilesToOutputDirectory">
<Message Text="Copying files to output dir..." Importance="high" />
<Copy SourceFiles="@(Content)" DestinationFiles="@(Content-&gt;'$(OutputPath)$([MSBuild]::MakeRelative($(MSBuildProjectDirectory),'%(FullPath)'))')" />
</Target>
<Target Name="CoreCompile">
<!--<Message Text="'$(MSBuildToolsPath)'"></Message>-->
<!--<Message Text="'$(BuildingProject)'"></Message>-->
<!--<Message Text="Build JSProject '$(MSBuildProjectFile)':" Importance="high"></Message>-->
<!--<Message Text="Finished Build JSProject '$(MSBuildProjectFile)'." Importance="high"></Message>-->
</Target>
<Target Name="CreateManifestResourceNames" Condition="'@(ResxWithNoCulture)@(ResxWithCulture)@(NonResxWithNoCulture)@(NonResxWithCulture)'!=''" />
<Target Name="Clean">
<!--
<Message Text="Cleaning Output files..." Importance="high" />
<Delete Files="@([System.IO.Path]::GetFullPath('$(OutputPath)'))" />
-->
<Message Text="Cleaning Output dir ($([System.IO.Path]::GetFullPath('$(OutputPath)')))..." Importance="high" />
<RemoveDir Directories="$([System.IO.Path]::GetFullPath('$(OutputPath)'))" />
</Target>
</Project>
@@ -0,0 +1,55 @@
// NOTE object below must be a valid JSON
window.Nuvolar_Scanner_Android = $.extend(true, window.Nuvolar_Scanner_Android, {
"config": {
"layoutSet": "slideout",
"animationSet": "default",
"commandMapping": {
"ios-header-toolbar": {
"commands": [
{
"id": "sde",
"location": "after"
},
{
"id": "delete",
"location": "after"
}
]
},
"generic-header-toolbar": {
"commands": [
{
"id": "ghz",
"location": "after"
}
]
},
"android-header-toolbar": {
"commands": [
{
"id": "delete",
"location": "after"
}
]
},
"win10-phone-appbar": {
"commands": [
{
"id": "delete",
"location": "menu"
}
]
},
"android-simple-toolbar": {
"commands": [
{
"id": "delete",
"location": "after"
}
]
}
}
}
});
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 691 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 510 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 401 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 558 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 481 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 686 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

@@ -0,0 +1,22 @@
-----BEGIN CERTIFICATE REQUEST-----
MIIDszCCApsCAQAwUDELMAkGA1UEBhMCaHUxIDAeBgkqhkiG9w0BCQEWEWl3YW5A
Y2l0cm9tYWlsLmh1MRAwDgYDVQQKDAdOdXZvbGFyMQ0wCwYDVQQDDARpd2FuMIIB
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn9toBKQ5Qwb52OBE+Eav5S30
wwnmu3G05OT+j7qN8EWEfXvAm7O7wNeGreQfDdcfkdOlD6xnMWyt4hgYrnXWutqu
SK30NDwrL2IH76Ozu7e8vgzxaz3YaHPq+rH6Jrkhjqx6PTyOv32yHP7LzwPWH+OT
/UFCBEhS4A5D1H0/M+bLZ9CH/bTI8CAHnf3w7yieAKvj+SGU8Bwg8a/8SGvZ2jHU
zdu0LG3CS0EJIxZZ6+OuX533dgaNJ5uNuqNnZi5HRGBvtCqTc35W98A3XswxYukL
T0cCkuy4r+3iyo/Z7lAKxu6OkuBBBuXsSIZv60to3w+vOBNSRI6dO0D+OC98hwID
AQABoIIBHDAcBgorBgEEAYI3DQIDMQ4WDDEwLjAuMTA1ODYuMjA/BgkrBgEEAYI3
FRQxMjAwAgEFDAlTSVNJNVNTRDIMFFNJU0k1U1NEMlxpdmFuLnN6YWJvDApkZXZl
bnYuZXhlMFMGCSqGSIb3DQEJDjFGMEQwDgYDVR0PAQH/BAQDAgTwMBMGA1UdJQQM
MAoGCCsGAQUFBwMCMB0GA1UdDgQWBBTMyQuKobmfDhUF6gCqYSI/iD/52jBmBgor
BgEEAYI3DQICMVgwVgIBAh5OAE0AaQBjAHIAbwBzAG8AZgB0ACAAUwB0AHIAbwBu
AGcAIABDAHIAeQBwAHQAbwBnAHIAYQBwAGgAaQBjACAAUAByAG8AdgBpAGQAZQBy
AwEAMA0GCSqGSIb3DQEBBQUAA4IBAQAneBoDIa62YdOO715srDVqV5oQJm1WeFtQ
WhbwmKkE4qe0I4Cz/D/htrWPSlvBUzrmURNW8fo7y5CUBmlEgZOgvq2Jiv1N4tKg
TLM52BT6SIW5fQGLs1Q/BjPsOgPY6a4bPZJy5d8IKVNWr/eUCro93hfb2x4SJQRE
xgAs9Fq/9Ep/QVXRl3S8m7qjrMxITHrrSlaYLYH1Rt4AocckPSM4Dxr+WKVfGzBy
igMcUvAn7N0UIpdo0LnSoBoFGpws1/gYAXsKKFufYtyxjAoZFSZjdoyZnZbfX14I
Ya+p8/JgD6xjZ5QQSGS3ELUTEmuHNoGws5l9jcXmqI6W428TYw8w
-----END CERTIFICATE REQUEST-----
@@ -0,0 +1,25 @@
BwIAAAAkAABSU0EyAAgAAAEAAQCHfC84/kA7nY5EUhM4rw/faEvrb4ZI7OUGQeCS
ju7GClDu2Y/K4u2vuOySAkdPC+liMcxeN8D3Vn5zkyq0b2BERy5mZ6O6jZsnjQZ2
951fruPrWRYjCUFLwm0stNvN1DHa2WtI/K/xIBzwlCH546sAnijv8P2dByDwyLT9
h9Bny+YzP33UQw7gUkgEQkH9k+Mf1gPPy/4csn2/jjw9eqyOIbkm+rH66nNo2D1r
8Qy+vLe7s6PvB2IvKzw09K1Irtq61nWuGBjirWwxZ6wPpdORH9cNH+SthtfAu7Ob
wHt9hEXwjbqP/uTktHG75gnD9C3lr0b4RODY+QZDOaQEaNufDTgRgt0xkZZBGzsl
YOzhhjhLWbDj/iTAs8irAXprUFN2lo5f8IJNVvUDFypRbC2+3vEORc2bK+aZf95j
Xg4kD04VIaLHP931BhP2WaenOGmK8yoMgWniw7Uj0WY6iyCqXN11/LTw9eJlaPd0
ylM4G3uTncJS6X2iU4qgfDbGuLjjrbKj2WsmRQNm5c6I1ObCj6rqBrYxdN++v0By
bODGBbwOS9APyO+d102mvPIW6LsIFPmt+sVJsvL4tyizNisQ7fTfjZnmtDhxdLHl
JfOL74TXimXFhRdFbgXYqoFS2isA2s1lxXEYN+smxKuRnr9iafek6eM10ydy6EK7
q3CK3b1lgE5xDQUZkDDTDtCURR4o1sFjFOB/eVTQQzOGsGj0S5pXy3dTRL3cdTOJ
oTzTp9tOiAHibyT7Pd4jZ43vly4o3lpwmM56s4TcM0cvqeu31S3CRk4yXahXLZNI
9DcD3wExFMqhIle2TtKhJIDyku4JgLST0F20LLukHF7u89F/KR7nLaACWuHhsZNc
x6aag6jxq6hFV2icNEUIPh/JJVO6YlxOVtWXexfM6Eyi0DwYgMDaHdatjiCmJH/3
j5RTE/eyLNqknOulABnd0L8mxdJVDPWb/HPp821Gn4hDl/Oeeerh6xGUgUNl2y6i
+/LYcNEIC8kKBfKlwTB2WL39NAdBxj2MmTI/6xljrq0SS33/Qjf+rLQEYIUN9N6q
vOVlkvDleVZZhdsosK88VYXaGKMN7kP5IrC+PvodHfcJVnQmZ5JmdW5OPQJkuk4H
VKkGSGGKReO8jzkxL2e4Hr4TgrYvUzy7skOeOjHmmE3VMkFIxFBnsA6tOVDkZcVd
246WIrWLNRH2GHZWGmnvYcvyrvVvJznEwwu1kW5DZhi5zvY/YGE5gD1LdDkk+FvF
NZSLn0zhyIFQ4WlhmZJQJKartIOxVmlGC2AH+bze0aXv4eVjy6hJB+oojBPZ4kkl
JYBbKKIzl0Kve2d4u7bEHMFV7nlL/9Vrrgy71hFvYzKICGJMliao8RPz+AsNw9nj
CfMCmxXn03170kuP9bKbi/k0nUjKDnOGCxSYIhsWfvd5nwTC7npH14g07yxDmp5+
8zz0iZJFA4HvYyzSeF6ZIr/w8tj3NGpwnUI7HcZQcoUo+oL4XstQwq8XpRUaXceO
3lGaIqMQUXfQsj+lIUeEr4G6eiY=
+35
View File
@@ -0,0 +1,35 @@
<widget xmlns="http://www.w3.org/ns/widgets" xmlns:gap="http://phonegap.com/ns/1.0" id="com.devexpress.apptemplate" version="1.0" versionCode="1">
<name>ApplicationTemplate</name>
<preference name="permissions" value="none" />
<preference name="prerendered-icon" value="true" />
<preference name="android-windowSoftInputMode" value="adjustPan" />
<preference name="SplashScreen" value="splash" />
<preference name="SplashScreenDelay" value="60000" />
<preference name="AutoHideSplashScreen" value="false" />
<preference name="DisallowOverscroll" value="true" />
<preference name="StatusBarOverlaysWebView" value="false" />
<preference name="StatusBarBackgroundColor" value="#000000" />
<feature name="http://api.phonegap.com/1.0/network" />
<gap:plugin name="com.devexpress.plugins.devextremeaddon" version="1.0.1" />
<gap:plugin name="cordova-plugin-statusbar" version="2.1.0" source="npm" onload="true" />
<gap:plugin name="org.apache.cordova.battery-status" version="0.2.12" />
<gap:plugin name="org.apache.cordova.camera" version="0.3.6" />
<gap:plugin name="org.apache.cordova.contacts" version="0.2.16" />
<gap:plugin name="org.apache.cordova.device-motion" version="0.2.11" />
<gap:plugin name="org.apache.cordova.device-orientation" version="0.3.11" />
<gap:plugin name="org.apache.cordova.file" version="1.3.3" />
<gap:plugin name="org.apache.cordova.file-transfer" version="0.5.0" />
<gap:plugin name="org.apache.cordova.geolocation" version="0.3.12" />
<gap:plugin name="org.apache.cordova.globalization" version="0.3.4" />
<gap:plugin name="org.apache.cordova.media" version="0.2.16" />
<gap:plugin name="org.apache.cordova.media-capture" version="0.3.6" />
<gap:plugin name="org.apache.cordova.network-information" version="0.2.15" />
<gap:plugin name="cordova-plugin-splashscreen" version="3.2.2" onload="true" source="npm" />
<gap:plugin name="org.apache.cordova.vibration" version="0.3.13" />
<gap:plugin name="org.apache.cordova.dialogs" version="0.3.0" />
<gap:plugin name="cordova-plugin-whitelist" source="npm" />
<access origin="*" />
<gap:plugin name="cordova-plugin-ios-longpress-fix" version="1.1.0" source="npm" />
<preference name="FadeSplashScreen" value="false" />
<preference name="ShowSplashScreenSpinner" value="false" />
</widget>
+1
View File
@@ -0,0 +1 @@
// This is a fake cordova.js file. It will be replaced with a file specific to the platform and version when building the native package.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
+49
View File
@@ -0,0 +1,49 @@
html,
body,
.dx-viewport {
height: 100%;
}
body {
margin: 0;
padding: 0;
}
.delete-button {
text-align: center;
}
.delete-button div {
width: 98%;
}
.msg {
width: 100%;
padding-bottom: 10px;
}
.dx-theme-ios .msg-button-left {
width: 44%;
margin: 0 4% 0 0;
float: left;
}
.dx-theme-ios .msg-button-right {
width: 44%;
margin: 0 0 0 4%;
float: left;
}
.dx-theme-ios #deleteConfirmation {
height: 135px !important;
}
.dx-theme-android .msg-button-left {
width: 42%;
margin: 0 3% 0 0;
float: left;
}
.dx-theme-android .msg-button-right {
width: 42%;
margin: 0 0 0 3%;
float: left;
}
.dx-theme-android #deleteConfirmation {
height: 150px !important;
}
+126
View File
@@ -0,0 +1,126 @@
<!DOCTYPE html>
<html>
<head>
<title>Nuvolar_Scanner_Android</title>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="msapplication-tap-highlight" content="no" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" />
<link rel="stylesheet" type="text/css" href="css/dx.spa.css" />
<link rel="stylesheet" type="text/css" href="css/dx.common.css" />
<link rel="dx-theme" data-theme="generic.light" href="css/dx.light.css" data-active="true" />
<link rel="dx-theme" data-theme="generic.light.compact" href="css/dx.light.compact.css" />
<link rel="dx-theme" data-theme="generic.dark" href="css/dx.dark.css" />
<link rel="dx-theme" data-theme="generic.dark.compact" href="css/dx.dark.compact.css" />
<link rel="dx-theme" data-theme="generic.contrast" href="css/dx.contrast.css" />
<link rel="dx-theme" data-theme="generic.contrast.compact" href="css/dx.contrast.compact.css" />
<link rel="dx-theme" data-theme="android5.light" href="css/dx.android5.light.css"/>
<link rel="dx-theme" data-theme="ios7.default" href="css/dx.ios7.default.css" />
<!-- <link rel="dx-theme" data-theme="win8.black" href="css/dx.win8.black.css" data-active="true" /> -->
<link rel="dx-theme" data-theme="win10.black" href="css/dx.win10.black.css" data-active="true" />
<!-- <link rel="dx-theme" data-theme="win8.white" href="css/dx.win8.white.css" /> -->
<link rel="dx-theme" data-theme="win10.white" href="css/dx.win10.white.css" />
<script type="text/javascript" src="cordova.js"></script>
<!--[if lt IE 9]>
<script type="text/javascript" src="js/jquery-1.12.3.min.js"></script>
<![endif]-->
<!--[if gte IE 9]><!-->
<script type="text/javascript" src="js/jquery-2.2.3.min.js"></script>
<!--<![endif]-->
<script type="text/javascript" src="js/knockout-3.4.0.js"></script>
<!-- Read the Localization section of the migration guide for more details http://dxpr.es/1TXqrVS -->
<script type="text/javascript" src="js/cldr.min.js"></script>
<script type="text/javascript" src="js/cldr/event.min.js"></script>
<script type="text/javascript" src="js/cldr/supplemental.min.js"></script>
<script type="text/javascript" src="js/globalize.min.js"></script>
<script type="text/javascript" src="js/globalize/number.min.js"></script>
<script type="text/javascript" src="js/globalize/date.min.js"></script>
<script type="text/javascript" src="js/globalize/message.min.js"></script>
<script type="text/javascript" src="js/globalize/currency.min.js"></script>
<script type="text/javascript" src="js/dx.all.js"></script>
<script type="text/javascript" src="data/Global.js"></script>
<!--
<script type="text/javascript" src="js/dx.all.debug.js"></script>
-->
<link rel="stylesheet" type="text/css" href="index.css" />
<script type="text/javascript" src="Nuvolar_scanner_android.shared.config.js"></script>
<script type="text/javascript" src="Nuvolar_scanner_android.config.js"></script>
<script type="text/javascript" src="index.js"></script>
<script type="text/javascript" src="data/db.js"></script>
<!-- Layouts -->
<link rel="stylesheet" type="text/css" href="layouts/SlideOut/SlideOutLayout.css" />
<link rel="dx-template" type="text/html" href="layouts/SlideOut/SlideOutLayout.html"/>
<script type="text/javascript" src="layouts/SlideOut/SlideOutLayout.js"></script>
<link rel="stylesheet" type="text/css" href="layouts/Simple/SimpleLayout.css" />
<link rel="dx-template" type="text/html" href="layouts/Simple/SimpleLayout.html"/>
<script type="text/javascript" src="layouts/Simple/SimpleLayout.js"></script>
<link rel="stylesheet" type="text/css" href="layouts/Popup/PopupLayout.css" />
<link rel="dx-template" type="text/html" href="layouts/Popup/PopupLayout.html"/>
<script type="text/javascript" src="layouts/Popup/PopupLayout.js"></script>
<link rel="stylesheet" type="text/css" href="layouts/Empty/EmptyLayout.css" />
<link rel="dx-template" type="text/html" href="layouts/Empty/EmptyLayout.html"/>
<script type="text/javascript" src="layouts/Empty/EmptyLayout.js"></script>
<!-- Views -->
<link rel="dx-template" type="text/html" href="views/about.html"/>
<link rel="dx-template" type="text/html" href="views/blank.html" />
<link rel="stylesheet" type="text/css" href="views/Login.css" />
<script type="text/javascript" src="views/Login.js"></script>
<link rel="dx-template" type="text/html" href="views/Login.dxview" />
<script type="text/javascript" src="views/StoragePDACollectionSelect.js"></script>
<link rel="dx-template" type="text/html" href="views/StoragePDACollectionSelect.dxview" />
<link rel="stylesheet" type="text/css" href="views/StoragePDACollectionEdit.css" />
<script type="text/javascript" src="views/StoragePDACollectionEdit.js"></script>
<link rel="dx-template" type="text/html" href="views/StoragePDACollectionEdit.dxview" />
<script type="text/javascript" src="views/navigation.js"></script>
<link rel="dx-template" type="text/html" href="views/navigation.dxview" />
<script type="text/javascript" src="views/ProductsInfo.js"></script>
<link rel="dx-template" type="text/html" href="views/ProductsInfo.dxview"/>
<script type="text/javascript" src="views/StorageOutHeaderSelect.js"></script>
<link rel="dx-template" type="text/html" href="views/StorageOutHeaderSelect.dxview"/>
<script type="text/javascript" src="views/StorageOutRowsEdit.js"></script>
<link rel="dx-template" type="text/html" href="views/StorageOutRowsEdit.dxview"/>
<script type="text/javascript" src="views/StorageInHeaderSelect.js"></script>
<link rel="dx-template" type="text/html" href="views/StorageInHeaderSelect.dxview"/>
<script type="text/javascript" src="views/Discount.js"></script>
<link rel="dx-template" type="text/html" href="views/Discount.dxview"/>
<script type="text/javascript" src="views/StorageInRowsEdit.js"></script>
<link rel="dx-template" type="text/html" href="views/StorageInRowsEdit.dxview"/>
<script type="text/javascript" src="views/FoldUnfold/StorageLocationFoldSelect.js"></script>
<link rel="dx-template" type="text/html" href="views/FoldUnfold/StorageLocationFoldSelect.dxview"/>
<script type="text/javascript" src="views/FoldUnfold/StorageLocationFoldEdit.js"></script>
<link rel="dx-template" type="text/html" href="views/FoldUnfold/StorageLocationFoldEdit.dxview"/>
<script type="text/javascript" src="views/Test/Test.js"></script>
<link rel="dx-template" type="text/html" href="views/Test/Test.dxview"/>
</head>
<body>
<div class="dx-viewport"></div>
</body>
</html>
+57
View File
@@ -0,0 +1,57 @@
$(function() {
var startupView = "Login";
// Uncomment the line below to disable platform-specific look and feel and to use the Generic theme for all devices
// DevExpress.devices.current({ platform: "generic" });
if(DevExpress.devices.real().platform === "win8") {
$("body").css("background-color", "#000");
}
$(document).on("deviceready", function () {
navigator.splashscreen.hide();
if (window.devextremeaddon) {
window.devextremeaddon.setup();
}
$(document).on("backbutton", function () {
DevExpress.processHardwareBackButton();
});
});
function onNavigatingBack(e) {
if(e.isHardwareButton && !Nuvolar_Scanner_Android.app.canBack()) {
e.cancel = true;
exitApp();
}
}
function exitApp() {
switch (DevExpress.devices.real().platform) {
case "android":
navigator.app.exitApp();
break;
case "win8":
window.external.Notify("DevExpress.ExitApp");
break;
}
}
Nuvolar_Scanner_Android.app = new DevExpress.framework.html.HtmlApplication({
namespace: Nuvolar_Scanner_Android,
layoutSet: DevExpress.framework.html.layoutSets[Nuvolar_Scanner_Android.config.layoutSet],
animationSet: DevExpress.framework.html.animationSets[Nuvolar_Scanner_Android.config.animationSet],
//navigation: navigation, //Nuvolar_Scanner_Android.config.
commandMapping: Nuvolar_Scanner_Android.config.commandMapping,
navigateToRootViewMode: "resetHistory",
useViewTitleAsBackText: true,
disableViewCache: true
});
$(window).unload(function() {
Nuvolar_Scanner_Android.app.saveState();
});
Nuvolar_Scanner_Android.app.router.register(":view/:id", { view: startupView, id: undefined });
Nuvolar_Scanner_Android.app.on("navigatingBack", onNavigatingBack);
Nuvolar_Scanner_Android.app.navigate();
});
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+123
View File
@@ -0,0 +1,123 @@
/*!
* Knockout JavaScript library v3.4.0
* (c) Steven Sanderson - http://knockoutjs.com/
* License: MIT (http://www.opensource.org/licenses/mit-license.php)
*/
(function() {(function(n){var x=this||(0,eval)("this"),u=x.document,M=x.navigator,v=x.jQuery,F=x.JSON;(function(n){"function"===typeof define&&define.amd?define(["exports","require"],n):"object"===typeof exports&&"object"===typeof module?n(module.exports||exports):n(x.ko={})})(function(N,O){function J(a,c){return null===a||typeof a in T?a===c:!1}function U(b,c){var d;return function(){d||(d=a.a.setTimeout(function(){d=n;b()},c))}}function V(b,c){var d;return function(){clearTimeout(d);d=a.a.setTimeout(b,c)}}function W(a,
c){c&&c!==I?"beforeChange"===c?this.Kb(a):this.Ha(a,c):this.Lb(a)}function X(a,c){null!==c&&c.k&&c.k()}function Y(a,c){var d=this.Hc,e=d[s];e.R||(this.lb&&this.Ma[c]?(d.Pb(c,a,this.Ma[c]),this.Ma[c]=null,--this.lb):e.r[c]||d.Pb(c,a,e.s?{ia:a}:d.uc(a)))}function K(b,c,d,e){a.d[b]={init:function(b,g,k,l,m){var h,r;a.m(function(){var q=a.a.c(g()),p=!d!==!q,A=!r;if(A||c||p!==h)A&&a.va.Aa()&&(r=a.a.ua(a.f.childNodes(b),!0)),p?(A||a.f.da(b,a.a.ua(r)),a.eb(e?e(m,q):m,b)):a.f.xa(b),h=p},null,{i:b});return{controlsDescendantBindings:!0}}};
a.h.ta[b]=!1;a.f.Z[b]=!0}var a="undefined"!==typeof N?N:{};a.b=function(b,c){for(var d=b.split("."),e=a,f=0;f<d.length-1;f++)e=e[d[f]];e[d[d.length-1]]=c};a.G=function(a,c,d){a[c]=d};a.version="3.4.0";a.b("version",a.version);a.options={deferUpdates:!1,useOnlyNativeEvents:!1};a.a=function(){function b(a,b){for(var c in a)a.hasOwnProperty(c)&&b(c,a[c])}function c(a,b){if(b)for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}function d(a,b){a.__proto__=b;return a}function e(b,c,d,e){var h=b[c].match(r)||
[];a.a.q(d.match(r),function(b){a.a.pa(h,b,e)});b[c]=h.join(" ")}var f={__proto__:[]}instanceof Array,g="function"===typeof Symbol,k={},l={};k[M&&/Firefox\/2/i.test(M.userAgent)?"KeyboardEvent":"UIEvents"]=["keyup","keydown","keypress"];k.MouseEvents="click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave".split(" ");b(k,function(a,b){if(b.length)for(var c=0,d=b.length;c<d;c++)l[b[c]]=a});var m={propertychange:!0},h=u&&function(){for(var a=3,b=u.createElement("div"),c=
b.getElementsByTagName("i");b.innerHTML="\x3c!--[if gt IE "+ ++a+"]><i></i><![endif]--\x3e",c[0];);return 4<a?a:n}(),r=/\S+/g;return{cc:["authenticity_token",/^__RequestVerificationToken(_.*)?$/],q:function(a,b){for(var c=0,d=a.length;c<d;c++)b(a[c],c)},o:function(a,b){if("function"==typeof Array.prototype.indexOf)return Array.prototype.indexOf.call(a,b);for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},Sb:function(a,b,c){for(var d=0,e=a.length;d<e;d++)if(b.call(c,a[d],d))return a[d];
return null},La:function(b,c){var d=a.a.o(b,c);0<d?b.splice(d,1):0===d&&b.shift()},Tb:function(b){b=b||[];for(var c=[],d=0,e=b.length;d<e;d++)0>a.a.o(c,b[d])&&c.push(b[d]);return c},fb:function(a,b){a=a||[];for(var c=[],d=0,e=a.length;d<e;d++)c.push(b(a[d],d));return c},Ka:function(a,b){a=a||[];for(var c=[],d=0,e=a.length;d<e;d++)b(a[d],d)&&c.push(a[d]);return c},ra:function(a,b){if(b instanceof Array)a.push.apply(a,b);else for(var c=0,d=b.length;c<d;c++)a.push(b[c]);return a},pa:function(b,c,d){var e=
a.a.o(a.a.zb(b),c);0>e?d&&b.push(c):d||b.splice(e,1)},ka:f,extend:c,Xa:d,Ya:f?d:c,D:b,Ca:function(a,b){if(!a)return a;var c={},d;for(d in a)a.hasOwnProperty(d)&&(c[d]=b(a[d],d,a));return c},ob:function(b){for(;b.firstChild;)a.removeNode(b.firstChild)},jc:function(b){b=a.a.V(b);for(var c=(b[0]&&b[0].ownerDocument||u).createElement("div"),d=0,e=b.length;d<e;d++)c.appendChild(a.$(b[d]));return c},ua:function(b,c){for(var d=0,e=b.length,h=[];d<e;d++){var m=b[d].cloneNode(!0);h.push(c?a.$(m):m)}return h},
da:function(b,c){a.a.ob(b);if(c)for(var d=0,e=c.length;d<e;d++)b.appendChild(c[d])},qc:function(b,c){var d=b.nodeType?[b]:b;if(0<d.length){for(var e=d[0],h=e.parentNode,m=0,l=c.length;m<l;m++)h.insertBefore(c[m],e);m=0;for(l=d.length;m<l;m++)a.removeNode(d[m])}},za:function(a,b){if(a.length){for(b=8===b.nodeType&&b.parentNode||b;a.length&&a[0].parentNode!==b;)a.splice(0,1);for(;1<a.length&&a[a.length-1].parentNode!==b;)a.length--;if(1<a.length){var c=a[0],d=a[a.length-1];for(a.length=0;c!==d;)a.push(c),
c=c.nextSibling;a.push(d)}}return a},sc:function(a,b){7>h?a.setAttribute("selected",b):a.selected=b},$a:function(a){return null===a||a===n?"":a.trim?a.trim():a.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")},nd:function(a,b){a=a||"";return b.length>a.length?!1:a.substring(0,b.length)===b},Mc:function(a,b){if(a===b)return!0;if(11===a.nodeType)return!1;if(b.contains)return b.contains(3===a.nodeType?a.parentNode:a);if(b.compareDocumentPosition)return 16==(b.compareDocumentPosition(a)&16);for(;a&&a!=
b;)a=a.parentNode;return!!a},nb:function(b){return a.a.Mc(b,b.ownerDocument.documentElement)},Qb:function(b){return!!a.a.Sb(b,a.a.nb)},A:function(a){return a&&a.tagName&&a.tagName.toLowerCase()},Wb:function(b){return a.onError?function(){try{return b.apply(this,arguments)}catch(c){throw a.onError&&a.onError(c),c;}}:b},setTimeout:function(b,c){return setTimeout(a.a.Wb(b),c)},$b:function(b){setTimeout(function(){a.onError&&a.onError(b);throw b;},0)},p:function(b,c,d){var e=a.a.Wb(d);d=h&&m[c];if(a.options.useOnlyNativeEvents||
d||!v)if(d||"function"!=typeof b.addEventListener)if("undefined"!=typeof b.attachEvent){var l=function(a){e.call(b,a)},f="on"+c;b.attachEvent(f,l);a.a.F.oa(b,function(){b.detachEvent(f,l)})}else throw Error("Browser doesn't support addEventListener or attachEvent");else b.addEventListener(c,e,!1);else v(b).bind(c,e)},Da:function(b,c){if(!b||!b.nodeType)throw Error("element must be a DOM node when calling triggerEvent");var d;"input"===a.a.A(b)&&b.type&&"click"==c.toLowerCase()?(d=b.type,d="checkbox"==
d||"radio"==d):d=!1;if(a.options.useOnlyNativeEvents||!v||d)if("function"==typeof u.createEvent)if("function"==typeof b.dispatchEvent)d=u.createEvent(l[c]||"HTMLEvents"),d.initEvent(c,!0,!0,x,0,0,0,0,0,!1,!1,!1,!1,0,b),b.dispatchEvent(d);else throw Error("The supplied element doesn't support dispatchEvent");else if(d&&b.click)b.click();else if("undefined"!=typeof b.fireEvent)b.fireEvent("on"+c);else throw Error("Browser doesn't support triggering events");else v(b).trigger(c)},c:function(b){return a.H(b)?
b():b},zb:function(b){return a.H(b)?b.t():b},bb:function(b,c,d){var h;c&&("object"===typeof b.classList?(h=b.classList[d?"add":"remove"],a.a.q(c.match(r),function(a){h.call(b.classList,a)})):"string"===typeof b.className.baseVal?e(b.className,"baseVal",c,d):e(b,"className",c,d))},Za:function(b,c){var d=a.a.c(c);if(null===d||d===n)d="";var e=a.f.firstChild(b);!e||3!=e.nodeType||a.f.nextSibling(e)?a.f.da(b,[b.ownerDocument.createTextNode(d)]):e.data=d;a.a.Rc(b)},rc:function(a,b){a.name=b;if(7>=h)try{a.mergeAttributes(u.createElement("<input name='"+
a.name+"'/>"),!1)}catch(c){}},Rc:function(a){9<=h&&(a=1==a.nodeType?a:a.parentNode,a.style&&(a.style.zoom=a.style.zoom))},Nc:function(a){if(h){var b=a.style.width;a.style.width=0;a.style.width=b}},hd:function(b,c){b=a.a.c(b);c=a.a.c(c);for(var d=[],e=b;e<=c;e++)d.push(e);return d},V:function(a){for(var b=[],c=0,d=a.length;c<d;c++)b.push(a[c]);return b},Yb:function(a){return g?Symbol(a):a},rd:6===h,sd:7===h,C:h,ec:function(b,c){for(var d=a.a.V(b.getElementsByTagName("input")).concat(a.a.V(b.getElementsByTagName("textarea"))),
e="string"==typeof c?function(a){return a.name===c}:function(a){return c.test(a.name)},h=[],m=d.length-1;0<=m;m--)e(d[m])&&h.push(d[m]);return h},ed:function(b){return"string"==typeof b&&(b=a.a.$a(b))?F&&F.parse?F.parse(b):(new Function("return "+b))():null},Eb:function(b,c,d){if(!F||!F.stringify)throw Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js");
return F.stringify(a.a.c(b),c,d)},fd:function(c,d,e){e=e||{};var h=e.params||{},m=e.includeFields||this.cc,l=c;if("object"==typeof c&&"form"===a.a.A(c))for(var l=c.action,f=m.length-1;0<=f;f--)for(var g=a.a.ec(c,m[f]),k=g.length-1;0<=k;k--)h[g[k].name]=g[k].value;d=a.a.c(d);var r=u.createElement("form");r.style.display="none";r.action=l;r.method="post";for(var n in d)c=u.createElement("input"),c.type="hidden",c.name=n,c.value=a.a.Eb(a.a.c(d[n])),r.appendChild(c);b(h,function(a,b){var c=u.createElement("input");
c.type="hidden";c.name=a;c.value=b;r.appendChild(c)});u.body.appendChild(r);e.submitter?e.submitter(r):r.submit();setTimeout(function(){r.parentNode.removeChild(r)},0)}}}();a.b("utils",a.a);a.b("utils.arrayForEach",a.a.q);a.b("utils.arrayFirst",a.a.Sb);a.b("utils.arrayFilter",a.a.Ka);a.b("utils.arrayGetDistinctValues",a.a.Tb);a.b("utils.arrayIndexOf",a.a.o);a.b("utils.arrayMap",a.a.fb);a.b("utils.arrayPushAll",a.a.ra);a.b("utils.arrayRemoveItem",a.a.La);a.b("utils.extend",a.a.extend);a.b("utils.fieldsIncludedWithJsonPost",
a.a.cc);a.b("utils.getFormFields",a.a.ec);a.b("utils.peekObservable",a.a.zb);a.b("utils.postJson",a.a.fd);a.b("utils.parseJson",a.a.ed);a.b("utils.registerEventHandler",a.a.p);a.b("utils.stringifyJson",a.a.Eb);a.b("utils.range",a.a.hd);a.b("utils.toggleDomNodeCssClass",a.a.bb);a.b("utils.triggerEvent",a.a.Da);a.b("utils.unwrapObservable",a.a.c);a.b("utils.objectForEach",a.a.D);a.b("utils.addOrRemoveItem",a.a.pa);a.b("utils.setTextContent",a.a.Za);a.b("unwrap",a.a.c);Function.prototype.bind||(Function.prototype.bind=
function(a){var c=this;if(1===arguments.length)return function(){return c.apply(a,arguments)};var d=Array.prototype.slice.call(arguments,1);return function(){var e=d.slice(0);e.push.apply(e,arguments);return c.apply(a,e)}});a.a.e=new function(){function a(b,g){var k=b[d];if(!k||"null"===k||!e[k]){if(!g)return n;k=b[d]="ko"+c++;e[k]={}}return e[k]}var c=0,d="__ko__"+(new Date).getTime(),e={};return{get:function(c,d){var e=a(c,!1);return e===n?n:e[d]},set:function(c,d,e){if(e!==n||a(c,!1)!==n)a(c,!0)[d]=
e},clear:function(a){var b=a[d];return b?(delete e[b],a[d]=null,!0):!1},I:function(){return c++ +d}}};a.b("utils.domData",a.a.e);a.b("utils.domData.clear",a.a.e.clear);a.a.F=new function(){function b(b,c){var e=a.a.e.get(b,d);e===n&&c&&(e=[],a.a.e.set(b,d,e));return e}function c(d){var e=b(d,!1);if(e)for(var e=e.slice(0),l=0;l<e.length;l++)e[l](d);a.a.e.clear(d);a.a.F.cleanExternalData(d);if(f[d.nodeType])for(e=d.firstChild;d=e;)e=d.nextSibling,8===d.nodeType&&c(d)}var d=a.a.e.I(),e={1:!0,8:!0,9:!0},
f={1:!0,9:!0};return{oa:function(a,c){if("function"!=typeof c)throw Error("Callback must be a function");b(a,!0).push(c)},pc:function(c,e){var l=b(c,!1);l&&(a.a.La(l,e),0==l.length&&a.a.e.set(c,d,n))},$:function(b){if(e[b.nodeType]&&(c(b),f[b.nodeType])){var d=[];a.a.ra(d,b.getElementsByTagName("*"));for(var l=0,m=d.length;l<m;l++)c(d[l])}return b},removeNode:function(b){a.$(b);b.parentNode&&b.parentNode.removeChild(b)},cleanExternalData:function(a){v&&"function"==typeof v.cleanData&&v.cleanData([a])}}};
a.$=a.a.F.$;a.removeNode=a.a.F.removeNode;a.b("cleanNode",a.$);a.b("removeNode",a.removeNode);a.b("utils.domNodeDisposal",a.a.F);a.b("utils.domNodeDisposal.addDisposeCallback",a.a.F.oa);a.b("utils.domNodeDisposal.removeDisposeCallback",a.a.F.pc);(function(){var b=[0,"",""],c=[1,"<table>","</table>"],d=[3,"<table><tbody><tr>","</tr></tbody></table>"],e=[1,"<select multiple='multiple'>","</select>"],f={thead:c,tbody:c,tfoot:c,tr:[2,"<table><tbody>","</tbody></table>"],td:d,th:d,option:e,optgroup:e},
g=8>=a.a.C;a.a.ma=function(c,d){var e;if(v)if(v.parseHTML)e=v.parseHTML(c,d)||[];else{if((e=v.clean([c],d))&&e[0]){for(var h=e[0];h.parentNode&&11!==h.parentNode.nodeType;)h=h.parentNode;h.parentNode&&h.parentNode.removeChild(h)}}else{(e=d)||(e=u);var h=e.parentWindow||e.defaultView||x,r=a.a.$a(c).toLowerCase(),q=e.createElement("div"),p;p=(r=r.match(/^<([a-z]+)[ >]/))&&f[r[1]]||b;r=p[0];p="ignored<div>"+p[1]+c+p[2]+"</div>";"function"==typeof h.innerShiv?q.appendChild(h.innerShiv(p)):(g&&e.appendChild(q),
q.innerHTML=p,g&&q.parentNode.removeChild(q));for(;r--;)q=q.lastChild;e=a.a.V(q.lastChild.childNodes)}return e};a.a.Cb=function(b,c){a.a.ob(b);c=a.a.c(c);if(null!==c&&c!==n)if("string"!=typeof c&&(c=c.toString()),v)v(b).html(c);else for(var d=a.a.ma(c,b.ownerDocument),e=0;e<d.length;e++)b.appendChild(d[e])}})();a.b("utils.parseHtmlFragment",a.a.ma);a.b("utils.setHtml",a.a.Cb);a.M=function(){function b(c,e){if(c)if(8==c.nodeType){var f=a.M.lc(c.nodeValue);null!=f&&e.push({Lc:c,cd:f})}else if(1==c.nodeType)for(var f=
0,g=c.childNodes,k=g.length;f<k;f++)b(g[f],e)}var c={};return{wb:function(a){if("function"!=typeof a)throw Error("You can only pass a function to ko.memoization.memoize()");var b=(4294967296*(1+Math.random())|0).toString(16).substring(1)+(4294967296*(1+Math.random())|0).toString(16).substring(1);c[b]=a;return"\x3c!--[ko_memo:"+b+"]--\x3e"},xc:function(a,b){var f=c[a];if(f===n)throw Error("Couldn't find any memo with ID "+a+". Perhaps it's already been unmemoized.");try{return f.apply(null,b||[]),
!0}finally{delete c[a]}},yc:function(c,e){var f=[];b(c,f);for(var g=0,k=f.length;g<k;g++){var l=f[g].Lc,m=[l];e&&a.a.ra(m,e);a.M.xc(f[g].cd,m);l.nodeValue="";l.parentNode&&l.parentNode.removeChild(l)}},lc:function(a){return(a=a.match(/^\[ko_memo\:(.*?)\]$/))?a[1]:null}}}();a.b("memoization",a.M);a.b("memoization.memoize",a.M.wb);a.b("memoization.unmemoize",a.M.xc);a.b("memoization.parseMemoText",a.M.lc);a.b("memoization.unmemoizeDomNodeAndDescendants",a.M.yc);a.Y=function(){function b(){if(e)for(var b=
e,c=0,m;g<e;)if(m=d[g++]){if(g>b){if(5E3<=++c){g=e;a.a.$b(Error("'Too much recursion' after processing "+c+" task groups."));break}b=e}try{m()}catch(h){a.a.$b(h)}}}function c(){b();g=e=d.length=0}var d=[],e=0,f=1,g=0;return{scheduler:x.MutationObserver?function(a){var b=u.createElement("div");(new MutationObserver(a)).observe(b,{attributes:!0});return function(){b.classList.toggle("foo")}}(c):u&&"onreadystatechange"in u.createElement("script")?function(a){var b=u.createElement("script");b.onreadystatechange=
function(){b.onreadystatechange=null;u.documentElement.removeChild(b);b=null;a()};u.documentElement.appendChild(b)}:function(a){setTimeout(a,0)},Wa:function(b){e||a.Y.scheduler(c);d[e++]=b;return f++},cancel:function(a){a-=f-e;a>=g&&a<e&&(d[a]=null)},resetForTesting:function(){var a=e-g;g=e=d.length=0;return a},md:b}}();a.b("tasks",a.Y);a.b("tasks.schedule",a.Y.Wa);a.b("tasks.runEarly",a.Y.md);a.ya={throttle:function(b,c){b.throttleEvaluation=c;var d=null;return a.B({read:b,write:function(e){clearTimeout(d);
d=a.a.setTimeout(function(){b(e)},c)}})},rateLimit:function(a,c){var d,e,f;"number"==typeof c?d=c:(d=c.timeout,e=c.method);a.cb=!1;f="notifyWhenChangesStop"==e?V:U;a.Ta(function(a){return f(a,d)})},deferred:function(b,c){if(!0!==c)throw Error("The 'deferred' extender only accepts the value 'true', because it is not supported to turn deferral off once enabled.");b.cb||(b.cb=!0,b.Ta(function(c){var e;return function(){a.Y.cancel(e);e=a.Y.Wa(c);b.notifySubscribers(n,"dirty")}}))},notify:function(a,c){a.equalityComparer=
"always"==c?null:J}};var T={undefined:1,"boolean":1,number:1,string:1};a.b("extenders",a.ya);a.vc=function(b,c,d){this.ia=b;this.gb=c;this.Kc=d;this.R=!1;a.G(this,"dispose",this.k)};a.vc.prototype.k=function(){this.R=!0;this.Kc()};a.J=function(){a.a.Ya(this,D);D.rb(this)};var I="change",D={rb:function(a){a.K={};a.Nb=1},X:function(b,c,d){var e=this;d=d||I;var f=new a.vc(e,c?b.bind(c):b,function(){a.a.La(e.K[d],f);e.Ia&&e.Ia(d)});e.sa&&e.sa(d);e.K[d]||(e.K[d]=[]);e.K[d].push(f);return f},notifySubscribers:function(b,
c){c=c||I;c===I&&this.zc();if(this.Pa(c))try{a.l.Ub();for(var d=this.K[c].slice(0),e=0,f;f=d[e];++e)f.R||f.gb(b)}finally{a.l.end()}},Na:function(){return this.Nb},Uc:function(a){return this.Na()!==a},zc:function(){++this.Nb},Ta:function(b){var c=this,d=a.H(c),e,f,g;c.Ha||(c.Ha=c.notifySubscribers,c.notifySubscribers=W);var k=b(function(){c.Mb=!1;d&&g===c&&(g=c());e=!1;c.tb(f,g)&&c.Ha(f=g)});c.Lb=function(a){c.Mb=e=!0;g=a;k()};c.Kb=function(a){e||(f=a,c.Ha(a,"beforeChange"))}},Pa:function(a){return this.K[a]&&
this.K[a].length},Sc:function(b){if(b)return this.K[b]&&this.K[b].length||0;var c=0;a.a.D(this.K,function(a,b){"dirty"!==a&&(c+=b.length)});return c},tb:function(a,c){return!this.equalityComparer||!this.equalityComparer(a,c)},extend:function(b){var c=this;b&&a.a.D(b,function(b,e){var f=a.ya[b];"function"==typeof f&&(c=f(c,e)||c)});return c}};a.G(D,"subscribe",D.X);a.G(D,"extend",D.extend);a.G(D,"getSubscriptionsCount",D.Sc);a.a.ka&&a.a.Xa(D,Function.prototype);a.J.fn=D;a.hc=function(a){return null!=
a&&"function"==typeof a.X&&"function"==typeof a.notifySubscribers};a.b("subscribable",a.J);a.b("isSubscribable",a.hc);a.va=a.l=function(){function b(a){d.push(e);e=a}function c(){e=d.pop()}var d=[],e,f=0;return{Ub:b,end:c,oc:function(b){if(e){if(!a.hc(b))throw Error("Only subscribable things can act as dependencies");e.gb.call(e.Gc,b,b.Cc||(b.Cc=++f))}},w:function(a,d,e){try{return b(),a.apply(d,e||[])}finally{c()}},Aa:function(){if(e)return e.m.Aa()},Sa:function(){if(e)return e.Sa}}}();a.b("computedContext",
a.va);a.b("computedContext.getDependenciesCount",a.va.Aa);a.b("computedContext.isInitial",a.va.Sa);a.b("ignoreDependencies",a.qd=a.l.w);var E=a.a.Yb("_latestValue");a.N=function(b){function c(){if(0<arguments.length)return c.tb(c[E],arguments[0])&&(c.ga(),c[E]=arguments[0],c.fa()),this;a.l.oc(c);return c[E]}c[E]=b;a.a.ka||a.a.extend(c,a.J.fn);a.J.fn.rb(c);a.a.Ya(c,B);a.options.deferUpdates&&a.ya.deferred(c,!0);return c};var B={equalityComparer:J,t:function(){return this[E]},fa:function(){this.notifySubscribers(this[E])},
ga:function(){this.notifySubscribers(this[E],"beforeChange")}};a.a.ka&&a.a.Xa(B,a.J.fn);var H=a.N.gd="__ko_proto__";B[H]=a.N;a.Oa=function(b,c){return null===b||b===n||b[H]===n?!1:b[H]===c?!0:a.Oa(b[H],c)};a.H=function(b){return a.Oa(b,a.N)};a.Ba=function(b){return"function"==typeof b&&b[H]===a.N||"function"==typeof b&&b[H]===a.B&&b.Vc?!0:!1};a.b("observable",a.N);a.b("isObservable",a.H);a.b("isWriteableObservable",a.Ba);a.b("isWritableObservable",a.Ba);a.b("observable.fn",B);a.G(B,"peek",B.t);a.G(B,
"valueHasMutated",B.fa);a.G(B,"valueWillMutate",B.ga);a.la=function(b){b=b||[];if("object"!=typeof b||!("length"in b))throw Error("The argument passed when initializing an observable array must be an array, or null, or undefined.");b=a.N(b);a.a.Ya(b,a.la.fn);return b.extend({trackArrayChanges:!0})};a.la.fn={remove:function(b){for(var c=this.t(),d=[],e="function"!=typeof b||a.H(b)?function(a){return a===b}:b,f=0;f<c.length;f++){var g=c[f];e(g)&&(0===d.length&&this.ga(),d.push(g),c.splice(f,1),f--)}d.length&&
this.fa();return d},removeAll:function(b){if(b===n){var c=this.t(),d=c.slice(0);this.ga();c.splice(0,c.length);this.fa();return d}return b?this.remove(function(c){return 0<=a.a.o(b,c)}):[]},destroy:function(b){var c=this.t(),d="function"!=typeof b||a.H(b)?function(a){return a===b}:b;this.ga();for(var e=c.length-1;0<=e;e--)d(c[e])&&(c[e]._destroy=!0);this.fa()},destroyAll:function(b){return b===n?this.destroy(function(){return!0}):b?this.destroy(function(c){return 0<=a.a.o(b,c)}):[]},indexOf:function(b){var c=
this();return a.a.o(c,b)},replace:function(a,c){var d=this.indexOf(a);0<=d&&(this.ga(),this.t()[d]=c,this.fa())}};a.a.ka&&a.a.Xa(a.la.fn,a.N.fn);a.a.q("pop push reverse shift sort splice unshift".split(" "),function(b){a.la.fn[b]=function(){var a=this.t();this.ga();this.Vb(a,b,arguments);var d=a[b].apply(a,arguments);this.fa();return d===a?this:d}});a.a.q(["slice"],function(b){a.la.fn[b]=function(){var a=this();return a[b].apply(a,arguments)}});a.b("observableArray",a.la);a.ya.trackArrayChanges=function(b,
c){function d(){if(!e){e=!0;var c=b.notifySubscribers;b.notifySubscribers=function(a,b){b&&b!==I||++k;return c.apply(this,arguments)};var d=[].concat(b.t()||[]);f=null;g=b.X(function(c){c=[].concat(c||[]);if(b.Pa("arrayChange")){var e;if(!f||1<k)f=a.a.ib(d,c,b.hb);e=f}d=c;f=null;k=0;e&&e.length&&b.notifySubscribers(e,"arrayChange")})}}b.hb={};c&&"object"==typeof c&&a.a.extend(b.hb,c);b.hb.sparse=!0;if(!b.Vb){var e=!1,f=null,g,k=0,l=b.sa,m=b.Ia;b.sa=function(a){l&&l.call(b,a);"arrayChange"===a&&d()};
b.Ia=function(a){m&&m.call(b,a);"arrayChange"!==a||b.Pa("arrayChange")||(g.k(),e=!1)};b.Vb=function(b,c,d){function m(a,b,c){return l[l.length]={status:a,value:b,index:c}}if(e&&!k){var l=[],g=b.length,t=d.length,G=0;switch(c){case "push":G=g;case "unshift":for(c=0;c<t;c++)m("added",d[c],G+c);break;case "pop":G=g-1;case "shift":g&&m("deleted",b[G],G);break;case "splice":c=Math.min(Math.max(0,0>d[0]?g+d[0]:d[0]),g);for(var g=1===t?g:Math.min(c+(d[1]||0),g),t=c+t-2,G=Math.max(g,t),P=[],n=[],Q=2;c<G;++c,
++Q)c<g&&n.push(m("deleted",b[c],c)),c<t&&P.push(m("added",d[Q],c));a.a.dc(n,P);break;default:return}f=l}}}};var s=a.a.Yb("_state");a.m=a.B=function(b,c,d){function e(){if(0<arguments.length){if("function"===typeof f)f.apply(g.pb,arguments);else throw Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.");return this}a.l.oc(e);(g.S||g.s&&e.Qa())&&e.aa();return g.T}"object"===typeof b?d=b:(d=d||{},b&&(d.read=
b));if("function"!=typeof d.read)throw Error("Pass a function that returns the value of the ko.computed");var f=d.write,g={T:n,S:!0,Ra:!1,Fb:!1,R:!1,Va:!1,s:!1,jd:d.read,pb:c||d.owner,i:d.disposeWhenNodeIsRemoved||d.i||null,wa:d.disposeWhen||d.wa,mb:null,r:{},L:0,bc:null};e[s]=g;e.Vc="function"===typeof f;a.a.ka||a.a.extend(e,a.J.fn);a.J.fn.rb(e);a.a.Ya(e,z);d.pure?(g.Va=!0,g.s=!0,a.a.extend(e,$)):d.deferEvaluation&&a.a.extend(e,aa);a.options.deferUpdates&&a.ya.deferred(e,!0);g.i&&(g.Fb=!0,g.i.nodeType||
(g.i=null));g.s||d.deferEvaluation||e.aa();g.i&&e.ba()&&a.a.F.oa(g.i,g.mb=function(){e.k()});return e};var z={equalityComparer:J,Aa:function(){return this[s].L},Pb:function(a,c,d){if(this[s].Va&&c===this)throw Error("A 'pure' computed must not be called recursively");this[s].r[a]=d;d.Ga=this[s].L++;d.na=c.Na()},Qa:function(){var a,c,d=this[s].r;for(a in d)if(d.hasOwnProperty(a)&&(c=d[a],c.ia.Uc(c.na)))return!0},bd:function(){this.Fa&&!this[s].Ra&&this.Fa()},ba:function(){return this[s].S||0<this[s].L},
ld:function(){this.Mb||this.ac()},uc:function(a){if(a.cb&&!this[s].i){var c=a.X(this.bd,this,"dirty"),d=a.X(this.ld,this);return{ia:a,k:function(){c.k();d.k()}}}return a.X(this.ac,this)},ac:function(){var b=this,c=b.throttleEvaluation;c&&0<=c?(clearTimeout(this[s].bc),this[s].bc=a.a.setTimeout(function(){b.aa(!0)},c)):b.Fa?b.Fa():b.aa(!0)},aa:function(b){var c=this[s],d=c.wa;if(!c.Ra&&!c.R){if(c.i&&!a.a.nb(c.i)||d&&d()){if(!c.Fb){this.k();return}}else c.Fb=!1;c.Ra=!0;try{this.Qc(b)}finally{c.Ra=!1}c.L||
this.k()}},Qc:function(b){var c=this[s],d=c.Va?n:!c.L,e={Hc:this,Ma:c.r,lb:c.L};a.l.Ub({Gc:e,gb:Y,m:this,Sa:d});c.r={};c.L=0;e=this.Pc(c,e);this.tb(c.T,e)&&(c.s||this.notifySubscribers(c.T,"beforeChange"),c.T=e,c.s?this.zc():b&&this.notifySubscribers(c.T));d&&this.notifySubscribers(c.T,"awake")},Pc:function(b,c){try{var d=b.jd;return b.pb?d.call(b.pb):d()}finally{a.l.end(),c.lb&&!b.s&&a.a.D(c.Ma,X),b.S=!1}},t:function(){var a=this[s];(a.S&&!a.L||a.s&&this.Qa())&&this.aa();return a.T},Ta:function(b){a.J.fn.Ta.call(this,
b);this.Fa=function(){this.Kb(this[s].T);this[s].S=!0;this.Lb(this)}},k:function(){var b=this[s];!b.s&&b.r&&a.a.D(b.r,function(a,b){b.k&&b.k()});b.i&&b.mb&&a.a.F.pc(b.i,b.mb);b.r=null;b.L=0;b.R=!0;b.S=!1;b.s=!1;b.i=null}},$={sa:function(b){var c=this,d=c[s];if(!d.R&&d.s&&"change"==b){d.s=!1;if(d.S||c.Qa())d.r=null,d.L=0,d.S=!0,c.aa();else{var e=[];a.a.D(d.r,function(a,b){e[b.Ga]=a});a.a.q(e,function(a,b){var e=d.r[a],l=c.uc(e.ia);l.Ga=b;l.na=e.na;d.r[a]=l})}d.R||c.notifySubscribers(d.T,"awake")}},
Ia:function(b){var c=this[s];c.R||"change"!=b||this.Pa("change")||(a.a.D(c.r,function(a,b){b.k&&(c.r[a]={ia:b.ia,Ga:b.Ga,na:b.na},b.k())}),c.s=!0,this.notifySubscribers(n,"asleep"))},Na:function(){var b=this[s];b.s&&(b.S||this.Qa())&&this.aa();return a.J.fn.Na.call(this)}},aa={sa:function(a){"change"!=a&&"beforeChange"!=a||this.t()}};a.a.ka&&a.a.Xa(z,a.J.fn);var R=a.N.gd;a.m[R]=a.N;z[R]=a.m;a.Xc=function(b){return a.Oa(b,a.m)};a.Yc=function(b){return a.Oa(b,a.m)&&b[s]&&b[s].Va};a.b("computed",a.m);
a.b("dependentObservable",a.m);a.b("isComputed",a.Xc);a.b("isPureComputed",a.Yc);a.b("computed.fn",z);a.G(z,"peek",z.t);a.G(z,"dispose",z.k);a.G(z,"isActive",z.ba);a.G(z,"getDependenciesCount",z.Aa);a.nc=function(b,c){if("function"===typeof b)return a.m(b,c,{pure:!0});b=a.a.extend({},b);b.pure=!0;return a.m(b,c)};a.b("pureComputed",a.nc);(function(){function b(a,f,g){g=g||new d;a=f(a);if("object"!=typeof a||null===a||a===n||a instanceof RegExp||a instanceof Date||a instanceof String||a instanceof
Number||a instanceof Boolean)return a;var k=a instanceof Array?[]:{};g.save(a,k);c(a,function(c){var d=f(a[c]);switch(typeof d){case "boolean":case "number":case "string":case "function":k[c]=d;break;case "object":case "undefined":var h=g.get(d);k[c]=h!==n?h:b(d,f,g)}});return k}function c(a,b){if(a instanceof Array){for(var c=0;c<a.length;c++)b(c);"function"==typeof a.toJSON&&b("toJSON")}else for(c in a)b(c)}function d(){this.keys=[];this.Ib=[]}a.wc=function(c){if(0==arguments.length)throw Error("When calling ko.toJS, pass the object you want to convert.");
return b(c,function(b){for(var c=0;a.H(b)&&10>c;c++)b=b();return b})};a.toJSON=function(b,c,d){b=a.wc(b);return a.a.Eb(b,c,d)};d.prototype={save:function(b,c){var d=a.a.o(this.keys,b);0<=d?this.Ib[d]=c:(this.keys.push(b),this.Ib.push(c))},get:function(b){b=a.a.o(this.keys,b);return 0<=b?this.Ib[b]:n}}})();a.b("toJS",a.wc);a.b("toJSON",a.toJSON);(function(){a.j={u:function(b){switch(a.a.A(b)){case "option":return!0===b.__ko__hasDomDataOptionValue__?a.a.e.get(b,a.d.options.xb):7>=a.a.C?b.getAttributeNode("value")&&
b.getAttributeNode("value").specified?b.value:b.text:b.value;case "select":return 0<=b.selectedIndex?a.j.u(b.options[b.selectedIndex]):n;default:return b.value}},ha:function(b,c,d){switch(a.a.A(b)){case "option":switch(typeof c){case "string":a.a.e.set(b,a.d.options.xb,n);"__ko__hasDomDataOptionValue__"in b&&delete b.__ko__hasDomDataOptionValue__;b.value=c;break;default:a.a.e.set(b,a.d.options.xb,c),b.__ko__hasDomDataOptionValue__=!0,b.value="number"===typeof c?c:""}break;case "select":if(""===c||
null===c)c=n;for(var e=-1,f=0,g=b.options.length,k;f<g;++f)if(k=a.j.u(b.options[f]),k==c||""==k&&c===n){e=f;break}if(d||0<=e||c===n&&1<b.size)b.selectedIndex=e;break;default:if(null===c||c===n)c="";b.value=c}}}})();a.b("selectExtensions",a.j);a.b("selectExtensions.readValue",a.j.u);a.b("selectExtensions.writeValue",a.j.ha);a.h=function(){function b(b){b=a.a.$a(b);123===b.charCodeAt(0)&&(b=b.slice(1,-1));var c=[],d=b.match(e),r,k=[],p=0;if(d){d.push(",");for(var A=0,y;y=d[A];++A){var t=y.charCodeAt(0);
if(44===t){if(0>=p){c.push(r&&k.length?{key:r,value:k.join("")}:{unknown:r||k.join("")});r=p=0;k=[];continue}}else if(58===t){if(!p&&!r&&1===k.length){r=k.pop();continue}}else 47===t&&A&&1<y.length?(t=d[A-1].match(f))&&!g[t[0]]&&(b=b.substr(b.indexOf(y)+1),d=b.match(e),d.push(","),A=-1,y="/"):40===t||123===t||91===t?++p:41===t||125===t||93===t?--p:r||k.length||34!==t&&39!==t||(y=y.slice(1,-1));k.push(y)}}return c}var c=["true","false","null","undefined"],d=/^(?:[$_a-z][$\w]*|(.+)(\.\s*[$_a-z][$\w]*|\[.+\]))$/i,
e=RegExp("\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'|/(?:[^/\\\\]|\\\\.)*/w*|[^\\s:,/][^,\"'{}()/:[\\]]*[^\\s,\"'{}()/:[\\]]|[^\\s]","g"),f=/[\])"'A-Za-z0-9_$]+$/,g={"in":1,"return":1,"typeof":1},k={};return{ta:[],ea:k,yb:b,Ua:function(e,m){function h(b,e){var m;if(!A){var l=a.getBindingHandler(b);if(l&&l.preprocess&&!(e=l.preprocess(e,b,h)))return;if(l=k[b])m=e,0<=a.a.o(c,m)?m=!1:(l=m.match(d),m=null===l?!1:l[1]?"Object("+l[1]+")"+l[2]:m),l=m;l&&g.push("'"+b+"':function(_z){"+m+"=_z}")}p&&(e=
"function(){return "+e+" }");f.push("'"+b+"':"+e)}m=m||{};var f=[],g=[],p=m.valueAccessors,A=m.bindingParams,y="string"===typeof e?b(e):e;a.a.q(y,function(a){h(a.key||a.unknown,a.value)});g.length&&h("_ko_property_writers","{"+g.join(",")+" }");return f.join(",")},ad:function(a,b){for(var c=0;c<a.length;c++)if(a[c].key==b)return!0;return!1},Ea:function(b,c,d,e,f){if(b&&a.H(b))!a.Ba(b)||f&&b.t()===e||b(e);else if((b=c.get("_ko_property_writers"))&&b[d])b[d](e)}}}();a.b("expressionRewriting",a.h);a.b("expressionRewriting.bindingRewriteValidators",
a.h.ta);a.b("expressionRewriting.parseObjectLiteral",a.h.yb);a.b("expressionRewriting.preProcessBindings",a.h.Ua);a.b("expressionRewriting._twoWayBindings",a.h.ea);a.b("jsonExpressionRewriting",a.h);a.b("jsonExpressionRewriting.insertPropertyAccessorsIntoJson",a.h.Ua);(function(){function b(a){return 8==a.nodeType&&g.test(f?a.text:a.nodeValue)}function c(a){return 8==a.nodeType&&k.test(f?a.text:a.nodeValue)}function d(a,d){for(var e=a,f=1,l=[];e=e.nextSibling;){if(c(e)&&(f--,0===f))return l;l.push(e);
b(e)&&f++}if(!d)throw Error("Cannot find closing comment tag to match: "+a.nodeValue);return null}function e(a,b){var c=d(a,b);return c?0<c.length?c[c.length-1].nextSibling:a.nextSibling:null}var f=u&&"\x3c!--test--\x3e"===u.createComment("test").text,g=f?/^\x3c!--\s*ko(?:\s+([\s\S]+))?\s*--\x3e$/:/^\s*ko(?:\s+([\s\S]+))?\s*$/,k=f?/^\x3c!--\s*\/ko\s*--\x3e$/:/^\s*\/ko\s*$/,l={ul:!0,ol:!0};a.f={Z:{},childNodes:function(a){return b(a)?d(a):a.childNodes},xa:function(c){if(b(c)){c=a.f.childNodes(c);for(var d=
0,e=c.length;d<e;d++)a.removeNode(c[d])}else a.a.ob(c)},da:function(c,d){if(b(c)){a.f.xa(c);for(var e=c.nextSibling,f=0,l=d.length;f<l;f++)e.parentNode.insertBefore(d[f],e)}else a.a.da(c,d)},mc:function(a,c){b(a)?a.parentNode.insertBefore(c,a.nextSibling):a.firstChild?a.insertBefore(c,a.firstChild):a.appendChild(c)},gc:function(c,d,e){e?b(c)?c.parentNode.insertBefore(d,e.nextSibling):e.nextSibling?c.insertBefore(d,e.nextSibling):c.appendChild(d):a.f.mc(c,d)},firstChild:function(a){return b(a)?!a.nextSibling||
c(a.nextSibling)?null:a.nextSibling:a.firstChild},nextSibling:function(a){b(a)&&(a=e(a));return a.nextSibling&&c(a.nextSibling)?null:a.nextSibling},Tc:b,pd:function(a){return(a=(f?a.text:a.nodeValue).match(g))?a[1]:null},kc:function(d){if(l[a.a.A(d)]){var h=d.firstChild;if(h){do if(1===h.nodeType){var f;f=h.firstChild;var g=null;if(f){do if(g)g.push(f);else if(b(f)){var k=e(f,!0);k?f=k:g=[f]}else c(f)&&(g=[f]);while(f=f.nextSibling)}if(f=g)for(g=h.nextSibling,k=0;k<f.length;k++)g?d.insertBefore(f[k],
g):d.appendChild(f[k])}while(h=h.nextSibling)}}}}})();a.b("virtualElements",a.f);a.b("virtualElements.allowedBindings",a.f.Z);a.b("virtualElements.emptyNode",a.f.xa);a.b("virtualElements.insertAfter",a.f.gc);a.b("virtualElements.prepend",a.f.mc);a.b("virtualElements.setDomNodeChildren",a.f.da);(function(){a.Q=function(){this.Fc={}};a.a.extend(a.Q.prototype,{nodeHasBindings:function(b){switch(b.nodeType){case 1:return null!=b.getAttribute("data-bind")||a.g.getComponentNameForNode(b);case 8:return a.f.Tc(b);
default:return!1}},getBindings:function(b,c){var d=this.getBindingsString(b,c),d=d?this.parseBindingsString(d,c,b):null;return a.g.Ob(d,b,c,!1)},getBindingAccessors:function(b,c){var d=this.getBindingsString(b,c),d=d?this.parseBindingsString(d,c,b,{valueAccessors:!0}):null;return a.g.Ob(d,b,c,!0)},getBindingsString:function(b){switch(b.nodeType){case 1:return b.getAttribute("data-bind");case 8:return a.f.pd(b);default:return null}},parseBindingsString:function(b,c,d,e){try{var f=this.Fc,g=b+(e&&e.valueAccessors||
""),k;if(!(k=f[g])){var l,m="with($context){with($data||{}){return{"+a.h.Ua(b,e)+"}}}";l=new Function("$context","$element",m);k=f[g]=l}return k(c,d)}catch(h){throw h.message="Unable to parse bindings.\nBindings value: "+b+"\nMessage: "+h.message,h;}}});a.Q.instance=new a.Q})();a.b("bindingProvider",a.Q);(function(){function b(a){return function(){return a}}function c(a){return a()}function d(b){return a.a.Ca(a.l.w(b),function(a,c){return function(){return b()[c]}})}function e(c,e,h){return"function"===
typeof c?d(c.bind(null,e,h)):a.a.Ca(c,b)}function f(a,b){return d(this.getBindings.bind(this,a,b))}function g(b,c,d){var e,h=a.f.firstChild(c),f=a.Q.instance,m=f.preprocessNode;if(m){for(;e=h;)h=a.f.nextSibling(e),m.call(f,e);h=a.f.firstChild(c)}for(;e=h;)h=a.f.nextSibling(e),k(b,e,d)}function k(b,c,d){var e=!0,h=1===c.nodeType;h&&a.f.kc(c);if(h&&d||a.Q.instance.nodeHasBindings(c))e=m(c,null,b,d).shouldBindDescendants;e&&!r[a.a.A(c)]&&g(b,c,!h)}function l(b){var c=[],d={},e=[];a.a.D(b,function Z(h){if(!d[h]){var f=
a.getBindingHandler(h);f&&(f.after&&(e.push(h),a.a.q(f.after,function(c){if(b[c]){if(-1!==a.a.o(e,c))throw Error("Cannot combine the following bindings, because they have a cyclic dependency: "+e.join(", "));Z(c)}}),e.length--),c.push({key:h,fc:f}));d[h]=!0}});return c}function m(b,d,e,h){var m=a.a.e.get(b,q);if(!d){if(m)throw Error("You cannot apply bindings multiple times to the same element.");a.a.e.set(b,q,!0)}!m&&h&&a.tc(b,e);var g;if(d&&"function"!==typeof d)g=d;else{var k=a.Q.instance,r=k.getBindingAccessors||
f,p=a.B(function(){(g=d?d(e,b):r.call(k,b,e))&&e.P&&e.P();return g},null,{i:b});g&&p.ba()||(p=null)}var u;if(g){var v=p?function(a){return function(){return c(p()[a])}}:function(a){return g[a]},s=function(){return a.a.Ca(p?p():g,c)};s.get=function(a){return g[a]&&c(v(a))};s.has=function(a){return a in g};h=l(g);a.a.q(h,function(c){var d=c.fc.init,h=c.fc.update,f=c.key;if(8===b.nodeType&&!a.f.Z[f])throw Error("The binding '"+f+"' cannot be used with virtual elements");try{"function"==typeof d&&a.l.w(function(){var a=
d(b,v(f),s,e.$data,e);if(a&&a.controlsDescendantBindings){if(u!==n)throw Error("Multiple bindings ("+u+" and "+f+") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.");u=f}}),"function"==typeof h&&a.B(function(){h(b,v(f),s,e.$data,e)},null,{i:b})}catch(m){throw m.message='Unable to process binding "'+f+": "+g[f]+'"\nMessage: '+m.message,m;}})}return{shouldBindDescendants:u===n}}function h(b){return b&&b instanceof a.U?b:new a.U(b)}
a.d={};var r={script:!0,textarea:!0,template:!0};a.getBindingHandler=function(b){return a.d[b]};a.U=function(b,c,d,e){var h=this,f="function"==typeof b&&!a.H(b),m,g=a.B(function(){var m=f?b():b,l=a.a.c(m);c?(c.P&&c.P(),a.a.extend(h,c),g&&(h.P=g)):(h.$parents=[],h.$root=l,h.ko=a);h.$rawData=m;h.$data=l;d&&(h[d]=l);e&&e(h,c,l);return h.$data},null,{wa:function(){return m&&!a.a.Qb(m)},i:!0});g.ba()&&(h.P=g,g.equalityComparer=null,m=[],g.Ac=function(b){m.push(b);a.a.F.oa(b,function(b){a.a.La(m,b);m.length||
(g.k(),h.P=g=n)})})};a.U.prototype.createChildContext=function(b,c,d){return new a.U(b,this,c,function(a,b){a.$parentContext=b;a.$parent=b.$data;a.$parents=(b.$parents||[]).slice(0);a.$parents.unshift(a.$parent);d&&d(a)})};a.U.prototype.extend=function(b){return new a.U(this.P||this.$data,this,null,function(c,d){c.$rawData=d.$rawData;a.a.extend(c,"function"==typeof b?b():b)})};var q=a.a.e.I(),p=a.a.e.I();a.tc=function(b,c){if(2==arguments.length)a.a.e.set(b,p,c),c.P&&c.P.Ac(b);else return a.a.e.get(b,
p)};a.Ja=function(b,c,d){1===b.nodeType&&a.f.kc(b);return m(b,c,h(d),!0)};a.Dc=function(b,c,d){d=h(d);return a.Ja(b,e(c,d,b),d)};a.eb=function(a,b){1!==b.nodeType&&8!==b.nodeType||g(h(a),b,!0)};a.Rb=function(a,b){!v&&x.jQuery&&(v=x.jQuery);if(b&&1!==b.nodeType&&8!==b.nodeType)throw Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node");b=b||x.document.body;k(h(a),b,!0)};a.kb=function(b){switch(b.nodeType){case 1:case 8:var c=a.tc(b);if(c)return c;
if(b.parentNode)return a.kb(b.parentNode)}return n};a.Jc=function(b){return(b=a.kb(b))?b.$data:n};a.b("bindingHandlers",a.d);a.b("applyBindings",a.Rb);a.b("applyBindingsToDescendants",a.eb);a.b("applyBindingAccessorsToNode",a.Ja);a.b("applyBindingsToNode",a.Dc);a.b("contextFor",a.kb);a.b("dataFor",a.Jc)})();(function(b){function c(c,e){var m=f.hasOwnProperty(c)?f[c]:b,h;m?m.X(e):(m=f[c]=new a.J,m.X(e),d(c,function(b,d){var e=!(!d||!d.synchronous);g[c]={definition:b,Zc:e};delete f[c];h||e?m.notifySubscribers(b):
a.Y.Wa(function(){m.notifySubscribers(b)})}),h=!0)}function d(a,b){e("getConfig",[a],function(c){c?e("loadComponent",[a,c],function(a){b(a,c)}):b(null,null)})}function e(c,d,f,h){h||(h=a.g.loaders.slice(0));var g=h.shift();if(g){var q=g[c];if(q){var p=!1;if(q.apply(g,d.concat(function(a){p?f(null):null!==a?f(a):e(c,d,f,h)}))!==b&&(p=!0,!g.suppressLoaderExceptions))throw Error("Component loaders must supply values by invoking the callback, not by returning values synchronously.");}else e(c,d,f,h)}else f(null)}
var f={},g={};a.g={get:function(d,e){var f=g.hasOwnProperty(d)?g[d]:b;f?f.Zc?a.l.w(function(){e(f.definition)}):a.Y.Wa(function(){e(f.definition)}):c(d,e)},Xb:function(a){delete g[a]},Jb:e};a.g.loaders=[];a.b("components",a.g);a.b("components.get",a.g.get);a.b("components.clearCachedDefinition",a.g.Xb)})();(function(){function b(b,c,d,e){function g(){0===--y&&e(k)}var k={},y=2,t=d.template;d=d.viewModel;t?f(c,t,function(c){a.g.Jb("loadTemplate",[b,c],function(a){k.template=a;g()})}):g();d?f(c,d,function(c){a.g.Jb("loadViewModel",
[b,c],function(a){k[l]=a;g()})}):g()}function c(a,b,d){if("function"===typeof b)d(function(a){return new b(a)});else if("function"===typeof b[l])d(b[l]);else if("instance"in b){var e=b.instance;d(function(){return e})}else"viewModel"in b?c(a,b.viewModel,d):a("Unknown viewModel value: "+b)}function d(b){switch(a.a.A(b)){case "script":return a.a.ma(b.text);case "textarea":return a.a.ma(b.value);case "template":if(e(b.content))return a.a.ua(b.content.childNodes)}return a.a.ua(b.childNodes)}function e(a){return x.DocumentFragment?
a instanceof DocumentFragment:a&&11===a.nodeType}function f(a,b,c){"string"===typeof b.require?O||x.require?(O||x.require)([b.require],c):a("Uses require, but no AMD loader is present"):c(b)}function g(a){return function(b){throw Error("Component '"+a+"': "+b);}}var k={};a.g.register=function(b,c){if(!c)throw Error("Invalid configuration for "+b);if(a.g.ub(b))throw Error("Component "+b+" is already registered");k[b]=c};a.g.ub=function(a){return k.hasOwnProperty(a)};a.g.od=function(b){delete k[b];
a.g.Xb(b)};a.g.Zb={getConfig:function(a,b){b(k.hasOwnProperty(a)?k[a]:null)},loadComponent:function(a,c,d){var e=g(a);f(e,c,function(c){b(a,e,c,d)})},loadTemplate:function(b,c,f){b=g(b);if("string"===typeof c)f(a.a.ma(c));else if(c instanceof Array)f(c);else if(e(c))f(a.a.V(c.childNodes));else if(c.element)if(c=c.element,x.HTMLElement?c instanceof HTMLElement:c&&c.tagName&&1===c.nodeType)f(d(c));else if("string"===typeof c){var l=u.getElementById(c);l?f(d(l)):b("Cannot find element with ID "+c)}else b("Unknown element type: "+
c);else b("Unknown template value: "+c)},loadViewModel:function(a,b,d){c(g(a),b,d)}};var l="createViewModel";a.b("components.register",a.g.register);a.b("components.isRegistered",a.g.ub);a.b("components.unregister",a.g.od);a.b("components.defaultLoader",a.g.Zb);a.g.loaders.push(a.g.Zb);a.g.Bc=k})();(function(){function b(b,e){var f=b.getAttribute("params");if(f){var f=c.parseBindingsString(f,e,b,{valueAccessors:!0,bindingParams:!0}),f=a.a.Ca(f,function(c){return a.m(c,null,{i:b})}),g=a.a.Ca(f,function(c){var e=
c.t();return c.ba()?a.m({read:function(){return a.a.c(c())},write:a.Ba(e)&&function(a){c()(a)},i:b}):e});g.hasOwnProperty("$raw")||(g.$raw=f);return g}return{$raw:{}}}a.g.getComponentNameForNode=function(b){var c=a.a.A(b);if(a.g.ub(c)&&(-1!=c.indexOf("-")||"[object HTMLUnknownElement]"==""+b||8>=a.a.C&&b.tagName===c))return c};a.g.Ob=function(c,e,f,g){if(1===e.nodeType){var k=a.g.getComponentNameForNode(e);if(k){c=c||{};if(c.component)throw Error('Cannot use the "component" binding on a custom element matching a component');
var l={name:k,params:b(e,f)};c.component=g?function(){return l}:l}}return c};var c=new a.Q;9>a.a.C&&(a.g.register=function(a){return function(b){u.createElement(b);return a.apply(this,arguments)}}(a.g.register),u.createDocumentFragment=function(b){return function(){var c=b(),f=a.g.Bc,g;for(g in f)f.hasOwnProperty(g)&&c.createElement(g);return c}}(u.createDocumentFragment))})();(function(b){function c(b,c,d){c=c.template;if(!c)throw Error("Component '"+b+"' has no template");b=a.a.ua(c);a.f.da(d,b)}
function d(a,b,c,d){var e=a.createViewModel;return e?e.call(a,d,{element:b,templateNodes:c}):d}var e=0;a.d.component={init:function(f,g,k,l,m){function h(){var a=r&&r.dispose;"function"===typeof a&&a.call(r);q=r=null}var r,q,p=a.a.V(a.f.childNodes(f));a.a.F.oa(f,h);a.m(function(){var l=a.a.c(g()),k,t;"string"===typeof l?k=l:(k=a.a.c(l.name),t=a.a.c(l.params));if(!k)throw Error("No component name specified");var n=q=++e;a.g.get(k,function(e){if(q===n){h();if(!e)throw Error("Unknown component '"+k+
"'");c(k,e,f);var g=d(e,f,p,t);e=m.createChildContext(g,b,function(a){a.$component=g;a.$componentTemplateNodes=p});r=g;a.eb(e,f)}})},null,{i:f});return{controlsDescendantBindings:!0}}};a.f.Z.component=!0})();var S={"class":"className","for":"htmlFor"};a.d.attr={update:function(b,c){var d=a.a.c(c())||{};a.a.D(d,function(c,d){d=a.a.c(d);var g=!1===d||null===d||d===n;g&&b.removeAttribute(c);8>=a.a.C&&c in S?(c=S[c],g?b.removeAttribute(c):b[c]=d):g||b.setAttribute(c,d.toString());"name"===c&&a.a.rc(b,
g?"":d.toString())})}};(function(){a.d.checked={after:["value","attr"],init:function(b,c,d){function e(){var e=b.checked,f=p?g():e;if(!a.va.Sa()&&(!l||e)){var m=a.l.w(c);if(h){var k=r?m.t():m;q!==f?(e&&(a.a.pa(k,f,!0),a.a.pa(k,q,!1)),q=f):a.a.pa(k,f,e);r&&a.Ba(m)&&m(k)}else a.h.Ea(m,d,"checked",f,!0)}}function f(){var d=a.a.c(c());b.checked=h?0<=a.a.o(d,g()):k?d:g()===d}var g=a.nc(function(){return d.has("checkedValue")?a.a.c(d.get("checkedValue")):d.has("value")?a.a.c(d.get("value")):b.value}),k=
"checkbox"==b.type,l="radio"==b.type;if(k||l){var m=c(),h=k&&a.a.c(m)instanceof Array,r=!(h&&m.push&&m.splice),q=h?g():n,p=l||h;l&&!b.name&&a.d.uniqueName.init(b,function(){return!0});a.m(e,null,{i:b});a.a.p(b,"click",e);a.m(f,null,{i:b});m=n}}};a.h.ea.checked=!0;a.d.checkedValue={update:function(b,c){b.value=a.a.c(c())}}})();a.d.css={update:function(b,c){var d=a.a.c(c());null!==d&&"object"==typeof d?a.a.D(d,function(c,d){d=a.a.c(d);a.a.bb(b,c,d)}):(d=a.a.$a(String(d||"")),a.a.bb(b,b.__ko__cssValue,
!1),b.__ko__cssValue=d,a.a.bb(b,d,!0))}};a.d.enable={update:function(b,c){var d=a.a.c(c());d&&b.disabled?b.removeAttribute("disabled"):d||b.disabled||(b.disabled=!0)}};a.d.disable={update:function(b,c){a.d.enable.update(b,function(){return!a.a.c(c())})}};a.d.event={init:function(b,c,d,e,f){var g=c()||{};a.a.D(g,function(g){"string"==typeof g&&a.a.p(b,g,function(b){var m,h=c()[g];if(h){try{var r=a.a.V(arguments);e=f.$data;r.unshift(e);m=h.apply(e,r)}finally{!0!==m&&(b.preventDefault?b.preventDefault():
b.returnValue=!1)}!1===d.get(g+"Bubble")&&(b.cancelBubble=!0,b.stopPropagation&&b.stopPropagation())}})})}};a.d.foreach={ic:function(b){return function(){var c=b(),d=a.a.zb(c);if(!d||"number"==typeof d.length)return{foreach:c,templateEngine:a.W.sb};a.a.c(c);return{foreach:d.data,as:d.as,includeDestroyed:d.includeDestroyed,afterAdd:d.afterAdd,beforeRemove:d.beforeRemove,afterRender:d.afterRender,beforeMove:d.beforeMove,afterMove:d.afterMove,templateEngine:a.W.sb}}},init:function(b,c){return a.d.template.init(b,
a.d.foreach.ic(c))},update:function(b,c,d,e,f){return a.d.template.update(b,a.d.foreach.ic(c),d,e,f)}};a.h.ta.foreach=!1;a.f.Z.foreach=!0;a.d.hasfocus={init:function(b,c,d){function e(e){b.__ko_hasfocusUpdating=!0;var f=b.ownerDocument;if("activeElement"in f){var g;try{g=f.activeElement}catch(h){g=f.body}e=g===b}f=c();a.h.Ea(f,d,"hasfocus",e,!0);b.__ko_hasfocusLastValue=e;b.__ko_hasfocusUpdating=!1}var f=e.bind(null,!0),g=e.bind(null,!1);a.a.p(b,"focus",f);a.a.p(b,"focusin",f);a.a.p(b,"blur",g);a.a.p(b,
"focusout",g)},update:function(b,c){var d=!!a.a.c(c());b.__ko_hasfocusUpdating||b.__ko_hasfocusLastValue===d||(d?b.focus():b.blur(),!d&&b.__ko_hasfocusLastValue&&b.ownerDocument.body.focus(),a.l.w(a.a.Da,null,[b,d?"focusin":"focusout"]))}};a.h.ea.hasfocus=!0;a.d.hasFocus=a.d.hasfocus;a.h.ea.hasFocus=!0;a.d.html={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.Cb(b,c())}};K("if");K("ifnot",!1,!0);K("with",!0,!1,function(a,c){return a.createChildContext(c)});var L={};
a.d.options={init:function(b){if("select"!==a.a.A(b))throw Error("options binding applies only to SELECT elements");for(;0<b.length;)b.remove(0);return{controlsDescendantBindings:!0}},update:function(b,c,d){function e(){return a.a.Ka(b.options,function(a){return a.selected})}function f(a,b,c){var d=typeof b;return"function"==d?b(a):"string"==d?a[b]:c}function g(c,e){if(A&&h)a.j.ha(b,a.a.c(d.get("value")),!0);else if(p.length){var f=0<=a.a.o(p,a.j.u(e[0]));a.a.sc(e[0],f);A&&!f&&a.l.w(a.a.Da,null,[b,
"change"])}}var k=b.multiple,l=0!=b.length&&k?b.scrollTop:null,m=a.a.c(c()),h=d.get("valueAllowUnset")&&d.has("value"),r=d.get("optionsIncludeDestroyed");c={};var q,p=[];h||(k?p=a.a.fb(e(),a.j.u):0<=b.selectedIndex&&p.push(a.j.u(b.options[b.selectedIndex])));m&&("undefined"==typeof m.length&&(m=[m]),q=a.a.Ka(m,function(b){return r||b===n||null===b||!a.a.c(b._destroy)}),d.has("optionsCaption")&&(m=a.a.c(d.get("optionsCaption")),null!==m&&m!==n&&q.unshift(L)));var A=!1;c.beforeRemove=function(a){b.removeChild(a)};
m=g;d.has("optionsAfterRender")&&"function"==typeof d.get("optionsAfterRender")&&(m=function(b,c){g(0,c);a.l.w(d.get("optionsAfterRender"),null,[c[0],b!==L?b:n])});a.a.Bb(b,q,function(c,e,g){g.length&&(p=!h&&g[0].selected?[a.j.u(g[0])]:[],A=!0);e=b.ownerDocument.createElement("option");c===L?(a.a.Za(e,d.get("optionsCaption")),a.j.ha(e,n)):(g=f(c,d.get("optionsValue"),c),a.j.ha(e,a.a.c(g)),c=f(c,d.get("optionsText"),g),a.a.Za(e,c));return[e]},c,m);a.l.w(function(){h?a.j.ha(b,a.a.c(d.get("value")),
!0):(k?p.length&&e().length<p.length:p.length&&0<=b.selectedIndex?a.j.u(b.options[b.selectedIndex])!==p[0]:p.length||0<=b.selectedIndex)&&a.a.Da(b,"change")});a.a.Nc(b);l&&20<Math.abs(l-b.scrollTop)&&(b.scrollTop=l)}};a.d.options.xb=a.a.e.I();a.d.selectedOptions={after:["options","foreach"],init:function(b,c,d){a.a.p(b,"change",function(){var e=c(),f=[];a.a.q(b.getElementsByTagName("option"),function(b){b.selected&&f.push(a.j.u(b))});a.h.Ea(e,d,"selectedOptions",f)})},update:function(b,c){if("select"!=
a.a.A(b))throw Error("values binding applies only to SELECT elements");var d=a.a.c(c()),e=b.scrollTop;d&&"number"==typeof d.length&&a.a.q(b.getElementsByTagName("option"),function(b){var c=0<=a.a.o(d,a.j.u(b));b.selected!=c&&a.a.sc(b,c)});b.scrollTop=e}};a.h.ea.selectedOptions=!0;a.d.style={update:function(b,c){var d=a.a.c(c()||{});a.a.D(d,function(c,d){d=a.a.c(d);if(null===d||d===n||!1===d)d="";b.style[c]=d})}};a.d.submit={init:function(b,c,d,e,f){if("function"!=typeof c())throw Error("The value for a submit binding must be a function");
a.a.p(b,"submit",function(a){var d,e=c();try{d=e.call(f.$data,b)}finally{!0!==d&&(a.preventDefault?a.preventDefault():a.returnValue=!1)}})}};a.d.text={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.Za(b,c())}};a.f.Z.text=!0;(function(){if(x&&x.navigator)var b=function(a){if(a)return parseFloat(a[1])},c=x.opera&&x.opera.version&&parseInt(x.opera.version()),d=x.navigator.userAgent,e=b(d.match(/^(?:(?!chrome).)*version\/([^ ]*) safari/i)),f=b(d.match(/Firefox\/([^ ]*)/));
if(10>a.a.C)var g=a.a.e.I(),k=a.a.e.I(),l=function(b){var c=this.activeElement;(c=c&&a.a.e.get(c,k))&&c(b)},m=function(b,c){var d=b.ownerDocument;a.a.e.get(d,g)||(a.a.e.set(d,g,!0),a.a.p(d,"selectionchange",l));a.a.e.set(b,k,c)};a.d.textInput={init:function(b,d,g){function l(c,d){a.a.p(b,c,d)}function k(){var c=a.a.c(d());if(null===c||c===n)c="";v!==n&&c===v?a.a.setTimeout(k,4):b.value!==c&&(u=c,b.value=c)}function y(){s||(v=b.value,s=a.a.setTimeout(t,4))}function t(){clearTimeout(s);v=s=n;var c=
b.value;u!==c&&(u=c,a.h.Ea(d(),g,"textInput",c))}var u=b.value,s,v,x=9==a.a.C?y:t;10>a.a.C?(l("propertychange",function(a){"value"===a.propertyName&&x(a)}),8==a.a.C&&(l("keyup",t),l("keydown",t)),8<=a.a.C&&(m(b,x),l("dragend",y))):(l("input",t),5>e&&"textarea"===a.a.A(b)?(l("keydown",y),l("paste",y),l("cut",y)):11>c?l("keydown",y):4>f&&(l("DOMAutoComplete",t),l("dragdrop",t),l("drop",t)));l("change",t);a.m(k,null,{i:b})}};a.h.ea.textInput=!0;a.d.textinput={preprocess:function(a,b,c){c("textInput",
a)}}})();a.d.uniqueName={init:function(b,c){if(c()){var d="ko_unique_"+ ++a.d.uniqueName.Ic;a.a.rc(b,d)}}};a.d.uniqueName.Ic=0;a.d.value={after:["options","foreach"],init:function(b,c,d){if("input"!=b.tagName.toLowerCase()||"checkbox"!=b.type&&"radio"!=b.type){var e=["change"],f=d.get("valueUpdate"),g=!1,k=null;f&&("string"==typeof f&&(f=[f]),a.a.ra(e,f),e=a.a.Tb(e));var l=function(){k=null;g=!1;var e=c(),f=a.j.u(b);a.h.Ea(e,d,"value",f)};!a.a.C||"input"!=b.tagName.toLowerCase()||"text"!=b.type||
"off"==b.autocomplete||b.form&&"off"==b.form.autocomplete||-1!=a.a.o(e,"propertychange")||(a.a.p(b,"propertychange",function(){g=!0}),a.a.p(b,"focus",function(){g=!1}),a.a.p(b,"blur",function(){g&&l()}));a.a.q(e,function(c){var d=l;a.a.nd(c,"after")&&(d=function(){k=a.j.u(b);a.a.setTimeout(l,0)},c=c.substring(5));a.a.p(b,c,d)});var m=function(){var e=a.a.c(c()),f=a.j.u(b);if(null!==k&&e===k)a.a.setTimeout(m,0);else if(e!==f)if("select"===a.a.A(b)){var g=d.get("valueAllowUnset"),f=function(){a.j.ha(b,
e,g)};f();g||e===a.j.u(b)?a.a.setTimeout(f,0):a.l.w(a.a.Da,null,[b,"change"])}else a.j.ha(b,e)};a.m(m,null,{i:b})}else a.Ja(b,{checkedValue:c})},update:function(){}};a.h.ea.value=!0;a.d.visible={update:function(b,c){var d=a.a.c(c()),e="none"!=b.style.display;d&&!e?b.style.display="":!d&&e&&(b.style.display="none")}};(function(b){a.d[b]={init:function(c,d,e,f,g){return a.d.event.init.call(this,c,function(){var a={};a[b]=d();return a},e,f,g)}}})("click");a.O=function(){};a.O.prototype.renderTemplateSource=
function(){throw Error("Override renderTemplateSource");};a.O.prototype.createJavaScriptEvaluatorBlock=function(){throw Error("Override createJavaScriptEvaluatorBlock");};a.O.prototype.makeTemplateSource=function(b,c){if("string"==typeof b){c=c||u;var d=c.getElementById(b);if(!d)throw Error("Cannot find template with ID "+b);return new a.v.n(d)}if(1==b.nodeType||8==b.nodeType)return new a.v.qa(b);throw Error("Unknown template type: "+b);};a.O.prototype.renderTemplate=function(a,c,d,e){a=this.makeTemplateSource(a,
e);return this.renderTemplateSource(a,c,d,e)};a.O.prototype.isTemplateRewritten=function(a,c){return!1===this.allowTemplateRewriting?!0:this.makeTemplateSource(a,c).data("isRewritten")};a.O.prototype.rewriteTemplate=function(a,c,d){a=this.makeTemplateSource(a,d);c=c(a.text());a.text(c);a.data("isRewritten",!0)};a.b("templateEngine",a.O);a.Gb=function(){function b(b,c,d,k){b=a.h.yb(b);for(var l=a.h.ta,m=0;m<b.length;m++){var h=b[m].key;if(l.hasOwnProperty(h)){var r=l[h];if("function"===typeof r){if(h=
r(b[m].value))throw Error(h);}else if(!r)throw Error("This template engine does not support the '"+h+"' binding within its templates");}}d="ko.__tr_ambtns(function($context,$element){return(function(){return{ "+a.h.Ua(b,{valueAccessors:!0})+" } })()},'"+d.toLowerCase()+"')";return k.createJavaScriptEvaluatorBlock(d)+c}var c=/(<([a-z]+\d*)(?:\s+(?!data-bind\s*=\s*)[a-z0-9\-]+(?:=(?:\"[^\"]*\"|\'[^\']*\'|[^>]*))?)*\s+)data-bind\s*=\s*(["'])([\s\S]*?)\3/gi,d=/\x3c!--\s*ko\b\s*([\s\S]*?)\s*--\x3e/g;return{Oc:function(b,
c,d){c.isTemplateRewritten(b,d)||c.rewriteTemplate(b,function(b){return a.Gb.dd(b,c)},d)},dd:function(a,f){return a.replace(c,function(a,c,d,e,h){return b(h,c,d,f)}).replace(d,function(a,c){return b(c,"\x3c!-- ko --\x3e","#comment",f)})},Ec:function(b,c){return a.M.wb(function(d,k){var l=d.nextSibling;l&&l.nodeName.toLowerCase()===c&&a.Ja(l,b,k)})}}}();a.b("__tr_ambtns",a.Gb.Ec);(function(){a.v={};a.v.n=function(b){if(this.n=b){var c=a.a.A(b);this.ab="script"===c?1:"textarea"===c?2:"template"==c&&
b.content&&11===b.content.nodeType?3:4}};a.v.n.prototype.text=function(){var b=1===this.ab?"text":2===this.ab?"value":"innerHTML";if(0==arguments.length)return this.n[b];var c=arguments[0];"innerHTML"===b?a.a.Cb(this.n,c):this.n[b]=c};var b=a.a.e.I()+"_";a.v.n.prototype.data=function(c){if(1===arguments.length)return a.a.e.get(this.n,b+c);a.a.e.set(this.n,b+c,arguments[1])};var c=a.a.e.I();a.v.n.prototype.nodes=function(){var b=this.n;if(0==arguments.length)return(a.a.e.get(b,c)||{}).jb||(3===this.ab?
b.content:4===this.ab?b:n);a.a.e.set(b,c,{jb:arguments[0]})};a.v.qa=function(a){this.n=a};a.v.qa.prototype=new a.v.n;a.v.qa.prototype.text=function(){if(0==arguments.length){var b=a.a.e.get(this.n,c)||{};b.Hb===n&&b.jb&&(b.Hb=b.jb.innerHTML);return b.Hb}a.a.e.set(this.n,c,{Hb:arguments[0]})};a.b("templateSources",a.v);a.b("templateSources.domElement",a.v.n);a.b("templateSources.anonymousTemplate",a.v.qa)})();(function(){function b(b,c,d){var e;for(c=a.f.nextSibling(c);b&&(e=b)!==c;)b=a.f.nextSibling(e),
d(e,b)}function c(c,d){if(c.length){var e=c[0],f=c[c.length-1],g=e.parentNode,k=a.Q.instance,n=k.preprocessNode;if(n){b(e,f,function(a,b){var c=a.previousSibling,d=n.call(k,a);d&&(a===e&&(e=d[0]||b),a===f&&(f=d[d.length-1]||c))});c.length=0;if(!e)return;e===f?c.push(e):(c.push(e,f),a.a.za(c,g))}b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.Rb(d,b)});b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.M.yc(b,[d])});a.a.za(c,g)}}function d(a){return a.nodeType?a:0<a.length?a[0]:null}function e(b,
e,f,k,q){q=q||{};var p=(b&&d(b)||f||{}).ownerDocument,n=q.templateEngine||g;a.Gb.Oc(f,n,p);f=n.renderTemplate(f,k,q,p);if("number"!=typeof f.length||0<f.length&&"number"!=typeof f[0].nodeType)throw Error("Template engine must return an array of DOM nodes");p=!1;switch(e){case "replaceChildren":a.f.da(b,f);p=!0;break;case "replaceNode":a.a.qc(b,f);p=!0;break;case "ignoreTargetNode":break;default:throw Error("Unknown renderMode: "+e);}p&&(c(f,k),q.afterRender&&a.l.w(q.afterRender,null,[f,k.$data]));
return f}function f(b,c,d){return a.H(b)?b():"function"===typeof b?b(c,d):b}var g;a.Db=function(b){if(b!=n&&!(b instanceof a.O))throw Error("templateEngine must inherit from ko.templateEngine");g=b};a.Ab=function(b,c,h,k,q){h=h||{};if((h.templateEngine||g)==n)throw Error("Set a template engine before calling renderTemplate");q=q||"replaceChildren";if(k){var p=d(k);return a.B(function(){var g=c&&c instanceof a.U?c:new a.U(a.a.c(c)),n=f(b,g.$data,g),g=e(k,q,n,g,h);"replaceNode"==q&&(k=g,p=d(k))},null,
{wa:function(){return!p||!a.a.nb(p)},i:p&&"replaceNode"==q?p.parentNode:p})}return a.M.wb(function(d){a.Ab(b,c,h,d,"replaceNode")})};a.kd=function(b,d,g,k,q){function p(a,b){c(b,s);g.afterRender&&g.afterRender(b,a);s=null}function u(a,c){s=q.createChildContext(a,g.as,function(a){a.$index=c});var d=f(b,a,s);return e(null,"ignoreTargetNode",d,s,g)}var s;return a.B(function(){var b=a.a.c(d)||[];"undefined"==typeof b.length&&(b=[b]);b=a.a.Ka(b,function(b){return g.includeDestroyed||b===n||null===b||!a.a.c(b._destroy)});
a.l.w(a.a.Bb,null,[k,b,u,g,p])},null,{i:k})};var k=a.a.e.I();a.d.template={init:function(b,c){var d=a.a.c(c());if("string"==typeof d||d.name)a.f.xa(b);else{if("nodes"in d){if(d=d.nodes||[],a.H(d))throw Error('The "nodes" option must be a plain, non-observable array.');}else d=a.f.childNodes(b);d=a.a.jc(d);(new a.v.qa(b)).nodes(d)}return{controlsDescendantBindings:!0}},update:function(b,c,d,e,f){var g=c(),s;c=a.a.c(g);d=!0;e=null;"string"==typeof c?c={}:(g=c.name,"if"in c&&(d=a.a.c(c["if"])),d&&"ifnot"in
c&&(d=!a.a.c(c.ifnot)),s=a.a.c(c.data));"foreach"in c?e=a.kd(g||b,d&&c.foreach||[],c,b,f):d?(f="data"in c?f.createChildContext(s,c.as):f,e=a.Ab(g||b,f,c,b)):a.f.xa(b);f=e;(s=a.a.e.get(b,k))&&"function"==typeof s.k&&s.k();a.a.e.set(b,k,f&&f.ba()?f:n)}};a.h.ta.template=function(b){b=a.h.yb(b);return 1==b.length&&b[0].unknown||a.h.ad(b,"name")?null:"This template engine does not support anonymous templates nested within its templates"};a.f.Z.template=!0})();a.b("setTemplateEngine",a.Db);a.b("renderTemplate",
a.Ab);a.a.dc=function(a,c,d){if(a.length&&c.length){var e,f,g,k,l;for(e=f=0;(!d||e<d)&&(k=a[f]);++f){for(g=0;l=c[g];++g)if(k.value===l.value){k.moved=l.index;l.moved=k.index;c.splice(g,1);e=g=0;break}e+=g}}};a.a.ib=function(){function b(b,d,e,f,g){var k=Math.min,l=Math.max,m=[],h,n=b.length,q,p=d.length,s=p-n||1,u=n+p+1,t,v,x;for(h=0;h<=n;h++)for(v=t,m.push(t=[]),x=k(p,h+s),q=l(0,h-1);q<=x;q++)t[q]=q?h?b[h-1]===d[q-1]?v[q-1]:k(v[q]||u,t[q-1]||u)+1:q+1:h+1;k=[];l=[];s=[];h=n;for(q=p;h||q;)p=m[h][q]-
1,q&&p===m[h][q-1]?l.push(k[k.length]={status:e,value:d[--q],index:q}):h&&p===m[h-1][q]?s.push(k[k.length]={status:f,value:b[--h],index:h}):(--q,--h,g.sparse||k.push({status:"retained",value:d[q]}));a.a.dc(s,l,!g.dontLimitMoves&&10*n);return k.reverse()}return function(a,d,e){e="boolean"===typeof e?{dontLimitMoves:e}:e||{};a=a||[];d=d||[];return a.length<d.length?b(a,d,"added","deleted",e):b(d,a,"deleted","added",e)}}();a.b("utils.compareArrays",a.a.ib);(function(){function b(b,c,d,k,l){var m=[],
h=a.B(function(){var h=c(d,l,a.a.za(m,b))||[];0<m.length&&(a.a.qc(m,h),k&&a.l.w(k,null,[d,h,l]));m.length=0;a.a.ra(m,h)},null,{i:b,wa:function(){return!a.a.Qb(m)}});return{ca:m,B:h.ba()?h:n}}var c=a.a.e.I(),d=a.a.e.I();a.a.Bb=function(e,f,g,k,l){function m(b,c){w=q[c];v!==c&&(D[b]=w);w.qb(v++);a.a.za(w.ca,e);u.push(w);z.push(w)}function h(b,c){if(b)for(var d=0,e=c.length;d<e;d++)c[d]&&a.a.q(c[d].ca,function(a){b(a,d,c[d].ja)})}f=f||[];k=k||{};var r=a.a.e.get(e,c)===n,q=a.a.e.get(e,c)||[],p=a.a.fb(q,
function(a){return a.ja}),s=a.a.ib(p,f,k.dontLimitMoves),u=[],t=0,v=0,x=[],z=[];f=[];for(var D=[],p=[],w,C=0,B,E;B=s[C];C++)switch(E=B.moved,B.status){case "deleted":E===n&&(w=q[t],w.B&&(w.B.k(),w.B=n),a.a.za(w.ca,e).length&&(k.beforeRemove&&(u.push(w),z.push(w),w.ja===d?w=null:f[C]=w),w&&x.push.apply(x,w.ca)));t++;break;case "retained":m(C,t++);break;case "added":E!==n?m(C,E):(w={ja:B.value,qb:a.N(v++)},u.push(w),z.push(w),r||(p[C]=w))}a.a.e.set(e,c,u);h(k.beforeMove,D);a.a.q(x,k.beforeRemove?a.$:
a.removeNode);for(var C=0,r=a.f.firstChild(e),F;w=z[C];C++){w.ca||a.a.extend(w,b(e,g,w.ja,l,w.qb));for(t=0;s=w.ca[t];r=s.nextSibling,F=s,t++)s!==r&&a.f.gc(e,s,F);!w.Wc&&l&&(l(w.ja,w.ca,w.qb),w.Wc=!0)}h(k.beforeRemove,f);for(C=0;C<f.length;++C)f[C]&&(f[C].ja=d);h(k.afterMove,D);h(k.afterAdd,p)}})();a.b("utils.setDomNodeChildrenFromArrayMapping",a.a.Bb);a.W=function(){this.allowTemplateRewriting=!1};a.W.prototype=new a.O;a.W.prototype.renderTemplateSource=function(b,c,d,e){if(c=(9>a.a.C?0:b.nodes)?
b.nodes():null)return a.a.V(c.cloneNode(!0).childNodes);b=b.text();return a.a.ma(b,e)};a.W.sb=new a.W;a.Db(a.W.sb);a.b("nativeTemplateEngine",a.W);(function(){a.vb=function(){var a=this.$c=function(){if(!v||!v.tmpl)return 0;try{if(0<=v.tmpl.tag.tmpl.open.toString().indexOf("__"))return 2}catch(a){}return 1}();this.renderTemplateSource=function(b,e,f,g){g=g||u;f=f||{};if(2>a)throw Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later.");var k=b.data("precompiled");
k||(k=b.text()||"",k=v.template(null,"{{ko_with $item.koBindingContext}}"+k+"{{/ko_with}}"),b.data("precompiled",k));b=[e.$data];e=v.extend({koBindingContext:e},f.templateOptions);e=v.tmpl(k,b,e);e.appendTo(g.createElement("div"));v.fragments={};return e};this.createJavaScriptEvaluatorBlock=function(a){return"{{ko_code ((function() { return "+a+" })()) }}"};this.addTemplate=function(a,b){u.write("<script type='text/html' id='"+a+"'>"+b+"\x3c/script>")};0<a&&(v.tmpl.tag.ko_code={open:"__.push($1 || '');"},
v.tmpl.tag.ko_with={open:"with($1) {",close:"} "})};a.vb.prototype=new a.O;var b=new a.vb;0<b.$c&&a.Db(b);a.b("jqueryTmplTemplateEngine",a.vb)})()})})();})();
@@ -0,0 +1,19 @@
.empty-layout {
width: 100%;
height: 100%;
position: relative;
}
/* Prevent margin collapse */
.empty-layout::before {
content: "\00a0";
display: block;
overflow: hidden;
height: 0;
}
.empty-layout > div.content,
.empty-layout > div.content > div {
width: 100%;
height: 100%;
}
@@ -0,0 +1,9 @@
<div class="empty-layout" data-options="dxLayout : { name: 'empty' } " >
<div class="content layout-content" data-options="dxContentPlaceholder : { name: 'content', animation: 'view-content-change' }">
</div>
</div>
<div class="empty-layout" data-options="dxLayout : { name: 'empty', platform: 'win', phone: false } " >
<div class="content layout-content" data-options="dxContentPlaceholder : { name: 'content', contentCssPosition: 'static' }">
</div>
</div>
@@ -0,0 +1,23 @@
(function(root, factory) {
if (typeof define === 'function' && define.amd) {
define(function(require, exports, module) {
module.exports = factory(require("jquery"), require("framework/html/presets").layoutSets, require("framework/html/layout_controller").DefaultLayoutController)
})
}
else {
root.DevExpress.layouts = root.DevExpress.layouts || {};
root.DevExpress.layouts.EmptyLayout = factory(jQuery, DevExpress.framework.html.layoutSets, DevExpress.framework.html.DefaultLayoutController);
root.DevExpress.framework.html.EmptyLayoutController = root.DevExpress.layouts.EmptyLayout.EmptyLayoutController
}
}(this, function($, layoutSets, DefaultLayoutController) {
var exports = {};
var EmptyLayoutController = DefaultLayoutController.inherit({ctor: function(options) {
options = options || {};
options.name = options.name || "empty";
this.callBase(options)
}});
layoutSets["empty"] = layoutSets["empty"] || [];
layoutSets["empty"].push({controller: new EmptyLayoutController});
exports.EmptyLayoutController = EmptyLayoutController;
return exports
}));
@@ -0,0 +1,272 @@
/* Layout */
.navbar-layout,
.navbar-layout-tablet {
height: 100%;
width: 100%;
position: relative;
}
.navbar-layout .layout-header {
position: absolute;
width: 100%;
}
.navbar-layout .layout-content {
position: absolute;
width: 100%;
overflow: hidden;
}
.navbar-layout .layout-content > div,
.navbar-layout .transition-frame {
height: 100%;
width: 100%;
}
.navbar-layout .layout-footer {
width: 100%;
position: absolute;
}
.navbar-layout .view-footer {
position: static;
}
.navbar-layout .view-footer .dx-toolbar {
background: transparent;
border: none;
margin-bottom: 10px;
}
.navbar-layout .view-footer .dx-toolbar .dx-toolbar-center {
width: 100%;
}
/* ios7 */
.dx-theme-ios7 .navbar-layout .layout-header {
top: 0;
height: 44px;
}
.dx-theme-ios7 .navbar-layout .layout-content {
top: 44px;
bottom: 0;
}
.dx-theme-ios7 .navbar-layout.has-navbar .layout-content {
bottom: 59px;
}
.dx-theme-ios7 .navbar-layout.has-navbar .layout-footer {
height: 59px;
bottom: 0;
}
.dx-theme-ios7 .navbar-layout .view-footer .dx-toolbar {
height: 57px;
}
.dx-theme-ios7 .navbar-layout .view-footer .dx-button .dx-button-content .dx-button-text {
font-size: 20px;
line-height: 38px;
}
/* android5 */
.dx-theme-android5 .navbar-layout .layout-header .dx-navbar {
top: 0;
height: 80px;
}
.dx-theme-android5 .navbar-layout .layout-content {
top: 0;
bottom: 0;
}
.dx-theme-android5 .navbar-layout.has-toolbar .layout-content {
bottom: 56px;
}
.dx-theme-android5 .navbar-layout.has-navbar .layout-content {
top: 80px;
}
.dx-theme-android5 .navbar-layout .layout-footer {
bottom: 0;
height: 56px;
display: none;
}
.dx-theme-android5 .navbar-layout.has-toolbar .layout-footer {
display: block;
}
/* win8 */
.dx-theme-win8 .navbar-layout-tablet {
height: 100%;
}
.dx-theme-win8 .navbar-layout-tablet .layout-header,
.dx-theme-win8 .navbar-layout-tablet .layout-content {
position: static;
width: auto;
}
.dx-theme-win8 .navbar-layout-tablet .layout-content,
.dx-theme-win8 .navbar-layout-tablet .layout-content .dx-content {
height: 100%;
}
.dx-theme-win8 .navbar-layout-tablet {
display: -ms-grid;
-ms-grid-columns: 1fr;
-ms-grid-rows: 274px 1fr;
overflow: hidden;
}
.dx-theme-win8 .navbar-layout-tablet .layout-header {
-ms-grid-column: 1;
-ms-grid-row: 1;
height: 180px;
padding: 60px; /* #B230682 */
}
.dx-theme-win8 .navbar-layout-tablet .layout-header h1 {
margin-bottom: 40px;
}
.dx-theme-win8 .navbar-layout-tablet .layout-content-wrapper {
padding: 0 60px 60px 60px; /* #B230682 */
/* for IE */
-ms-grid-column: 1;
-ms-grid-row: 2;
/* end for IE */
}
.dx-theme-win8 .navbar-layout-tablet.dx-animating:not(.dx-enter):not(.dx-leave) {
display: none;
}
/* win10 */
.dx-theme-win10 .navbar-layout-tablet {
height: 100%;
}
.dx-theme-win10 .navbar-layout-tablet .layout-header,
.dx-theme-win10 .navbar-layout-tablet .layout-content {
position: static;
width: auto;
}
.dx-theme-win10 .navbar-layout-tablet .layout-content,
.dx-theme-win10 .navbar-layout-tablet .layout-content .dx-content {
height: 100%;
}
.dx-theme-win10 .navbar-layout-tablet {
display: -ms-grid;
-ms-grid-columns: 1fr;
-ms-grid-rows: 300px 1fr;
overflow: hidden;
}
.dx-theme-win10 .navbar-layout-tablet .layout-header {
-ms-grid-column: 1;
-ms-grid-row: 1;
}
.dx-theme-win10 .navbar-layout-tablet .layout-header .dx-content-placeholder-header {
padding: 60px 60px 0;
}
.dx-theme-win10 .navbar-layout-tablet .layout-header .navbar-container {
height: 80px;
}
.dx-theme-win10 .navbar-layout-tablet .layout-header h1 {
margin-bottom: 60px;
}
.dx-theme-win10 .navbar-layout-tablet .layout-content-wrapper {
padding: 0 60px 60px 60px;
/* for IE */
-ms-grid-column: 1;
-ms-grid-row: 2;
/* end for IE */
}
.dx-theme-win10 .navbar-layout-tablet.dx-animating:not(.dx-enter):not(.dx-leave),
.dx-theme-win10 .navbar-layout.dx-animating:not(.dx-enter):not(.dx-leave) {
display: none;
}
.dx-theme-win10 .navbar-layout .layout-header {
top: 0;
height: 80px;
}
.dx-theme-win10 .navbar-layout .layout-content {
top: 80px;
bottom: 0;
}
.dx-theme-win10 .navbar-layout.has-toolbar .layout-content {
bottom: 48px;
}
.dx-theme-win10 .navbar-layout .layout-footer {
bottom: 0;
height: 48px;
}
/* generic */
.dx-theme-generic .navbar-layout .layout-content {
top: 56px;
bottom: 0px;
}
.dx-theme-generic.dx-device-mobile .navbar-layout .layout-header {
height: 56px;
}
.dx-theme-generic.dx-device-mobile .navbar-layout .layout-header .dx-toolbar {
background: none;
}
.dx-theme-generic .navbar-layout .layout-header .dx-toolbar {
padding: 0 10px;
}
.dx-theme-generic .navbar-layout .layout-header .dx-toolbar-items-container {
height: 56px;
}
.dx-theme-generic .navbar-layout.has-navbar .layout-content {
bottom: 68px;
}
.dx-theme-generic .navbar-layout .layout-footer,
.dx-theme-generic .navbar-layout .layout-footer .dx-navbar {
bottom: 0;
height: 68px;
}
.dx-theme-generic .navbar-layout.has-toolbar .layout-footer {
display: block;
}
.dx-theme-generic .navbar-layout .dx-tabs.dx-navbar {
padding: 0;
}
.dx-theme-generic .navbar-layout .view-footer .dx-button {
width: 97%;
overflow: visible;
}
@@ -0,0 +1,88 @@
<div class="navbar-layout" data-options="dxLayout : { name: 'navbar', platform: 'ios' } ">
<div class="layout-header dx-toolbar-background" data-options="dxContentPlaceholder : { name: 'header', animation: 'view-header-toolbar' }">
<div data-bind="dxToolbar: { items: [ { text: title, location: 'center' } ] }" data-options="dxCommandContainer : { id: 'ios-header-toolbar' }">
</div>
</div>
<div class="layout-content" data-options="dxContentPlaceholder : { name: 'content', animation: 'view-content-change' }">
</div>
<div class="layout-footer">
<div class="navbar-container" data-bind="dxNavBar: { }" data-options="dxCommandContainer: { id: 'global-navigation' }">
</div>
</div>
<div class="view-footer" data-options="dxContent : { targetPlaceholder: 'view-footer' } ">
<div class="view-toolbar-bottom" data-bind="dxToolbar: { visible: false }" data-options="dxCommandContainer : { id: 'ios-view-footer' } ">
</div>
</div>
</div>
<div class="navbar-layout" data-options="dxLayout : { name: 'navbar', platform: 'android' } ">
<div class="layout-header">
<div class="navbar-container dx-navbar-layout-header" data-bind="dxNavBar: {}" data-options="dxCommandContainer: { id: 'global-navigation' }">
</div>
</div>
<div class="layout-content" data-options="dxContentPlaceholder : { name: 'content', animation: 'view-content-change' }">
</div>
<div class="layout-footer" data-options="dxContentPlaceholder: { name: 'footer' } ">
<div data-bind="dxToolbar: { visible: false }" data-options="dxCommandContainer : { id: 'android-footer-toolbar' } "></div>
</div>
</div>
<div class="navbar-layout" data-options="dxLayout : { name: 'navbar', platform: 'generic' } ">
<div class="layout-header dx-toolbar-background" data-options="dxContentPlaceholder : { name: 'header', animation: 'view-header-toolbar' }">
<div data-bind="dxToolbar: { items: [{ text: title, location: 'center' }] }" data-options="dxCommandContainer : { id: 'generic-header-toolbar' }">
</div>
</div>
<div class="layout-content" data-options="dxContentPlaceholder : { name: 'content', animation: 'view-content-change' }">
</div>
<div class="layout-footer">
<div class="navbar-container" data-bind="dxNavBar: {}" data-options="dxCommandContainer: { id: 'global-navigation' }">
</div>
</div>
<div class="view-footer" data-options="dxContent : { targetPlaceholder: 'view-footer' } ">
<div class="view-toolbar-bottom" data-bind="dxToolbar: { visible: false }" data-options="dxCommandContainer : { id: 'generic-view-footer' } ">
</div>
</div>
</div>
<div class="navbar-layout-tablet" data-options="dxLayout : { name: 'navbar', platform: 'win', phone: false }">
<div class="layout-header">
<div data-options="dxContentPlaceholder : { name: 'header', contentCssPosition: 'static' }">
<h1 class="view-title" data-bind="text: title"></h1>
</div>
<div class="navbar-container" data-bind="dxNavBar: { selectionMode: 'none' }" data-options="dxCommandContainer : { id: 'global-navigation' }"></div>
</div>
<div class="layout-content-wrapper">
<div class="layout-content" data-options="dxContentPlaceholder : { name: 'content', contentCssPosition: 'static' }">
</div>
</div>
</div>
<div class="navbar-layout" data-options="dxLayout : { name: 'navbar', platform: 'win', phone: true } ">
<div class="layout-header">
<div class="navbar-container dx-navbar-layout-header" data-bind="dxNavBar: {}" data-options="dxCommandContainer: { id: 'global-navigation' }">
</div>
</div>
<div class="layout-content" data-options="dxContentPlaceholder : { name: 'content', animation: 'view-content-change' }">
</div>
<div class="layout-footer" data-options="dxContentPlaceholder : { name: 'footer' }">
<div class="layout-toolbar-bottom" data-bind="dxToolbar: { items: [], renderAs: 'bottomToolbar', visible: false }" data-options="dxCommandContainer : { id: 'win10-phone-appbar' } "></div>
</div>
</div>
@@ -0,0 +1,63 @@
(function(root, factory) {
if (typeof define === 'function' && define.amd) {
define(function(require, exports, module) {
module.exports = factory(require("framework/html/presets").layoutSets, require("framework/html/layout_controller").DefaultLayoutController, require("ui/toolbar"))
})
}
else {
root.DevExpress.layouts = root.DevExpress.layouts || {};
root.DevExpress.layouts.NavbarLayout = factory(DevExpress.framework.html.layoutSets, DevExpress.framework.html.DefaultLayoutController);
root.DevExpress.framework.html.NavBarController = root.DevExpress.layouts.NavbarLayout.NavBarController
}
}(this, function(layoutSets, DefaultLayoutController) {
var exports = {},
HAS_NAVBAR_CLASS = "has-navbar",
HAS_TOOLBAR_CLASS = "has-toolbar",
LAYOUT_FOOTER_SELECTOR = ".layout-footer",
ACTIVE_TOOLBAR_SELECTOR = ".dx-active-view .dx-toolbar";
var NavBarController = DefaultLayoutController.inherit({
ctor: function(options) {
options = options || {};
options.name = options.name || "navbar";
this.callBase(options)
}, _createNavigationWidget: function(navigationCommands) {
this.callBase(navigationCommands);
this.$navbar = this._$mainLayout.find(".navbar-container");
return this.$navbar
}, _renderNavigationImpl: function(navigationCommands) {
this.callBase(navigationCommands);
if (navigationCommands.length) {
this._$mainLayout.addClass(HAS_NAVBAR_CLASS)
}
}, _showViewImpl: function(viewInfo) {
var that = this;
return that.callBase.apply(that, arguments).done(function() {
var $toolbar = that._$mainLayout.find(LAYOUT_FOOTER_SELECTOR).find(ACTIVE_TOOLBAR_SELECTOR),
isToolbarEmpty = !$toolbar.length || !$toolbar.dxToolbar("instance").option("visible");
that._$mainLayout.toggleClass(HAS_TOOLBAR_CLASS, !isToolbarEmpty)
})
}
});
layoutSets["navbar"] = layoutSets["navbar"] || [];
layoutSets["navbar"].push({
platform: "ios", controller: new NavBarController
});
layoutSets["navbar"].push({
platform: "android", controller: new NavBarController
});
layoutSets["navbar"].push({
platform: "generic", controller: new NavBarController
});
layoutSets["navbar"].push({
platform: "win", controller: new NavBarController
});
layoutSets["split"] = layoutSets["split"] || [];
layoutSets["split"].push({
platform: "win", phone: false, root: true, pane: "master", controller: new NavBarController
});
layoutSets["split"].push({
platform: "win", phone: true, controller: new NavBarController
});
exports.NavBarController = NavBarController;
return exports
}));
@@ -0,0 +1,111 @@
/* Layout */
.navbar-layout-phone .layout-content,
.navbar-layout-phone .layout-content > div {
-position: absolute;
height: 100%;
width: 100%;
}
/* Windows phone 8 */
.dx-theme-win8 .pivot-layout {
height: 100%;
position: relative;
}
.dx-theme-win8 .navbar-layout-phone {
height: 100%;
position: relative;
}
.dx-theme-win8 .pivot-layout .dx-toolbar.layout-toolbar-bottom {
position: absolute;
bottom: 0;
width: 100%;
}
.dx-theme-win8 .pivot-layout .layout-footer {
position: absolute;
bottom: 0;
width: 100%;
height: 0;
}
.dx-theme-win8 .pivot-layout.has-toolbar-bottom .layout-footer {
height: 40px;
}
.dx-theme-win8 .pivot-layout.dx-animating:not(.dx-enter):not(.dx-leave) {
display: none;
}
.dx-theme-win8 .navbar-layout-phone .layout-content {
overflow: hidden;
width: 100%;
}
.dx-theme-win8 .has-toolbar-bottom .dx-pivot {
overflow: hidden;
width: 100%;
height: auto;
top: 0;
bottom: 40px;
position: absolute;
}
.dx-theme-win8 .navbar-layout-phone .layout-header .dx-toolbar {
opacity: 1;
}
/* Windows phone 10 */
.dx-theme-win10 .pivot-layout {
height: 100%;
position: relative;
}
.dx-theme-win10 .navbar-layout-phone {
height: 100%;
position: relative;
}
.dx-theme-win10 .pivot-layout .dx-toolbar.layout-toolbar-bottom {
position: absolute;
bottom: 0;
width: 100%;
}
.dx-theme-win10 .pivot-layout .layout-footer {
position: absolute;
bottom: 0;
width: 100%;
height: 0;
}
.dx-theme-win10 .pivot-layout.has-toolbar-bottom .layout-footer {
height: 48px;
}
.dx-theme-win10 .pivot-layout.dx-animating:not(.dx-enter):not(.dx-leave) {
display: none;
}
.dx-theme-win10 .navbar-layout-phone .layout-content {
overflow: hidden;
width: 100%;
}
.dx-theme-win10 .has-toolbar-bottom .dx-pivot {
overflow: hidden;
width: 100%;
height: auto;
top: 0;
bottom: 48px;
position: absolute;
}
.dx-theme-win10 .navbar-layout-phone .layout-header .dx-toolbar {
opacity: 1;
}
@@ -0,0 +1,11 @@
<div class="navbar-layout-phone" data-options="dxLayout : { name: 'pivot', platform: 'win', phone: true }">
<div class="layout-content" data-options="dxContentPlaceholder : { name: 'content' }">
</div>
<div class="layout-footer" data-options="dxContentPlaceholder : { name: 'footer' }">
<div data-bind="dxToolbar: { items: [], renderAs: 'bottomToolbar' }" data-options="dxCommandContainer : { id: 'win8-phone-appbar' }" class="layout-toolbar-bottom">
</div>
</div>
</div>
@@ -0,0 +1,90 @@
(function(root, factory) {
if (typeof define === 'function' && define.amd) {
define(function(require, exports, module) {
module.exports = factory(require("jquery"), require("framework/html/presets").layoutSets, require("framework/html/layout_controller").DefaultLayoutController, require("ui/pivot"), require("ui/toolbar"))
})
}
else {
root.DevExpress.layouts = root.DevExpress.layouts || {};
root.DevExpress.layouts.PivotLayout = factory(jQuery, DevExpress.framework.html.layoutSets, DevExpress.framework.html.DefaultLayoutController);
root.DevExpress.framework.html.PivotLayoutController = root.DevExpress.layouts.PivotLayout.PivotLayoutController
}
}(this, function($, layoutSets, DefaultLayoutController) {
var exports = {},
HAS_TOOLBAR_BOTTOM_CLASS = "has-toolbar-bottom",
TOOLBAR_BOTTOM_SELECTOR = ".layout-toolbar-bottom",
ACTIVE_PIVOT_ITEM_SELECTOR = ".dx-pivot-item:not(.dx-pivot-item-hidden)";
var PivotLayoutController = DefaultLayoutController.inherit({
ctor: function(options) {
options = options || {};
options.name = options.name || "pivot";
this._viewsInLayout = {};
this.callBase(options)
}, init: function(options) {
this.callBase(options)
}, _createNavigationWidget: function() {
var that = this;
this.$root = $("<div/>").addClass("pivot-layout");
this.$pivot = $("<div/>").appendTo(this.$root).dxPivot({itemTemplate: function(itemData, itemIndex, itemElement) {
var emptyLayout = that._createEmptyLayout();
that._showElements(emptyLayout);
emptyLayout.find(".layout-footer").remove();
emptyLayout.appendTo(itemElement)
}}).dxCommandContainer({id: 'global-navigation'});
this.$pivot.dxPivot("instance").on("optionChanged", function(args) {
if (args.name === "items") {
that._clearPivotViewsRenderCache()
}
});
var $tmpLayoutForFooter = that._createEmptyLayout();
this._showElements($tmpLayoutForFooter);
this.$footer = $tmpLayoutForFooter.find(".layout-footer").insertAfter(this.$pivot);
return this.$pivot
}, _clearPivotViewsRenderCache: function() {
var that = this;
$.each(this._viewsInLayout, function(key, viewInfo) {
that._clearRenderResult(viewInfo)
})
}, _renderNavigationImpl: function(navigationCommands) {
var container = this.$pivot.dxCommandContainer("instance");
this._commandManager.renderCommandsToContainers(navigationCommands, [container])
}, element: function() {
return this.$root
}, _getViewFrame: function(viewInfo) {
var $result = this.$pivot.find(ACTIVE_PIVOT_ITEM_SELECTOR);
$result = $result.add(this.$footer);
return $result
}, _showViewImpl: function(viewInfo, direction, previousViewTemplateId) {
this._showViewElements(viewInfo.renderResult.$markup);
this._changeView(viewInfo, previousViewTemplateId);
this._changeAppbar();
this._viewsInLayout[viewInfo.key] = viewInfo;
return $.Deferred().resolve().promise()
}, _changeAppbar: function() {
var $appbar = this.$footer.find(".dx-active-view " + TOOLBAR_BOTTOM_SELECTOR),
appbar = $appbar.dxToolbar("instance");
if (appbar) {
this._refreshAppbarVisibility(appbar, this.$root)
}
}, _refreshAppbarVisibility: function(appbar, $container) {
var isAppbarNotEmpty = false;
$.each(appbar.option("items"), function(index, item) {
if (item.visible) {
isAppbarNotEmpty = true;
return false
}
});
$container.toggleClass(HAS_TOOLBAR_BOTTOM_CLASS, isAppbarNotEmpty);
appbar.option("visible", isAppbarNotEmpty)
}, _hideView: function(viewInfo) {
this.callBase.apply(this, arguments);
this._changeAppbar()
}
});
layoutSets["navbar"] = layoutSets["navbar"] || [];
layoutSets["navbar"].push({
platform: "win", version: [8], phone: true, root: true, controller: new PivotLayoutController
});
exports.PivotLayoutController = PivotLayoutController;
return exports
}));
@@ -0,0 +1,8 @@
.child-controller-content {
height: 100%;
}
.popup-container .dx-popup-content,
.popover-container .dx-popup-content {
padding: 0;
}
@@ -0,0 +1,6 @@
<div class="popup-layout" data-options="dxLayout : { name: 'popup' }">
<div data-bind="dxPopup: { showTitle: false, contentTemplate: 'content', fullScreen: true, deferRendering: false, closeOnBackButton: false, showCloseButton: false }" class="popup-container">
<div data-options="dxTemplate: { name: 'content' }" class="child-controller-content">
</div>
</div>
</div>
@@ -0,0 +1,99 @@
(function(root, factory) {
if (typeof define === 'function' && define.amd) {
define(function(require, exports, module) {
module.exports = factory(require("jquery"), require("framework/html/presets").layoutSets, require("framework/html/layout_controller").DefaultLayoutController, require("../Simple/SimpleLayout.js").SimpleLayoutController, require("ui/popup"))
})
}
else {
root.DevExpress.layouts = root.DevExpress.layouts || {};
root.DevExpress.layouts.PopupLayout = factory(jQuery, DevExpress.framework.html.layoutSets, DevExpress.framework.html.DefaultLayoutController, DevExpress.layouts.SimpleLayout.SimpleLayoutController);
root.DevExpress.framework.html.OverlayLayoutControllerBase = root.DevExpress.layouts.PopupLayout.OverlayLayoutControllerBase;
root.DevExpress.framework.html.PopupLayoutController = root.DevExpress.layouts.PopupLayout.PopupLayoutController
}
}(this, function($, layoutSets, DefaultLayoutController, SimpleLayoutController) {
var exports = {},
abstract = DefaultLayoutController.abstract;
var OverlayLayoutControllerBase = DefaultLayoutController.inherit({
ctor: function(options) {
options = options || {};
this.callBase(options);
if (!options.childController) {
this._ensureChildController(SimpleLayoutController, "SimpleLayout");
this.childController = new SimpleLayoutController
}
else {
this.childController = options.childController
}
this.contentContainerSelector = options.contentContainerSelector
}, _initChildController: function(options) {
var that = this,
$targetViewPort = that._$mainLayout.find(this.contentContainerSelector);
that.childController.init($.extend({}, options, {$viewPort: $targetViewPort}));
$.each(["viewRendered", "viewShowing", "viewReleased", "viewHidden"], function(_, callbacksPropertyName) {
that.childController.on(callbacksPropertyName, function(args) {
that.fireEvent(callbacksPropertyName, [args])
})
})
}, _ensureChildController: function(controller, layoutName) {
if (!controller) {
throw new Error(layoutName + "Controller is not found but it is required by the '" + this.name + "' layout for specified platform and device. Make sure the " + layoutName + ".* files are referenced in your main *.html file or specify other platform and device.");
}
}, _base: function() {
return DefaultLayoutController.prototype
}, _showContainerWidget: abstract, _hideContainerWidget: abstract, init: function(options) {
options = options || {};
this.callBase(options);
this._initChildController(options)
}, activate: function($target) {
var that = this,
result;
that.childController.activate();
that._base().activate.call(that, $target);
result = that._showContainerWidget($target);
return result
}, deactivate: function() {
var that = this,
result;
result = that._hideContainerWidget();
result.done(function() {
that._base().deactivate.call(that);
that.childController.deactivate()
});
return result
}, showView: function(viewInfo, direction) {
return this.childController.showView(viewInfo, direction)
}
});
var PopupLayoutController = OverlayLayoutControllerBase.inherit({
ctor: function(options) {
options = options || {};
options.name = options.name || "popup";
options.contentContainerSelector = options.contentContainerSelector || ".child-controller-content";
this.isOverlay = true;
this._targetContainer = options.targetContainer;
this.callBase(options)
}, init: function(options) {
this.callBase(options);
this._popup = this._$mainLayout.find(".popup-container").dxPopup("instance");
if (this._targetContainer) {
this._popup.option("container", this._targetContainer)
}
}, _showContainerWidget: function() {
return this._popup.show()
}, _hideContainerWidget: function() {
return this._popup.hide()
}
});
$.each(["navbar", "simple", "slideout", "pivot", "split"], function(index, name) {
layoutSets[name] = layoutSets[name] || [];
$.each(layoutSets[name], function(index, layoutInfo) {
layoutInfo.modal = false
});
layoutSets[name].push({
modal: true, controller: new PopupLayoutController
})
});
exports.OverlayLayoutControllerBase = OverlayLayoutControllerBase;
exports.PopupLayoutController = PopupLayoutController;
return exports
}));
@@ -0,0 +1,232 @@
/* Layout */
.simple-layout,
.simple-layout-tablet {
height: 100%;
width: 100%;
position: relative;
}
.simple-layout .layout-header {
position: absolute;
width: 100%;
}
.simple-layout .layout-content {
position: absolute;
width: 100%;
overflow: hidden;
}
.simple-layout .layout-content > div,
.simple-layout .transition-frame {
height: 100%;
width: 100%;
}
.simple-layout .view-footer {
position: static;
}
.simple-layout .view-footer .dx-toolbar {
background: transparent;
border: none;
margin-bottom: 10px;
}
.simple-layout .view-footer .dx-toolbar .dx-toolbar-center {
width: 100%;
}
/* ios7 */
.dx-theme-ios7 .simple-layout .layout-header {
top: 0;
height: 44px;
}
.dx-theme-ios7 .simple-layout .layout-content {
top: 45px;
bottom: 0;
}
.dx-theme-ios7 .simple-layout .view-footer .dx-toolbar {
height: 57px;
}
.dx-theme-ios7 .simple-layout .view-footer .dx-button .dx-button-content .dx-button-text {
font-size: 20px;
line-height: 38px;
}
/* android5 */
.dx-theme-android5 .simple-layout .layout-content {
top: 56px;
bottom: 0;
}
/* generic */
.dx-theme-generic .simple-layout .layout-content {
top: 56px;
bottom: 0;
}
.dx-theme-generic.dx-device-mobile .simple-layout .layout-header {
height: 56px;
}
.dx-theme-generic.dx-device-mobile .simple-layout .layout-header .dx-toolbar {
background: none;
}
.dx-theme-generic .simple-layout .layout-header .dx-toolbar {
padding: 0 10px;
}
.dx-theme-generic .simple-layout .layout-header .dx-toolbar-items-container {
height: 56px;
}
.dx-theme-generic .simple-layout .view-footer .dx-button {
width: 97%;
overflow: visible;
}
/* Windows Phone 8*/
.dx-theme-win8 .simple-layout {
height: 100%;
width: 100%;
overflow: hidden;
position: relative;
}
.dx-theme-win8 .simple-layout .layout-header {
height: 20px;
margin-left: 10px;
text-transform: uppercase;
}
.dx-theme-win8 .simple-layout .layout-content {
position: absolute;
top: 20px;
bottom: 0;
width: 100%;
overflow: hidden;
}
.dx-theme-win8 .simple-layout .layout-content > div {
height: 100%;
width: 100%;
}
.dx-theme-win8 .simple-layout .view-content {
position: absolute;
height: 100%;
width: 100%;
}
.dx-theme-win8 .simple-layout .layout-frame {
top: 0;
bottom: 0;
position: absolute;
width: 100%;
}
.dx-theme-win8 .simple-layout.has-toolbar-bottom .layout-frame,
.dx-theme-win8 .simple-layout .has-toolbar-bottom.layout-frame {
bottom: 40px;
}
.dx-theme-win8 .simple-layout .dx-toolbar.layout-toolbar-bottom {
position: absolute;
bottom: 0;
margin-bottom: 0;
}
.dx-theme-win8 .simple-layout .layout-footer {
position: absolute;
bottom: 0;
height: 0;
width: 100%;
}
.dx-theme-win8 .simple-layout.has-toolbar-bottom .layout-footer {
height: 40px;
}
/* Windows Phone 10 */
.dx-theme-win10 .simple-layout {
height: 100%;
width: 100%;
overflow: hidden;
position: relative;
}
.dx-theme-win10 .simple-layout .layout-header {
height: 60px;
}
.dx-theme-win10.dx-device-phone .simple-layout .layout-header {
height: 20px;
top: 20px;
text-indent: 12px;
font-weight: bold;
text-transform: uppercase;
}
.dx-theme-win10.dx-device-desktop .simple-layout .layout-header .dx-toolbar-center {
margin: 0 0 0 70px;
text-align: left;
}
.dx-theme-win10 .simple-layout .layout-content {
position: absolute;
top: 60px;
bottom: 0;
width: 100%;
overflow: hidden;
}
.dx-theme-win10 .simple-layout .layout-content > div {
height: 100%;
width: 100%;
}
.dx-theme-win10 .simple-layout .view-content {
position: absolute;
height: 100%;
width: 100%;
}
.dx-theme-win10 .simple-layout .layout-frame {
top: 0;
bottom: 0;
position: absolute;
width: 100%;
}
.dx-theme-win10 .simple-layout.has-toolbar-bottom .layout-frame,
.dx-theme-win10 .simple-layout .has-toolbar-bottom.layout-frame {
bottom: 48px;
}
.dx-theme-win10 .simple-layout .dx-toolbar.layout-toolbar-bottom {
position: absolute;
bottom: 0;
margin-bottom: 0;
}
.dx-theme-win10 .simple-layout .layout-footer {
position: absolute;
bottom: 0;
height: 0;
width: 100%;
}
.dx-theme-win10 .simple-layout.has-toolbar-bottom .layout-footer {
height: 48px;
}
.dx-theme-win10 .simple-layout.dx-animating:not(.dx-enter):not(.dx-leave) {
display: none;
}
@@ -0,0 +1,95 @@
<div class="simple-layout" data-options="dxLayout : { name: 'simple', platform: 'win', phone: false, version: [8] } ">
<div class="layout-frame" data-options="dxTransition: { name: 'main', animation: 'view-content-change' }">
<div class="layout-header">
<div data-bind="dxToolbar: { items: [{ text: title, location: 'center' }] }"
data-options="dxCommandContainer : { id: 'win8-master-detail-toolbar' }">
</div>
</div>
<div class="layout-content" data-options="dxContentPlaceholder : { name: 'content', animation: 'view-content-change' } ">
</div>
</div>
<div class="layout-footer" data-options="dxContentPlaceholder : { name: 'footer' }">
<div class="layout-toolbar-bottom win8" data-bind="dxToolbar: { items: [], renderAs: 'bottomToolbar' }" data-options="dxCommandContainer : { id: 'win8-phone-appbar' } "></div>
</div>
</div>
<div class="simple-layout" data-options="dxLayout : { name: 'simple', platform: 'win', phone: false } ">
<div class="layout-frame" data-options="dxTransition: { name: 'main', animation: 'view-content-change' }">
<div class="layout-header">
<div data-bind="dxToolbar: { items: [{ text: title, location: 'center' }] }"
data-options="dxCommandContainer : { id: 'win10-appbar' }">
</div>
</div>
<div class="layout-content" data-options="dxContentPlaceholder : { name: 'content', animation: 'view-content-change' } ">
</div>
</div>
</div>
<div class="simple-layout" data-options="dxLayout : { name: 'simple', platform: 'win', phone: true } ">
<div class="layout-frame" data-options="dxTransition: { name: 'main', animation: 'view-content-change' }">
<div class="layout-header" data-options="dxContentPlaceholder : { name: 'header' }">
<div data-bind="text: title">
</div>
</div>
<div class="layout-content" data-options="dxContentPlaceholder : { name: 'content', animation: 'view-content-change' } ">
</div>
</div>
<div class="layout-footer" data-options="dxContentPlaceholder : { name: 'footer' }">
<div class="layout-toolbar-bottom" data-bind="dxToolbar: { items: [], renderAs: 'bottomToolbar' }" data-options="dxCommandContainer : { id: 'win10-phone-appbar' } "></div>
</div>
</div>
<div class="simple-layout" data-options="dxLayout : { name: 'simple', platform: 'win', phone: true, version: [8] } ">
<div class="layout-frame">
<div class="layout-header" data-options="dxContentPlaceholder : { name: 'header' }">
<div data-bind="text: title">
</div>
</div>
<div class="layout-content" data-options="dxContentPlaceholder : { name: 'content', animation: 'view-content-change' } ">
</div>
</div>
<div class="layout-footer" data-options="dxContentPlaceholder : { name: 'footer' }">
<div class="layout-toolbar-bottom win8" data-bind="dxToolbar: { items: [], renderAs: 'bottomToolbar' }" data-options="dxCommandContainer : { id: 'win8-phone-appbar' } "></div>
</div>
</div>
<div class="simple-layout" data-options="dxLayout : { name: 'simple', platform: 'ios' } " >
<div class="layout-header dx-toolbar-background" data-options="dxContentPlaceholder : { name: 'header', animation: 'view-header-toolbar' }">
<div data-bind="dxToolbar: { items: [ { text: title, location: 'center' } ] }" data-options="dxCommandContainer : { id: 'ios-header-toolbar' }">
</div>
</div>
<div class="layout-content" data-options="dxContentPlaceholder : { name: 'content', animation: 'view-content-change' }">
</div>
<div class="view-footer" data-options="dxContent : { targetPlaceholder: 'view-footer' } " >
<div class="view-toolbar-bottom" data-bind="dxToolbar: { visible: true }" data-options="dxCommandContainer : { id: 'ios-view-footer' } " ></div>
</div>
</div>
<div class="simple-layout" data-options="dxLayout : { name: 'simple', platform: 'android' } " >
<div class="transition-frame" data-options="dxTransition: { name: 'main', animation: 'view-content-change' }">
<div class="layout-header">
<div data-bind="dxToolbar: { items: [{ text: title, location: 'center' }] }"
data-options="dxCommandContainer : { id: 'android-simple-toolbar' }">
</div>
</div>
<div class="layout-content" data-options="dxContentPlaceholder : { name: 'content', animation: 'view-content-change' }">
</div>
</div>
</div>
<div class="simple-layout" data-options="dxLayout : { name: 'simple', platform: 'generic' } " >
<div class="layout-header dx-toolbar-background" data-options="dxContentPlaceholder : { name: 'header', animation: 'view-header-toolbar' }">
<div data-bind="dxToolbar: { items: [ { text: title, location: 'center' } ] }" data-options="dxCommandContainer : { id: 'generic-header-toolbar' }">
</div>
</div>
<div class="layout-content" data-options="dxContentPlaceholder : { name: 'content', animation: 'view-content-change' }">
</div>
<div class="view-footer" data-options="dxContent : { targetPlaceholder: 'view-footer' } " >
<div class="view-toolbar-bottom" data-bind="dxToolbar: { visible: true }" data-options="dxCommandContainer : { id: 'generic-view-footer' } " ></div>
</div>
</div>
@@ -0,0 +1,124 @@
(function(root, factory) {
if (typeof define === 'function' && define.amd) {
define(function(require, exports, module) {
module.exports = factory(require("jquery"), require("core/class"), require("framework/html/presets").layoutSets, require("framework/html/layout_controller").DefaultLayoutController, require("core/devices"), require("core/errors").log, require("ui/toolbar"))
})
}
else {
root.DevExpress.layouts = root.DevExpress.layouts || {};
root.DevExpress.layouts.SimpleLayout = factory(jQuery, DevExpress.Class, DevExpress.framework.html.layoutSets, DevExpress.framework.html.DefaultLayoutController, DevExpress.devices, DevExpress.errors.log);
root.DevExpress.framework.html.SimpleLayoutController = root.DevExpress.layouts.SimpleLayout.SimpleLayoutController;
root.DevExpress.framework.html.Win8SimpleLayoutController = root.DevExpress.layouts.SimpleLayout.Win8SimpleLayoutController
}
}(this, function($, Class, layoutSets, DefaultLayoutController, devices, log) {
var exports = {};
var SimpleLayoutController = DefaultLayoutController.inherit({
ctor: function(options) {
options = options || {};
options.name = options.name || "simple";
this.callBase(options);
var device = devices.current();
if (device.win && device.phone || options.Win8SimpleLayoutControllerFroced) {
this.impl = new Win8SimpleLayoutImpl($.proxy(this._getViewFrame, this))
}
else {
this.impl = new SimpleLayoutImpl
}
}, _onRenderComplete: function(viewInfo) {
this.impl.onRenderComplete(viewInfo);
this.callBase.apply(this, arguments)
}, disposeView: function(viewInfo) {
this.impl.disposeView(viewInfo);
this.callBase.apply(this, arguments)
}, _changeView: function(viewInfo) {
var that = this,
result = this.callBase.apply(this, arguments);
result.done(function() {
that.impl.changeView(viewInfo)
});
return result
}
});
var SimpleLayoutImpl = Class.inherit({
ctor: $.noop, onRenderComplete: $.noop, disposeView: $.noop, changeView: $.noop
});
var HAS_TOOLBAR_BOTTOM_CLASS = "has-toolbar-bottom",
LAYOUT_TOOLBAR_BOTTOM_SELECTOR = ".layout-toolbar-bottom";
var Win8SimpleLayoutImpl = SimpleLayoutImpl.inherit({
ctor: function(viewFrameGetter) {
this._getViewFrame = viewFrameGetter;
this.callBase.apply(this, arguments);
this._toolbarOptionChangedHandler = $.proxy(this._onToolbarOptionChanged, this)
}, _onToolbarOptionChanged: function(args) {
if (args.name === "items") {
var appbar = args.component;
if (appbar) {
this._refreshAppbarVisibility(appbar)
}
this._refreshHasToolbarClass()
}
}, _getAppbar: function($markup) {
var $appbar = $markup.find(LAYOUT_TOOLBAR_BOTTOM_SELECTOR);
if ($appbar.length !== 1) {
return
}
return $appbar.dxToolbar("instance")
}, _getCurrentAppbar: function() {
return this._getAppbar(this._getViewFrame().find(".dx-active-view "))
}, onRenderComplete: function(viewInfo) {
var appbar = this._getAppbar(viewInfo.renderResult.$markup);
if (appbar) {
this._refreshAppbarVisibility(appbar);
appbar.on("optionChanged", this._toolbarOptionChangedHandler)
}
}, disposeView: function(viewInfo) {
var appbar = this._getAppbar(viewInfo.renderResult.$markup);
if (appbar) {
appbar.off("optionChanged", this._toolbarOptionChangedHandler)
}
}, changeView: function(viewInfo) {
this._refreshHasToolbarClass()
}, _refreshAppbarVisibility: function(appbar) {
var isAppbarNotEmpty = false;
$.each(appbar.option("items"), function(index, item) {
if (item.visible) {
isAppbarNotEmpty = true;
return false
}
});
appbar.option("visible", isAppbarNotEmpty)
}, _refreshHasToolbarClass: function() {
var appbar = this._getCurrentAppbar(),
hasToolbar = appbar ? appbar.option("visible") : false;
this._getViewFrame().toggleClass(HAS_TOOLBAR_BOTTOM_CLASS, hasToolbar)
}
});
var Win8SimpleLayoutController = SimpleLayoutController.inherit({ctor: function(options) {
options = options || {};
options.Win8SimpleLayoutControllerFroced = true;
log("W0000", "Layouts", "Win8SimpleLayoutController", "15.1", "Use the SimpleLayoutController instead");
this.callBase.apply(this, arguments)
}});
layoutSets["navbar"] = layoutSets["navbar"] || [];
layoutSets["navbar"].push({
platform: "win", root: false, phone: true, controller: new SimpleLayoutController
});
layoutSets["navbar"].push({
platform: "android", root: false, controller: new SimpleLayoutController
});
layoutSets["simple"] = layoutSets["simple"] || [];
layoutSets["simple"].push({controller: new SimpleLayoutController});
layoutSets["simple"].push({
platform: "win", phone: true, controller: new SimpleLayoutController
});
layoutSets["split"] = layoutSets["split"] || [];
layoutSets["split"].push({
platform: "win", requireCustomResolve: true, controller: new SimpleLayoutController
});
layoutSets["split"].push({
platform: "win", root: false, phone: true, controller: new SimpleLayoutController
});
exports.SimpleLayoutController = SimpleLayoutController;
exports.Win8SimpleLayoutController = Win8SimpleLayoutController;
return exports
}));
@@ -0,0 +1,234 @@
.slideout-layout {
height: 100%;
width: 100%;
overflow: hidden;
position: relative;
}
.slideout-layout .layout-header {
position: absolute;
width: 100%;
top: 0;
height: 40px;
}
.slideout-layout .layout-content {
position: absolute;
top: 40px;
bottom: 0;
width: 100%;
overflow: hidden;
}
.slideout-layout .layout-content > div[data-options] {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
}
.slideout-layout .view-content {
position: absolute;
height: 100%;
width: 100%;
}
.slideout-layout .layout-frame {
position: absolute;
height: 100%;
width: 100%;
z-index: 200;
}
.dx-slideout .dx-slideout-item-container .dx-slideoutview-shield {
z-index: 201;
top: 42px;
}
.slideout-layout .layout-frame,
.slideout-layout .layout-frame .layout-header,
.slideout-layout .layout-frame .layout-header .dx-toolbar {
border-radius: 4px 4px 0 0;
}
.slideout-layout .view-footer {
position: static;
}
.slideout-layout .view-footer .dx-toolbar {
background: transparent;
border: none;
margin-bottom: 10px;
}
.slideout-layout .view-footer .dx-toolbar .dx-toolbar-center {
width: 100%;
}
/* navigation */
.slideout-layout .navigation-list {
position: absolute;
top: 0;
left: 0;
bottom: 0;
width: 100%;
height: 100%;
z-index: 100;
}
.slideout-layout .nav-partial-view {
height: 100%;
}
.slideout-layout .navigation-list .dx-list .dx-list-item .dx-navigation-item {
line-height: 24px;
height: 24px;
}
.slideout-layout .navigation-list .dx-list .dx-list-item .dx-icon {
float: left;
margin-right: 15px;
-moz-background-size: 100%;
-o-background-size: 100%;
-webkit-background-size: 100%;
background-size: 100%;
width: 24px;
height: 24px;
}
.dx-rtl .slideout-layout .navigation-list .dx-list .dx-list-item .dx-icon,
.dx-rtl.slideout-layout .navigation-list .dx-list .dx-list-item .dx-icon {
float: right;
margin-right: 0;
margin-left: 15px;
}
/* iOS7 */
.dx-theme-ios7 .slideout-layout .layout-header.dx-toolbar-wrapper {
background: none;
}
.dx-theme-ios7 .slideout-layout .layout-header {
height: 43px;
}
.dx-theme-ios7 .slideout-layout .layout-content {
top: 44px;
}
.dx-theme-ios7 .slideout-layout .view-footer .dx-toolbar {
height: 57px;
}
.dx-theme-ios7 .slideout-layout .view-footer .dx-button .dx-button-content .dx-button-text {
font-size: 20px;
line-height: 38px;
}
/* Android 5 */
.dx-theme-android5 .slideout-layout .layout-header {
height: 56px;
}
.dx-theme-android5 .slideout-layout .layout-content,
.dx-theme-android5 .dx-slideout .dx-slideout-item-container .dx-slideoutview-shield {
top: 56px;
}
.dx-theme-android5 .slideout-layout .layout-frame,
.dx-theme-android5 .slideout-layout .layout-frame .layout-header,
.dx-theme-android5 .slideout-layout .layout-frame .layout-header .dx-toolbar {
border-radius: 0;
}
/* Windows phone 8 */
.dx-theme-win8 .slideout-layout .layout-header {
height: 88px;
}
.dx-theme-win8 .slideout-layout .layout-content,
.dx-theme-win8 .dx-slideout .dx-slideout-item-container .dx-slideoutview-shield {
top: 88px;
}
.dx-theme-win8 .slideout-layout .layout-content.has-toolbar-bottom {
overflow: hidden;
bottom: 40px;
}
.dx-theme-win8 .slideout-layout .dx-toolbar.layout-toolbar-bottom {
position: absolute;
bottom: 0;
margin-bottom: 0;
}
.dx-theme-win8 .slideout-layout .layout-header .dx-toolbar {
opacity: 1;
}
.dx-device-phone.dx-theme-win8 .slideout-layout .layout-header {
height: 60px;
}
.dx-device-phone.dx-theme-win8 .slideout-layout .layout-content,
.dx-device-phone.dx-theme-win8 .dx-slideout .dx-slideout-item-container .dx-slideoutview-shield {
top: 60px;
}
/* Windows phone 10 */
.dx-theme-win10 .slideout-layout .layout-header {
height: 60px;
}
.dx-theme-win10 .slideout-layout .layout-content,
.dx-theme-win10 .dx-slideout .dx-slideout-item-container .dx-slideoutview-shield {
top: 60px;
}
.dx-theme-win10 .slideout-layout .layout-content.has-toolbar-bottom {
overflow: hidden;
bottom: 48px;
}
.dx-theme-win10 .slideout-layout .dx-toolbar.layout-toolbar-bottom {
position: absolute;
bottom: 0;
margin-bottom: 0;
}
.dx-theme-win10 .slideout-layout .layout-header .dx-toolbar {
opacity: 1;
}
/* generic theme */
.dx-theme-generic .slideout-layout .layout-header {
height: 56px;
}
.dx-theme-generic .slideout-layout .layout-content {
top: 56px;
}
.dx-theme-generic.dx-device-mobile .slideout-layout .layout-header .dx-toolbar {
background: none;
}
.dx-theme-generic .slideout-layout .layout-header .dx-toolbar {
padding: 0 10px;
}
.dx-theme-generic .slideout-layout .layout-header .dx-toolbar-items-container {
height: 56px;
}
.dx-theme-generic .slideout-layout .view-footer .dx-button {
width: 97%;
overflow: visible;
}
@@ -0,0 +1,99 @@
<script type="text/html" id="slideOutMenuItemTemplate">
<div data-bind="visible: visible, css: { 'dx-state-disabled': disabled }" data-options="dxTemplate : { name: 'item' } ">
<div>
<!-- ko dxIcon: $data.icon || $data.iconSrc --><!-- /ko -->
<div class="dx-navigation-item" data-bind="text: text"></div>
</div>
</div>
</script>
<div class="slideout-layout" data-options="dxLayout : { name: 'slideout', platform: 'ios' } ">
<div class="layout-header dx-toolbar-wrapper dx-toolbar-background" data-options="dxContentPlaceholder : { name: 'header', animation: 'view-header-toolbar' }">
<div class="layout-toolbar" data-bind="dxToolbar: { items: [{ location: 'before', template: 'nav-button', visible: false }, { location: 'center', text: title }] }"
data-options="dxCommandContainer : { id: 'ios-header-toolbar' }">
<div class="nav-button-item" data-options="dxTemplate : { name: 'nav-button' } ">
<div class="nav-button" data-bind="dxButton: { icon: 'menu' }"></div>
</div>
</div>
</div>
<div class="layout-content" data-options="dxContentPlaceholder : { name: 'content', animation: 'view-content-change' } ">
</div>
<div class="view-footer" data-options="dxContent : { targetPlaceholder: 'view-footer' } ">
<div class="view-toolbar-bottom" data-bind="dxToolbar: { visible: true }" data-options="dxCommandContainer : { id: 'ios-view-footer' } "></div>
</div>
</div>
<div class="slideout-layout" data-options="dxLayout : { name: 'slideout', platform: 'android' } ">
<div class="layout-frame" data-options="dxTransition: { name: 'main', animation: 'view-content-change' }">
<div class="layout-header dx-toolbar-wrapper">
<div class="layout-toolbar" data-bind="dxToolbar: { items: [{ location: 'before', template: 'nav-button', visible: false }, { location: 'center', text: title }] }"
data-options="dxCommandContainer : { id: 'android-header-toolbar' }">
<div class="nav-button-item" data-options="dxTemplate : { name: 'nav-button' } ">
<div class="nav-button" data-bind="dxButton: { icon: 'menu' }"></div>
</div>
</div>
</div>
<div class="layout-content" data-options="dxContentPlaceholder : { name: 'content' } ">
</div>
</div>
</div>
<div class="slideout-layout" data-options="dxLayout : { name: 'slideout', platform: 'generic' } ">
<div class="layout-header dx-toolbar-wrapper dx-toolbar-background" data-options="dxContentPlaceholder : { name: 'header', animation: 'view-header-toolbar' }">
<div class="layout-toolbar" data-bind="dxToolbar: { items: [{ location: 'before', template: 'nav-button', visible: false }, { location: 'center', text: title }] }"
data-options="dxCommandContainer : { id: 'generic-header-toolbar' }">
<div class="nav-button-item" data-options="dxTemplate : { name: 'nav-button' } ">
<div class="nav-button" data-bind="dxButton: { icon: 'menu' }"></div>
</div>
</div>
</div>
<div class="layout-content" data-options="dxContentPlaceholder : { name: 'content', animation: 'view-content-change' } ">
</div>
<div class="view-footer" data-options="dxContent : { targetPlaceholder: 'view-footer' } ">
<div class="view-toolbar-bottom" data-bind="dxToolbar: { visible: true }" data-options="dxCommandContainer : { id: 'generic-view-footer' } ">
</div>
</div>
</div>
<div class="slideout-layout" data-options="dxLayout : { name: 'slideout', platform: 'win' } ">
<div class="layout-frame" data-options="dxTransition: { name: 'main', animation: 'view-content-change' }">
<div class="layout-header">
<div class="layout-toolbar" data-bind="dxToolbar: { items: [{ location: 'before', template: 'nav-button', visible: false }, { location: 'center', text: title }] }">
<div class="nav-button-item" data-options="dxTemplate : { name: 'nav-button' } ">
<div class="nav-button" data-bind="dxButton: { icon: 'menu' }"></div>
</div>
</div>
</div>
<div class="layout-content" data-options="dxContentPlaceholder : { name: 'content' } ">
</div>
<div class="layout-toolbar-bottom" data-bind="dxToolbar: { visible: false, renderAs: 'bottomToolbar' }" data-options="dxCommandContainer : { id: 'win10-phone-appbar' } ">
</div>
</div>
</div>
<div class="slideout-layout" data-options="dxLayout : { name: 'slideout', platform: 'win', version: [8] } ">
<div class="layout-frame" data-options="dxTransition: { name: 'main', animation: 'view-content-change' }">
<div class="layout-header">
<div class="layout-toolbar" data-bind="dxToolbar: { items: [{ location: 'before', template: 'nav-button', visible: false }, { location: 'center', text: title }] }">
<div class="nav-button-item" data-options="dxTemplate : { name: 'nav-button' } ">
<div class="nav-button" data-bind="dxButton: { icon: 'menu' }"></div>
</div>
</div>
</div>
<div class="layout-content" data-options="dxContentPlaceholder : { name: 'content' } ">
</div>
<div class="layout-toolbar-bottom" data-bind="dxToolbar: { visible: false, renderAs: 'bottomToolbar' }" data-options="dxCommandContainer : { id: 'win8-phone-appbar' } ">
</div>
</div>
</div>
@@ -0,0 +1,140 @@
(function(root, factory) {
if (typeof define === 'function' && define.amd) {
define(function(require, exports, module) {
module.exports = factory(require("jquery"), require("framework/html/presets").layoutSets, require("framework/html/layout_controller").DefaultLayoutController, require("animation/fx"), require("core/devices"), require("ui/slide_out"), require("ui/toolbar"), require("ui/button"))
})
}
else {
root.DevExpress.layouts = root.DevExpress.layouts || {};
root.DevExpress.layouts.SlideOutLayout = factory(jQuery, DevExpress.framework.html.layoutSets, DevExpress.framework.html.DefaultLayoutController, DevExpress.fx, DevExpress.devices);
root.DevExpress.framework.html.SlideOutController = root.DevExpress.layouts.SlideOutLayout.SlideOutController
}
}(this, function($, layoutSets, DefaultLayoutController, fx, devices) {
var exports = {};
var SlideOutController = DefaultLayoutController.inherit({
ctor: function(options) {
options = options || {};
options.name = options.name || "slideout";
this.swipeEnabled = options.swipeEnabled === undefined ? true : options.swipeEnabled;
this.callBase(options)
}, init: function(options) {
this.callBase(options);
this._navigationManager = options.navigationManager;
this._navigationCanceledHandler = $.proxy(this._onNavigatingCanceled, this)
}, activate: function() {
var result = this.callBase.apply(this, arguments);
this._navigationManager.on("navigationCanceled", this._navigationCanceledHandler);
return result
}, deactivate: function() {
this._navigationManager.off("navigationCanceled", this._navigationCanceledHandler);
return this.callBase.apply(this, arguments)
}, disable: function() {
if (this.slideOut.option("menuVisible")) {
this._toggleNavigation()
}
return this.callBase.apply(this, arguments)
}, _onNavigatingCanceled: function(args) {
if (this.slideOut.option("menuVisible") && args.cancelReason !== "redirect") {
this._toggleNavigation()
}
}, _createNavigationWidget: function() {
this.$slideOut = $("<div data-bind='dxSlideOut: { menuItemTemplate: $(\"#slideOutMenuItemTemplate\"), contentTemplate: \" \" }'></div>").dxCommandContainer({id: 'global-navigation'});
this._applyTemplate(this.$slideOut, this._layoutModel);
this.callBase();
this.slideOut = this.$slideOut.dxSlideOut("instance");
this.slideOut.option("swipeEnabled", this.swipeEnabled);
this.$slideOut.find(".dx-slideout-item-container").append(this._$mainLayout);
return this.$slideOut
}, _renderNavigationImpl: function(navigationCommands) {
var container = this.$slideOut.dxCommandContainer("instance");
this._commandManager.renderCommandsToContainers(navigationCommands, [container])
}, element: function() {
return this.$slideOut
}, _showViewImpl: function(viewInfo, direction, previousViewTemplateId) {
this._fxOffSaved = fx.off;
if (this.slideOut.option("menuVisible")) {
fx.off = true
}
return this.callBase.apply(this, arguments)
}, _getReadyForRenderDeferredItems: function(viewInfo) {
var result = this.callBase(viewInfo);
fx.off = this._fxOffSaved;
if (this.slideOut.option("menuVisible")) {
result = $.when(this._toggleNavigation(), result)
}
return result
}, _onViewShown: function(viewInfo) {
this._refreshVisibility()
}, _refreshVisibility: function() {
if (devices.real().platform === "android") {
this.$slideOut.css("backface-visibility", "hidden");
this.$slideOut.css("backface-visibility");
this.$slideOut.css("backface-visibility", "visible")
}
}, _viewHasBackCommands: function(viewInfo) {
var hasBackCommands = false;
$.each(viewInfo.commands, function(index, command) {
if (((command.option("behavior") === "back" || command.option("id") === "back")) && command.option("visible")) {
hasBackCommands = true;
return false
}
});
return hasBackCommands
}, _onRenderComplete: function(viewInfo) {
var that = this;
if (!that._viewHasBackCommands(viewInfo)) {
that._initNavigationButton(viewInfo.renderResult.$markup)
}
var $content = viewInfo.renderResult.$markup.find(".layout-content"),
$appbar = viewInfo.renderResult.$markup.find(".layout-toolbar-bottom"),
appbar = $appbar.dxToolbar("instance");
if (appbar) {
that._refreshAppbarVisibility(appbar, $content);
appbar.on("optionChanged", function(args) {
if (args.name === "items") {
that._refreshAppbarVisibility(appbar, $content)
}
})
}
}, _refreshAppbarVisibility: function(appbar, $content) {
var isAppbarNotEmpty = false;
$.each(appbar.option("items"), function(index, item) {
if (item.visible) {
isAppbarNotEmpty = true;
return false
}
});
$content.toggleClass("has-toolbar-bottom", isAppbarNotEmpty);
appbar.option("visible", isAppbarNotEmpty)
}, _initNavigationButton: function($markup) {
var that = this,
$toolbar = $markup.find(".layout-toolbar"),
toolbar = $toolbar.dxToolbar("instance");
var initNavButton = function() {
toolbar.option("items[0].visible", true);
$toolbar.find(".nav-button").dxButton("instance").option("onClick", $.proxy(that._toggleNavigation, that, $markup))
};
initNavButton();
toolbar.on("contentReady", function(args) {
initNavButton()
})
}, _toggleNavigation: function($markup) {
return this.slideOut.toggleMenuVisibility()
}
});
layoutSets["slideout"] = layoutSets["slideout"] || [];
layoutSets["slideout"].push({
platform: "ios", controller: new SlideOutController
});
layoutSets["slideout"].push({
platform: "android", controller: new SlideOutController
});
layoutSets["slideout"].push({
platform: "generic", controller: new SlideOutController
});
layoutSets["slideout"].push({
platform: "win", controller: new SlideOutController
});
exports.SlideOutController = SlideOutController;
return exports
}));
@@ -0,0 +1,210 @@
.dx-viewport {
width: 100%;
height: 100%;
position: absolute;
}
.dx-theme-win8 .split-layout {
display: -ms-grid;
-ms-grid-columns: 620px 1fr;
-ms-grid-rows: 104px 1fr;
width: 100%;
height: 100%;
}
.dx-theme-win8 .split-layout .layout-header {
-ms-grid-column: 1;
-ms-grid-row: 1;
-ms-grid-column-span: 2;
padding: 60px 120px;
}
.dx-theme-win8 .split-layout .layout-header .dx-toolbar {
margin-left: -63px;
background: transparent;
}
.dx-theme-win8 .dx-rtl .split-layout .layout-header .dx-toolbar,
.dx-theme-win8 .dx-rtl.split-layout .layout-header .dx-toolbar {
margin-left: 0px;
}
.dx-theme-win8 .split-layout .layout-header .dx-toolbar-center {
margin: 0 0 0 70px;
text-align: left;
}
.dx-theme-win8 .dx-rtl .split-layout .layout-header .dx-toolbar-center,
.dx-theme-win8 .dx-rtl.split-layout .layout-header .dx-toolbar-center {
margin-right: 7px;
margin-left: 0;
text-align: right;
}
.dx-theme-win8 .split-layout .layout-header .dx-toolbar-after {
margin: 10px 120px 0 0;
}
.dx-theme-win8 .dx-rtl .split-layout .layout-header .dx-toolbar-after,
.dx-theme-win8 .dx-rtl.split-layout .layout-header .dx-toolbar-after {
margin-right: 0;
margin-left: 120px;
}
.dx-theme-win8 .split-layout .left-content {
-ms-grid-column: 1;
-ms-grid-row: 2;
padding: 60px 0 0 120px;
}
.dx-theme-win8 .dx-rtl .split-layout .left-content,
.dx-theme-win8 .dx-rtl.split-layout .left-content {
padding-right: 120px;
padding-left: 0;
}
.dx-theme-win8 .split-layout .right-content {
-ms-grid-column: 2;
-ms-grid-row: 2;
padding: 60px 0 0 0;
}
/*.dx-theme-win8 .split-layout .right-content .content {
margin-left: 40px;
}*/
.dx-theme-win8 .split-layout .right-content .dx-scrollview-content {
padding-right: 40px;
padding-left: 40px;
}
.dx-theme-win8 .split-layout .dx-app-bar {
position: fixed;
z-index: 1000;
width: 100%;
bottom: -104px;
transition: bottom .4s;
}
.dx-theme-win8 .split-layout .dx-app-bar.dx-app-bar-visible {
bottom: 0;
}
.dx-theme-win8 .split-layout.dx-animating:not(.dx-enter):not(.dx-leave) {
display: none;
}
.dx-theme-win8 .content, .dx-theme-win8 .content>div {
height: 100%;
position: relative;
}
.dx-theme-win8 .have-static-appbar .left-content,
.dx-theme-win8 .have-static-appbar .right-content {
margin-bottom: 82px;
}
.split-layout .left-content > .dx-content-placeholder,
.split-layout .left-content > .dx-content-placeholder > .dx-content {
height: 100%;
}
/* Win 10 */
.dx-theme-win10 .split-layout {
display: -ms-grid;
-ms-grid-columns: 1fr 3fr;
-ms-grid-rows: 60px 1fr;
width: 100%;
height: 100%;
}
.dx-theme-win10 .split-layout .layout-header {
-ms-grid-column: 1;
-ms-grid-row: 1;
-ms-grid-column-span: 2;
}
.dx-theme-win10 .split-layout .layout-header .dx-toolbar-center {
margin: 0 0 0 70px;
text-align: left;
}
.dx-theme-win10 .dx-rtl .split-layout .layout-header .dx-toolbar-center,
.dx-theme-win10 .dx-rtl.split-layout .layout-header .dx-toolbar-center {
margin-right: 70px;
margin-left: 0;
text-align: right;
}
.dx-theme-win10 .split-layout .left-content {
-ms-grid-column: 1;
-ms-grid-row: 2;
background-color: #171717;
}
.dx-theme-win10 .split-layout .right-content {
-ms-grid-column: 2;
-ms-grid-row: 2;
}
.dx-theme-win10 .split-layout .right-content .dx-scrollview-content {
padding-right: 40px;
padding-left: 40px;
padding-top: 20px;
}
.dx-theme-win10 .split-layout.dx-animating:not(.dx-enter):not(.dx-leave) {
display: none;
}
.dx-theme-win10 .content, .dx-theme-win10 .content>div {
height: 100%;
position: relative;
}
/* Master-Detail */
.master-detail-layout {
width: 100%;
height: 100%;
position: relative;
}
.master-detail-layout .master-pane {
width: 320px;
position: absolute;
left: 0;
top: 0;
bottom: 0;
overflow: hidden;
box-sizing: border-box;
border-right-width: 1px;
border-right-style: solid;
}
.master-detail-layout .detail-pane {
position: absolute;
left: 320px;
right: 0;
top: 0;
bottom: 0;
overflow: hidden;
}
.master-detail-layout .header-toolbar {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 46px;
}
.master-detail-layout .main-area {
position: absolute;
left: 0;
top: 48px;
bottom: 0;
width: 100%;
}
@@ -0,0 +1,61 @@
<div class="master-detail-layout" data-options="dxLayout : { name: 'split', tablet: true, platform: 'ios' }">
<div class="master-pane dx-splitter">
</div>
<div class="detail-pane">
</div>
</div>
<div class="master-detail-layout" data-options="dxLayout : { name: 'split', tablet: true, platform: 'android' }">
<div class="header-toolbar" data-bind="dxToolbar: { items: [{ text: title, align: 'center' }] }" data-options="dxCommandContainer : { id: 'android-simple-toolbar' }" >
</div>
<div class="main-area">
<div class="master-pane dx-splitter">
</div>
<div class="detail-pane">
</div>
</div>
</div>
<div class="split-layout" data-options="dxLayout : { name: 'split', platform: 'win', phone: false, version: [8] } " >
<div class="layout-header">
<div class="header-toolbar" data-bind="dxToolbar: { items: [{ text: title, location: 'center' }] }" data-options="dxCommandContainer : { id: 'win8-master-detail-toolbar' }" >
</div>
</div>
<div class="left-content">
</div>
<div class="right-content">
</div>
<div class="dx-app-bar">
<div class="footer-toolbar" data-bind="dxToolbar: { }" data-options="dxCommandContainer : { id: 'win8-appbar' }">
</div>
</div>
</div>
<div class="split-layout" data-options="dxLayout : { name: 'split', platform: 'win', phone: false } ">
<div class="layout-header">
<div class="header-toolbar" data-bind="dxToolbar: { items: [{ text: title, location: 'center' }] }" data-options="dxCommandContainer : { id: 'win10-appbar' }">
</div>
</div>
<div class="left-content">
</div>
<div class="right-content">
</div>
</div>
<div class="master-detail-layout" data-options="dxLayout : { name: 'split', tablet: true, platform: 'generic' }">
<div class="master-pane dx-splitter">
</div>
<div class="detail-pane">
</div>
</div>
@@ -0,0 +1,381 @@
(function(root, factory) {
if (typeof define === 'function' && define.amd) {
define(function(require, exports, module) {
module.exports = factory(require("jquery"), require("knockout"), require("core/class"), require("framework/errors"), require("framework/html/presets").layoutSets, require("framework/html/layout_controller").DefaultLayoutController, require("../Empty/EmptyLayout.js"), require("../Simple/SimpleLayout.js"), require("animation/fx"), require("ui/toolbar"))
})
}
else {
root.DevExpress.layouts = root.DevExpress.layouts || {};
root.DevExpress.layouts.SplitLayout = factory(jQuery, window.ko, DevExpress.Class, DevExpress.framework.errors, DevExpress.framework.html.layoutSets, DevExpress.framework.html.DefaultLayoutController, DevExpress.layouts.EmptyLayout, DevExpress.layouts.SimpleLayout, DevExpress.fx);
root.DevExpress.framework.html.MultipaneLayoutController = root.DevExpress.layouts.SplitLayout.MultipaneLayoutController;
root.DevExpress.framework.html.IOSSplitLayoutController = root.DevExpress.layouts.SplitLayout.IOSSplitLayoutController;
root.DevExpress.framework.html.ToolbarController = root.DevExpress.layouts.SplitLayout.ToolbarController;
root.DevExpress.framework.html.AndroidSplitLayoutController = root.DevExpress.layouts.SplitLayout.AndroidSplitLayoutController;
root.DevExpress.framework.html.WinSplitLayoutController = root.DevExpress.layouts.SplitLayout.WinSplitLayoutController;
root.DevExpress.framework.html.Win8SplitLayoutController = root.DevExpress.layouts.SplitLayout.Win8SplitLayoutController
}
}(this, function($, ko, Class, errors, layoutSets, DefaultLayoutController, EmptyLayoutControllerModule, SimpleLayoutControllerModule, fx) {
var exports = {},
APPBAR_TOUCH_AREA_HEIGHT = 50,
APPBAR_TOUCH_THRESHOLD = 50,
EVENTS_NAMESPACE = ".dxSplitLayout",
KEYCODE_WIN = 91,
KEYCODE_Z = 90,
POINTER_DOWN_EVENT_NAME,
POINTER_UP_EVENT_NAME,
POINTER_MOVE_EVENT_NAME;
if (window.PointerEvent) {
POINTER_DOWN_EVENT_NAME = "pointerdown";
POINTER_UP_EVENT_NAME = "pointerup";
POINTER_MOVE_EVENT_NAME = "pointermove"
}
else if (window.MSPointerEvent) {
POINTER_DOWN_EVENT_NAME = "MSPointerDown";
POINTER_UP_EVENT_NAME = "MSPointerUp";
POINTER_MOVE_EVENT_NAME = "MSPointerMove"
}
else {
POINTER_DOWN_EVENT_NAME = "mousedown";
POINTER_UP_EVENT_NAME = "mouseup";
POINTER_MOVE_EVENT_NAME = "mousemove"
}
var SplitLayoutEventHelper = Class.inherit({
ctor: function(splitLayout) {
this.root = splitLayout
}, init: function() {
this.root._$viewPort.on(POINTER_UP_EVENT_NAME + EVENTS_NAMESPACE, $.proxy(this._pointerUpHandler, this));
this.root._$viewPort.on(POINTER_DOWN_EVENT_NAME + EVENTS_NAMESPACE, $.proxy(this._pointerDownHandler, this));
$(document).on("keydown" + EVENTS_NAMESPACE, $.proxy(this._keyDownHandler, this));
$(document).on("keyup" + EVENTS_NAMESPACE, $.proxy(this._keyUpHandler, this));
this._startTouchPoint = false;
this._winKeyPressed = false;
this._moveEvent = false;
this._appbarBehavior = true
}, _pointerDownHandler: function(e) {
var originalEvent = e.originalEvent;
if (this._isTouch(originalEvent) && this._startedInAppBarArea(originalEvent)) {
this._startTouchPoint = {
x: originalEvent.clientX, y: originalEvent.clientY
};
this.root._$viewPort.on(POINTER_MOVE_EVENT_NAME + EVENTS_NAMESPACE, $.proxy(this._pointerMoveHandler, this))
}
}, _pointerMoveHandler: function(e) {
var originalEvent = e.originalEvent;
if (this._thresholdExceeded(originalEvent)) {
this._moveEvent = true;
this.root._$viewPort.off(POINTER_MOVE_EVENT_NAME + EVENTS_NAMESPACE);
if (this._isVerticalDirection(originalEvent.clientX, originalEvent.clientY))
this._toggleAppBarState(true)
}
}, _pointerUpHandler: function(e) {
this.root._$viewPort.off(POINTER_MOVE_EVENT_NAME + EVENTS_NAMESPACE);
var $appBar = this.root._$viewPort.find(".dx-app-bar");
if (e.originalEvent.button === 2) {
this._toggleAppBarState()
}
else if (!this._moveEvent && $appBar[0] && !$appBar[0].contains(e.target)) {
this._toggleAppBarState(false)
}
this._moveEvent = false
}, _keyDownHandler: function(e) {
if (e.keyCode === KEYCODE_WIN) {
this._winKeyPressed = true
}
}, _keyUpHandler: function(e) {
if (this._winKeyPressed && (e.keyCode === KEYCODE_Z)) {
this._toggleAppBarState()
}
else if (e.keyCode === KEYCODE_WIN) {
this._winKeyPressed = false
}
}, _toggleAppBarState: function(state) {
if (!this.root._appBarHasCommands())
return;
this.root._$viewPort.find(".dx-app-bar").toggleClass("dx-app-bar-visible", !this._appbarBehavior || state)
}, _isVerticalDirection: function(x, y) {
return Math.abs(y - this._startTouchPoint.y) > Math.abs(x - this._startTouchPoint.x)
}, _isTouch: function(event) {
return event.pointerType === event.MSPOINTER_TYPE_TOUCH || event.pointerType === event.MSPOINTER_TYPE_PEN
}, _startedInAppBarArea: function(event) {
return (this.root._$viewPort.height() - APPBAR_TOUCH_AREA_HEIGHT) < event.clientY
}, _thresholdExceeded: function(originalEvent) {
return originalEvent.clientY < (this._startTouchPoint.y - APPBAR_TOUCH_THRESHOLD)
}
});
var MultipaneLayoutController = DefaultLayoutController.inherit({
ctor: function(options) {
options = options || {};
options.name = options.name || "split";
this._detailPaneName = options.detailPaneName || "detail";
this._masterPaneName = options.masterPaneName || "master";
options.defaultPaneName = this._detailPaneName;
this.callBase(options);
this._panesConfig = options.panesConfig;
this._activeViews = {};
this._stateStorageKey = "dxSplitLayoutState"
}, init: function(options) {
options = options || {};
this.callBase(options);
this._router = options.app && options.app.router;
this._onNavigatingHandler = $.proxy(this._onNavigating, this);
this._onNavigatedHandler = $.proxy(this._onNavigated, this);
this._navigationManager = options.navigationManager;
this._ensurePanesConfig();
this._initChildControllers(options)
}, activate: function() {
var tasks = [];
this.callBase();
this._navigationManager.on("navigating", this._onNavigatingHandler);
this._navigationManager.on("navigated", this._onNavigatedHandler);
this._navigationManager.on("navigatingBack", this._onNavigatingBackHandler);
$.each(this._panesConfig, function(_, paneConfig) {
tasks.push(paneConfig.controller.activate())
});
return $.when.apply($, tasks)
}, deactivate: function() {
var that = this,
tasks = [];
$.each(this._panesConfig, function(_, paneConfig) {
tasks.push(paneConfig.controller.deactivate())
});
this._navigationManager.off("navigating", this._onNavigatingHandler);
this._navigationManager.off("navigated", this._onNavigatedHandler);
this.callBase();
return $.when.apply($, tasks).done(function() {
that._activeViews = {}
})
}, showView: function(viewInfo, direction) {
var that = this,
paneConfig = that._getPaneConfig(viewInfo);
return paneConfig.controller.showView(viewInfo, direction).done(function() {
that._activeViews[that._getViewPaneName(viewInfo.viewTemplateInfo)] = viewInfo
})
}, activeViewInfo: function() {
return this._activeViews[this._masterPaneName]
}, _updateLayoutTitle: function(viewInfo, defaultTitle) {
if (this._getViewPaneName(viewInfo.viewTemplateInfo) === this._masterPaneName) {
var title;
if (viewInfo.model !== undefined) {
title = ko.utils.unwrapObservable(viewInfo.model.title)
}
else {
title = (viewInfo.viewTemplateInfo || {}).title
}
this._layoutModel.title(title || defaultTitle || "")
}
}, _ensurePanesConfig: function() {
if (!this._panesConfig) {
this._panesConfig = this._createPanesConfig()
}
}, _createPanesConfig: function() {
return {}
}, _initChildControllers: function(options) {
var that = this;
$.each(that._panesConfig, function(_, paneConfig) {
var controller = paneConfig.controller;
controller.init($.extend({}, options, {$viewPort: that._$mainLayout.find(paneConfig.selector)}));
$.each(["viewRendered", "viewShowing", "viewReleased", "viewHidden"], function(_, callbacksPropertyName) {
controller.on(callbacksPropertyName, function(args) {
that.fireEvent(callbacksPropertyName, [args])
})
})
})
}, _onNavigating: function(args) {
var options = args.options,
$sourceElement = this._getEventSourceElement(args.options.jQueryEvent);
var routeValues = this._router.parse(args.uri),
viewTemplateInfo = this._viewEngine.getViewTemplateInfo(routeValues.view).option(),
pane = this._getViewPaneName(viewTemplateInfo);
if (pane === this._detailPaneName) {
options.stack = this._detailPaneName + "_pane";
options.root = options.root === undefined ? $sourceElement.is(this._panesConfig[this._masterPaneName].selector + " *") : options.root;
options.keepPositionInStack = false
}
else {
options.stack = options.stack || this._masterPaneCurrentStackKey
}
args.options.pane = pane
}, _onNavigated: function(args) {
if (args.options.pane === this._masterPaneName) {
this._masterPaneCurrentStackKey = this._navigationManager.currentStackKey
}
}, _getEventSourceElement: function(jQueryEvent) {
return jQueryEvent ? $(jQueryEvent.target) : $()
}, _getPaneConfig: function(viewInfo) {
return this._panesConfig[this._getViewPaneName(viewInfo.viewTemplateInfo)]
}, _getViewPaneName: function(viewTemplateInfo) {
return viewTemplateInfo.pane || this._detailPaneName
}, _raiseEvent: function(callback) {
callback.fire()
}, _ensureChildController: function(controller, layoutName) {
if (!controller) {
throw new Error(layoutName + "Controller is not found but it is required by the '" + this.name + "' layout for specified platform and device. Make sure the " + layoutName + ".* files are referenced in your main *.html file or specify other platform and device.");
}
}, saveState: function(storage) {
var state = {};
$.each(this._activeViews, function(pane, viewInfo) {
state[pane] = {
uri: viewInfo.uri, stack: viewInfo.navigateOptions.stack
}
});
var json = JSON.stringify(state);
storage.setItem(this._stateStorageKey, json)
}, restoreState: function(storage) {
var json = storage.getItem(this._stateStorageKey);
if (json) {
try {
var that = this,
state = JSON.parse(json);
$.each(state, function(pane, navigateOptions) {
that._navigationManager.navigate(navigateOptions.uri, {
stack: navigateOptions.stack, target: 'current'
})
})
}
catch(e) {
this.removeState(storage);
throw errors.Error("E3007");
}
}
}, removeState: function(storage) {
storage.removeItem(this._stateStorageKey)
}
});
var IOSSplitLayoutController = MultipaneLayoutController.inherit({_createPanesConfig: function() {
this._ensureChildController(SimpleLayoutControllerModule.SimpleLayoutController, "SimpleLayout");
return {
master: {
controller: new SimpleLayoutControllerModule.SimpleLayoutController, selector: ".master-pane"
}, detail: {
controller: new SimpleLayoutControllerModule.SimpleLayoutController, selector: ".detail-pane"
}
}
}});
var ToolbarController = Class.inherit({
ctor: function($toolbar, commandManager) {
this._commandManager = commandManager;
this._$toolbar = $toolbar;
this._toolbar = $toolbar.dxToolbar("instance");
this._commandContainer = $toolbar.dxCommandContainer("instance")
}, showViews: function(viewInfos) {
var that = this,
commands = this._mergeCommands(viewInfos),
toolbarItems = that._toolbar.option("items");
var newItems = $.map(toolbarItems, function(item) {
return item.command ? undefined : item
});
that._toolbar.option("items", newItems);
fx.off = true;
that._commandManager.renderCommandsToContainers(commands, [that._commandContainer]);
fx.off = false
}, _mergeCommands: function(viewInfos) {
var result = [],
idHash = {};
$.each(viewInfos, function(_, viewInfo) {
if (viewInfo.commands) {
$.each(viewInfo.commands, function(_, command) {
var id = command.option("id");
if (!(id in idHash)) {
idHash[id] = true;
result.push(command)
}
})
}
});
return result
}
});
var AndroidSplitLayoutController = MultipaneLayoutController.inherit({
ctor: function(options) {
options = options || {};
options.layoutModel = options.layoutModel || this._createLayoutModel();
this.callBase(options)
}, init: function(options) {
this.callBase(options);
this.toolbarController = new ToolbarController(this._$mainLayout.find(".header-toolbar"), this._commandManager)
}, _createLayoutModel: function() {
return {title: ko.observable("")}
}, showView: function(viewInfo, direction) {
var that = this;
that._updateLayoutTitle(viewInfo);
return that.callBase(viewInfo, direction).done(function() {
that.toolbarController.showViews(that._activeViews)
})
}, _createPanesConfig: function() {
this._ensureChildController(EmptyLayoutControllerModule.EmptyLayoutController, "EmptyLayout");
return {
master: {
controller: new EmptyLayoutControllerModule.EmptyLayoutController, selector: ".master-pane"
}, detail: {
controller: new EmptyLayoutControllerModule.EmptyLayoutController, selector: ".detail-pane"
}
}
}
});
var WinSplitLayoutController = MultipaneLayoutController.inherit({
ctor: function(options) {
options = options || {};
this._eventHelper = new SplitLayoutEventHelper(this);
options.layoutModel = options.layoutModel || this._createLayoutModel();
this.callBase(options)
}, init: function(options) {
this.callBase(options);
this._eventHelper.init();
this.headerToolbarController = new ToolbarController(this._$mainLayout.find(".header-toolbar"), this._commandManager)
}, showView: function(viewInfo, direction) {
var that = this;
that._updateLayoutTitle(viewInfo);
return that.callBase(viewInfo, direction).done(function() {
that.headerToolbarController.showViews(that._activeViews)
})
}, _createLayoutModel: function() {
return {title: ko.observable("")}
}, _createPanesConfig: function() {
this._ensureChildController(EmptyLayoutControllerModule.EmptyLayoutController, "EmptyLayout");
return {
master: {
controller: new EmptyLayoutControllerModule.EmptyLayoutController, selector: ".left-content"
}, detail: {
controller: new EmptyLayoutControllerModule.EmptyLayoutController, selector: ".right-content"
}
}
}, _appBarHasCommands: function() {
var footerToolbar = this._$viewPort.find(".footer-toolbar").data("dxToolbar");
return footerToolbar ? footerToolbar.option("items").length : false
}
});
var Win8SplitLayoutController = WinSplitLayoutController.inherit({
init: function(options) {
this.callBase(options);
this.footerToolbarController = new ToolbarController(this._$mainLayout.find(".footer-toolbar"), this._commandManager)
}, showView: function(viewInfo, direction) {
var that = this;
return that.callBase(viewInfo, direction).done(function() {
that.footerToolbarController.showViews(that._activeViews)
})
}
});
layoutSets["split"] = layoutSets["split"] || [];
layoutSets["split"].push({
platform: "ios", tablet: true, controller: new IOSSplitLayoutController
});
layoutSets["split"].push({
platform: "android", tablet: true, controller: new AndroidSplitLayoutController
});
layoutSets["split"].push({
platform: "generic", tablet: true, controller: new IOSSplitLayoutController
});
layoutSets["split"].push({
platform: "win", phone: false, controller: new WinSplitLayoutController
});
layoutSets["split"].push({
platform: "win", version: [8], phone: false, controller: new Win8SplitLayoutController
});
exports.MultipaneLayoutController = MultipaneLayoutController;
exports.IOSSplitLayoutController = IOSSplitLayoutController;
exports.ToolbarController = ToolbarController;
exports.AndroidSplitLayoutController = AndroidSplitLayoutController;
exports.WinSplitLayoutController = WinSplitLayoutController;
exports.Win8SplitLayoutController = Win8SplitLayoutController;
return exports
}));
@@ -0,0 +1,46 @@
<div data-options="dxView : { name: 'Discount', title: 'Leértékelés' } " >
<div data-options="dxContent : { targetPlaceholder: 'content' } " >
<div class="dx-fieldset">
<div class="dx-field">
<div class="dx-field-label">Vonalkód:</div>
<div class="dx-field-value">
<div id="BarcodeText" data-bind="dxTextBox: { onEnterKey: onEnterKeyBarcode, placeholder: 'EAN13, EAN8', value: Barcode, disabled: BarcodeDisabled }"></div>
</div>
</div>
<div class="dx-field">
<div class="dx-field-label">Ár:</div>
<div class="dx-field-value">
<div data-bind="dxNumberBox: { value: PriceBruttoHUF },dxValidator: priceValidationRules"></div>
</div>
</div>
<div class="dx-field">
<div class="dx-field-label">Érvényes:</div>
<div class="dx-field-value">
<div data-bind="dxDateBox: { value: ActualDate }"></div>
</div>
</div>
<div class="dx-field">
<div class="dx-field-label">Lejárat:</div>
<div class="dx-field-value">
<div data-bind="dxDateBox: {value: ExpirationDate}"></div>
</div>
</div>
<br />
<table style="width: 100%">
<tr>
<td style="width: 5%"></td>
<td style="text-align: center">
<div data-bind="dxButton: { text: 'Leértékel',visible: DiscountOkVisible,onClick: onClickOk }"></div>
<div data-bind="dxButton: { text: 'Mégsem',visible:DiscountCancelVisible,onClick: onClickCancel }"></div>
</td>
<td style="width: 5%"></td>
</tr>
</table>
<br/>
<div data-bind="dxScrollView: {scrollByContent: true, scrollByThumb: true}">
<div id="gridContainer"></div>
<div id="gridContainerDiscount"></div>
</div>
</div>
</div>
</div>
@@ -0,0 +1,134 @@
Nuvolar_Scanner_Android.Discount = function (params) {
priceValidationRules = {
validationRules: [{
type: "range",
min: 1,
message: "A leértékelt ár nem lehet 0"
}]
};
var viewModel = {
onEnterKeyBarcode: function (e) {
SimpleQuery.UserName = username();
SimpleQuery.Password = password();
SimpleQuery.Database = database();
SimpleQuery.Query = 'DX_GetProductsInfo_dxDatagrid;' + Barcode();
JSON_Text = JSON.stringify(SimpleQuery, null);
$.getJSON(URL(), 'id=' + JSON_Text, function (results) {
dataSourcePDARows = JSON.parse(JSON.parse(results).Result);
$("#gridContainer").dxDataGrid({ dataSource: dataSourcePDARows });
if (dataSourcePDARows.length > 1) {
BarcodeDisabled(true);
DiscountCancelVisible(true);
DiscountOkVisible(true);
}
else {
Barcode("");
DiscountCancelVisible(false);
DiscountOkVisible(false);
}
$("#BarcodeText").dxTextBox("instance").focus();
}).done(function () {
//alert("second success");
}).fail(function (jqXHR, textStatus, errorThrown) {
DevExpress.ui.notify("Kapcsolati hiba, próbálja meg újra!", "error", 2000);
});
SimpleQuery.UserName = username();
SimpleQuery.Password = password();
SimpleQuery.Database = database();
SimpleQuery.Query = 'DX_GetDiscountInfo_dxDatagrid;' + Barcode();
JSON_Text = JSON.stringify(SimpleQuery, null);
$.getJSON(URL(), 'id=' + JSON_Text, function (results) {
dataSourceDiscount = JSON.parse(JSON.parse(results).Result);
$("#gridContainerDiscount").dxDataGrid({ dataSource: dataSourceDiscount });
}).done(function () {
//alert("second success");
}).fail(function (jqXHR, textStatus, errorThrown) {
DevExpress.ui.notify("Kapcsolati hiba, próbálja meg újra!", "error", 2000);
});
},
onClickOk: function (e) {
var result = e.validationGroup.validate();
if (result.isValid) {
SimpleQuery.UserName = username();
SimpleQuery.Password = password();
SimpleQuery.Database = database();
SimpleQuery.Query = 'DX_InsertDiscount_dxDataGrid;' + Barcode() + ';' + PriceBruttoHUF() + ';' + ActualDate.yyyymmdd() + ';' + ExpirationDate.yyyymmdd();
JSON_Text = JSON.stringify(SimpleQuery, null);
$.getJSON(URL(), 'id=' + JSON_Text, function (results) {
dataSourceDiscount = JSON.parse(JSON.parse(results).Result);
$("#gridContainerDiscount").dxDataGrid({ dataSource: dataSourceDiscount });
Barcode("");
DiscountCancelVisible(false);
DiscountOkVisible(false);
BarcodeDisabled(false);
$("BarcodeText").dxTextBox("instance").focus();
}).done(function () {
//alert("second success");
}).fail(function (jqXHR, textStatus, errorThrown) {
DevExpress.ui.notify("Kapcsolati hiba, próbálja meg újra!", "error", 2000);
});
}
},
onClickCancel: function (e) {
BarcodeDisabled(false);
DiscountCancelVisible(false);
DiscountOkVisible(false);
Barcode("");
},
viewShown: function (e) {
dataSourcePDARows = null;
if (IsLoggedOn == false) {
currentnavigate("Discount");
Nuvolar_Scanner_Android.app.navigate("Login", { root: true });
}
else {
$("#gridContainer").dxDataGrid({
dataSource: dataSourcePDARows,
allowColumnReordering: true,
allowColumnResizing: true,
columnAutoWidth: true,
rowAlternationEnabled: true,
columnChooser: {
enabled: false
},
scrolling: { mode: 'infinite' },
columnFixing: {
enabled: true
},
columns: [{
dataField: "Oid",
visible: false,
key: true
},
{ dataField: "ShortName", caption: 'Megnevezés' },
{ dataField: "Value", caption: 'Érték' }
]
});
$("#gridContainerDiscount").dxDataGrid({
dataSource: dataSourceDiscount,
allowColumnReordering: true,
allowColumnResizing: true,
columnAutoWidth: true,
rowAlternationEnabled: true,
columnChooser: {
enabled: false
},
scrolling: { mode: 'infinite' },
columnFixing: {
enabled: true
},
columns: [{
dataField: "Oid",
visible: false,
key: true
},
{ dataField: "Barcode", caption: 'Vonalkód' },
{ dataField: "PriceBruttoHUF", caption: 'Bruttó ár' },
{ dataField: "ExpirationDate", caption: 'Érvényes' }
]
});
};
}
};
return viewModel;
};
@@ -0,0 +1,26 @@
<div data-options="dxView : { name: 'StorageLocationFoldEdit', title: 'Szétrakás polcra' } " >
<div data-bind="dxCommand: { title: 'x', id: 'delete', icon:'remove',onExecute:removerows }"></div>
<div data-options="dxContent : { targetPlaceholder: 'content' } " class="dx-content-background">
<div class="dx-fieldset">
<div class="dx-field">
<div class="dx-field-label">Termék vonalkód:</div>
<div class="dx-field-value">
<div id="BarcodeTextProducts" data-bind="dxTextBox: { onEnterKey: onEnterKeyBarcodeProducts, placeholder: 'EAN13, EAN8', value: BarcodeProducts }"></div>
</div>
</div>
<div class="dx-field">
<div class="dx-field-label">Lokáció vonalkód:</div>
<div class="dx-field-value">
<div id="BarcodeTextLocations" data-bind="dxTextBox: { onEnterKey: onEnterKeyBarcodeLocations, placeholder: 'EAN13', value: BarcodeLocations }"></div>
</div>
</div>
<div class="dx-field">
<div class="dx-field-label">Mennyiség:</div>
<div class="dx-field-value">
<div data-bind="dxNumberBox: { onEnterKey: onEnterKeyBarcodeProducts, value: QTT }"></div>
</div>
</div>
<div id="gridContainer"></div>
</div>
</div>
</div>
@@ -0,0 +1,113 @@
Nuvolar_Scanner_Android.StorageLocationFoldEdit = function (params) {
"use strict";
var viewModel = {
viewShown: function (e) {
$("#gridContainer").dxDataGrid({
dataSource: dataSourcePDARows,
allowColumnReordering: true,
allowColumnResizing: true,
showColumnLines: true,
showRowLines: true,
rowAlternationEnabled: true,
columnAutoWidth: true,
height:450,
columnChooser: {
enabled: false
},
//paging: {
// pageSize: 10
//},
scrolling: {
mode: 'infinite'
},
//pager: {
// showPageSizeSelector: true,
// allowedPageSizes: [5, 10, 20]
//},
columnFixing: {
enabled: true
},
selection: {
mode: 'multiple',
allowSelectAll: false
},
//editing: {
// //editEnabled: true,
// editMode: 'row',
// //insertEnabled: true,
// removeEnabled: true
//},
store: {key: "Oid"},
onRowRemoving: function(e) {
var dataGrid = $('#gridContainer').dxDataGrid('instance');
alert(dataGrid.getSelectedRowsData());
e.cancel = true;
//e.data.RecordStatus = 'Deleted';
//var rowIndex = e.component.getRowIndexByKey(e.key);
//var $commandEditCell = e.component.getCellElement(rowIndex, "command:edit");
//$commandEditCell.empty();
//$commandEditCell.parent().addClass("deleted");
},
columns: [{ dataField: "Oid",
visible: false,
key:true},
{ dataField: "QTT",caption:'M.',dataType:'number' },
{ dataField: "ShortName", caption:'Megnevezés'},
{ dataField: "Barcode", caption: 'Vonalkód' },
{
dataField: "RowIndex", caption: 'S.',
allowSorting: true,
sortIndex: 1,
sortOrder: 'desc',
dataType: 'number'
}
]
});
SimpleQuery.UserName = username();
SimpleQuery.Password = password();
SimpleQuery.Database = database();
dataSourcePDARows = null;
$("#gridContainer").dxDataGrid({ dataSource: dataSourcePDARows })
SimpleQuery.Query = 'DX_GetStoragePDACollectionRows_dxDataGrid;' + params.id;
JSON_Text = JSON.stringify(SimpleQuery, null);
$.getJSON(URL(), 'id='+JSON_Text, function (results) {
dataSourcePDARows = JSON.parse(JSON.parse(results).Result);
$("#gridContainer").dxDataGrid({dataSource: dataSourcePDARows})
}
).done(function () {
//alert("second success");
}).fail(function (jqXHR, textStatus, errorThrown) {
DevExpress.ui.notify("Kapcsolati hiba, próbálja meg újra!", "error", 2000);
});
},
onEnterKeyBarcodeProducts: function (e) {
SimpleQuery.UserName = username();
SimpleQuery.Password = password();
SimpleQuery.Database = database();
SimpleQuery.Query = 'DX_InsertStorageLocationFold_dxDataGrid;' + BarcodeProducts() + ';' + params.id + ';' + QTT() + ';' + BarcodeLocations();
JSON_Text = JSON.stringify(SimpleQuery, null);
$.getJSON(URL(), 'id=' + JSON_Text, function (results) {
Barcode("");
dataSourcePDARows = JSON.parse(JSON.parse(results).Result);
$("#gridContainer").dxDataGrid({ dataSource: dataSourcePDARows })
$("#BarcodeTextProducts").dxTextBox("instance").focus();
}
).done(function () {
}).fail(function (jqXHR, textStatus, errorThrown) {
DevExpress.ui.notify("Kapcsolati hiba, próbálja meg újra!", "error", 2000);
});
},
onEnterKeyBarcodeLocations: function (e) {
$("#BarcodeTextProducts").dxTextBox("instance").focus();
},
removerows: function (e) {
}
};
return viewModel;
};
@@ -0,0 +1,9 @@
<div data-options="dxView : { name: 'StorageLocationFoldSelect', title: 'Szétrakás polcra' } " >
<div data-options="dxContent : { targetPlaceholder: 'content' } " class="dx-content-background">
<div id="dxlist" data-bind="dxList: { dataSource: dxListDataSource, noDataText: 'Nincs semmi!', onItemClick: dxListItemClickAction}">
<div data-options="dxTemplate:{name:'item'}">
<span style="text-align: center; vertical-align: middle" data-bind="text: $data.title"></span>
</div>
</div>
</div>
</div>
@@ -0,0 +1,36 @@
Nuvolar_Scanner_Android.StorageLocationFoldSelect = function (params) {
"use strict";
var viewModel = {
viewShown: function (e) {
dxListDataSource = null;
currentnavigate("StorageLocationFoldSelect");
if (IsLoggedOn == false) {
Nuvolar_Scanner_Android.app.navigate("Login", { root: false });
}
else {
SimpleQuery.UserName = username();
SimpleQuery.Password = password();
SimpleQuery.Database = database();
SimpleQuery.Query = 'DX_GetStorageLocationFoldSelect_dxList';
JSON_Text = JSON.stringify(SimpleQuery, null);
$.getJSON(URL(), 'id=' + JSON_Text, function (results) {
dxListDataSource = JSON.parse(JSON.parse(results).Result);
$("#dxlist").dxList({ dataSource: dxListDataSource });
}).done(function () {
//alert("second success");
}).fail(function (jqXHR, textStatus, errorThrown) {
DevExpress.ui.notify("Kapcsolati hiba, próbálja meg újra!", "error", 2000);
});
};
},
dxListItemClickAction: function (e) {
if (e.itemData.key != '') {
//alert(e.itemData.key);
Nuvolar_Scanner_Android.app.navigate({ view: "StorageLocationFoldEdit", id: e.itemData.key });
};
}
};
return viewModel;
};
@@ -0,0 +1,7 @@
/*.dx-button-content {
background: #00bcd4 none repeat scroll 0 0;
}
.dx-button-text {
color: #ffffff;
}*/
@@ -0,0 +1,46 @@
<div data-options="dxView: { modal: true, name: 'Login', title: 'Bejelentkezés' }">
<div data-options="dxContent : { targetPlaceholder: 'content' } ">
<div class="dx-fieldset">
<div class="dx-field">
<div class="dx-field-label">Felhasználó:</div>
<div class="dx-field-value">
<div id="username" data-bind="dxTextBox: { value: username }"></div>
</div>
</div>
<div class="dx-field">
<div class="dx-field-label">Jelszó:</div>
<div class="dx-field-value">
<div id="password" data-bind="dxTextBox: { value: password,mode: 'password' }"></div>
</div>
</div>
<div class="dx-field">
<div class="dx-field-label">IP:</div>
<div class="dx-field-value">
<div id="URL_IP" data-bind="dxTextBox: { value: URL_IP }"></div>
</div>
</div>
<div class="dx-field">
<div class="dx-field-label">DIR:</div>
<div class="dx-field-value">
<div id="URL_DIR" data-bind="dxTextBox: { value: URL_DIR }"></div>
</div>
</div>
<!--<div class="dx-field">
<div class="dx-field-label">Egység:</div>
<div class="dx-field-value">
<div id="products-simple" data-bind="dxSelectBox: {displayValue: database}"></div>
</div>
</div>-->
</div>
<table style="width: 100%">
<tr>
<td style="width: 20%"></td>
<td style="text-align:center">
<div class="logout-button" data-bind="dxButton: { text: 'Bejelentkezés',onClick: getlogin }"></div>
</td>
<td style="width: 20%"></td>
</tr>
</table>
<div data-bind="dxLoadPanel: { message: 'Kapcsolódás...', visible: loadPanelVisible }"></div>
</div>
</div>
@@ -0,0 +1,72 @@
Nuvolar_Scanner_Android.Login = function (params, viewInfo) {
$.each(Nuvolar_Scanner_Android.app.navigation, function (_, command) {
command.option("root", false);
})
var viewModel = {
commands: Nuvolar_Scanner_Android.app.navigation,
getlogin: function (e) {
IsLoggedOn = false;
SimpleQuery.UserName = username();
SimpleQuery.Password = password();
SimpleQuery.Database = database();
SimpleQuery.Query = 'DX_Login';
JSON_Text = JSON.stringify(SimpleQuery, null);
if (URL_DIR() != "" && URL_DIR() != null) {
URL("http://" + URL_IP() + "/" + URL_DIR() + "/Service.svc/GetInfo?callback=?");
}
else {
URL("http://" + URL_IP() + "/Service.svc/GetInfo?callback=?");
}
//Most kell bejelentkeztetni
$.getJSON(URL(), 'id=' + JSON_Text, function (results) {
if (JSON.parse(results).ResultStatus == 1) {
IsLoggedOn = true;
//Ideiglenesen !!!
database("pcs_324");
Nuvolar_Scanner_Android.app.createNavigation(navigation);
Nuvolar_Scanner_Android.app.renderNavigation();
Nuvolar_Scanner_Android.app.navigate(currentnavigate(), { root: true });
window.localStorage.setItem("username", username());
window.localStorage.setItem("database", database());
window.localStorage.setItem("URL_IP", URL_IP());
window.localStorage.setItem("URL_DIR", URL_DIR());
};
}
).done(function () {
loadPanelVisible(false);
}).fail(function (jqXHR, textStatus, errorThrown) {
loadPanelVisible(false);
alert(textStatus);
alert(jqXHR.responseText);
DevExpress.ui.notify("Kapcsolati hiba, próbálja meg újra!", "error", 2000);
});
},
viewShown: function (e) {
loadPanelVisible(true);
IsLoggedOn = false;
//Nuvolar_Scanner_Android.app.navigate("Login", { root: true,target:"current",clearHistory: true });
if (window.localStorage.getItem("database") != null)
{
database(window.localStorage.getItem("database"));
username(window.localStorage.getItem("username"));
URL_IP(window.localStorage.getItem("URL_IP"));
URL_DIR(window.localStorage.getItem("URL_DIR"));
if (URL_DIR() != "" && URL_DIR() != null) {
URL("http://" + URL_IP() + "/" + URL_DIR() + "/Service.svc/GetInfo?callback=?");
}
else
{
URL("http://" + URL_IP() + "/Service.svc/GetInfo?callback=?");
}
}
loadPanelVisible(false);
}
};
return viewModel;
};
@@ -0,0 +1,15 @@
<div data-options="dxView : { name: 'ProductsInfo', title: 'Termék információ', root: true } " >
<div data-options="dxContent : { targetPlaceholder: 'content' } " >
<div class="dx-fieldset">
<div class="dx-field">
<div class="dx-field-label">Vonalkód</div>
<div class="dx-field-value">
<div id="BarcodeText" data-bind="dxTextBox: { onEnterKey: onEnterKeyBarcode, placeholder: 'EAN13, EAN8', value: Barcode }"></div>
<!--<div data-bind="dxButton: { onClick: 'onClickScan', text: 'SCAN' }"></div>-->
</div>
</div>
<div id="gridContainer"></div>
<img id="img" src="" />
</div>
</div>
</div>
@@ -0,0 +1,70 @@
Nuvolar_Scanner_Android.ProductsInfo = function (params) {
var viewModel = {
onEnterKeyBarcode: function (e)
{
SimpleQuery.UserName = username();
SimpleQuery.Password = password();
SimpleQuery.Database = database();
SimpleQuery.Query = 'DX_GetProductsInfo_Picture;' + Barcode();
JSON_Text = JSON.stringify(SimpleQuery, null);
$.getJSON(URL(), 'id=' + JSON_Text, function (results) {
ProductPicture = JSON.parse(results).Result;
document.getElementById('img').setAttribute('src', 'data:image/png;base64,'+ProductPicture);
}).done(function () {
}).fail(function (jqXHR, textStatus, errorThrown) {
DevExpress.ui.notify("Kapcsolati hiba, próbálja meg újra!", "error", 2000);
});
SimpleQuery.UserName = username();
SimpleQuery.Password = password();
SimpleQuery.Database = database();
SimpleQuery.Query = 'DX_GetProductsInfo_dxDatagrid;' + Barcode();
JSON_Text = JSON.stringify(SimpleQuery, null);
$.getJSON(URL(), 'id=' + JSON_Text, function (results) {
dataSourcePDARows = JSON.parse(JSON.parse(results).Result);
$("#gridContainer").dxDataGrid({ dataSource: dataSourcePDARows });
Barcode("");
$("#BarcodeText").dxTextBox("instance").focus();
}).done(function () {
}).fail(function (jqXHR, textStatus, errorThrown) {
DevExpress.ui.notify("Kapcsolati hiba, próbálja meg újra!", "error", 2000);
});
},
viewShown: function (e) {
dataSourcePDARows = null;
if (IsLoggedOn == false) {
currentnavigate("ProductsInfo");
Nuvolar_Scanner_Android.app.navigate("Login", { root: true });
}
else
{
$("#gridContainer").dxDataGrid({
dataSource: dataSourcePDARows,
allowColumnReordering: true,
allowColumnResizing: true,
columnAutoWidth: true,
rowAlternationEnabled: true,
columnChooser: {
enabled: false
},
scrolling: { mode: 'infinite' },
columnFixing: {
enabled: true
},
columns: [{
dataField: "Oid",
visible: false,
key: true
},
{ dataField: "ShortName", caption: 'Megnevezés' },
{ dataField: "Value", caption: 'Érték' }
]
});
};
}
};
return viewModel;
};
//Kép feldolgozása
@@ -0,0 +1,4 @@
<div data-options="dxView : { name: 'StorageInHeaderSelect', title: 'Betárolás' } " >
<div data-options="dxContent : { targetPlaceholder: 'content' } " >
</div>
</div>
@@ -0,0 +1,13 @@
Nuvolar_Scanner_Android.StorageInHeaderSelect = function (params) {
var viewModel = {
viewShown: function (e) {
if (IsLoggedOn == false) {
currentnavigate("StorageInHeaderSelect");
Nuvolar_Scanner_Android.app.navigate("Login", { root: true });
}
}
};
return viewModel;
};
@@ -0,0 +1,20 @@
<div data-options="dxView : { name: 'StorageInRowsEdit', title: 'Betárolási sorok rögzítése' } " >
<div data-options="dxContent : { targetPlaceholder: 'content' } " >
<div class="dx-fieldset">
<div class="dx-field">
<div class="dx-field-label">Vonalkód:</div>
<div class="dx-field-value">
<div id="BarcodeText" data-bind="dxTextBox: { onEnterKey: onEnterKeyBarcode, placeholder: 'EAN13, EAN8', value: Barcode }"></div>
<!--<div data-bind="dxButton: { onClick: 'onClickScan', text: 'SCAN' }"></div>-->
</div>
</div>
<div class="dx-field">
<div class="dx-field-label">Mennyiség:</div>
<div class="dx-field-value">
<div data-bind="dxNumberBox: { onEnterKey: onEnterKeyBarcode, value: QTT }"></div>
</div>
</div>
<div id="gridContainer"></div>
</div>
</div>
</div>
@@ -0,0 +1,8 @@
Nuvolar_Scanner_Android.StorageInRowsEdit = function (params) {
var viewModel = {
// Put the binding properties here
};
return viewModel;
};
@@ -0,0 +1,11 @@
<div data-options="dxView : { name: 'StorageOutHeaderSelect', title: 'Kitárolás kiválasztása' } " >
<div data-options="dxContent : { targetPlaceholder: 'content' } " >
<div id="dxlist" data-bind="dxList: { itemClickAction: dxListItemClickAction, noDataText: 'Nincs semmi!', dataSource: dxListDataSource, grouped: false, pullRefreshEnabled: false }">
<div data-options="dxTemplate:{name:'item'}">
<span style="text-align: center; vertical-align: middle" data-bind="text: $data.title"><b></b></span>
<span style="text-align: center; vertical-align: middle; font-weight: bold;" data-bind="text: $data.group"></span>
<span style="text-align: center; vertical-align: middle;font-style: italic;" data-bind="text: $data.customername"></span>
</div>
</div>
</div>
</div>
@@ -0,0 +1,35 @@
Nuvolar_Scanner_Android.StorageOutHeaderSelect = function (params) {
var viewModel = {
viewShown: function (e) {
dxListDataSource = null;
currentnavigate("StorageOutHeaderSelect");
if (IsLoggedOn == false) {
Nuvolar_Scanner_Android.app.navigate("Login", { root: false });
}
else {
SimpleQuery.UserName = username();
SimpleQuery.Password = password();
SimpleQuery.Database = database();
SimpleQuery.Query = 'DX_GetStorageOutHeader_dxList';
JSON_Text = JSON.stringify(SimpleQuery, null);
$.getJSON(URL(), 'id=' + JSON_Text, function (results) {
dxListDataSource = JSON.parse(JSON.parse(results).Result);
$("#dxlist").dxList({ dataSource: dxListDataSource });
}).done(function () {
//alert("second success");
}).fail(function (jqXHR, textStatus, errorThrown) {
DevExpress.ui.notify("Kapcsolati hiba, próbálja meg újra!", "error", 2000);
});
};
},
dxListItemClickAction: function (e) {
if (e.itemData.key != '') {
//alert(e.itemData.key);
Nuvolar_Scanner_Android.app.navigate({ view: "StorageOutRowsEdit", id: e.itemData.key });
};
}
};
return viewModel;
};
@@ -0,0 +1,21 @@
<div data-options="dxView : { name: 'StorageOutRowsEdit', title: 'Kitárolási sorok rögzítése' } " >
<div data-bind="dxCommand: { title: 'x', id: 'delete', icon: 'remove', onExecute: removerows }"></div>
<div data-options="dxContent : { targetPlaceholder: 'content' } " >
<div class="dx-fieldset">
<div class="dx-field">
<div class="dx-field-label">Vonalkód:</div>
<div class="dx-field-value">
<div id="BarcodeText" data-bind="dxTextBox: { onEnterKey: onEnterKeyBarcode, placeholder: 'EAN13, EAN8', value: Barcode }"></div>
<!--<div data-bind="dxButton: { onClick: 'onClickScan', text: 'SCAN' }"></div>-->
</div>
</div>
<div class="dx-field">
<div class="dx-field-label">Mennyiség:</div>
<div class="dx-field-value">
<div data-bind="dxNumberBox: { onEnterKey: onEnterKeyBarcode, value: QTT }"></div>
</div>
</div>
<div id="gridContainer"></div>
</div>
</div>
</div>
@@ -0,0 +1,115 @@
Nuvolar_Scanner_Android.StorageOutRowsEdit = function (params) {
var viewModel = {
viewShown: function (e) {
$("#gridContainer").dxDataGrid({
dataSource: dataSourcePDARows,
allowColumnReordering: true,
allowColumnResizing: true,
showColumnLines: true,
showRowLines: true,
rowAlternationEnabled: true,
columnAutoWidth: true,
height: 450,
columnChooser: {
enabled: false
},
scrolling: {
mode: 'infinite'
},
columnFixing: {
enabled: true
},
selection: {
mode: 'multiple',
allowSelectAll: false
},
columns: [{
dataField: "Oid",
visible: false,
key: true
},
{ dataField: "QTT", caption: 'M.' },
{ dataField: "ShortName", caption: 'Megnevezés' },
{ dataField: "ProductNumber", caption: 'Cikkszám' },
{
dataField: "RowIndex", caption: 'S.',
allowSorting: true,
sortIndex: 1,
sortOrder: 'desc'
}
]
});
SimpleQuery.UserName = username();
SimpleQuery.Password = password();
SimpleQuery.Database = database();
SimpleQuery.Query = 'DX_GetStorageOutRows_dxDataGrid;' + params.id;
JSON_Text = JSON.stringify(SimpleQuery, null);
$.getJSON(URL(), 'id=' + JSON_Text, function (results) {
dataSourcePDARows = JSON.parse(JSON.parse(results).Result);
$("#gridContainer").dxDataGrid({ dataSource: dataSourcePDARows })
}
).done(function () {
//alert("second success");
}).fail(function (jqXHR, textStatus, errorThrown) {
DevExpress.ui.notify("Kapcsolati hiba, próbálja meg újra!", "error", 2000);
});
},
onEnterKeyBarcode: function (e) {
SimpleQuery.UserName = username();
SimpleQuery.Password = password();
SimpleQuery.Database = database();
SimpleQuery.Query = 'DX_InsertStorageOutRows_dxDataGrid;' + Barcode() + ';' + params.id + ';' + QTT();
JSON_Text = JSON.stringify(SimpleQuery, null);
$.getJSON(URL(), 'id=' + JSON_Text, function (results) {
Barcode("");
dataSourcePDARows = JSON.parse(JSON.parse(results).Result);
$("#gridContainer").dxDataGrid({ dataSource: dataSourcePDARows })
$("#BarcodeText").dxTextBox("instance").focus();
}
).done(function () {
}).fail(function (jqXHR, textStatus, errorThrown) {
DevExpress.ui.notify("Kapcsolati hiba, próbálja meg újra!", "error", 2000);
});
},
removerows: function (e) {
var dataGrid = $('#gridContainer').dxDataGrid('instance');
var items = dataGrid.getSelectedRowsData();
for (i = 0; i < items.length; i++) {
SimpleQuery.UserName = username();
SimpleQuery.Password = password();
SimpleQuery.Database = database();
SimpleQuery.Query = 'DX_DeleteStorageOutRows_dxDataGrid;' + items[i].Oid;
JSON_Text = JSON.stringify(SimpleQuery, null);
$.getJSON(URL(), 'id=' + JSON_Text, function (results) {
}
).done(function () {
//alert("second success");
}).fail(function (jqXHR, textStatus, errorThrown) {
DevExpress.ui.notify("Kapcsolati hiba, próbálja meg újra!", "error", 2000);
});
};
SimpleQuery.UserName = username();
SimpleQuery.Password = password();
SimpleQuery.Database = database();
SimpleQuery.Query = 'DX_GetStorageOutRows_dxDataGrid;' + params.id;
JSON_Text = JSON.stringify(SimpleQuery, null);
$.getJSON(URL(), 'id=' + JSON_Text, function (results) {
dataSourcePDARows = JSON.parse(JSON.parse(results).Result);
$("#gridContainer").dxDataGrid({ dataSource: dataSourcePDARows })
}
).done(function () {
//alert("second success");
}).fail(function (jqXHR, textStatus, errorThrown) {
DevExpress.ui.notify("Kapcsolati hiba, próbálja meg újra!", "error", 2000);
});
}
};
return viewModel;
};
@@ -0,0 +1,3 @@
.dx-datagrid .dx-row > td {
padding: 4px;
}
@@ -0,0 +1,21 @@
<div data-options="dxView : { name: 'StoragePDACollectionEdit', title: 'PDA adatgyűjtés' } " >
<div data-bind="dxCommand: { icon: 'remove', id: 'delete', onExecute: removerows }"></div>
<div data-options="dxContent : { targetPlaceholder: 'content' } " >
<div class="dx-fieldset">
<div class="dx-field">
<div class="dx-field-label">Vonalkód:</div>
<div class="dx-field-value">
<div id="BarcodeText" data-bind="dxTextBox: { onEnterKey: onEnterKeyBarcode, placeholder: 'EAN13, EAN8', value: Barcode }"></div>
<!--<div data-bind="dxButton: { onClick: 'onClickScan', text: 'SCAN' }"></div>-->
</div>
</div>
<div class="dx-field">
<div class="dx-field-label">Mennyiség:</div>
<div class="dx-field-value">
<div data-bind="dxNumberBox: { onEnterKey: onEnterKeyBarcode, value: QTT }"></div>
</div>
</div>
<div id="gridContainer"></div>
</div>
</div>
</div>
@@ -0,0 +1,142 @@
Nuvolar_Scanner_Android.StoragePDACollectionEdit = function (params) {
var viewModel = {
viewShown: function (e) {
//alert(params.id);
$("#gridContainer").dxDataGrid({
dataSource: dataSourcePDARows,
allowColumnReordering: true,
allowColumnResizing: true,
showColumnLines: true,
showRowLines: true,
rowAlternationEnabled: true,
columnAutoWidth: true,
height:450,
columnChooser: {
enabled: false
},
//paging: {
// pageSize: 10
//},
scrolling: {
mode: 'infinite'
},
//pager: {
// showPageSizeSelector: true,
// allowedPageSizes: [5, 10, 20]
//},
columnFixing: {
enabled: true
},
selection: {
mode: 'multiple',
allowSelectAll: false
},
//editing: {
// //editEnabled: true,
// editMode: 'row',
// //insertEnabled: true,
// removeEnabled: true
//},
store: {key: "Oid"},
onRowRemoving: function(e) {
var dataGrid = $('#gridContainer').dxDataGrid('instance');
alert(dataGrid.getSelectedRowsData());
e.cancel = true;
//e.data.RecordStatus = 'Deleted';
//var rowIndex = e.component.getRowIndexByKey(e.key);
//var $commandEditCell = e.component.getCellElement(rowIndex, "command:edit");
//$commandEditCell.empty();
//$commandEditCell.parent().addClass("deleted");
},
columns: [{ dataField: "Oid",
visible: false,
key:true},
{ dataField: "QTT",caption:'M.',dataType:'number' },
{ dataField: "ShortName", caption:'Megnevezés'},
{ dataField: "Barcode", caption: 'Vonalkód' },
{
dataField: "RowIndex", caption: 'S.',
allowSorting: true,
sortIndex: 1,
sortOrder: 'desc',
dataType: 'number'
}
]
});
SimpleQuery.UserName = username();
SimpleQuery.Password = password();
SimpleQuery.Database = database();
dataSourcePDARows = null;
$("#gridContainer").dxDataGrid({ dataSource: dataSourcePDARows })
SimpleQuery.Query = 'DX_GetStoragePDACollectionRows_dxDataGrid;' + params.id;
JSON_Text = JSON.stringify(SimpleQuery, null);
$.getJSON(URL(), 'id='+JSON_Text, function (results) {
dataSourcePDARows = JSON.parse(JSON.parse(results).Result);
$("#gridContainer").dxDataGrid({dataSource: dataSourcePDARows})
}
).done(function () {
//alert("second success");
}).fail(function (jqXHR, textStatus, errorThrown) {
DevExpress.ui.notify("Kapcsolati hiba, próbálja meg újra!", "error", 2000);
});
},
onEnterKeyBarcode: function (e) {
SimpleQuery.UserName = username();
SimpleQuery.Password = password();
SimpleQuery.Database = database();
SimpleQuery.Query = 'DX_InsertStoragePDACollectionRows_dxDataGrid;' + Barcode() + ';' + params.id+';'+QTT();
JSON_Text = JSON.stringify(SimpleQuery, null);
$.getJSON(URL(), 'id=' + JSON_Text, function (results) {
Barcode("");
dataSourcePDARows = JSON.parse(JSON.parse(results).Result);
$("#gridContainer").dxDataGrid({ dataSource: dataSourcePDARows })
$("#BarcodeText").dxTextBox("instance").focus();
}
).done(function () {
//alert("second success");
}).fail(function (jqXHR, textStatus, errorThrown) {
DevExpress.ui.notify("Kapcsolati hiba, próbálja meg újra!", "error", 2000);
});
//DevExpress.ui.notify("Enterkey fired", "success", 2000);
//$.getJSON(URL(), null, function (results) {
// //simpleProducts = JSON.parse(results).dataResult;
// //alert(results);
// simpleProducts = JSON.parse(results);
// var productsWidget = $("#products-simple").dxSelectBox({
// items: simpleProducts
// }).dxSelectBox("instance");
//}
//).fail(function (jqXHR, textStatus, errorThrown) {
// alert('getJSON request failed! ' + textStatus);
//});
},
removerows: function (e) {
var dataGrid = $('#gridContainer').dxDataGrid('instance');
var items = dataGrid.getSelectedRowsData();
for (i = 0; i < items.length; i++) {
SimpleQuery.UserName = username();
SimpleQuery.Password = password();
SimpleQuery.Database = database();
SimpleQuery.Query = 'DX_DeleteStoragePDACollectionRows_dxDataGrid;' + items[i].Oid;
JSON_Text = JSON.stringify(SimpleQuery, null);
$.getJSON(URL(), 'id=' + JSON_Text, function (results) {
dataSourcePDARows = JSON.parse(JSON.parse(results).Result);
$("#gridContainer").dxDataGrid({ dataSource: dataSourcePDARows })
}
).done(function () {
//alert("second success");
}).fail(function (jqXHR, textStatus, errorThrown) {
DevExpress.ui.notify("Kapcsolati hiba, próbálja meg újra!", "error", 2000);
});
};
}
};
return viewModel;
};
@@ -0,0 +1,9 @@
<div data-options="dxView : { name: 'StoragePDACollectionSelect', title: 'PDA adatgyűjtés' } " >
<div data-options="dxContent : { targetPlaceholder: 'content' } " >
<div id="dxlist" data-bind="dxList: { dataSource: dxListDataSource, noDataText: 'Nincs semmi!', onItemClick: dxListItemClickAction}">
<div data-options="dxTemplate:{name:'item'}">
<span style="text-align: center; vertical-align: middle" data-bind="text: $data.title"></span>
</div>
</div>
</div>
</div>
@@ -0,0 +1,37 @@
Nuvolar_Scanner_Android.StoragePDACollectionSelect = function (params) {
// = ko.observable([{ "key": 1, "title": "a" }, { "key": 2, "title": "b" }]);
var viewModel = {
viewShown: function (e) {
dxListDataSource = null;
currentnavigate("StoragePDACollectionSelect");
if (IsLoggedOn == false) {
Nuvolar_Scanner_Android.app.navigate("Login",{ root: false });
}
else
{
SimpleQuery.UserName = username();
SimpleQuery.Password = password();
SimpleQuery.Database = database();
SimpleQuery.Query = 'DX_GetStoragePDACollectionHeader_dxList';
JSON_Text = JSON.stringify(SimpleQuery, null);
$.getJSON(URL(), 'id='+JSON_Text, function (results) {
dxListDataSource = JSON.parse(JSON.parse(results).Result);
$("#dxlist").dxList({ dataSource: dxListDataSource });
}).done(function () {
//alert("second success");
}).fail(function (jqXHR, textStatus, errorThrown) {
DevExpress.ui.notify("Kapcsolati hiba, próbálja meg újra!", "error", 2000);
});
};
},
dxListItemClickAction: function (e) {
if (e.itemData.key != '') {
//alert(e.itemData.key);
Nuvolar_Scanner_Android.app.navigate({ view: "StoragePDACollectionEdit", id: e.itemData.key });
};
}
};
return viewModel;
};
@@ -0,0 +1,8 @@
<div data-options="dxView : { name: 'Test', title: 'Test' } " >
<div data-options="dxContent : { targetPlaceholder: 'content' } " class="dx-content-background">
<p style="padding: 5px">To learn more about DevExtreme, check out the <a href="http://go.devexpress.com/DevExtreme_LearningCenter.aspx" target="_blank">Learning Center</a>.</p>
<p style="padding: 5px">Note: To disable the simulator debugging environment, set the project's 'Run in Simulator' property to false.</p>
<div data-bind="dxButton: { text: 'Button1',onClick: onClick }"></div>
<div id="status" name="status">Status Message</div>
</div>
</div>
@@ -0,0 +1,44 @@
Nuvolar_Scanner_Android.Test = function (params) {
"use strict";
function errorHandler(transaction, error) {
alert("Error : " + error.message + " in " + query);
}
var viewModel = {
onClick: function (e) {
var db = openDatabase('mydb', '1.0', 'Test DB', 10 * 1024 * 1024);
var msg;
db.transaction(function (tx) {
//tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)',null,errorHandler);
tx.executeSql('CREATE TABLE IF NOT EXISTS Products (id unique, ProductNumber, ShortName,Barcode)');
//tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "foobar")');
//tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "logmsg")');
tx.executeSql('INSERT INTO LOGS (id, log) VALUES (4, "Varuba")');
tx.executeSql('INSERT INTO LOGS (id, log) VALUES (3, "minyime")');
msg = '<p>Log message created and row inserted.</p>';
document.querySelector('#status').innerHTML = msg;
});
db.transaction(function (tx) {
tx.executeSql('SELECT * FROM LOGS', [], function (tx, results) {
var len = results.rows.length, i;
msg = "<p>Found rows: " + len + "</p>";
document.querySelector('#status').innerHTML += msg;
for (i = 0; i < len; i++) {
msg = "<p><b>" + results.rows.item(i).log + "</b></p>";
document.querySelector('#status').innerHTML += msg;
}
}, null);
});
}
};
return viewModel;
};
@@ -0,0 +1,10 @@
<div data-options="dxView : { name: 'navigation', title: 'Menu' } " >
<div class="home-view" data-options="dxContent : { targetPlaceholder: 'content' } " >
<div data-bind="dxList: {}" style="height: 100%" data-options="dxCommandContainer : { id: 'global-navigation' } " >
<div data-bind="visible: visible, css: { 'dx-state-disabled': disabled }" data-options="dxTemplate : { name: 'item' } " >
<div data-bind="dxAction: onExecute">
<div class="dx-navigation-item" data-bind="text: title"></div>
</div>
</div>
</div>
</div>

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