From b1b08365b89d180eb26bb78d236e2845f40b1731 Mon Sep 17 00:00:00 2001 From: button-bot <15862839+button-bot@users.noreply.github.com> Date: Tue, 3 Sep 2024 15:23:35 -0400 Subject: [PATCH] Release 1.7.1 --- ButtonMerchant.podspec | 2 +- ButtonMerchant.xcodeproj/project.pbxproj | 30 +- Gemfile.lock | 48 +- Podfile | 2 +- Podfile.lock | 2 +- Source/AppIntegrationVerification.swift | 147 -- Source/ButtonMerchant.swift | 4 +- Source/Core.swift | 12 +- .../Extensions/UIApplicationExtensions.swift | 37 - Source/Info.plist | 2 +- Source/Version/Version.generated.swift | 2 +- .../AppIntegrationVerificationTests.swift | 234 --- Tests/UnitTests/ButtonMerchantTests.swift | 4 +- Tests/UnitTests/CoreTests.swift | 29 +- .../Foundation/TestApplication.swift | 42 - .../TestAppIntegrationVerification.swift | 42 - Tests/UnitTests/TestObjects/TestCore.swift | 5 +- .../Version/VersionTests.generated.swift | 4 +- docs/history/1.7.1/Classes.html | 225 +++ .../history/1.7.1/Classes/ButtonMerchant.html | 554 ++++++ docs/history/1.7.1/Classes/ButtonProduct.html | 372 ++++ docs/history/1.7.1/Classes/Order.html | 359 ++++ .../history/1.7.1/Classes/Order/Customer.html | 231 +++ .../history/1.7.1/Classes/Order/LineItem.html | 364 ++++ docs/history/1.7.1/Enums.html | 218 +++ .../1.7.1/Enums/ButtonMerchantError.html | 191 ++ .../1.7.1/Enums/ConfigurationError.html | 197 ++ docs/history/1.7.1/Enums/NetworkError.html | 166 ++ docs/history/1.7.1/Protocols.html | 217 +++ docs/history/1.7.1/Protocols/Activity.html | 232 +++ .../Protocols/ButtonProductCompatible.html | 382 ++++ .../history/1.7.1/Protocols/Configurable.html | 170 ++ docs/history/1.7.1/Structs.html | 163 ++ docs/history/1.7.1/badge.svg | 28 + docs/history/1.7.1/css/highlight.css | 202 ++ docs/history/1.7.1/css/jazzy.css | 404 ++++ .../ButtonMerchant.docset/Contents/Info.plist | 20 + .../Contents/Resources/Documents/Classes.html | 225 +++ .../Documents/Classes/ButtonMerchant.html | 554 ++++++ .../Documents/Classes/ButtonProduct.html | 372 ++++ .../Resources/Documents/Classes/Order.html | 359 ++++ .../Documents/Classes/Order/Customer.html | 231 +++ .../Documents/Classes/Order/LineItem.html | 364 ++++ .../Contents/Resources/Documents/Enums.html | 218 +++ .../Documents/Enums/ButtonMerchantError.html | 191 ++ .../Documents/Enums/ConfigurationError.html | 197 ++ .../Documents/Enums/NetworkError.html | 166 ++ .../Resources/Documents/Protocols.html | 217 +++ .../Documents/Protocols/Activity.html | 232 +++ .../Protocols/ButtonProductCompatible.html | 382 ++++ .../Documents/Protocols/Configurable.html | 170 ++ .../Contents/Resources/Documents/Structs.html | 163 ++ .../Resources/Documents/css/highlight.css | 202 ++ .../Resources/Documents/css/jazzy.css | 404 ++++ .../Resources/Documents/img/carat.png | Bin 0 -> 274 bytes .../Contents/Resources/Documents/img/dash.png | Bin 0 -> 1338 bytes .../Resources/Documents/img/spinner.gif | Bin 0 -> 1849 bytes .../Contents/Resources/Documents/index.html | 162 ++ .../Contents/Resources/Documents/js/jazzy.js | 74 + .../Resources/Documents/js/jazzy.search.js | 74 + .../Resources/Documents/js/jquery.min.js | 2 + .../Resources/Documents/js/lunr.min.js | 6 + .../Documents/js/typeahead.jquery.js | 1694 +++++++++++++++++ .../Contents/Resources/Documents/search.json | 1 + .../Contents/Resources/docSet.dsidx | Bin 0 -> 28672 bytes docs/history/1.7.1/docsets/ButtonMerchant.tgz | Bin 0 -> 80125 bytes docs/history/1.7.1/img/carat.png | Bin 0 -> 274 bytes docs/history/1.7.1/img/dash.png | Bin 0 -> 1338 bytes docs/history/1.7.1/img/spinner.gif | Bin 0 -> 1849 bytes docs/history/1.7.1/index.html | 162 ++ docs/history/1.7.1/js/jazzy.js | 74 + docs/history/1.7.1/js/jazzy.search.js | 74 + docs/history/1.7.1/js/jquery.min.js | 2 + docs/history/1.7.1/js/lunr.min.js | 6 + docs/history/1.7.1/js/typeahead.jquery.js | 1694 +++++++++++++++++ docs/history/1.7.1/search.json | 1 + docs/history/1.7.1/undocumented.json | 26 + docs/latest | 2 +- 78 files changed, 13437 insertions(+), 607 deletions(-) delete mode 100644 Source/AppIntegrationVerification.swift delete mode 100644 Source/Extensions/UIApplicationExtensions.swift delete mode 100644 Tests/UnitTests/AppIntegrationVerificationTests.swift delete mode 100644 Tests/UnitTests/TestObjects/Foundation/TestApplication.swift delete mode 100644 Tests/UnitTests/TestObjects/TestAppIntegrationVerification.swift create mode 100644 docs/history/1.7.1/Classes.html create mode 100644 docs/history/1.7.1/Classes/ButtonMerchant.html create mode 100644 docs/history/1.7.1/Classes/ButtonProduct.html create mode 100644 docs/history/1.7.1/Classes/Order.html create mode 100644 docs/history/1.7.1/Classes/Order/Customer.html create mode 100644 docs/history/1.7.1/Classes/Order/LineItem.html create mode 100644 docs/history/1.7.1/Enums.html create mode 100644 docs/history/1.7.1/Enums/ButtonMerchantError.html create mode 100644 docs/history/1.7.1/Enums/ConfigurationError.html create mode 100644 docs/history/1.7.1/Enums/NetworkError.html create mode 100644 docs/history/1.7.1/Protocols.html create mode 100644 docs/history/1.7.1/Protocols/Activity.html create mode 100644 docs/history/1.7.1/Protocols/ButtonProductCompatible.html create mode 100644 docs/history/1.7.1/Protocols/Configurable.html create mode 100644 docs/history/1.7.1/Structs.html create mode 100644 docs/history/1.7.1/badge.svg create mode 100644 docs/history/1.7.1/css/highlight.css create mode 100644 docs/history/1.7.1/css/jazzy.css create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Info.plist create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes.html create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonMerchant.html create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonProduct.html create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order.html create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/Customer.html create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/LineItem.html create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums.html create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ButtonMerchantError.html create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ConfigurationError.html create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/NetworkError.html create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols.html create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Activity.html create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/ButtonProductCompatible.html create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Configurable.html create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Structs.html create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/highlight.css create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/jazzy.css create mode 100755 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/carat.png create mode 100755 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/dash.png create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/spinner.gif create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/index.html create mode 100755 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.js create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.search.js create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jquery.min.js create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/lunr.min.js create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/typeahead.jquery.js create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/search.json create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/docSet.dsidx create mode 100644 docs/history/1.7.1/docsets/ButtonMerchant.tgz create mode 100755 docs/history/1.7.1/img/carat.png create mode 100755 docs/history/1.7.1/img/dash.png create mode 100644 docs/history/1.7.1/img/spinner.gif create mode 100644 docs/history/1.7.1/index.html create mode 100755 docs/history/1.7.1/js/jazzy.js create mode 100644 docs/history/1.7.1/js/jazzy.search.js create mode 100644 docs/history/1.7.1/js/jquery.min.js create mode 100644 docs/history/1.7.1/js/lunr.min.js create mode 100644 docs/history/1.7.1/js/typeahead.jquery.js create mode 100644 docs/history/1.7.1/search.json create mode 100644 docs/history/1.7.1/undocumented.json diff --git a/ButtonMerchant.podspec b/ButtonMerchant.podspec index 035b0c7..b436c84 100644 --- a/ButtonMerchant.podspec +++ b/ButtonMerchant.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'ButtonMerchant' - s.version = '1.7.0' + s.version = '1.7.1' s.summary = 'An open source client library for Button merchants.' s.description = <<-DESC The Button Merchant library is a light-weight, open-source method diff --git a/ButtonMerchant.xcodeproj/project.pbxproj b/ButtonMerchant.xcodeproj/project.pbxproj index 1a7ac1e..d5541aa 100644 --- a/ButtonMerchant.xcodeproj/project.pbxproj +++ b/ButtonMerchant.xcodeproj/project.pbxproj @@ -131,11 +131,6 @@ FB78CAE12618F9360076D9C3 /* Customer.m in Sources */ = {isa = PBXBuildFile; fileRef = FB78CAE02618F9360076D9C3 /* Customer.m */; }; FB78CBC6261A6C110076D9C3 /* CustomerCompatibilityTest.m in Sources */ = {isa = PBXBuildFile; fileRef = FB78CBC5261A6C110076D9C3 /* CustomerCompatibilityTest.m */; }; FB78CBCC261A6C4F0076D9C3 /* Customer.m in Sources */ = {isa = PBXBuildFile; fileRef = FB78CAE02618F9360076D9C3 /* Customer.m */; }; - FBEBC8BB25434A5700AAE9E5 /* AppIntegrationVerification.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBEBC8BA25434A5700AAE9E5 /* AppIntegrationVerification.swift */; }; - FBEBC8CD2543557D00AAE9E5 /* UIApplicationExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBEBC8CC2543557D00AAE9E5 /* UIApplicationExtensions.swift */; }; - FBEBC8DF2543576A00AAE9E5 /* TestApplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBEBC8DE2543576A00AAE9E5 /* TestApplication.swift */; }; - FBEBC92125435D5900AAE9E5 /* TestAppIntegrationVerification.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBEBC92025435D5900AAE9E5 /* TestAppIntegrationVerification.swift */; }; - FBEBC92825436AFA00AAE9E5 /* AppIntegrationVerificationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBEBC92725436AFA00AAE9E5 /* AppIntegrationVerificationTests.swift */; }; FBEBC99625437E1700AAE9E5 /* ButtonMerchantError.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBEBC99525437E1700AAE9E5 /* ButtonMerchantError.swift */; }; /* End PBXBuildFile section */ @@ -335,11 +330,6 @@ FB78CADF2618F9360076D9C3 /* Customer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Customer.h; sourceTree = ""; }; FB78CAE02618F9360076D9C3 /* Customer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Customer.m; sourceTree = ""; }; FB78CBC5261A6C110076D9C3 /* CustomerCompatibilityTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CustomerCompatibilityTest.m; sourceTree = ""; }; - FBEBC8BA25434A5700AAE9E5 /* AppIntegrationVerification.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppIntegrationVerification.swift; sourceTree = ""; }; - FBEBC8CC2543557D00AAE9E5 /* UIApplicationExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIApplicationExtensions.swift; sourceTree = ""; }; - FBEBC8DE2543576A00AAE9E5 /* TestApplication.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestApplication.swift; sourceTree = ""; }; - FBEBC92025435D5900AAE9E5 /* TestAppIntegrationVerification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestAppIntegrationVerification.swift; sourceTree = ""; }; - FBEBC92725436AFA00AAE9E5 /* AppIntegrationVerificationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppIntegrationVerificationTests.swift; sourceTree = ""; }; FBEBC99525437E1700AAE9E5 /* ButtonMerchantError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ButtonMerchantError.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -457,7 +447,6 @@ FB5AA6AC24D0A19B0057F3A0 /* ApplicationIdTests.swift */, DAA3F29A24E305790046DA61 /* ButtonProductTests.swift */, DAD885D024E41B4100E138BF /* ActivityRequestBodyTests.swift */, - FBEBC92725436AFA00AAE9E5 /* AppIntegrationVerificationTests.swift */, DE175A2320A0EF12005C97B9 /* Extensions */, DEE61B2B206569EA0039E47A /* TestExtensions */, DA0FA2A1205C1EE8008296A6 /* TestObjects */, @@ -553,7 +542,6 @@ DA756B8222B33762003397E3 /* URLAuthenticationChallengeExtensions.swift */, DA756B8422B3378B003397E3 /* URLProtectionSpaceExtensions.swift */, 9E56CE5822B8049C00E75884 /* StringExtensions.swift */, - FBEBC8CC2543557D00AAE9E5 /* UIApplicationExtensions.swift */, DE59498C28F49FA200FD9737 /* ButtonMerchantExtensions.swift */, DED9E4B12BD0D667004F24F3 /* ButtonMerchantDeprecations.swift */, ); @@ -563,7 +551,6 @@ 9EAA60C8207ACA3800D21601 /* Foundation */ = { isa = PBXGroup; children = ( - FBEBC8DE2543576A00AAE9E5 /* TestApplication.swift */, 9E4C496920616B130053E4CA /* TestUserDefaults.swift */, 9E6F4342206C171F004242A1 /* TestURLSession.swift */, 9E5475E3206D91A900947A1C /* TestURLSessionDataTask.swift */, @@ -595,7 +582,6 @@ DA191A2322D4F75B00ED88B9 /* TestReportOrderRequest.swift */, DA191A2522D5261100ED88B9 /* TestRetryPolicy.swift */, 9EAA60C8207ACA3800D21601 /* Foundation */, - FBEBC92025435D5900AAE9E5 /* TestAppIntegrationVerification.swift */, ); path = TestObjects; sourceTree = ""; @@ -676,7 +662,6 @@ isa = PBXGroup; children = ( DE8F54BD2BCDC8F800DB880B /* Resources */, - FBEBC8BA25434A5700AAE9E5 /* AppIntegrationVerification.swift */, DE175A1920A09BB1005C97B9 /* Version */, DE865F792052F90600F4054D /* ButtonMerchant.swift */, FBEBC99525437E1700AAE9E5 /* ButtonMerchantError.swift */, @@ -1178,7 +1163,6 @@ buildActionMask = 2147483647; files = ( DE175A1C20A09DEA005C97B9 /* Version.generated.swift in Sources */, - FBEBC8BB25434A5700AAE9E5 /* AppIntegrationVerification.swift in Sources */, 9EB1B0A0207AB43E00BE0A1A /* System.swift in Sources */, DAE8B96F22AF5F0700D11AF9 /* TrustEvaluator.swift in Sources */, DE2F7450208F6552001E4BD6 /* ConfigurationError.swift in Sources */, @@ -1203,7 +1187,6 @@ 9E2B4315206C12BC009F2886 /* URLSessionExtensions.swift in Sources */, 9E9CDEA72076BD7900A1424C /* Order.swift in Sources */, DA4AF05720869966002C3E0E /* NotificationCenterExtensions.swift in Sources */, - FBEBC8CD2543557D00AAE9E5 /* UIApplicationExtensions.swift in Sources */, DA2F912222A83FEE000054D6 /* SessionDelegate.swift in Sources */, DA756B8322B33762003397E3 /* URLAuthenticationChallengeExtensions.swift in Sources */, 9EFF2B5A2065965000250269 /* UserDefaultsExtensions.swift in Sources */, @@ -1239,7 +1222,6 @@ 9EDED110208FA3930049A56A /* UserAgentTests.swift in Sources */, DA0FA2A3205C1EF2008296A6 /* TestCore.swift in Sources */, DA29D894209CF34D00537806 /* UIDeviceTests.swift in Sources */, - FBEBC92125435D5900AAE9E5 /* TestAppIntegrationVerification.swift in Sources */, DA29D892209CDC3100537806 /* URLSessionTests.swift in Sources */, DA756B7922B2DB67003397E3 /* SessionDelegateTests.swift in Sources */, FB70030B24CF46260050E021 /* AppEventsRequestBodyTests.swift in Sources */, @@ -1251,10 +1233,8 @@ DCF4AD0722B7E31C000DA3B2 /* ReportOrderBodyTests.swift in Sources */, DEE61B2D20656A090039E47A /* XCTestExtensions.swift in Sources */, 9E77202520607331005F740B /* ButtonMerchantTests.swift in Sources */, - FBEBC8DF2543576A00AAE9E5 /* TestApplication.swift in Sources */, DA756B8722B3ECE9003397E3 /* TrustEvaluatorTests.swift in Sources */, 9E76FEB32090EEC700BDC844 /* TestUserAgent.swift in Sources */, - FBEBC92825436AFA00AAE9E5 /* AppIntegrationVerificationTests.swift in Sources */, 9EAA60C5207AC9AC00D21601 /* TestFileManager.swift in Sources */, 9E5475E2206D7E0C00947A1C /* ClientTests.swift in Sources */, DA756B6F22B2B717003397E3 /* PEMCertificateTests.swift in Sources */, @@ -1395,7 +1375,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -1446,7 +1426,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; @@ -1515,7 +1495,6 @@ DEVELOPMENT_TEAM = 39F27QYP2C; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Tests/IntegrationTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.2; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1545,7 +1524,6 @@ DEVELOPMENT_TEAM = 39F27QYP2C; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Tests/IntegrationTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.2; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1640,6 +1618,7 @@ GCC_TREAT_WARNINGS_AS_ERRORS = YES; INFOPLIST_FILE = Source/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1678,6 +1657,7 @@ GCC_TREAT_WARNINGS_AS_ERRORS = YES; INFOPLIST_FILE = Source/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1709,7 +1689,6 @@ DEVELOPMENT_TEAM = 39F27QYP2C; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Tests/UnitTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.2; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1737,7 +1716,6 @@ DEVELOPMENT_TEAM = 39F27QYP2C; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Tests/UnitTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.2; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/Gemfile.lock b/Gemfile.lock index fecc72b..d7e4074 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -15,28 +15,28 @@ GEM minitest (>= 5.1) mutex_m tzinfo (~> 2.0) - addressable (2.8.6) - public_suffix (>= 2.0.2, < 6.0) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) artifactory (3.0.17) atomos (0.1.3) aws-eventstream (1.3.0) - aws-partitions (1.915.0) - aws-sdk-core (3.192.0) + aws-partitions (1.970.0) + aws-sdk-core (3.202.2) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) - aws-sigv4 (~> 1.8) + aws-sigv4 (~> 1.9) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.79.0) - aws-sdk-core (~> 3, >= 3.191.0) - aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.147.0) - aws-sdk-core (~> 3, >= 3.192.0) + aws-sdk-kms (1.88.0) + aws-sdk-core (~> 3, >= 3.201.0) + aws-sigv4 (~> 1.5) + aws-sdk-s3 (1.159.0) + aws-sdk-core (~> 3, >= 3.201.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.8) - aws-sigv4 (1.8.0) + aws-sigv4 (~> 1.5) + aws-sigv4 (1.9.1) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) base64 (0.2.0) @@ -96,7 +96,7 @@ GEM escape (0.0.4) ethon (0.16.0) ffi (>= 1.15.0) - excon (0.110.0) + excon (0.111.0) faraday (1.10.3) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) @@ -118,7 +118,7 @@ GEM faraday-httpclient (1.0.1) faraday-multipart (1.0.4) multipart-post (~> 2) - faraday-net_http (1.0.1) + faraday-net_http (1.0.2) faraday-net_http_persistent (1.2.0) faraday-patron (1.0.0) faraday-rack (1.0.0) @@ -126,7 +126,7 @@ GEM faraday_middleware (1.2.0) faraday (~> 1.0) fastimage (2.3.1) - fastlane (2.220.0) + fastlane (2.222.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -187,7 +187,7 @@ GEM google-apis-core (>= 0.11.0, < 2.a) google-apis-storage_v1 (0.31.0) google-apis-core (>= 0.11.0, < 2.a) - google-cloud-core (1.7.0) + google-cloud-core (1.7.1) google-cloud-env (>= 1.0, < 3.a) google-cloud-errors (~> 1.0) google-cloud-env (1.6.0) @@ -208,7 +208,7 @@ GEM os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) highline (2.0.3) - http-cookie (1.0.5) + http-cookie (1.0.7) domain_name (~> 0.5) httpclient (2.8.3) i18n (1.14.4) @@ -225,16 +225,16 @@ GEM xcinvoke (~> 0.3.0) jmespath (1.6.2) json (2.7.2) - jwt (2.8.1) + jwt (2.8.2) base64 liferaft (0.0.6) - mini_magick (4.12.0) + mini_magick (4.13.2) mini_mime (1.1.5) mini_portile2 (2.8.6) minitest (5.22.3) molinillo (0.8.0) multi_json (1.15.0) - multipart-post (2.4.0) + multipart-post (2.4.1) mustache (1.1.1) mutex_m (0.2.0) nanaimo (0.3.0) @@ -258,7 +258,8 @@ GEM trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.2.6) + rexml (3.3.6) + strscan rouge (2.0.7) ruby-macho (2.5.1) ruby2_keywords (0.0.5) @@ -282,6 +283,7 @@ GEM xcodeproj (~> 1.21) sqlite3 (1.5.4) mini_portile2 (~> 2.8.0) + strscan (3.1.0) terminal-notifier (2.0.0) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) @@ -299,13 +301,13 @@ GEM word_wrap (1.0.0) xcinvoke (0.3.0) liferaft (~> 0.0.6) - xcodeproj (1.24.0) + xcodeproj (1.25.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) colored2 (~> 3.1) nanaimo (~> 0.3.0) - rexml (~> 3.2.4) + rexml (>= 3.3.2, < 4.0) xcpretty (0.3.0) rouge (~> 2.0.7) xcpretty-travis-formatter (1.0.1) diff --git a/Podfile b/Podfile index 08d3c06..b8b8388 100644 --- a/Podfile +++ b/Podfile @@ -1,6 +1,6 @@ source 'https://cdn.cocoapods.org/' -platform :ios, '9.0' +platform :ios, '12.0' use_frameworks! pod 'SwiftLint' diff --git a/Podfile.lock b/Podfile.lock index 077f39a..4d8cd98 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -11,6 +11,6 @@ SPEC REPOS: SPEC CHECKSUMS: SwiftLint: e14651157288e9e01d6e1a71db7014fb5744a8ea -PODFILE CHECKSUM: 652cb6e78be2f97c0e2a5f3885b6be555b5af666 +PODFILE CHECKSUM: 0388c5ebbe2f99807857721ac448e90396727f9e COCOAPODS: 1.15.2 diff --git a/Source/AppIntegrationVerification.swift b/Source/AppIntegrationVerification.swift deleted file mode 100644 index 101e47e..0000000 --- a/Source/AppIntegrationVerification.swift +++ /dev/null @@ -1,147 +0,0 @@ -// -// AppIntegrationVerification.swift -// -// Copyright © 2020 Button, Inc. All rights reserved. (https://usebutton.com) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// - -import UIKit - -internal protocol AppIntegrationVerificationType: AnyObject { - var application: UIApplicationType { get } - var buttonDefaults: ButtonDefaultsType { get } - func handleIncomingURL(_ url: URL) - init(application: UIApplicationType, defaults: ButtonDefaultsType) -} - -internal class AppIntegrationVerification: AppIntegrationVerificationType { - - enum Command: String { - - case quit - case echo = "btn_test_echo" - case getToken = "get-token" - case testPostInstall = "test-post-install" - case version - - enum Response { - - private static let baseURLString = "button-brand-test://action-response/" - - // swiftlint:disable identifier_name - case quit - case echo(token: String) - case getToken(token: String) - case testpostInstall(success: Bool) - case version(version: String) - // swiftlint:enable identifier_name - - var url: URL { - switch self { - case .quit: - return URL(string: Self.baseURLString.appending("quit"))! - case .echo(let token): - return URL(string: Self.baseURLString.appending("echo?btn_ref=\(token)"))! - case .getToken(let token): - return URL(string: Self.baseURLString.appending("get-token?btn_ref=\(token)"))! - case .testpostInstall(let success): - return URL(string: Self.baseURLString.appending("test-post-install?success=\(success)"))! - case .version(let version): - return URL(string: Self.baseURLString.appending("version?version=\(version)"))! - } - } - } - - init?(url: URL) { - guard let rawValue = Self.commandFrom(url: url) else { - return nil - } - self.init(rawValue: rawValue) - } - } - - var application: UIApplicationType - var buttonDefaults: ButtonDefaultsType - var token: String { - buttonDefaults.attributionToken ?? "null" - } - - required init(application: UIApplicationType, defaults: ButtonDefaultsType) { - self.application = application - self.buttonDefaults = defaults - } - - func handleIncomingURL(_ url: URL) { - guard let command = Command(url: url) else { - return - } - - switch command { - case .echo: - reportResult(url: Command.Response.echo(token: token).url) - case .getToken: - reportResult(url: Command.Response.getToken(token: token).url) - case .testPostInstall: - reportResult(url: Command.Response.testpostInstall(success: buttonDefaults.hasFetchedPostInstallURL).url) - case .version: - reportResult(url: Command.Response.version(version: Version.stringValue).url) - case .quit: - reportResult(url: Command.Response.quit.url) { success in - if success { - self.application.quit() - } - } - } - } - - func reportResult(url: URL, completion: ((Bool) -> Void)? = nil) { - if #available(iOS 10.0, *) { - application.open(url, options: [:], completionHandler: completion) - } - } -} - -extension AppIntegrationVerification.Command { - - static func commandFrom(url: URL) -> String? { - if isEchoCommand(url: url) { - return Self.echo.rawValue - } - - // Must be: *://*/_bttn/action/* - let components = url.pathComponents - if components.count == 4, - components[1] == "_bttn", - components[2] == "action" { - return components.last - } - - return nil - } - - static func isEchoCommand(url: URL) -> Bool { - guard let urlComponents = URLComponents(string: url.absoluteString), - let echoItem = urlComponents.queryItems?.first(where: { $0.name == Self.echo.rawValue }), - ((echoItem.value as NSString?)?.boolValue ?? false) else { - return false - } - return true - } -} diff --git a/Source/ButtonMerchant.swift b/Source/ButtonMerchant.swift index d09234a..c3d528a 100644 --- a/Source/ButtonMerchant.swift +++ b/Source/ButtonMerchant.swift @@ -190,12 +190,10 @@ final public class ButtonMerchant: NSObject { userAgent: UserAgent(libraryVersion: Version.stringValue, system: system), defaults: buttonDefaults, system: system) - let verifier = AppIntegrationVerification(application: UIApplication.shared, defaults: buttonDefaults) return Core(buttonDefaults: buttonDefaults, client: client, system: system, - notificationCenter: NotificationCenter.default, - verifier: verifier) + notificationCenter: NotificationCenter.default) } } diff --git a/Source/Core.swift b/Source/Core.swift index d83d149..d1fdf44 100644 --- a/Source/Core.swift +++ b/Source/Core.swift @@ -32,7 +32,6 @@ internal protocol CoreType { var notificationCenter: NotificationCenterType { get } var shouldFetchPostInstallURL: Bool { get } var attributionToken: String? { get set } - var appIntegrationVerifier: AppIntegrationVerificationType { get } func clearAllData() func trackIncomingURL(_ url: URL) func handlePostInstallURL(_ completion: @escaping (URL?, Error?) -> Void) @@ -41,8 +40,7 @@ internal protocol CoreType { init(buttonDefaults: ButtonDefaultsType, client: ClientType, system: SystemType, - notificationCenter: NotificationCenterType, - verifier: AppIntegrationVerificationType) + notificationCenter: NotificationCenterType) } /** @@ -73,19 +71,15 @@ final internal class Core: CoreType { } } - var appIntegrationVerifier: AppIntegrationVerificationType - required init(buttonDefaults: ButtonDefaultsType, client: ClientType, system: SystemType, - notificationCenter: NotificationCenterType, - verifier: AppIntegrationVerificationType) { + notificationCenter: NotificationCenterType) { self.applicationId = nil self.buttonDefaults = buttonDefaults self.client = client self.system = system self.notificationCenter = notificationCenter - self.appIntegrationVerifier = verifier } /** @@ -131,8 +125,6 @@ final internal class Core: CoreType { urlComponents.queryItems = allowedQueryItems } - appIntegrationVerifier.handleIncomingURL(url) - guard let filteredURL = urlComponents.url else { return } diff --git a/Source/Extensions/UIApplicationExtensions.swift b/Source/Extensions/UIApplicationExtensions.swift deleted file mode 100644 index 7ed0d1b..0000000 --- a/Source/Extensions/UIApplicationExtensions.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// UIApplicationExtensions.swift -// -// Copyright © 2020 Button, Inc. All rights reserved. (https://usebutton.com) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// - -import UIKit - -internal protocol UIApplicationType { - @available(iOS 10.0, *) - func open(_ url: URL, options: [UIApplication.OpenExternalURLOptionsKey: Any], completionHandler completion: ((Bool) -> Void)?) - func quit() -} - -extension UIApplication: UIApplicationType { - func quit() { - exit(0) - } -} diff --git a/Source/Info.plist b/Source/Info.plist index 73b6636..b39269b 100644 --- a/Source/Info.plist +++ b/Source/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.7.0 + 1.7.1 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSPrincipalClass diff --git a/Source/Version/Version.generated.swift b/Source/Version/Version.generated.swift index af0e954..f9a0743 100644 --- a/Source/Version/Version.generated.swift +++ b/Source/Version/Version.generated.swift @@ -35,5 +35,5 @@ public struct Version { /** Library version string. */ - static let stringValue = "1.7.0" + static let stringValue = "1.7.1" } diff --git a/Tests/UnitTests/AppIntegrationVerificationTests.swift b/Tests/UnitTests/AppIntegrationVerificationTests.swift deleted file mode 100644 index edd3979..0000000 --- a/Tests/UnitTests/AppIntegrationVerificationTests.swift +++ /dev/null @@ -1,234 +0,0 @@ -// -// AppIntegrationVerificationTests.swift -// -// Copyright © 2020 Button, Inc. All rights reserved. (https://usebutton.com) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// - -import XCTest -@testable import ButtonMerchant - -class AppIntegrationVerificationTests: XCTestCase { - - var testApplication: TestApplication! - var testDefaults: TestButtonDefaults! - var verifier: AppIntegrationVerification! - - override func setUp() { - super.setUp() - testApplication = TestApplication() - testDefaults = TestButtonDefaults(userDefaults: TestUserDefaults()) - verifier = AppIntegrationVerification(application: testApplication, defaults: testDefaults) - } - - // MARK: - Commands via app scheme links - - func testAppSchemeCommand_ignoresUnnamespacedAppSchemeURLs() { - let url = URL(string: "brandapp://example.com/action/version")! - - verifier.handleIncomingURL(url) - - XCTAssertNil(testApplication.actualURL) - } - - func testAppSchemeCommand_unknown_doesNothing() { - let url = URL(string: "brandapp://test.bttn.io/_bttn/action/unknown")! - - verifier.handleIncomingURL(url) - - XCTAssertNil(testApplication.actualURL) - } - - func testAppSchemeCommand_quit_quitsApp() { - let url = URL(string: "brandapp://test.bttn.io/_bttn/action/quit")! - - verifier.handleIncomingURL(url) - - XCTAssertTrue(testApplication.didQuit) - XCTAssertEqual(testApplication.actualURL?.absoluteString, "button-brand-test://action-response/quit") - } - - func testAppSchemeCommand_quit_doesNotQuitWithoutTestApp() { - let url = URL(string: "brandapp://test.bttn.io/_bttn/action/quit")! - testApplication.stubbedOpenResult = false - - verifier.handleIncomingURL(url) - - XCTAssertFalse(testApplication.didQuit) - } - - func testAppSchemeCommand_echo_respondsWithToken() { - testDefaults.attributionToken = "srctok-xxxxx" - let url = URL(string: "https://www.example.com/some/product?btn_ref=srctok-xxxxx&btn_test_echo=true")! - - verifier.handleIncomingURL(url) - - XCTAssertEqual(testApplication.actualURL?.absoluteString, "button-brand-test://action-response/echo?btn_ref=srctok-xxxxx") - } - - func testAppSchemeCommand_echo_respondsWithNullToken() { - let url = URL(string: "https://www.example.com/some/product?btn_test_echo=true")! - - verifier.handleIncomingURL(url) - - XCTAssertEqual(testApplication.actualURL?.absoluteString, "button-brand-test://action-response/echo?btn_ref=null") - } - - func testAppSchemeCommand_getToken_respondsWithToken() { - testDefaults.attributionToken = "srctok-xxxxx" - let url = URL(string: "brandapp://test.bttn.io/_bttn/action/get-token")! - - verifier.handleIncomingURL(url) - - XCTAssertEqual(testApplication.actualURL?.absoluteString, "button-brand-test://action-response/get-token?btn_ref=srctok-xxxxx") - } - - func testAppSchemeCommand_getToken_respondsWithNullToken() { - let url = URL(string: "brandapp://test.bttn.io/_bttn/action/get-token")! - - verifier.handleIncomingURL(url) - - XCTAssertEqual(testApplication.actualURL?.absoluteString, "button-brand-test://action-response/get-token?btn_ref=null") - } - - func testAppSchemeCommand_testPostInstall_respondsTrue() { - testDefaults.hasFetchedPostInstallURL = true - let url = URL(string: "brandapp://test.bttn.io/_bttn/action/test-post-install")! - - verifier.handleIncomingURL(url) - - XCTAssertEqual(testApplication.actualURL?.absoluteString, "button-brand-test://action-response/test-post-install?success=true") - } - - func testAppSchemeCommand_testPostInstall_respondsFalse() { - testDefaults.hasFetchedPostInstallURL = false - let url = URL(string: "brandapp://test.bttn.io/_bttn/action/test-post-install")! - - verifier.handleIncomingURL(url) - - XCTAssertEqual(testApplication.actualURL?.absoluteString, "button-brand-test://action-response/test-post-install?success=false") - } - - func testAppSchemeCommand_version_respondsVersion() { - testDefaults.hasFetchedPostInstallURL = false - let url = URL(string: "brandapp://test.bttn.io/_bttn/action/version")! - - verifier.handleIncomingURL(url) - - XCTAssertEqual(testApplication.actualURL?.absoluteString, "button-brand-test://action-response/version?version=\(Version.stringValue)") - } - - // MARK: - Commands via universal links - - func testUniversalLinkCommand_ignoresUnnamespacedUniversaLinks() { - let url = URL(string: "https://example.com/action/version")! - - verifier.handleIncomingURL(url) - - XCTAssertNil(testApplication.actualURL) - } - - func testUniversalLinkCommand_unknown_doesNothing() { - let url = URL(string: "https://example.com/_bttn/action/unknown")! - - verifier.handleIncomingURL(url) - - XCTAssertNil(testApplication.actualURL) - } - - func testUniversalLinkCommand_quit_quitsApp() { - let url = URL(string: "https://example.com/_bttn/action/quit")! - - verifier.handleIncomingURL(url) - - XCTAssertTrue(testApplication.didQuit) - XCTAssertEqual(testApplication.actualURL?.absoluteString, "button-brand-test://action-response/quit") - } - - func testUniversalLinkCommand_quit_doesNotQuitWithoutTestApp() { - let url = URL(string: "https://example.com/_bttn/action/quit")! - testApplication.stubbedOpenResult = false - - verifier.handleIncomingURL(url) - - XCTAssertFalse(testApplication.didQuit) - } - - func testUniversalLinkCommand_echo_respondsWithToken() { - testDefaults.attributionToken = "srctok-xxxxx" - let url = URL(string: "https://www.example.com/some/product?btn_ref=srctok-xxxxx&btn_test_echo=true")! - - verifier.handleIncomingURL(url) - - XCTAssertEqual(testApplication.actualURL?.absoluteString, "button-brand-test://action-response/echo?btn_ref=srctok-xxxxx") - } - - func testUniversalLinkCommand_echo_respondsWithNullToken() { - let url = URL(string: "https://www.example.com/some/product?btn_test_echo=true")! - - verifier.handleIncomingURL(url) - - XCTAssertEqual(testApplication.actualURL?.absoluteString, "button-brand-test://action-response/echo?btn_ref=null") - } - - func testUniversalLinkCommand_getToken_respondsWithToken() { - testDefaults.attributionToken = "srctok-xxxxx" - let url = URL(string: "https://example.com/_bttn/action/get-token")! - - verifier.handleIncomingURL(url) - - XCTAssertEqual(testApplication.actualURL?.absoluteString, "button-brand-test://action-response/get-token?btn_ref=srctok-xxxxx") - } - - func testUniversalLinkCommand_getToken_respondsWithNullToken() { - let url = URL(string: "https://example.com/_bttn/action/get-token")! - - verifier.handleIncomingURL(url) - - XCTAssertEqual(testApplication.actualURL?.absoluteString, "button-brand-test://action-response/get-token?btn_ref=null") - } - - func testUniversalLinkCommand_testPostInstall_respondsTrue() { - testDefaults.hasFetchedPostInstallURL = true - let url = URL(string: "https://example.com/_bttn/action/test-post-install")! - - verifier.handleIncomingURL(url) - - XCTAssertEqual(testApplication.actualURL?.absoluteString, "button-brand-test://action-response/test-post-install?success=true") - } - - func testUniversalLinkCommand_testPostInstall_respondsFalse() { - testDefaults.hasFetchedPostInstallURL = false - let url = URL(string: "https://example.com/_bttn/action/test-post-install")! - - verifier.handleIncomingURL(url) - - XCTAssertEqual(testApplication.actualURL?.absoluteString, "button-brand-test://action-response/test-post-install?success=false") - } - - func testUniversalLinkCommand_version_respondsVersion() { - testDefaults.hasFetchedPostInstallURL = false - let url = URL(string: "https://example.com/_bttn/action/version")! - - verifier.handleIncomingURL(url) - - XCTAssertEqual(testApplication.actualURL?.absoluteString, "button-brand-test://action-response/version?version=\(Version.stringValue)") - } -} diff --git a/Tests/UnitTests/ButtonMerchantTests.swift b/Tests/UnitTests/ButtonMerchantTests.swift index d70639d..7695af6 100644 --- a/Tests/UnitTests/ButtonMerchantTests.swift +++ b/Tests/UnitTests/ButtonMerchantTests.swift @@ -37,9 +37,7 @@ class ButtonMerchantTests: XCTestCase { defaults: defaults, system: TestSystem()), system: TestSystem(), - notificationCenter: TestNotificationCenter(), - verifier: TestAppIntegrationVerification(application: TestApplication(), - defaults: defaults)) + notificationCenter: TestNotificationCenter()) } override func tearDown() { diff --git a/Tests/UnitTests/CoreTests.swift b/Tests/UnitTests/CoreTests.swift index 516fb37..cc1e324 100644 --- a/Tests/UnitTests/CoreTests.swift +++ b/Tests/UnitTests/CoreTests.swift @@ -31,15 +31,12 @@ class CoreTests: XCTestCase { var testDefaults: TestButtonDefaults! var testNotificationCenter: TestNotificationCenter! var testClient: TestClient! - var testVerifier: TestAppIntegrationVerification! var core: Core! override func setUp() { testSystem = TestSystem() testDefaults = TestButtonDefaults(userDefaults: TestUserDefaults()) testNotificationCenter = TestNotificationCenter() - testVerifier = TestAppIntegrationVerification(application: TestApplication(), - defaults: testDefaults) testClient = TestClient(session: TestURLSession(), userAgent: TestUserAgent(system: testSystem), defaults: testDefaults, @@ -47,8 +44,7 @@ class CoreTests: XCTestCase { core = Core(buttonDefaults: testDefaults, client: testClient, system: testSystem, - notificationCenter: testNotificationCenter, - verifier: testVerifier) + notificationCenter: testNotificationCenter) } func testInitialization() { @@ -56,7 +52,6 @@ class CoreTests: XCTestCase { XCTAssertEqualReferences(core.client, testClient) XCTAssertEqualReferences(core.system, testSystem) XCTAssertEqualReferences(core.notificationCenter, testNotificationCenter) - XCTAssertEqualReferences(core.appIntegrationVerifier, testVerifier) } func testSetApplicationId_setClientApplicationId() { @@ -273,28 +268,6 @@ class CoreTests: XCTestCase { [Notification.Key.NewToken: expectedSourceToken]) } - func testTrackIncomingURL_forwardsAttributedURL_toIntegrationVerifier() { - // Arrange - let url = URL(string: "https://usebutton.com/test?btn_ref=srctok-123")! - - // Act - core.trackIncomingURL(url) - - // Assert - XCTAssertEqual(testVerifier.actualURL, url) - } - - func testTrackIncomingURL_forwardsAnyURL_toIntegrationVerifier() { - // Arrange - let url = URL(string: "https://example.com")! - - // Act - core.trackIncomingURL(url) - - // Assert - XCTAssertEqual(testVerifier.actualURL, url) - } - func testAttributionTokenReturnsStoredToken() { // Arrange let expectedToken = "srctok-123" diff --git a/Tests/UnitTests/TestObjects/Foundation/TestApplication.swift b/Tests/UnitTests/TestObjects/Foundation/TestApplication.swift deleted file mode 100644 index 0bcdbfd..0000000 --- a/Tests/UnitTests/TestObjects/Foundation/TestApplication.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// TestApplication.swift -// -// Copyright © 2020 Button, Inc. All rights reserved. (https://usebutton.com) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// - -import UIKit -@testable import ButtonMerchant - -class TestApplication: UIApplicationType { - - var didQuit: Bool = false - var actualURL: URL? - var stubbedOpenResult: Bool = true - - func open(_ url: URL, options: [UIApplication.OpenExternalURLOptionsKey: Any], completionHandler completion: ((Bool) -> Void)?) { - self.actualURL = url - completion?(stubbedOpenResult) - } - - func quit() { - didQuit = true - } -} diff --git a/Tests/UnitTests/TestObjects/TestAppIntegrationVerification.swift b/Tests/UnitTests/TestObjects/TestAppIntegrationVerification.swift deleted file mode 100644 index 8218bd9..0000000 --- a/Tests/UnitTests/TestObjects/TestAppIntegrationVerification.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// TestAppIntegrationVerification.swift -// -// Copyright © 2020 Button, Inc. All rights reserved. (https://usebutton.com) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// - -import UIKit -@testable import ButtonMerchant - -class TestAppIntegrationVerification: AppIntegrationVerificationType { - var application: UIApplicationType - var buttonDefaults: ButtonDefaultsType - - var actualURL: URL? - - func handleIncomingURL(_ url: URL) { - self.actualURL = url - } - - required init(application: UIApplicationType, defaults: ButtonDefaultsType) { - self.application = application - self.buttonDefaults = defaults - } -} diff --git a/Tests/UnitTests/TestObjects/TestCore.swift b/Tests/UnitTests/TestObjects/TestCore.swift index c2664c9..e381454 100644 --- a/Tests/UnitTests/TestObjects/TestCore.swift +++ b/Tests/UnitTests/TestObjects/TestCore.swift @@ -43,7 +43,6 @@ class TestCore: CoreType { var client: ClientType var system: SystemType var notificationCenter: NotificationCenterType - var appIntegrationVerifier: AppIntegrationVerificationType var attributionToken: String? { get { @@ -61,13 +60,11 @@ class TestCore: CoreType { required init(buttonDefaults: ButtonDefaultsType, client: ClientType, system: SystemType, - notificationCenter: NotificationCenterType, - verifier: AppIntegrationVerificationType) { + notificationCenter: NotificationCenterType) { self.buttonDefaults = buttonDefaults self.client = client self.system = system self.notificationCenter = notificationCenter - self.appIntegrationVerifier = verifier } func handlePostInstallURL(_ completion: @escaping (URL?, Error?) -> Void) { diff --git a/Tests/UnitTests/Version/VersionTests.generated.swift b/Tests/UnitTests/Version/VersionTests.generated.swift index c983311..ec39d3d 100644 --- a/Tests/UnitTests/Version/VersionTests.generated.swift +++ b/Tests/UnitTests/Version/VersionTests.generated.swift @@ -30,11 +30,11 @@ import XCTest class VersionTests: XCTestCase { func testLibraryVersion() { - XCTAssertEqual(Version.stringValue, "1.7.0") + XCTAssertEqual(Version.stringValue, "1.7.1") } func testPlistVersion() { let libraryBundle = Bundle(for: ButtonMerchant.self) - XCTAssertEqual(libraryBundle.infoDictionary!["CFBundleShortVersionString"] as? String, "1.7.0") + XCTAssertEqual(libraryBundle.infoDictionary!["CFBundleShortVersionString"] as? String, "1.7.1") } } diff --git a/docs/history/1.7.1/Classes.html b/docs/history/1.7.1/Classes.html new file mode 100644 index 0000000..8af6cff --- /dev/null +++ b/docs/history/1.7.1/Classes.html @@ -0,0 +1,225 @@ + + + + Classes Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

Classes

+

The following classes are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + ButtonMerchant + +
    +
    +
    +
    +
    +
    +
    +

    Note

    + ButtonMerchant is the main entry point to the library. + +
    + +

    To get started with your integration, get your application Id from from the Button Dashboard and follow our simple + integration guide.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +final public class ButtonMerchant : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ButtonProduct + +
    +
    +
    +
    +
    +
    +

    A concrete implementation of the ButtonProductCompatible protocol.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    final public class ButtonProduct : NSObject, ButtonProductCompatible, Codable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Order + +
    +
    +
    +
    +
    +
    +

    Represents an order placed by the user to be reported using ButtonMerchant.reportOrder(order).

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +@objc(BTNOrder)
    +final public class Order : NSObject, Codable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/Classes/ButtonMerchant.html b/docs/history/1.7.1/Classes/ButtonMerchant.html new file mode 100644 index 0000000..342a117 --- /dev/null +++ b/docs/history/1.7.1/Classes/ButtonMerchant.html @@ -0,0 +1,554 @@ + + + + ButtonMerchant Class Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

ButtonMerchant

+
+
+ +
@objcMembers
+final public class ButtonMerchant : NSObject
+ +
+
+
+

Note

+ ButtonMerchant is the main entry point to the library. + +
+ +

To get started with your integration, get your application Id from from the Button Dashboard and follow our simple + integration guide.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + attributionToken + +
    +
    +
    +
    +
    +
    +

    The last attributionToken from an inbound Button attributed URL.

    +
    +

    Attention

    +

    For attribution to work correctly, you must:

    + +
      +
    • Always access this token directly—never cache it.

    • +
    • Never manage the lifecycle of this token—Button manages the token validity window server-side.

    • +
    • Always include this value when reporting orders to your order API

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static var attributionToken: String? { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Configures ButtonMerchant with your application Id.

    +
    +

    Note

    +

    Get your application Id from from the Button Dashboard

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func configure(applicationId: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + applicationId + + +
    +

    Your application Id (required)

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + trackIncomingURL(_:) + +
    +
    +
    +
    +
    +
    +

    Checks the passed URL for a Button attribution and if present stores the token.

    +
    +

    Attention

    +

    To correctly attribute customers, you must call this method with every +incoming url and userActivity from the following UIApplicationDelegate methods:

    + +
      +
    • application(_:open:options:)

    • +
    • application(_:userActivity:restorationHandler:)

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func trackIncomingURL(_ url: URL)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + url + + +
    +

    A URL that has entered your app from a third party source.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Checks the URL in the passed NSUserActivity for Button attribution and if present stores the token.

    +
    +

    Attention

    +

    To correctly attribute customers, you must call this method with every +incoming userActivity from the following UIApplicationDelegate method:

    + +
      +
    • application(_:userActivity:restorationHandler:)

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func trackIncomingUserActivity(_ userActivity: NSUserActivity)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + userActivity + + +
    +

    A NSUserActivity with which your app has been continued.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Checks to see if the user visited a url destined for your app prior to installing your app.

    + +

    If a url is found, your completion handler will be called with the url and you are responsible +for navigating the user to the relevant content in your app. If a url is not found or an error occurs, your +completion handler will be called without a url and you can continue with your normal launch sequence.

    +
    +

    Attention

    +

    This method checks for a post-install url exactly one time after a user has installed your app. +Subsequent calls will result in your completion handler being called without a url. You do not need to wait +for the completion handler before continuing with your normal launch sequence but you should be prepared +to handle a post-install url if one is found. All subsequent incoming urls will be routed to your +UIApplicationDelegate as usual.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func handlePostInstallURL(_ completion: @escaping (URL?, Error?) -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + completion + + +
    +

    A completion block taking an optional url and optional error.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Reports an order to Button.

    +
    +

    See also

    +

    Reporting Orders to Button

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func reportOrder(_ order: Order, completion: ((Error?) -> Void)? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + order + + +
    +

    Your order object to be reported.

    +
    +
    + + completion + + +
    +

    An optional completion block taking an optional error.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + clearAllData() + +
    +
    +
    +
    +
    +
    +

    Discards the current session and all persisted data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func clearAllData()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + features + +
    +
    +
    +
    +
    +
    +

    An interface through which library features can be enabled/disabled.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static var features: Configurable { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + activity + +
    +
    +
    +
    +
    +
    +

    An interface through which user activity can be reported.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static var activity: Activity { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/Classes/ButtonProduct.html b/docs/history/1.7.1/Classes/ButtonProduct.html new file mode 100644 index 0000000..aeef8af --- /dev/null +++ b/docs/history/1.7.1/Classes/ButtonProduct.html @@ -0,0 +1,372 @@ + + + + ButtonProduct Class Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

ButtonProduct

+
+
+ +
final public class ButtonProduct : NSObject, ButtonProductCompatible, Codable
+ +
+
+

A concrete implementation of the ButtonProductCompatible protocol.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + id + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var id: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + upc + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var upc: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + categories + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var categories: [String]?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + name + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var name: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + currency + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var currency: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var value: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + quantity + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var quantity: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + url + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var url: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + attributes + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var attributes: [String : String]?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/Classes/Order.html b/docs/history/1.7.1/Classes/Order.html new file mode 100644 index 0000000..21eb53e --- /dev/null +++ b/docs/history/1.7.1/Classes/Order.html @@ -0,0 +1,359 @@ + + + + Order Class Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

Order

+
+
+ +
@objcMembers
+@objc(BTNOrder)
+final public class Order : NSObject, Codable
+ +
+
+

Represents an order placed by the user to be reported using ButtonMerchant.reportOrder(order).

+ +
+
+ +
+
+
+
    +
  • +
    + + + + currencyCode + +
    +
    +
    +
    +
    +
    +

    The ISO 4217 currency code (default is USD).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var currencyCode: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + customerOrderId + +
    +
    +
    +
    +
    +
    +

    The customer-facing order id.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var customerOrderId: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + customer + +
    +
    +
    +
    +
    +
    +

    The customer related to the order

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var customer: Customer?
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Initializes an order object with the passed parameters.

    + +
      +
    • id: The order identifier (required).
    • +
    • purchaseDate: The date of the purchase for the order.
    • +
    • lineItems: A list of the line item details that comprise the order.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public init(id: String, purchaseDate: Date, lineItems: [LineItem])
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Customer + +
    +
    +
    +
    +
    +
    +

    Represents a customer in the order.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +@objc(BTNCustomer)
    +final public class Customer : NSObject, Codable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LineItem + +
    +
    +
    +
    +
    +
    +

    Represents a line item in the order.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +@objc(LineItem)
    +final public class LineItem : NSObject, Codable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Deprecations +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Deprecated.

    + +

    If you’re migrating to client side order reporting, please use init(id:purchaseDate:lineItems:) instead.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "Use init(id:purchaseDate:lineItems:﹚ instead")
    +@objc
    +public init(id: String, amount: Int64 = 0, currencyCode: String = "USD")
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/Classes/Order/Customer.html b/docs/history/1.7.1/Classes/Order/Customer.html new file mode 100644 index 0000000..2e4f3e5 --- /dev/null +++ b/docs/history/1.7.1/Classes/Order/Customer.html @@ -0,0 +1,231 @@ + + + + Customer Class Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

Customer

+
+
+ +
@objcMembers
+@objc(BTNCustomer)
+final public class Customer : NSObject, Codable
+ +
+
+

Represents a customer in the order.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + email + +
    +
    +
    +
    +
    +
    +
    +

    Important

    + Deprecated. This property is a no-op. Data is not collected. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "Setting this property is a no-op. Data is not collected.")
    +public var email: String? { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isNew + +
    +
    +
    +
    +
    +
    +

    A flag indicating whether the customer is new (or not).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isNew: Bool?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(id:) + +
    +
    +
    +
    +
    +
    +

    Initializes a customer object with the passed parameters.

    + +
      +
    • id: The id for your customer (required).
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public init(id: String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/Classes/Order/LineItem.html b/docs/history/1.7.1/Classes/Order/LineItem.html new file mode 100644 index 0000000..87f5b2e --- /dev/null +++ b/docs/history/1.7.1/Classes/Order/LineItem.html @@ -0,0 +1,364 @@ + + + + LineItem Class Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

LineItem

+
+
+ +
@objcMembers
+@objc(LineItem)
+final public class LineItem : NSObject, Codable
+ +
+
+

Represents a line item in the order.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + quantity + +
    +
    +
    +
    +
    +
    +

    The number of unique units represented by this line item (default is 1).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var quantity: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + itemDescription + +
    +
    +
    +
    +
    +
    +

    Text describing the line item.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var itemDescription: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + sku + +
    +
    +
    +
    +
    +
    +

    The Stock Keeping Unit of the line item.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var sku: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + upc + +
    +
    +
    +
    +
    +
    +

    The Universal Product Code of the line item.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var upc: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + category + +
    +
    +
    +
    +
    +
    +

    The category of the line item. +An ordered list of strings, starting with the topmost (or most general) category.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var category: [String]?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + attributes + +
    +
    +
    +
    +
    +
    +

    A key/value store for strings to specify additional information about a line item.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var attributes: [String : String]?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(id:total:) + +
    +
    +
    +
    +
    +
    +

    An array of the line item details that comprise the order

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public init(id: String, total: Int64)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + id + + +
    +

    The unique identifier for this line item, within the scope of this order. + This must be unique across all line-items within the order. + We suggest using the SKU or UPC of the product. (required)

    +
    +
    + + total + + +
    +

    The total price of all items bought in a particular line item. (required)

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/Enums.html b/docs/history/1.7.1/Enums.html new file mode 100644 index 0000000..504caa4 --- /dev/null +++ b/docs/history/1.7.1/Enums.html @@ -0,0 +1,218 @@ + + + + Enumerations Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

Enumerations

+

The following enumerations are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + ButtonMerchantError + +
    +
    +
    +
    +
    +
    +

    Button Merchant Library Errors.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ButtonMerchantError : Error
    +
    extension ButtonMerchantError: Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ConfigurationError + +
    +
    +
    +
    +
    +
    +

    Button Merchant Library Configuration Error.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ConfigurationError : Error
    +
    extension ConfigurationError: Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NetworkError + +
    +
    +
    +
    +
    +
    +

    Button Merchant Library Configuration Error.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum NetworkError : Error
    +
    extension NetworkError: Equatable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/Enums/ButtonMerchantError.html b/docs/history/1.7.1/Enums/ButtonMerchantError.html new file mode 100644 index 0000000..cc3e78c --- /dev/null +++ b/docs/history/1.7.1/Enums/ButtonMerchantError.html @@ -0,0 +1,191 @@ + + + + ButtonMerchantError Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

ButtonMerchantError

+
+
+ +
public enum ButtonMerchantError : Error
+
extension ButtonMerchantError: Equatable
+ +
+
+

Button Merchant Library Errors.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case trackOrderDeprecationError
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + noEventsError + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case noEventsError
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/Enums/ConfigurationError.html b/docs/history/1.7.1/Enums/ConfigurationError.html new file mode 100644 index 0000000..35c18c8 --- /dev/null +++ b/docs/history/1.7.1/Enums/ConfigurationError.html @@ -0,0 +1,197 @@ + + + + ConfigurationError Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

ConfigurationError

+
+
+ +
public enum ConfigurationError : Error
+
extension ConfigurationError: Equatable
+ +
+
+

Button Merchant Library Configuration Error.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + noApplicationId + +
    +
    +
    +
    +
    +
    +

    Library is not configured with an applicationId

    +
    +

    Note

    + Get your application Id from from the Button Dashboard + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case noApplicationId
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case invalidApplicationId(appicationId: String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/Enums/NetworkError.html b/docs/history/1.7.1/Enums/NetworkError.html new file mode 100644 index 0000000..88dc8f1 --- /dev/null +++ b/docs/history/1.7.1/Enums/NetworkError.html @@ -0,0 +1,166 @@ + + + + NetworkError Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

NetworkError

+
+
+ +
public enum NetworkError : Error
+
extension NetworkError: Equatable
+ +
+
+

Button Merchant Library Configuration Error.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + unknown + +
    +
    +
    +
    +
    +
    +

    There was an unknown network error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case unknown
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/Protocols.html b/docs/history/1.7.1/Protocols.html new file mode 100644 index 0000000..ff4ab15 --- /dev/null +++ b/docs/history/1.7.1/Protocols.html @@ -0,0 +1,217 @@ + + + + Protocols Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

Protocols

+

The following protocols are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Activity + +
    +
    +
    +
    +
    +
    +

    A protocol through which user activities can be reported.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public protocol Activity
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A protocol that defines the product properties that may be provided when reporting user activity.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public protocol ButtonProductCompatible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Configurable + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public protocol Configurable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/Protocols/Activity.html b/docs/history/1.7.1/Protocols/Activity.html new file mode 100644 index 0000000..688cd58 --- /dev/null +++ b/docs/history/1.7.1/Protocols/Activity.html @@ -0,0 +1,232 @@ + + + + Activity Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

Activity

+
+
+ +
@objc
+public protocol Activity
+ +
+
+

A protocol through which user activities can be reported.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + productViewed(_:) + +
    +
    +
    +
    +
    +
    +

    Report that the user has viewed a product.

    + +
      +
    • product: The product being viewed.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func productViewed(_ product: ButtonProductCompatible?)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Report that the user added a product to their cart.

    + +
      +
    • product: The product added to the cart.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func productAddedToCart(_ product: ButtonProductCompatible?)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cartViewed(_:) + +
    +
    +
    +
    +
    +
    +

    Report that the user viewed their cart.

    + +
      +
    • products: The list of products in the cart.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func cartViewed(_ products: [ButtonProductCompatible]?)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/Protocols/ButtonProductCompatible.html b/docs/history/1.7.1/Protocols/ButtonProductCompatible.html new file mode 100644 index 0000000..ad3fc1a --- /dev/null +++ b/docs/history/1.7.1/Protocols/ButtonProductCompatible.html @@ -0,0 +1,382 @@ + + + + ButtonProductCompatible Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

ButtonProductCompatible

+
+
+ +
@objc
+public protocol ButtonProductCompatible
+ +
+
+

A protocol that defines the product properties that may be provided when reporting user activity.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + id + +
    +
    +
    +
    +
    +
    +

    The product identifier.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var id: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + upc + +
    +
    +
    +
    +
    +
    +

    The UPC (Universal Product Code) of the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var upc: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + categories + +
    +
    +
    +
    +
    +
    +

    A flat array of the names of the categories to which the product belongs.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var categories: [String]? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + name + +
    +
    +
    +
    +
    +
    +

    The name of the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var name: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + currency + +
    +
    +
    +
    +
    +
    +

    The ISO-4217 currency code in which the product’s value is reported.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var currency: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    The value of the order. Includes any discounts, if applicable. Example: 1234 for $12.34.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var value: Int { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + quantity + +
    +
    +
    +
    +
    +
    +

    The quantity of the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var quantity: Int { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + url + +
    +
    +
    +
    +
    +
    +

    The URL of the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var url: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + attributes + +
    +
    +
    +
    +
    +
    +

    Any additional attributes to be included with the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var attributes: [String : String]? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/Protocols/Configurable.html b/docs/history/1.7.1/Protocols/Configurable.html new file mode 100644 index 0000000..744a5a3 --- /dev/null +++ b/docs/history/1.7.1/Protocols/Configurable.html @@ -0,0 +1,170 @@ + + + + Configurable Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

Configurable

+
+
+ +
@objc
+public protocol Configurable
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + includesIFA + +
    +
    +
    +
    +
    +
    +
    +

    Important

    + Deprecated. This library does not read the advertising identifier even when permission is granted by the user. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "Advertising identifier is not accessed by this library.")
    +var includesIFA: Bool { get set }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/Structs.html b/docs/history/1.7.1/Structs.html new file mode 100644 index 0000000..5ce7fae --- /dev/null +++ b/docs/history/1.7.1/Structs.html @@ -0,0 +1,163 @@ + + + + Structures Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

Structures

+

The following structures are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Version + +
    +
    +
    +
    +
    +
    +

    Button Merchant Library Version.

    +
    +

    Note

    + The Button Merchant Library follows Semantic Versioning + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Version
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/badge.svg b/docs/history/1.7.1/badge.svg new file mode 100644 index 0000000..19d671e --- /dev/null +++ b/docs/history/1.7.1/badge.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + documentation + + + documentation + + + 95% + + + 95% + + + diff --git a/docs/history/1.7.1/css/highlight.css b/docs/history/1.7.1/css/highlight.css new file mode 100644 index 0000000..c170357 --- /dev/null +++ b/docs/history/1.7.1/css/highlight.css @@ -0,0 +1,202 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +/* Credit to https://gist.github.com/wataru420/2048287 */ +.highlight .c { + color: #999988; + font-style: italic; } + +.highlight .err { + color: #a61717; + background-color: #e3d2d2; } + +.highlight .k { + color: #000000; + font-weight: bold; } + +.highlight .o { + color: #000000; + font-weight: bold; } + +.highlight .cm { + color: #999988; + font-style: italic; } + +.highlight .cp { + color: #999999; + font-weight: bold; } + +.highlight .c1 { + color: #999988; + font-style: italic; } + +.highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; } + +.highlight .gd { + color: #000000; + background-color: #ffdddd; } + +.highlight .gd .x { + color: #000000; + background-color: #ffaaaa; } + +.highlight .ge { + color: #000000; + font-style: italic; } + +.highlight .gr { + color: #aa0000; } + +.highlight .gh { + color: #999999; } + +.highlight .gi { + color: #000000; + background-color: #ddffdd; } + +.highlight .gi .x { + color: #000000; + background-color: #aaffaa; } + +.highlight .go { + color: #888888; } + +.highlight .gp { + color: #555555; } + +.highlight .gs { + font-weight: bold; } + +.highlight .gu { + color: #aaaaaa; } + +.highlight .gt { + color: #aa0000; } + +.highlight .kc { + color: #000000; + font-weight: bold; } + +.highlight .kd { + color: #000000; + font-weight: bold; } + +.highlight .kp { + color: #000000; + font-weight: bold; } + +.highlight .kr { + color: #000000; + font-weight: bold; } + +.highlight .kt { + color: #445588; } + +.highlight .m { + color: #009999; } + +.highlight .s { + color: #d14; } + +.highlight .na { + color: #008080; } + +.highlight .nb { + color: #0086B3; } + +.highlight .nc { + color: #445588; + font-weight: bold; } + +.highlight .no { + color: #008080; } + +.highlight .ni { + color: #800080; } + +.highlight .ne { + color: #990000; + font-weight: bold; } + +.highlight .nf { + color: #990000; } + +.highlight .nn { + color: #555555; } + +.highlight .nt { + color: #000080; } + +.highlight .nv { + color: #008080; } + +.highlight .ow { + color: #000000; + font-weight: bold; } + +.highlight .w { + color: #bbbbbb; } + +.highlight .mf { + color: #009999; } + +.highlight .mh { + color: #009999; } + +.highlight .mi { + color: #009999; } + +.highlight .mo { + color: #009999; } + +.highlight .sb { + color: #d14; } + +.highlight .sc { + color: #d14; } + +.highlight .sd { + color: #d14; } + +.highlight .s2 { + color: #d14; } + +.highlight .se { + color: #d14; } + +.highlight .sh { + color: #d14; } + +.highlight .si { + color: #d14; } + +.highlight .sx { + color: #d14; } + +.highlight .sr { + color: #009926; } + +.highlight .s1 { + color: #d14; } + +.highlight .ss { + color: #990073; } + +.highlight .bp { + color: #999999; } + +.highlight .vc { + color: #008080; } + +.highlight .vg { + color: #008080; } + +.highlight .vi { + color: #008080; } + +.highlight .il { + color: #009999; } diff --git a/docs/history/1.7.1/css/jazzy.css b/docs/history/1.7.1/css/jazzy.css new file mode 100644 index 0000000..c7bb9fe --- /dev/null +++ b/docs/history/1.7.1/css/jazzy.css @@ -0,0 +1,404 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +*, *:before, *:after { + box-sizing: inherit; } + +body { + margin: 0; + background: #fff; + color: #333; + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + letter-spacing: .2px; + -webkit-font-smoothing: antialiased; + box-sizing: border-box; } + +h1 { + font-size: 2rem; + font-weight: 700; + margin: 1.275em 0 0.6em; } + +h2 { + font-size: 1.75rem; + font-weight: 700; + margin: 1.275em 0 0.3em; } + +h3 { + font-size: 1.5rem; + font-weight: 700; + margin: 1em 0 0.3em; } + +h4 { + font-size: 1.25rem; + font-weight: 700; + margin: 1.275em 0 0.85em; } + +h5 { + font-size: 1rem; + font-weight: 700; + margin: 1.275em 0 0.85em; } + +h6 { + font-size: 1rem; + font-weight: 700; + margin: 1.275em 0 0.85em; + color: #777; } + +p { + margin: 0 0 1em; } + +ul, ol { + padding: 0 0 0 2em; + margin: 0 0 0.85em; } + +blockquote { + margin: 0 0 0.85em; + padding: 0 15px; + color: #858585; + border-left: 4px solid #e5e5e5; } + +img { + max-width: 100%; } + +a { + color: #4183c4; + text-decoration: none; } + a:hover, a:focus { + outline: 0; + text-decoration: underline; } + a.discouraged { + text-decoration: line-through; } + a.discouraged:hover, a.discouraged:focus { + text-decoration: underline line-through; } + +table { + background: #fff; + width: 100%; + border-collapse: collapse; + border-spacing: 0; + overflow: auto; + margin: 0 0 0.85em; } + +tr:nth-child(2n) { + background-color: #fbfbfb; } + +th, td { + padding: 6px 13px; + border: 1px solid #ddd; } + +hr { + height: 1px; + border: none; + background-color: #ddd; } + +pre { + margin: 0 0 1.275em; + padding: .85em 1em; + overflow: auto; + background: #f7f7f7; + font-size: .85em; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } + +code { + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } + +.item-container p > code, .item-container li > code, .top-matter p > code, .top-matter li > code { + background: #f7f7f7; + padding: .2em; } + .item-container p > code:before, .item-container p > code:after, .item-container li > code:before, .item-container li > code:after, .top-matter p > code:before, .top-matter p > code:after, .top-matter li > code:before, .top-matter li > code:after { + letter-spacing: -.2em; + content: "\00a0"; } + +pre code { + padding: 0; + white-space: pre; } + +.content-wrapper { + display: flex; + flex-direction: column; } + @media (min-width: 768px) { + .content-wrapper { + flex-direction: row; } } +.header { + display: flex; + padding: 8px; + font-size: 0.875em; + background: #444; + color: #999; } + +.header-col { + margin: 0; + padding: 0 8px; } + +.header-col--primary { + flex: 1; } + +.header-link { + color: #fff; } + +.header-icon { + padding-right: 2px; + vertical-align: -3px; + height: 16px; } + +.breadcrumbs { + font-size: 0.875em; + padding: 8px 16px; + margin: 0; + background: #fbfbfb; + border-bottom: 1px solid #ddd; } + +.carat { + height: 10px; + margin: 0 5px; } + +.navigation { + order: 2; } + @media (min-width: 768px) { + .navigation { + order: 1; + width: 25%; + max-width: 300px; + padding-bottom: 64px; + overflow: hidden; + word-wrap: normal; + background: #fbfbfb; + border-right: 1px solid #ddd; } } +.nav-groups { + list-style-type: none; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #ddd; + padding: 8px 0 8px 16px; } + +.nav-group-name-link { + color: #333; } + +.nav-group-tasks { + margin: 8px 0; + padding: 0 0 0 8px; } + +.nav-group-task { + font-size: 1em; + list-style-type: none; + white-space: nowrap; } + +.nav-group-task-link { + color: #808080; } + +.main-content { + order: 1; } + @media (min-width: 768px) { + .main-content { + order: 2; + flex: 1; + padding-bottom: 60px; } } +.section { + padding: 0 32px; + border-bottom: 1px solid #ddd; } + +.section-content { + max-width: 834px; + margin: 0 auto; + padding: 16px 0; } + +.section-name { + color: #666; + display: block; } + .section-name p { + margin-bottom: inherit; } + +.declaration .highlight { + overflow-x: initial; + padding: 8px 0; + margin: 0; + background-color: transparent; + border: none; } + +.task-group-section { + border-top: 1px solid #ddd; } + +.task-group { + padding-top: 0px; } + +.task-name-container a[name]:before { + content: ""; + display: block; } + +.section-name-container { + position: relative; } + .section-name-container .section-name-link { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin-bottom: 0; } + .section-name-container .section-name { + position: relative; + pointer-events: none; + z-index: 1; } + .section-name-container .section-name a { + pointer-events: auto; } + +.item-container { + padding: 0; } + +.item { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; } + .item .token, .item .direct-link { + display: inline-block; + text-indent: -20px; + padding-left: 3px; + margin-left: 20px; + font-size: 1rem; } + .item .declaration-note { + font-size: .85em; + color: #808080; + font-style: italic; } + +.pointer-container { + border-bottom: 1px solid #ddd; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + left: 21px; + top: 7px; + display: block; + position: absolute; + width: 12px; + height: 12px; + border-left: 1px solid #ddd; + border-top: 1px solid #ddd; + background: #fff; + transform: rotate(45deg); } + +.height-container { + display: none; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #fff; + border: 1px solid #ddd; + border-top-width: 0; + padding-top: 10px; + padding-bottom: 5px; + padding: 8px 16px; } + +.aside, .language { + padding: 6px 12px; + margin: 12px 0; + border-left: 5px solid #dddddd; + overflow-y: hidden; } + .aside .aside-title, .language .aside-title { + font-size: 9px; + letter-spacing: 2px; + text-transform: uppercase; + padding-bottom: 0; + margin: 0; + color: #aaa; + -webkit-user-select: none; } + .aside p:last-child, .language p:last-child { + margin-bottom: 0; } + +.language { + border-left: 5px solid #cde9f4; } + .language .aside-title { + color: #4183c4; } + +.aside-warning, .aside-deprecated, .aside-unavailable { + border-left: 5px solid #ff6666; } + .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title { + color: #ff0000; } + +.graybox { + border-collapse: collapse; + width: 100%; } + .graybox p { + margin: 0; + word-break: break-word; + min-width: 50px; } + .graybox td { + border: 1px solid #ddd; + padding: 5px 25px 5px 10px; + vertical-align: middle; } + .graybox tr td:first-of-type { + text-align: right; + padding: 7px; + vertical-align: top; + word-break: normal; + width: 40px; } + +.slightly-smaller { + font-size: 0.9em; } + +.footer { + padding: 8px 16px; + background: #444; + color: #ddd; + font-size: 0.8em; } + .footer p { + margin: 8px 0; } + .footer a { + color: #fff; } + +html.dash .header, html.dash .breadcrumbs, html.dash .navigation { + display: none; } + +html.dash .height-container { + display: block; } + +form[role=search] input { + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 24px; + padding: 0 10px; + margin: 0; + border: none; + border-radius: 1em; } + .loading form[role=search] input { + background: white url(../img/spinner.gif) center right 4px no-repeat; } + +form[role=search] .tt-menu { + margin: 0; + min-width: 300px; + background: #fbfbfb; + color: #333; + border: 1px solid #ddd; } + +form[role=search] .tt-highlight { + font-weight: bold; } + +form[role=search] .tt-suggestion { + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + padding: 0 8px; } + form[role=search] .tt-suggestion span { + display: table-cell; + white-space: nowrap; } + form[role=search] .tt-suggestion .doc-parent-name { + width: 100%; + text-align: right; + font-weight: normal; + font-size: 0.9em; + padding-left: 16px; } + +form[role=search] .tt-suggestion:hover, +form[role=search] .tt-suggestion.tt-cursor { + cursor: pointer; + background-color: #4183c4; + color: #fff; } + +form[role=search] .tt-suggestion:hover .doc-parent-name, +form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { + color: #fff; } diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Info.plist b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Info.plist new file mode 100644 index 0000000..49cb17c --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleIdentifier + com.jazzy.buttonmerchant + CFBundleName + ButtonMerchant + DocSetPlatformFamily + buttonmerchant + isDashDocset + + dashIndexFilePath + index.html + isJavaScriptEnabled + + DashDocSetFamily + dashtoc + + diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes.html b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes.html new file mode 100644 index 0000000..8af6cff --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes.html @@ -0,0 +1,225 @@ + + + + Classes Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

Classes

+

The following classes are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + ButtonMerchant + +
    +
    +
    +
    +
    +
    +
    +

    Note

    + ButtonMerchant is the main entry point to the library. + +
    + +

    To get started with your integration, get your application Id from from the Button Dashboard and follow our simple + integration guide.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +final public class ButtonMerchant : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ButtonProduct + +
    +
    +
    +
    +
    +
    +

    A concrete implementation of the ButtonProductCompatible protocol.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    final public class ButtonProduct : NSObject, ButtonProductCompatible, Codable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Order + +
    +
    +
    +
    +
    +
    +

    Represents an order placed by the user to be reported using ButtonMerchant.reportOrder(order).

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +@objc(BTNOrder)
    +final public class Order : NSObject, Codable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonMerchant.html b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonMerchant.html new file mode 100644 index 0000000..342a117 --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonMerchant.html @@ -0,0 +1,554 @@ + + + + ButtonMerchant Class Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

ButtonMerchant

+
+
+ +
@objcMembers
+final public class ButtonMerchant : NSObject
+ +
+
+
+

Note

+ ButtonMerchant is the main entry point to the library. + +
+ +

To get started with your integration, get your application Id from from the Button Dashboard and follow our simple + integration guide.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + attributionToken + +
    +
    +
    +
    +
    +
    +

    The last attributionToken from an inbound Button attributed URL.

    +
    +

    Attention

    +

    For attribution to work correctly, you must:

    + +
      +
    • Always access this token directly—never cache it.

    • +
    • Never manage the lifecycle of this token—Button manages the token validity window server-side.

    • +
    • Always include this value when reporting orders to your order API

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static var attributionToken: String? { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Configures ButtonMerchant with your application Id.

    +
    +

    Note

    +

    Get your application Id from from the Button Dashboard

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func configure(applicationId: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + applicationId + + +
    +

    Your application Id (required)

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + trackIncomingURL(_:) + +
    +
    +
    +
    +
    +
    +

    Checks the passed URL for a Button attribution and if present stores the token.

    +
    +

    Attention

    +

    To correctly attribute customers, you must call this method with every +incoming url and userActivity from the following UIApplicationDelegate methods:

    + +
      +
    • application(_:open:options:)

    • +
    • application(_:userActivity:restorationHandler:)

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func trackIncomingURL(_ url: URL)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + url + + +
    +

    A URL that has entered your app from a third party source.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Checks the URL in the passed NSUserActivity for Button attribution and if present stores the token.

    +
    +

    Attention

    +

    To correctly attribute customers, you must call this method with every +incoming userActivity from the following UIApplicationDelegate method:

    + +
      +
    • application(_:userActivity:restorationHandler:)

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func trackIncomingUserActivity(_ userActivity: NSUserActivity)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + userActivity + + +
    +

    A NSUserActivity with which your app has been continued.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Checks to see if the user visited a url destined for your app prior to installing your app.

    + +

    If a url is found, your completion handler will be called with the url and you are responsible +for navigating the user to the relevant content in your app. If a url is not found or an error occurs, your +completion handler will be called without a url and you can continue with your normal launch sequence.

    +
    +

    Attention

    +

    This method checks for a post-install url exactly one time after a user has installed your app. +Subsequent calls will result in your completion handler being called without a url. You do not need to wait +for the completion handler before continuing with your normal launch sequence but you should be prepared +to handle a post-install url if one is found. All subsequent incoming urls will be routed to your +UIApplicationDelegate as usual.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func handlePostInstallURL(_ completion: @escaping (URL?, Error?) -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + completion + + +
    +

    A completion block taking an optional url and optional error.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Reports an order to Button.

    +
    +

    See also

    +

    Reporting Orders to Button

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func reportOrder(_ order: Order, completion: ((Error?) -> Void)? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + order + + +
    +

    Your order object to be reported.

    +
    +
    + + completion + + +
    +

    An optional completion block taking an optional error.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + clearAllData() + +
    +
    +
    +
    +
    +
    +

    Discards the current session and all persisted data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static func clearAllData()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + features + +
    +
    +
    +
    +
    +
    +

    An interface through which library features can be enabled/disabled.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static var features: Configurable { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + activity + +
    +
    +
    +
    +
    +
    +

    An interface through which user activity can be reported.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public static var activity: Activity { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonProduct.html b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonProduct.html new file mode 100644 index 0000000..aeef8af --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonProduct.html @@ -0,0 +1,372 @@ + + + + ButtonProduct Class Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

ButtonProduct

+
+
+ +
final public class ButtonProduct : NSObject, ButtonProductCompatible, Codable
+ +
+
+

A concrete implementation of the ButtonProductCompatible protocol.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + id + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var id: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + upc + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var upc: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + categories + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var categories: [String]?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + name + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var name: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + currency + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var currency: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var value: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + quantity + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var quantity: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + url + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var url: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + attributes + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var attributes: [String : String]?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order.html b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order.html new file mode 100644 index 0000000..21eb53e --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order.html @@ -0,0 +1,359 @@ + + + + Order Class Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

Order

+
+
+ +
@objcMembers
+@objc(BTNOrder)
+final public class Order : NSObject, Codable
+ +
+
+

Represents an order placed by the user to be reported using ButtonMerchant.reportOrder(order).

+ +
+
+ +
+
+
+
    +
  • +
    + + + + currencyCode + +
    +
    +
    +
    +
    +
    +

    The ISO 4217 currency code (default is USD).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var currencyCode: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + customerOrderId + +
    +
    +
    +
    +
    +
    +

    The customer-facing order id.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var customerOrderId: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + customer + +
    +
    +
    +
    +
    +
    +

    The customer related to the order

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var customer: Customer?
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Initializes an order object with the passed parameters.

    + +
      +
    • id: The order identifier (required).
    • +
    • purchaseDate: The date of the purchase for the order.
    • +
    • lineItems: A list of the line item details that comprise the order.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public init(id: String, purchaseDate: Date, lineItems: [LineItem])
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Customer + +
    +
    +
    +
    +
    +
    +

    Represents a customer in the order.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +@objc(BTNCustomer)
    +final public class Customer : NSObject, Codable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LineItem + +
    +
    +
    +
    +
    +
    +

    Represents a line item in the order.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +@objc(LineItem)
    +final public class LineItem : NSObject, Codable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Deprecations +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Deprecated.

    + +

    If you’re migrating to client side order reporting, please use init(id:purchaseDate:lineItems:) instead.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "Use init(id:purchaseDate:lineItems:﹚ instead")
    +@objc
    +public init(id: String, amount: Int64 = 0, currencyCode: String = "USD")
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/Customer.html b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/Customer.html new file mode 100644 index 0000000..2e4f3e5 --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/Customer.html @@ -0,0 +1,231 @@ + + + + Customer Class Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

Customer

+
+
+ +
@objcMembers
+@objc(BTNCustomer)
+final public class Customer : NSObject, Codable
+ +
+
+

Represents a customer in the order.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + email + +
    +
    +
    +
    +
    +
    +
    +

    Important

    + Deprecated. This property is a no-op. Data is not collected. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "Setting this property is a no-op. Data is not collected.")
    +public var email: String? { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isNew + +
    +
    +
    +
    +
    +
    +

    A flag indicating whether the customer is new (or not).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isNew: Bool?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(id:) + +
    +
    +
    +
    +
    +
    +

    Initializes a customer object with the passed parameters.

    + +
      +
    • id: The id for your customer (required).
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public init(id: String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/LineItem.html b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/LineItem.html new file mode 100644 index 0000000..87f5b2e --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/LineItem.html @@ -0,0 +1,364 @@ + + + + LineItem Class Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

LineItem

+
+
+ +
@objcMembers
+@objc(LineItem)
+final public class LineItem : NSObject, Codable
+ +
+
+

Represents a line item in the order.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + quantity + +
    +
    +
    +
    +
    +
    +

    The number of unique units represented by this line item (default is 1).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var quantity: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + itemDescription + +
    +
    +
    +
    +
    +
    +

    Text describing the line item.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var itemDescription: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + sku + +
    +
    +
    +
    +
    +
    +

    The Stock Keeping Unit of the line item.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var sku: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + upc + +
    +
    +
    +
    +
    +
    +

    The Universal Product Code of the line item.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var upc: String?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + category + +
    +
    +
    +
    +
    +
    +

    The category of the line item. +An ordered list of strings, starting with the topmost (or most general) category.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var category: [String]?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + attributes + +
    +
    +
    +
    +
    +
    +

    A key/value store for strings to specify additional information about a line item.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var attributes: [String : String]?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(id:total:) + +
    +
    +
    +
    +
    +
    +

    An array of the line item details that comprise the order

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public init(id: String, total: Int64)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + id + + +
    +

    The unique identifier for this line item, within the scope of this order. + This must be unique across all line-items within the order. + We suggest using the SKU or UPC of the product. (required)

    +
    +
    + + total + + +
    +

    The total price of all items bought in a particular line item. (required)

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums.html b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums.html new file mode 100644 index 0000000..504caa4 --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums.html @@ -0,0 +1,218 @@ + + + + Enumerations Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

Enumerations

+

The following enumerations are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + ButtonMerchantError + +
    +
    +
    +
    +
    +
    +

    Button Merchant Library Errors.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ButtonMerchantError : Error
    +
    extension ButtonMerchantError: Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ConfigurationError + +
    +
    +
    +
    +
    +
    +

    Button Merchant Library Configuration Error.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ConfigurationError : Error
    +
    extension ConfigurationError: Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NetworkError + +
    +
    +
    +
    +
    +
    +

    Button Merchant Library Configuration Error.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum NetworkError : Error
    +
    extension NetworkError: Equatable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ButtonMerchantError.html b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ButtonMerchantError.html new file mode 100644 index 0000000..cc3e78c --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ButtonMerchantError.html @@ -0,0 +1,191 @@ + + + + ButtonMerchantError Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

ButtonMerchantError

+
+
+ +
public enum ButtonMerchantError : Error
+
extension ButtonMerchantError: Equatable
+ +
+
+

Button Merchant Library Errors.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case trackOrderDeprecationError
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + noEventsError + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case noEventsError
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ConfigurationError.html b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ConfigurationError.html new file mode 100644 index 0000000..35c18c8 --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ConfigurationError.html @@ -0,0 +1,197 @@ + + + + ConfigurationError Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

ConfigurationError

+
+
+ +
public enum ConfigurationError : Error
+
extension ConfigurationError: Equatable
+ +
+
+

Button Merchant Library Configuration Error.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + noApplicationId + +
    +
    +
    +
    +
    +
    +

    Library is not configured with an applicationId

    +
    +

    Note

    + Get your application Id from from the Button Dashboard + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case noApplicationId
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case invalidApplicationId(appicationId: String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/NetworkError.html b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/NetworkError.html new file mode 100644 index 0000000..88dc8f1 --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/NetworkError.html @@ -0,0 +1,166 @@ + + + + NetworkError Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

NetworkError

+
+
+ +
public enum NetworkError : Error
+
extension NetworkError: Equatable
+ +
+
+

Button Merchant Library Configuration Error.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + unknown + +
    +
    +
    +
    +
    +
    +

    There was an unknown network error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case unknown
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols.html b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols.html new file mode 100644 index 0000000..ff4ab15 --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols.html @@ -0,0 +1,217 @@ + + + + Protocols Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

Protocols

+

The following protocols are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Activity + +
    +
    +
    +
    +
    +
    +

    A protocol through which user activities can be reported.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public protocol Activity
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A protocol that defines the product properties that may be provided when reporting user activity.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public protocol ButtonProductCompatible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Configurable + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objc
    +public protocol Configurable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Activity.html b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Activity.html new file mode 100644 index 0000000..688cd58 --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Activity.html @@ -0,0 +1,232 @@ + + + + Activity Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

Activity

+
+
+ +
@objc
+public protocol Activity
+ +
+
+

A protocol through which user activities can be reported.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + productViewed(_:) + +
    +
    +
    +
    +
    +
    +

    Report that the user has viewed a product.

    + +
      +
    • product: The product being viewed.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func productViewed(_ product: ButtonProductCompatible?)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Report that the user added a product to their cart.

    + +
      +
    • product: The product added to the cart.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func productAddedToCart(_ product: ButtonProductCompatible?)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cartViewed(_:) + +
    +
    +
    +
    +
    +
    +

    Report that the user viewed their cart.

    + +
      +
    • products: The list of products in the cart.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func cartViewed(_ products: [ButtonProductCompatible]?)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/ButtonProductCompatible.html b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/ButtonProductCompatible.html new file mode 100644 index 0000000..ad3fc1a --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/ButtonProductCompatible.html @@ -0,0 +1,382 @@ + + + + ButtonProductCompatible Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

ButtonProductCompatible

+
+
+ +
@objc
+public protocol ButtonProductCompatible
+ +
+
+

A protocol that defines the product properties that may be provided when reporting user activity.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + id + +
    +
    +
    +
    +
    +
    +

    The product identifier.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var id: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + upc + +
    +
    +
    +
    +
    +
    +

    The UPC (Universal Product Code) of the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var upc: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + categories + +
    +
    +
    +
    +
    +
    +

    A flat array of the names of the categories to which the product belongs.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var categories: [String]? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + name + +
    +
    +
    +
    +
    +
    +

    The name of the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var name: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + currency + +
    +
    +
    +
    +
    +
    +

    The ISO-4217 currency code in which the product’s value is reported.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var currency: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    The value of the order. Includes any discounts, if applicable. Example: 1234 for $12.34.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var value: Int { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + quantity + +
    +
    +
    +
    +
    +
    +

    The quantity of the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var quantity: Int { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + url + +
    +
    +
    +
    +
    +
    +

    The URL of the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var url: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + attributes + +
    +
    +
    +
    +
    +
    +

    Any additional attributes to be included with the product.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var attributes: [String : String]? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Configurable.html b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Configurable.html new file mode 100644 index 0000000..744a5a3 --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Configurable.html @@ -0,0 +1,170 @@ + + + + Configurable Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

Configurable

+
+
+ +
@objc
+public protocol Configurable
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + includesIFA + +
    +
    +
    +
    +
    +
    +
    +

    Important

    + Deprecated. This library does not read the advertising identifier even when permission is granted by the user. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "Advertising identifier is not accessed by this library.")
    +var includesIFA: Bool { get set }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Structs.html b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Structs.html new file mode 100644 index 0000000..5ce7fae --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Structs.html @@ -0,0 +1,163 @@ + + + + Structures Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+

Structures

+

The following structures are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Version + +
    +
    +
    +
    +
    +
    +

    Button Merchant Library Version.

    +
    +

    Note

    + The Button Merchant Library follows Semantic Versioning + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Version
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/highlight.css b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/highlight.css new file mode 100644 index 0000000..c170357 --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/highlight.css @@ -0,0 +1,202 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +/* Credit to https://gist.github.com/wataru420/2048287 */ +.highlight .c { + color: #999988; + font-style: italic; } + +.highlight .err { + color: #a61717; + background-color: #e3d2d2; } + +.highlight .k { + color: #000000; + font-weight: bold; } + +.highlight .o { + color: #000000; + font-weight: bold; } + +.highlight .cm { + color: #999988; + font-style: italic; } + +.highlight .cp { + color: #999999; + font-weight: bold; } + +.highlight .c1 { + color: #999988; + font-style: italic; } + +.highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; } + +.highlight .gd { + color: #000000; + background-color: #ffdddd; } + +.highlight .gd .x { + color: #000000; + background-color: #ffaaaa; } + +.highlight .ge { + color: #000000; + font-style: italic; } + +.highlight .gr { + color: #aa0000; } + +.highlight .gh { + color: #999999; } + +.highlight .gi { + color: #000000; + background-color: #ddffdd; } + +.highlight .gi .x { + color: #000000; + background-color: #aaffaa; } + +.highlight .go { + color: #888888; } + +.highlight .gp { + color: #555555; } + +.highlight .gs { + font-weight: bold; } + +.highlight .gu { + color: #aaaaaa; } + +.highlight .gt { + color: #aa0000; } + +.highlight .kc { + color: #000000; + font-weight: bold; } + +.highlight .kd { + color: #000000; + font-weight: bold; } + +.highlight .kp { + color: #000000; + font-weight: bold; } + +.highlight .kr { + color: #000000; + font-weight: bold; } + +.highlight .kt { + color: #445588; } + +.highlight .m { + color: #009999; } + +.highlight .s { + color: #d14; } + +.highlight .na { + color: #008080; } + +.highlight .nb { + color: #0086B3; } + +.highlight .nc { + color: #445588; + font-weight: bold; } + +.highlight .no { + color: #008080; } + +.highlight .ni { + color: #800080; } + +.highlight .ne { + color: #990000; + font-weight: bold; } + +.highlight .nf { + color: #990000; } + +.highlight .nn { + color: #555555; } + +.highlight .nt { + color: #000080; } + +.highlight .nv { + color: #008080; } + +.highlight .ow { + color: #000000; + font-weight: bold; } + +.highlight .w { + color: #bbbbbb; } + +.highlight .mf { + color: #009999; } + +.highlight .mh { + color: #009999; } + +.highlight .mi { + color: #009999; } + +.highlight .mo { + color: #009999; } + +.highlight .sb { + color: #d14; } + +.highlight .sc { + color: #d14; } + +.highlight .sd { + color: #d14; } + +.highlight .s2 { + color: #d14; } + +.highlight .se { + color: #d14; } + +.highlight .sh { + color: #d14; } + +.highlight .si { + color: #d14; } + +.highlight .sx { + color: #d14; } + +.highlight .sr { + color: #009926; } + +.highlight .s1 { + color: #d14; } + +.highlight .ss { + color: #990073; } + +.highlight .bp { + color: #999999; } + +.highlight .vc { + color: #008080; } + +.highlight .vg { + color: #008080; } + +.highlight .vi { + color: #008080; } + +.highlight .il { + color: #009999; } diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/jazzy.css b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/jazzy.css new file mode 100644 index 0000000..c7bb9fe --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/jazzy.css @@ -0,0 +1,404 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +*, *:before, *:after { + box-sizing: inherit; } + +body { + margin: 0; + background: #fff; + color: #333; + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + letter-spacing: .2px; + -webkit-font-smoothing: antialiased; + box-sizing: border-box; } + +h1 { + font-size: 2rem; + font-weight: 700; + margin: 1.275em 0 0.6em; } + +h2 { + font-size: 1.75rem; + font-weight: 700; + margin: 1.275em 0 0.3em; } + +h3 { + font-size: 1.5rem; + font-weight: 700; + margin: 1em 0 0.3em; } + +h4 { + font-size: 1.25rem; + font-weight: 700; + margin: 1.275em 0 0.85em; } + +h5 { + font-size: 1rem; + font-weight: 700; + margin: 1.275em 0 0.85em; } + +h6 { + font-size: 1rem; + font-weight: 700; + margin: 1.275em 0 0.85em; + color: #777; } + +p { + margin: 0 0 1em; } + +ul, ol { + padding: 0 0 0 2em; + margin: 0 0 0.85em; } + +blockquote { + margin: 0 0 0.85em; + padding: 0 15px; + color: #858585; + border-left: 4px solid #e5e5e5; } + +img { + max-width: 100%; } + +a { + color: #4183c4; + text-decoration: none; } + a:hover, a:focus { + outline: 0; + text-decoration: underline; } + a.discouraged { + text-decoration: line-through; } + a.discouraged:hover, a.discouraged:focus { + text-decoration: underline line-through; } + +table { + background: #fff; + width: 100%; + border-collapse: collapse; + border-spacing: 0; + overflow: auto; + margin: 0 0 0.85em; } + +tr:nth-child(2n) { + background-color: #fbfbfb; } + +th, td { + padding: 6px 13px; + border: 1px solid #ddd; } + +hr { + height: 1px; + border: none; + background-color: #ddd; } + +pre { + margin: 0 0 1.275em; + padding: .85em 1em; + overflow: auto; + background: #f7f7f7; + font-size: .85em; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } + +code { + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } + +.item-container p > code, .item-container li > code, .top-matter p > code, .top-matter li > code { + background: #f7f7f7; + padding: .2em; } + .item-container p > code:before, .item-container p > code:after, .item-container li > code:before, .item-container li > code:after, .top-matter p > code:before, .top-matter p > code:after, .top-matter li > code:before, .top-matter li > code:after { + letter-spacing: -.2em; + content: "\00a0"; } + +pre code { + padding: 0; + white-space: pre; } + +.content-wrapper { + display: flex; + flex-direction: column; } + @media (min-width: 768px) { + .content-wrapper { + flex-direction: row; } } +.header { + display: flex; + padding: 8px; + font-size: 0.875em; + background: #444; + color: #999; } + +.header-col { + margin: 0; + padding: 0 8px; } + +.header-col--primary { + flex: 1; } + +.header-link { + color: #fff; } + +.header-icon { + padding-right: 2px; + vertical-align: -3px; + height: 16px; } + +.breadcrumbs { + font-size: 0.875em; + padding: 8px 16px; + margin: 0; + background: #fbfbfb; + border-bottom: 1px solid #ddd; } + +.carat { + height: 10px; + margin: 0 5px; } + +.navigation { + order: 2; } + @media (min-width: 768px) { + .navigation { + order: 1; + width: 25%; + max-width: 300px; + padding-bottom: 64px; + overflow: hidden; + word-wrap: normal; + background: #fbfbfb; + border-right: 1px solid #ddd; } } +.nav-groups { + list-style-type: none; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #ddd; + padding: 8px 0 8px 16px; } + +.nav-group-name-link { + color: #333; } + +.nav-group-tasks { + margin: 8px 0; + padding: 0 0 0 8px; } + +.nav-group-task { + font-size: 1em; + list-style-type: none; + white-space: nowrap; } + +.nav-group-task-link { + color: #808080; } + +.main-content { + order: 1; } + @media (min-width: 768px) { + .main-content { + order: 2; + flex: 1; + padding-bottom: 60px; } } +.section { + padding: 0 32px; + border-bottom: 1px solid #ddd; } + +.section-content { + max-width: 834px; + margin: 0 auto; + padding: 16px 0; } + +.section-name { + color: #666; + display: block; } + .section-name p { + margin-bottom: inherit; } + +.declaration .highlight { + overflow-x: initial; + padding: 8px 0; + margin: 0; + background-color: transparent; + border: none; } + +.task-group-section { + border-top: 1px solid #ddd; } + +.task-group { + padding-top: 0px; } + +.task-name-container a[name]:before { + content: ""; + display: block; } + +.section-name-container { + position: relative; } + .section-name-container .section-name-link { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin-bottom: 0; } + .section-name-container .section-name { + position: relative; + pointer-events: none; + z-index: 1; } + .section-name-container .section-name a { + pointer-events: auto; } + +.item-container { + padding: 0; } + +.item { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; } + .item .token, .item .direct-link { + display: inline-block; + text-indent: -20px; + padding-left: 3px; + margin-left: 20px; + font-size: 1rem; } + .item .declaration-note { + font-size: .85em; + color: #808080; + font-style: italic; } + +.pointer-container { + border-bottom: 1px solid #ddd; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + left: 21px; + top: 7px; + display: block; + position: absolute; + width: 12px; + height: 12px; + border-left: 1px solid #ddd; + border-top: 1px solid #ddd; + background: #fff; + transform: rotate(45deg); } + +.height-container { + display: none; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #fff; + border: 1px solid #ddd; + border-top-width: 0; + padding-top: 10px; + padding-bottom: 5px; + padding: 8px 16px; } + +.aside, .language { + padding: 6px 12px; + margin: 12px 0; + border-left: 5px solid #dddddd; + overflow-y: hidden; } + .aside .aside-title, .language .aside-title { + font-size: 9px; + letter-spacing: 2px; + text-transform: uppercase; + padding-bottom: 0; + margin: 0; + color: #aaa; + -webkit-user-select: none; } + .aside p:last-child, .language p:last-child { + margin-bottom: 0; } + +.language { + border-left: 5px solid #cde9f4; } + .language .aside-title { + color: #4183c4; } + +.aside-warning, .aside-deprecated, .aside-unavailable { + border-left: 5px solid #ff6666; } + .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title { + color: #ff0000; } + +.graybox { + border-collapse: collapse; + width: 100%; } + .graybox p { + margin: 0; + word-break: break-word; + min-width: 50px; } + .graybox td { + border: 1px solid #ddd; + padding: 5px 25px 5px 10px; + vertical-align: middle; } + .graybox tr td:first-of-type { + text-align: right; + padding: 7px; + vertical-align: top; + word-break: normal; + width: 40px; } + +.slightly-smaller { + font-size: 0.9em; } + +.footer { + padding: 8px 16px; + background: #444; + color: #ddd; + font-size: 0.8em; } + .footer p { + margin: 8px 0; } + .footer a { + color: #fff; } + +html.dash .header, html.dash .breadcrumbs, html.dash .navigation { + display: none; } + +html.dash .height-container { + display: block; } + +form[role=search] input { + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 24px; + padding: 0 10px; + margin: 0; + border: none; + border-radius: 1em; } + .loading form[role=search] input { + background: white url(../img/spinner.gif) center right 4px no-repeat; } + +form[role=search] .tt-menu { + margin: 0; + min-width: 300px; + background: #fbfbfb; + color: #333; + border: 1px solid #ddd; } + +form[role=search] .tt-highlight { + font-weight: bold; } + +form[role=search] .tt-suggestion { + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + padding: 0 8px; } + form[role=search] .tt-suggestion span { + display: table-cell; + white-space: nowrap; } + form[role=search] .tt-suggestion .doc-parent-name { + width: 100%; + text-align: right; + font-weight: normal; + font-size: 0.9em; + padding-left: 16px; } + +form[role=search] .tt-suggestion:hover, +form[role=search] .tt-suggestion.tt-cursor { + cursor: pointer; + background-color: #4183c4; + color: #fff; } + +form[role=search] .tt-suggestion:hover .doc-parent-name, +form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { + color: #fff; } diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/carat.png b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/carat.png new file mode 100755 index 0000000000000000000000000000000000000000..29d2f7fd4955fca6bc6fb740e0373a2c358c398e GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRo!3HEV4DF?Wlw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JlqAi{-jv*Ddl5#RKJQ5NTUZgiPI4RUKGIKU?u8L&ndhX1t za+0CMVUnT(Gnb}ei=c~x==tMH^F1_tBocXwcoSWoO-SZY-o>!8%^=Bms)(~h;m_U( zXNixk28L}0LS5-jKyq@#2gyS|J&f#pGCLkTc<@2s1dqeyqJ*Rc0tSIETAgmODY;(s z2y|Mcp&2}7rpBprBBB~1qM1`N+}4SoxYVPqsXi&l`rxZp{(w0iSy$Nv5*Vy!RapG^ S^0y4=eg;ohKbLh*2~7a!Pg}VF literal 0 HcmV?d00001 diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/dash.png b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/dash.png new file mode 100755 index 0000000000000000000000000000000000000000..6f694c7a012b417908da3687a0a39aa182e91c74 GIT binary patch literal 1338 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 literal 0 HcmV?d00001 diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/index.html b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/index.html new file mode 100644 index 0000000..fb64956 --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/index.html @@ -0,0 +1,162 @@ + + + + ButtonMerchant Reference + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+ +

Button Merchant Library

+ +

License: MIT +Version +Platform

+

Documentation

+ +

Documentation for the Merchant Library can be found on the Button Developer site.

+ +

Reference docs are also available.

+

Example

+ +

To run the example project, clone the repo, run pod install, and run the Example scheme.

+

Installation

+ +

ButtonMerchant is available through CocoaPods and Carthage.

+

Swift Pacakage Manager

+ +

In Xcode, navigate to File → Swift Packages → Add Package Dependency

+ +

Enter the package repository URL:

+ +

https://github.com/button/button-merchant-ios

+ +

Note: Ensure to select ‘Up to Next Major’ version when prompted.

+

CocoaPods

+ +

Add this line to your Podfile:

+
pod 'ButtonMerchant'
+
+

Carthage

+ +

Or, add this to your Cartfile:

+
github "button/button-merchant-ios" ~> 1.0
+
+

Author

+ +

Button, Inc.

+

License

+ +

ButtonMerchant is available under the MIT license. See the LICENSE file for more info.

+ +
+
+ + +
+
+ + + diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.js b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.js new file mode 100755 index 0000000..1984416 --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +window.jazzy = {'docset': false} +if (typeof window.dash != 'undefined') { + document.documentElement.className += ' dash' + window.jazzy.docset = true +} +if (navigator.userAgent.match(/xcode/i)) { + document.documentElement.className += ' xcode' + window.jazzy.docset = true +} + +function toggleItem($link, $content) { + var animationDuration = 300; + $link.toggleClass('token-open'); + $content.slideToggle(animationDuration); +} + +function itemLinkToContent($link) { + return $link.parent().parent().next(); +} + +// On doc load + hash-change, open any targetted item +function openCurrentItemIfClosed() { + if (window.jazzy.docset) { + return; + } + var $link = $(`a[name="${location.hash.substring(1)}"]`).nextAll('.token'); + $content = itemLinkToContent($link); + if ($content.is(':hidden')) { + toggleItem($link, $content); + } +} + +$(openCurrentItemIfClosed); +$(window).on('hashchange', openCurrentItemIfClosed); + +// On item link ('token') click, toggle its discussion +$('.token').on('click', function(event) { + if (window.jazzy.docset) { + return; + } + var $link = $(this); + toggleItem($link, itemLinkToContent($link)); + + // Keeps the document from jumping to the hash. + var href = $link.attr('href'); + if (history.pushState) { + history.pushState({}, '', href); + } else { + location.hash = href; + } + event.preventDefault(); +}); + +// Clicks on links to the current, closed, item need to open the item +$("a:not('.token')").on('click', function() { + if (location == this.href) { + openCurrentItemIfClosed(); + } +}); + +// KaTeX rendering +if ("katex" in window) { + $($('.math').each( (_, element) => { + katex.render(element.textContent, element, { + displayMode: $(element).hasClass('m-block'), + throwOnError: false, + trust: true + }); + })) +} diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.search.js b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.search.js new file mode 100644 index 0000000..359cdbb --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.search.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +$(function(){ + var $typeahead = $('[data-typeahead]'); + var $form = $typeahead.parents('form'); + var searchURL = $form.attr('action'); + + function displayTemplate(result) { + return result.name; + } + + function suggestionTemplate(result) { + var t = '
'; + t += '' + result.name + ''; + if (result.parent_name) { + t += '' + result.parent_name + ''; + } + t += '
'; + return t; + } + + $typeahead.one('focus', function() { + $form.addClass('loading'); + + $.getJSON(searchURL).then(function(searchData) { + const searchIndex = lunr(function() { + this.ref('url'); + this.field('name'); + this.field('abstract'); + for (const [url, doc] of Object.entries(searchData)) { + this.add({url: url, name: doc.name, abstract: doc.abstract}); + } + }); + + $typeahead.typeahead( + { + highlight: true, + minLength: 3, + autoselect: true + }, + { + limit: 10, + display: displayTemplate, + templates: { suggestion: suggestionTemplate }, + source: function(query, sync) { + const lcSearch = query.toLowerCase(); + const results = searchIndex.query(function(q) { + q.term(lcSearch, { boost: 100 }); + q.term(lcSearch, { + boost: 10, + wildcard: lunr.Query.wildcard.TRAILING + }); + }).map(function(result) { + var doc = searchData[result.ref]; + doc.url = result.ref; + return doc; + }); + sync(results); + } + } + ); + $form.removeClass('loading'); + $typeahead.trigger('focus'); + }); + }); + + var baseURL = searchURL.slice(0, -"search.json".length); + + $typeahead.on('typeahead:select', function(e, result) { + window.location = baseURL + result.url; + }); +}); diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jquery.min.js b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jquery.min.js new file mode 100644 index 0000000..7f37b5d --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 00){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/typeahead.jquery.js b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/typeahead.jquery.js new file mode 100644 index 0000000..3a2d2ab --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/typeahead.jquery.js @@ -0,0 +1,1694 @@ +/*! + * typeahead.js 1.3.1 + * https://github.com/corejavascript/typeahead.js + * Copyright 2013-2020 Twitter, Inc. and other contributors; Licensed MIT + */ + + +(function(root, factory) { + if (typeof define === "function" && define.amd) { + define([ "jquery" ], function(a0) { + return factory(a0); + }); + } else if (typeof module === "object" && module.exports) { + module.exports = factory(require("jquery")); + } else { + factory(root["jQuery"]); + } +})(this, function($) { + var _ = function() { + "use strict"; + return { + isMsie: function() { + return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false; + }, + isBlankString: function(str) { + return !str || /^\s*$/.test(str); + }, + escapeRegExChars: function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }, + isString: function(obj) { + return typeof obj === "string"; + }, + isNumber: function(obj) { + return typeof obj === "number"; + }, + isArray: $.isArray, + isFunction: $.isFunction, + isObject: $.isPlainObject, + isUndefined: function(obj) { + return typeof obj === "undefined"; + }, + isElement: function(obj) { + return !!(obj && obj.nodeType === 1); + }, + isJQuery: function(obj) { + return obj instanceof $; + }, + toStr: function toStr(s) { + return _.isUndefined(s) || s === null ? "" : s + ""; + }, + bind: $.proxy, + each: function(collection, cb) { + $.each(collection, reverseArgs); + function reverseArgs(index, value) { + return cb(value, index); + } + }, + map: $.map, + filter: $.grep, + every: function(obj, test) { + var result = true; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (!(result = test.call(null, val, key, obj))) { + return false; + } + }); + return !!result; + }, + some: function(obj, test) { + var result = false; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (result = test.call(null, val, key, obj)) { + return false; + } + }); + return !!result; + }, + mixin: $.extend, + identity: function(x) { + return x; + }, + clone: function(obj) { + return $.extend(true, {}, obj); + }, + getIdGenerator: function() { + var counter = 0; + return function() { + return counter++; + }; + }, + templatify: function templatify(obj) { + return $.isFunction(obj) ? obj : template; + function template() { + return String(obj); + } + }, + defer: function(fn) { + setTimeout(fn, 0); + }, + debounce: function(func, wait, immediate) { + var timeout, result; + return function() { + var context = this, args = arguments, later, callNow; + later = function() { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + } + }; + callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + } + return result; + }; + }, + throttle: function(func, wait) { + var context, args, timeout, result, previous, later; + previous = 0; + later = function() { + previous = new Date(); + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date(), remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + } else if (!timeout) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + stringify: function(val) { + return _.isString(val) ? val : JSON.stringify(val); + }, + guid: function() { + function _p8(s) { + var p = (Math.random().toString(16) + "000000000").substr(2, 8); + return s ? "-" + p.substr(0, 4) + "-" + p.substr(4, 4) : p; + } + return "tt-" + _p8() + _p8(true) + _p8(true) + _p8(); + }, + noop: function() {} + }; + }(); + var WWW = function() { + "use strict"; + var defaultClassNames = { + wrapper: "twitter-typeahead", + input: "tt-input", + hint: "tt-hint", + menu: "tt-menu", + dataset: "tt-dataset", + suggestion: "tt-suggestion", + selectable: "tt-selectable", + empty: "tt-empty", + open: "tt-open", + cursor: "tt-cursor", + highlight: "tt-highlight" + }; + return build; + function build(o) { + var www, classes; + classes = _.mixin({}, defaultClassNames, o); + www = { + css: buildCss(), + classes: classes, + html: buildHtml(classes), + selectors: buildSelectors(classes) + }; + return { + css: www.css, + html: www.html, + classes: www.classes, + selectors: www.selectors, + mixin: function(o) { + _.mixin(o, www); + } + }; + } + function buildHtml(c) { + return { + wrapper: '', + menu: '
' + }; + } + function buildSelectors(classes) { + var selectors = {}; + _.each(classes, function(v, k) { + selectors[k] = "." + v; + }); + return selectors; + } + function buildCss() { + var css = { + wrapper: { + position: "relative", + display: "inline-block" + }, + hint: { + position: "absolute", + top: "0", + left: "0", + borderColor: "transparent", + boxShadow: "none", + opacity: "1" + }, + input: { + position: "relative", + verticalAlign: "top", + backgroundColor: "transparent" + }, + inputWithNoHint: { + position: "relative", + verticalAlign: "top" + }, + menu: { + position: "absolute", + top: "100%", + left: "0", + zIndex: "100", + display: "none" + }, + ltr: { + left: "0", + right: "auto" + }, + rtl: { + left: "auto", + right: " 0" + } + }; + if (_.isMsie()) { + _.mixin(css.input, { + backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)" + }); + } + return css; + } + }(); + var EventBus = function() { + "use strict"; + var namespace, deprecationMap; + namespace = "typeahead:"; + deprecationMap = { + render: "rendered", + cursorchange: "cursorchanged", + select: "selected", + autocomplete: "autocompleted" + }; + function EventBus(o) { + if (!o || !o.el) { + $.error("EventBus initialized without el"); + } + this.$el = $(o.el); + } + _.mixin(EventBus.prototype, { + _trigger: function(type, args) { + var $e = $.Event(namespace + type); + this.$el.trigger.call(this.$el, $e, args || []); + return $e; + }, + before: function(type) { + var args, $e; + args = [].slice.call(arguments, 1); + $e = this._trigger("before" + type, args); + return $e.isDefaultPrevented(); + }, + trigger: function(type) { + var deprecatedType; + this._trigger(type, [].slice.call(arguments, 1)); + if (deprecatedType = deprecationMap[type]) { + this._trigger(deprecatedType, [].slice.call(arguments, 1)); + } + } + }); + return EventBus; + }(); + var EventEmitter = function() { + "use strict"; + var splitter = /\s+/, nextTick = getNextTick(); + return { + onSync: onSync, + onAsync: onAsync, + off: off, + trigger: trigger + }; + function on(method, types, cb, context) { + var type; + if (!cb) { + return this; + } + types = types.split(splitter); + cb = context ? bindContext(cb, context) : cb; + this._callbacks = this._callbacks || {}; + while (type = types.shift()) { + this._callbacks[type] = this._callbacks[type] || { + sync: [], + async: [] + }; + this._callbacks[type][method].push(cb); + } + return this; + } + function onAsync(types, cb, context) { + return on.call(this, "async", types, cb, context); + } + function onSync(types, cb, context) { + return on.call(this, "sync", types, cb, context); + } + function off(types) { + var type; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + while (type = types.shift()) { + delete this._callbacks[type]; + } + return this; + } + function trigger(types) { + var type, callbacks, args, syncFlush, asyncFlush; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + args = [].slice.call(arguments, 1); + while ((type = types.shift()) && (callbacks = this._callbacks[type])) { + syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args)); + asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args)); + syncFlush() && nextTick(asyncFlush); + } + return this; + } + function getFlush(callbacks, context, args) { + return flush; + function flush() { + var cancelled; + for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) { + cancelled = callbacks[i].apply(context, args) === false; + } + return !cancelled; + } + } + function getNextTick() { + var nextTickFn; + if (window.setImmediate) { + nextTickFn = function nextTickSetImmediate(fn) { + setImmediate(function() { + fn(); + }); + }; + } else { + nextTickFn = function nextTickSetTimeout(fn) { + setTimeout(function() { + fn(); + }, 0); + }; + } + return nextTickFn; + } + function bindContext(fn, context) { + return fn.bind ? fn.bind(context) : function() { + fn.apply(context, [].slice.call(arguments, 0)); + }; + } + }(); + var highlight = function(doc) { + "use strict"; + var defaults = { + node: null, + pattern: null, + tagName: "strong", + className: null, + wordsOnly: false, + caseSensitive: false, + diacriticInsensitive: false + }; + var accented = { + A: "[AaªÀ-Åà-åĀ-ąǍǎȀ-ȃȦȧᴬᵃḀḁẚẠ-ảₐ℀℁℻⒜Ⓐⓐ㍱-㍴㎀-㎄㎈㎉㎩-㎯㏂㏊㏟㏿Aa]", + B: "[BbᴮᵇḂ-ḇℬ⒝Ⓑⓑ㍴㎅-㎇㏃㏈㏔㏝Bb]", + C: "[CcÇçĆ-čᶜ℀ℂ℃℅℆ℭⅭⅽ⒞Ⓒⓒ㍶㎈㎉㎝㎠㎤㏄-㏇Cc]", + D: "[DdĎďDŽ-džDZ-dzᴰᵈḊ-ḓⅅⅆⅮⅾ⒟Ⓓⓓ㋏㍲㍷-㍹㎗㎭-㎯㏅㏈Dd]", + E: "[EeÈ-Ëè-ëĒ-ěȄ-ȇȨȩᴱᵉḘ-ḛẸ-ẽₑ℡ℯℰⅇ⒠Ⓔⓔ㉐㋍㋎Ee]", + F: "[FfᶠḞḟ℉ℱ℻⒡Ⓕⓕ㎊-㎌㎙ff-fflFf]", + G: "[GgĜ-ģǦǧǴǵᴳᵍḠḡℊ⒢Ⓖⓖ㋌㋍㎇㎍-㎏㎓㎬㏆㏉㏒㏿Gg]", + H: "[HhĤĥȞȟʰᴴḢ-ḫẖℋ-ℎ⒣Ⓗⓗ㋌㍱㎐-㎔㏊㏋㏗Hh]", + I: "[IiÌ-Ïì-ïĨ-İIJijǏǐȈ-ȋᴵᵢḬḭỈ-ịⁱℐℑℹⅈⅠ-ⅣⅥ-ⅨⅪⅫⅰ-ⅳⅵ-ⅸⅺⅻ⒤Ⓘⓘ㍺㏌㏕fiffiIi]", + J: "[JjIJ-ĵLJ-njǰʲᴶⅉ⒥ⒿⓙⱼJj]", + K: "[KkĶķǨǩᴷᵏḰ-ḵK⒦Ⓚⓚ㎄㎅㎉㎏㎑㎘㎞㎢㎦㎪㎸㎾㏀㏆㏍-㏏Kk]", + L: "[LlĹ-ŀLJ-ljˡᴸḶḷḺ-ḽℒℓ℡Ⅼⅼ⒧Ⓛⓛ㋏㎈㎉㏐-㏓㏕㏖㏿flfflLl]", + M: "[MmᴹᵐḾ-ṃ℠™ℳⅯⅿ⒨Ⓜⓜ㍷-㍹㎃㎆㎎㎒㎖㎙-㎨㎫㎳㎷㎹㎽㎿㏁㏂㏎㏐㏔-㏖㏘㏙㏞㏟Mm]", + N: "[NnÑñŃ-ʼnNJ-njǸǹᴺṄ-ṋⁿℕ№⒩Ⓝⓝ㎁㎋㎚㎱㎵㎻㏌㏑Nn]", + O: "[OoºÒ-Öò-öŌ-őƠơǑǒǪǫȌ-ȏȮȯᴼᵒỌ-ỏₒ℅№ℴ⒪Ⓞⓞ㍵㏇㏒㏖Oo]", + P: "[PpᴾᵖṔ-ṗℙ⒫Ⓟⓟ㉐㍱㍶㎀㎊㎩-㎬㎰㎴㎺㏋㏗-㏚Pp]", + Q: "[Qqℚ⒬Ⓠⓠ㏃Qq]", + R: "[RrŔ-řȐ-ȓʳᴿᵣṘ-ṛṞṟ₨ℛ-ℝ⒭Ⓡⓡ㋍㍴㎭-㎯㏚㏛Rr]", + S: "[SsŚ-šſȘșˢṠ-ṣ₨℁℠⒮Ⓢⓢ㎧㎨㎮-㎳㏛㏜stSs]", + T: "[TtŢ-ťȚțᵀᵗṪ-ṱẗ℡™⒯Ⓣⓣ㉐㋏㎔㏏ſtstTt]", + U: "[UuÙ-Üù-üŨ-ųƯưǓǔȔ-ȗᵁᵘᵤṲ-ṷỤ-ủ℆⒰Ⓤⓤ㍳㍺Uu]", + V: "[VvᵛᵥṼ-ṿⅣ-Ⅷⅳ-ⅷ⒱Ⓥⓥⱽ㋎㍵㎴-㎹㏜㏞Vv]", + W: "[WwŴŵʷᵂẀ-ẉẘ⒲Ⓦⓦ㎺-㎿㏝Ww]", + X: "[XxˣẊ-ẍₓ℻Ⅸ-Ⅻⅸ-ⅻ⒳Ⓧⓧ㏓Xx]", + Y: "[YyÝýÿŶ-ŸȲȳʸẎẏẙỲ-ỹ⒴Ⓨⓨ㏉Yy]", + Z: "[ZzŹ-žDZ-dzᶻẐ-ẕℤℨ⒵Ⓩⓩ㎐-㎔Zz]" + }; + return function hightlight(o) { + var regex; + o = _.mixin({}, defaults, o); + if (!o.node || !o.pattern) { + return; + } + o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ]; + regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly, o.diacriticInsensitive); + traverse(o.node, hightlightTextNode); + function hightlightTextNode(textNode) { + var match, patternNode, wrapperNode; + if (match = regex.exec(textNode.data)) { + wrapperNode = doc.createElement(o.tagName); + o.className && (wrapperNode.className = o.className); + patternNode = textNode.splitText(match.index); + patternNode.splitText(match[0].length); + wrapperNode.appendChild(patternNode.cloneNode(true)); + textNode.parentNode.replaceChild(wrapperNode, patternNode); + } + return !!match; + } + function traverse(el, hightlightTextNode) { + var childNode, TEXT_NODE_TYPE = 3; + for (var i = 0; i < el.childNodes.length; i++) { + childNode = el.childNodes[i]; + if (childNode.nodeType === TEXT_NODE_TYPE) { + i += hightlightTextNode(childNode) ? 1 : 0; + } else { + traverse(childNode, hightlightTextNode); + } + } + } + }; + function accent_replacer(chr) { + return accented[chr.toUpperCase()] || chr; + } + function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensitive) { + var escapedPatterns = [], regexStr; + for (var i = 0, len = patterns.length; i < len; i++) { + var escapedWord = _.escapeRegExChars(patterns[i]); + if (diacriticInsensitive) { + escapedWord = escapedWord.replace(/\S/g, accent_replacer); + } + escapedPatterns.push(escapedWord); + } + regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")"; + return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i"); + } + }(window.document); + var Input = function() { + "use strict"; + var specialKeyCodeMap; + specialKeyCodeMap = { + 9: "tab", + 27: "esc", + 37: "left", + 39: "right", + 13: "enter", + 38: "up", + 40: "down" + }; + function Input(o, www) { + var id; + o = o || {}; + if (!o.input) { + $.error("input is missing"); + } + www.mixin(this); + this.$hint = $(o.hint); + this.$input = $(o.input); + this.$menu = $(o.menu); + id = this.$input.attr("id") || _.guid(); + this.$menu.attr("id", id + "_listbox"); + this.$hint.attr({ + "aria-hidden": true + }); + this.$input.attr({ + "aria-owns": id + "_listbox", + role: "combobox", + "aria-autocomplete": "list", + "aria-expanded": false + }); + this.query = this.$input.val(); + this.queryWhenFocused = this.hasFocus() ? this.query : null; + this.$overflowHelper = buildOverflowHelper(this.$input); + this._checkLanguageDirection(); + if (this.$hint.length === 0) { + this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop; + } + this.onSync("cursorchange", this._updateDescendent); + } + Input.normalizeQuery = function(str) { + return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " "); + }; + _.mixin(Input.prototype, EventEmitter, { + _onBlur: function onBlur() { + this.resetInputValue(); + this.trigger("blurred"); + }, + _onFocus: function onFocus() { + this.queryWhenFocused = this.query; + this.trigger("focused"); + }, + _onKeydown: function onKeydown($e) { + var keyName = specialKeyCodeMap[$e.which || $e.keyCode]; + this._managePreventDefault(keyName, $e); + if (keyName && this._shouldTrigger(keyName, $e)) { + this.trigger(keyName + "Keyed", $e); + } + }, + _onInput: function onInput() { + this._setQuery(this.getInputValue()); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + _managePreventDefault: function managePreventDefault(keyName, $e) { + var preventDefault; + switch (keyName) { + case "up": + case "down": + preventDefault = !withModifier($e); + break; + + default: + preventDefault = false; + } + preventDefault && $e.preventDefault(); + }, + _shouldTrigger: function shouldTrigger(keyName, $e) { + var trigger; + switch (keyName) { + case "tab": + trigger = !withModifier($e); + break; + + default: + trigger = true; + } + return trigger; + }, + _checkLanguageDirection: function checkLanguageDirection() { + var dir = (this.$input.css("direction") || "ltr").toLowerCase(); + if (this.dir !== dir) { + this.dir = dir; + this.$hint.attr("dir", dir); + this.trigger("langDirChanged", dir); + } + }, + _setQuery: function setQuery(val, silent) { + var areEquivalent, hasDifferentWhitespace; + areEquivalent = areQueriesEquivalent(val, this.query); + hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false; + this.query = val; + if (!silent && !areEquivalent) { + this.trigger("queryChanged", this.query); + } else if (!silent && hasDifferentWhitespace) { + this.trigger("whitespaceChanged", this.query); + } + }, + _updateDescendent: function updateDescendent(event, id) { + this.$input.attr("aria-activedescendant", id); + }, + bind: function() { + var that = this, onBlur, onFocus, onKeydown, onInput; + onBlur = _.bind(this._onBlur, this); + onFocus = _.bind(this._onFocus, this); + onKeydown = _.bind(this._onKeydown, this); + onInput = _.bind(this._onInput, this); + this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown); + if (!_.isMsie() || _.isMsie() > 9) { + this.$input.on("input.tt", onInput); + } else { + this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) { + if (specialKeyCodeMap[$e.which || $e.keyCode]) { + return; + } + _.defer(_.bind(that._onInput, that, $e)); + }); + } + return this; + }, + focus: function focus() { + this.$input.focus(); + }, + blur: function blur() { + this.$input.blur(); + }, + getLangDir: function getLangDir() { + return this.dir; + }, + getQuery: function getQuery() { + return this.query || ""; + }, + setQuery: function setQuery(val, silent) { + this.setInputValue(val); + this._setQuery(val, silent); + }, + hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() { + return this.query !== this.queryWhenFocused; + }, + getInputValue: function getInputValue() { + return this.$input.val(); + }, + setInputValue: function setInputValue(value) { + this.$input.val(value); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + resetInputValue: function resetInputValue() { + this.setInputValue(this.query); + }, + getHint: function getHint() { + return this.$hint.val(); + }, + setHint: function setHint(value) { + this.$hint.val(value); + }, + clearHint: function clearHint() { + this.setHint(""); + }, + clearHintIfInvalid: function clearHintIfInvalid() { + var val, hint, valIsPrefixOfHint, isValid; + val = this.getInputValue(); + hint = this.getHint(); + valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0; + isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow(); + !isValid && this.clearHint(); + }, + hasFocus: function hasFocus() { + return this.$input.is(":focus"); + }, + hasOverflow: function hasOverflow() { + var constraint = this.$input.width() - 2; + this.$overflowHelper.text(this.getInputValue()); + return this.$overflowHelper.width() >= constraint; + }, + isCursorAtEnd: function() { + var valueLength, selectionStart, range; + valueLength = this.$input.val().length; + selectionStart = this.$input[0].selectionStart; + if (_.isNumber(selectionStart)) { + return selectionStart === valueLength; + } else if (document.selection) { + range = document.selection.createRange(); + range.moveStart("character", -valueLength); + return valueLength === range.text.length; + } + return true; + }, + destroy: function destroy() { + this.$hint.off(".tt"); + this.$input.off(".tt"); + this.$overflowHelper.remove(); + this.$hint = this.$input = this.$overflowHelper = $("
"); + }, + setAriaExpanded: function setAriaExpanded(value) { + this.$input.attr("aria-expanded", value); + } + }); + return Input; + function buildOverflowHelper($input) { + return $('').css({ + position: "absolute", + visibility: "hidden", + whiteSpace: "pre", + fontFamily: $input.css("font-family"), + fontSize: $input.css("font-size"), + fontStyle: $input.css("font-style"), + fontVariant: $input.css("font-variant"), + fontWeight: $input.css("font-weight"), + wordSpacing: $input.css("word-spacing"), + letterSpacing: $input.css("letter-spacing"), + textIndent: $input.css("text-indent"), + textRendering: $input.css("text-rendering"), + textTransform: $input.css("text-transform") + }).insertAfter($input); + } + function areQueriesEquivalent(a, b) { + return Input.normalizeQuery(a) === Input.normalizeQuery(b); + } + function withModifier($e) { + return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey; + } + }(); + var Dataset = function() { + "use strict"; + var keys, nameGenerator; + keys = { + dataset: "tt-selectable-dataset", + val: "tt-selectable-display", + obj: "tt-selectable-object" + }; + nameGenerator = _.getIdGenerator(); + function Dataset(o, www) { + o = o || {}; + o.templates = o.templates || {}; + o.templates.notFound = o.templates.notFound || o.templates.empty; + if (!o.source) { + $.error("missing source"); + } + if (!o.node) { + $.error("missing node"); + } + if (o.name && !isValidName(o.name)) { + $.error("invalid dataset name: " + o.name); + } + www.mixin(this); + this.highlight = !!o.highlight; + this.name = _.toStr(o.name || nameGenerator()); + this.limit = o.limit || 5; + this.displayFn = getDisplayFn(o.display || o.displayKey); + this.templates = getTemplates(o.templates, this.displayFn); + this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source; + this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async; + this._resetLastSuggestion(); + this.$el = $(o.node).attr("role", "presentation").addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name); + } + Dataset.extractData = function extractData(el) { + var $el = $(el); + if ($el.data(keys.obj)) { + return { + dataset: $el.data(keys.dataset) || "", + val: $el.data(keys.val) || "", + obj: $el.data(keys.obj) || null + }; + } + return null; + }; + _.mixin(Dataset.prototype, EventEmitter, { + _overwrite: function overwrite(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (this.async && this.templates.pending) { + this._renderPending(query); + } else if (!this.async && this.templates.notFound) { + this._renderNotFound(query); + } else { + this._empty(); + } + this.trigger("rendered", suggestions, false, this.name); + }, + _append: function append(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length && this.$lastSuggestion.length) { + this._appendSuggestions(query, suggestions); + } else if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (!this.$lastSuggestion.length && this.templates.notFound) { + this._renderNotFound(query); + } + this.trigger("rendered", suggestions, true, this.name); + }, + _renderSuggestions: function renderSuggestions(query, suggestions) { + var $fragment; + $fragment = this._getSuggestionsFragment(query, suggestions); + this.$lastSuggestion = $fragment.children().last(); + this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions)); + }, + _appendSuggestions: function appendSuggestions(query, suggestions) { + var $fragment, $lastSuggestion; + $fragment = this._getSuggestionsFragment(query, suggestions); + $lastSuggestion = $fragment.children().last(); + this.$lastSuggestion.after($fragment); + this.$lastSuggestion = $lastSuggestion; + }, + _renderPending: function renderPending(query) { + var template = this.templates.pending; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _renderNotFound: function renderNotFound(query) { + var template = this.templates.notFound; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _empty: function empty() { + this.$el.empty(); + this._resetLastSuggestion(); + }, + _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) { + var that = this, fragment; + fragment = document.createDocumentFragment(); + _.each(suggestions, function getSuggestionNode(suggestion) { + var $el, context; + context = that._injectQuery(query, suggestion); + $el = $(that.templates.suggestion(context)).data(keys.dataset, that.name).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable); + fragment.appendChild($el[0]); + }); + this.highlight && highlight({ + className: this.classes.highlight, + node: fragment, + pattern: query + }); + return $(fragment); + }, + _getFooter: function getFooter(query, suggestions) { + return this.templates.footer ? this.templates.footer({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _getHeader: function getHeader(query, suggestions) { + return this.templates.header ? this.templates.header({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _resetLastSuggestion: function resetLastSuggestion() { + this.$lastSuggestion = $(); + }, + _injectQuery: function injectQuery(query, obj) { + return _.isObject(obj) ? _.mixin({ + _query: query + }, obj) : obj; + }, + update: function update(query) { + var that = this, canceled = false, syncCalled = false, rendered = 0; + this.cancel(); + this.cancel = function cancel() { + canceled = true; + that.cancel = $.noop; + that.async && that.trigger("asyncCanceled", query, that.name); + }; + this.source(query, sync, async); + !syncCalled && sync([]); + function sync(suggestions) { + if (syncCalled) { + return; + } + syncCalled = true; + suggestions = (suggestions || []).slice(0, that.limit); + rendered = suggestions.length; + that._overwrite(query, suggestions); + if (rendered < that.limit && that.async) { + that.trigger("asyncRequested", query, that.name); + } + } + function async(suggestions) { + suggestions = suggestions || []; + if (!canceled && rendered < that.limit) { + that.cancel = $.noop; + var idx = Math.abs(rendered - that.limit); + rendered += idx; + that._append(query, suggestions.slice(0, idx)); + that.async && that.trigger("asyncReceived", query, that.name); + } + } + }, + cancel: $.noop, + clear: function clear() { + this._empty(); + this.cancel(); + this.trigger("cleared"); + }, + isEmpty: function isEmpty() { + return this.$el.is(":empty"); + }, + destroy: function destroy() { + this.$el = $("
"); + } + }); + return Dataset; + function getDisplayFn(display) { + display = display || _.stringify; + return _.isFunction(display) ? display : displayFn; + function displayFn(obj) { + return obj[display]; + } + } + function getTemplates(templates, displayFn) { + return { + notFound: templates.notFound && _.templatify(templates.notFound), + pending: templates.pending && _.templatify(templates.pending), + header: templates.header && _.templatify(templates.header), + footer: templates.footer && _.templatify(templates.footer), + suggestion: templates.suggestion ? userSuggestionTemplate : suggestionTemplate + }; + function userSuggestionTemplate(context) { + var template = templates.suggestion; + return $(template(context)).attr("id", _.guid()); + } + function suggestionTemplate(context) { + return $('
').attr("id", _.guid()).text(displayFn(context)); + } + } + function isValidName(str) { + return /^[_a-zA-Z0-9-]+$/.test(str); + } + }(); + var Menu = function() { + "use strict"; + function Menu(o, www) { + var that = this; + o = o || {}; + if (!o.node) { + $.error("node is required"); + } + www.mixin(this); + this.$node = $(o.node); + this.query = null; + this.datasets = _.map(o.datasets, initializeDataset); + function initializeDataset(oDataset) { + var node = that.$node.find(oDataset.node).first(); + oDataset.node = node.length ? node : $("
").appendTo(that.$node); + return new Dataset(oDataset, www); + } + } + _.mixin(Menu.prototype, EventEmitter, { + _onSelectableClick: function onSelectableClick($e) { + this.trigger("selectableClicked", $($e.currentTarget)); + }, + _onRendered: function onRendered(type, dataset, suggestions, async) { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetRendered", dataset, suggestions, async); + }, + _onCleared: function onCleared() { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetCleared"); + }, + _propagate: function propagate() { + this.trigger.apply(this, arguments); + }, + _allDatasetsEmpty: function allDatasetsEmpty() { + return _.every(this.datasets, _.bind(function isDatasetEmpty(dataset) { + var isEmpty = dataset.isEmpty(); + this.$node.attr("aria-expanded", !isEmpty); + return isEmpty; + }, this)); + }, + _getSelectables: function getSelectables() { + return this.$node.find(this.selectors.selectable); + }, + _removeCursor: function _removeCursor() { + var $selectable = this.getActiveSelectable(); + $selectable && $selectable.removeClass(this.classes.cursor); + }, + _ensureVisible: function ensureVisible($el) { + var elTop, elBottom, nodeScrollTop, nodeHeight; + elTop = $el.position().top; + elBottom = elTop + $el.outerHeight(true); + nodeScrollTop = this.$node.scrollTop(); + nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10); + if (elTop < 0) { + this.$node.scrollTop(nodeScrollTop + elTop); + } else if (nodeHeight < elBottom) { + this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight)); + } + }, + bind: function() { + var that = this, onSelectableClick; + onSelectableClick = _.bind(this._onSelectableClick, this); + this.$node.on("click.tt", this.selectors.selectable, onSelectableClick); + this.$node.on("mouseover", this.selectors.selectable, function() { + that.setCursor($(this)); + }); + this.$node.on("mouseleave", function() { + that._removeCursor(); + }); + _.each(this.datasets, function(dataset) { + dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that); + }); + return this; + }, + isOpen: function isOpen() { + return this.$node.hasClass(this.classes.open); + }, + open: function open() { + this.$node.scrollTop(0); + this.$node.addClass(this.classes.open); + }, + close: function close() { + this.$node.attr("aria-expanded", false); + this.$node.removeClass(this.classes.open); + this._removeCursor(); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.attr("dir", dir); + }, + selectableRelativeToCursor: function selectableRelativeToCursor(delta) { + var $selectables, $oldCursor, oldIndex, newIndex; + $oldCursor = this.getActiveSelectable(); + $selectables = this._getSelectables(); + oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1; + newIndex = oldIndex + delta; + newIndex = (newIndex + 1) % ($selectables.length + 1) - 1; + newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex; + return newIndex === -1 ? null : $selectables.eq(newIndex); + }, + setCursor: function setCursor($selectable) { + this._removeCursor(); + if ($selectable = $selectable && $selectable.first()) { + $selectable.addClass(this.classes.cursor); + this._ensureVisible($selectable); + } + }, + getSelectableData: function getSelectableData($el) { + return $el && $el.length ? Dataset.extractData($el) : null; + }, + getActiveSelectable: function getActiveSelectable() { + var $selectable = this._getSelectables().filter(this.selectors.cursor).first(); + return $selectable.length ? $selectable : null; + }, + getTopSelectable: function getTopSelectable() { + var $selectable = this._getSelectables().first(); + return $selectable.length ? $selectable : null; + }, + update: function update(query) { + var isValidUpdate = query !== this.query; + if (isValidUpdate) { + this.query = query; + _.each(this.datasets, updateDataset); + } + return isValidUpdate; + function updateDataset(dataset) { + dataset.update(query); + } + }, + empty: function empty() { + _.each(this.datasets, clearDataset); + this.query = null; + this.$node.addClass(this.classes.empty); + function clearDataset(dataset) { + dataset.clear(); + } + }, + destroy: function destroy() { + this.$node.off(".tt"); + this.$node = $("
"); + _.each(this.datasets, destroyDataset); + function destroyDataset(dataset) { + dataset.destroy(); + } + } + }); + return Menu; + }(); + var Status = function() { + "use strict"; + function Status(options) { + this.$el = $("", { + role: "status", + "aria-live": "polite" + }).css({ + position: "absolute", + padding: "0", + border: "0", + height: "1px", + width: "1px", + "margin-bottom": "-1px", + "margin-right": "-1px", + overflow: "hidden", + clip: "rect(0 0 0 0)", + "white-space": "nowrap" + }); + options.$input.after(this.$el); + _.each(options.menu.datasets, _.bind(function(dataset) { + if (dataset.onSync) { + dataset.onSync("rendered", _.bind(this.update, this)); + dataset.onSync("cleared", _.bind(this.cleared, this)); + } + }, this)); + } + _.mixin(Status.prototype, { + update: function update(event, suggestions) { + var length = suggestions.length; + var words; + if (length === 1) { + words = { + result: "result", + is: "is" + }; + } else { + words = { + result: "results", + is: "are" + }; + } + this.$el.text(length + " " + words.result + " " + words.is + " available, use up and down arrow keys to navigate."); + }, + cleared: function() { + this.$el.text(""); + } + }); + return Status; + }(); + var DefaultMenu = function() { + "use strict"; + var s = Menu.prototype; + function DefaultMenu() { + Menu.apply(this, [].slice.call(arguments, 0)); + } + _.mixin(DefaultMenu.prototype, Menu.prototype, { + open: function open() { + !this._allDatasetsEmpty() && this._show(); + return s.open.apply(this, [].slice.call(arguments, 0)); + }, + close: function close() { + this._hide(); + return s.close.apply(this, [].slice.call(arguments, 0)); + }, + _onRendered: function onRendered() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onRendered.apply(this, [].slice.call(arguments, 0)); + }, + _onCleared: function onCleared() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onCleared.apply(this, [].slice.call(arguments, 0)); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl); + return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0)); + }, + _hide: function hide() { + this.$node.hide(); + }, + _show: function show() { + this.$node.css("display", "block"); + } + }); + return DefaultMenu; + }(); + var Typeahead = function() { + "use strict"; + function Typeahead(o, www) { + var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged; + o = o || {}; + if (!o.input) { + $.error("missing input"); + } + if (!o.menu) { + $.error("missing menu"); + } + if (!o.eventBus) { + $.error("missing event bus"); + } + www.mixin(this); + this.eventBus = o.eventBus; + this.minLength = _.isNumber(o.minLength) ? o.minLength : 1; + this.input = o.input; + this.menu = o.menu; + this.enabled = true; + this.autoselect = !!o.autoselect; + this.active = false; + this.input.hasFocus() && this.activate(); + this.dir = this.input.getLangDir(); + this._hacks(); + this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this); + onFocused = c(this, "activate", "open", "_onFocused"); + onBlurred = c(this, "deactivate", "_onBlurred"); + onEnterKeyed = c(this, "isActive", "isOpen", "_onEnterKeyed"); + onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed"); + onEscKeyed = c(this, "isActive", "_onEscKeyed"); + onUpKeyed = c(this, "isActive", "open", "_onUpKeyed"); + onDownKeyed = c(this, "isActive", "open", "_onDownKeyed"); + onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed"); + onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed"); + onQueryChanged = c(this, "_openIfActive", "_onQueryChanged"); + onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged"); + this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this); + } + _.mixin(Typeahead.prototype, { + _hacks: function hacks() { + var $input, $menu; + $input = this.input.$input || $("
"); + $menu = this.menu.$node || $("
"); + $input.on("blur.tt", function($e) { + var active, isActive, hasActive; + active = document.activeElement; + isActive = $menu.is(active); + hasActive = $menu.has(active).length > 0; + if (_.isMsie() && (isActive || hasActive)) { + $e.preventDefault(); + $e.stopImmediatePropagation(); + _.defer(function() { + $input.focus(); + }); + } + }); + $menu.on("mousedown.tt", function($e) { + $e.preventDefault(); + }); + }, + _onSelectableClicked: function onSelectableClicked(type, $el) { + this.select($el); + }, + _onDatasetCleared: function onDatasetCleared() { + this._updateHint(); + }, + _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) { + this._updateHint(); + if (this.autoselect) { + var cursorClass = this.selectors.cursor.substr(1); + this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass); + } + this.eventBus.trigger("render", suggestions, async, dataset); + }, + _onAsyncRequested: function onAsyncRequested(type, dataset, query) { + this.eventBus.trigger("asyncrequest", query, dataset); + }, + _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) { + this.eventBus.trigger("asynccancel", query, dataset); + }, + _onAsyncReceived: function onAsyncReceived(type, dataset, query) { + this.eventBus.trigger("asyncreceive", query, dataset); + }, + _onFocused: function onFocused() { + this._minLengthMet() && this.menu.update(this.input.getQuery()); + }, + _onBlurred: function onBlurred() { + if (this.input.hasQueryChangedSinceLastFocus()) { + this.eventBus.trigger("change", this.input.getQuery()); + } + }, + _onEnterKeyed: function onEnterKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + if (this.select($selectable)) { + $e.preventDefault(); + $e.stopPropagation(); + } + } else if (this.autoselect) { + if (this.select(this.menu.getTopSelectable())) { + $e.preventDefault(); + $e.stopPropagation(); + } + } + }, + _onTabKeyed: function onTabKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + this.select($selectable) && $e.preventDefault(); + } else if (this.autoselect) { + if ($selectable = this.menu.getTopSelectable()) { + this.autocomplete($selectable) && $e.preventDefault(); + } + } + }, + _onEscKeyed: function onEscKeyed() { + this.close(); + }, + _onUpKeyed: function onUpKeyed() { + this.moveCursor(-1); + }, + _onDownKeyed: function onDownKeyed() { + this.moveCursor(+1); + }, + _onLeftKeyed: function onLeftKeyed() { + if (this.dir === "rtl" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onRightKeyed: function onRightKeyed() { + if (this.dir === "ltr" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onQueryChanged: function onQueryChanged(e, query) { + this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty(); + }, + _onWhitespaceChanged: function onWhitespaceChanged() { + this._updateHint(); + }, + _onLangDirChanged: function onLangDirChanged(e, dir) { + if (this.dir !== dir) { + this.dir = dir; + this.menu.setLanguageDirection(dir); + } + }, + _openIfActive: function openIfActive() { + this.isActive() && this.open(); + }, + _minLengthMet: function minLengthMet(query) { + query = _.isString(query) ? query : this.input.getQuery() || ""; + return query.length >= this.minLength; + }, + _updateHint: function updateHint() { + var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match; + $selectable = this.menu.getTopSelectable(); + data = this.menu.getSelectableData($selectable); + val = this.input.getInputValue(); + if (data && !_.isBlankString(val) && !this.input.hasOverflow()) { + query = Input.normalizeQuery(val); + escapedQuery = _.escapeRegExChars(query); + frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i"); + match = frontMatchRegEx.exec(data.val); + match && this.input.setHint(val + match[1]); + } else { + this.input.clearHint(); + } + }, + isEnabled: function isEnabled() { + return this.enabled; + }, + enable: function enable() { + this.enabled = true; + }, + disable: function disable() { + this.enabled = false; + }, + isActive: function isActive() { + return this.active; + }, + activate: function activate() { + if (this.isActive()) { + return true; + } else if (!this.isEnabled() || this.eventBus.before("active")) { + return false; + } else { + this.active = true; + this.eventBus.trigger("active"); + return true; + } + }, + deactivate: function deactivate() { + if (!this.isActive()) { + return true; + } else if (this.eventBus.before("idle")) { + return false; + } else { + this.active = false; + this.close(); + this.eventBus.trigger("idle"); + return true; + } + }, + isOpen: function isOpen() { + return this.menu.isOpen(); + }, + open: function open() { + if (!this.isOpen() && !this.eventBus.before("open")) { + this.input.setAriaExpanded(true); + this.menu.open(); + this._updateHint(); + this.eventBus.trigger("open"); + } + return this.isOpen(); + }, + close: function close() { + if (this.isOpen() && !this.eventBus.before("close")) { + this.input.setAriaExpanded(false); + this.menu.close(); + this.input.clearHint(); + this.input.resetInputValue(); + this.eventBus.trigger("close"); + } + return !this.isOpen(); + }, + setVal: function setVal(val) { + this.input.setQuery(_.toStr(val)); + }, + getVal: function getVal() { + return this.input.getQuery(); + }, + select: function select($selectable) { + var data = this.menu.getSelectableData($selectable); + if (data && !this.eventBus.before("select", data.obj, data.dataset)) { + this.input.setQuery(data.val, true); + this.eventBus.trigger("select", data.obj, data.dataset); + this.close(); + return true; + } + return false; + }, + autocomplete: function autocomplete($selectable) { + var query, data, isValid; + query = this.input.getQuery(); + data = this.menu.getSelectableData($selectable); + isValid = data && query !== data.val; + if (isValid && !this.eventBus.before("autocomplete", data.obj, data.dataset)) { + this.input.setQuery(data.val); + this.eventBus.trigger("autocomplete", data.obj, data.dataset); + return true; + } + return false; + }, + moveCursor: function moveCursor(delta) { + var query, $candidate, data, suggestion, datasetName, cancelMove, id; + query = this.input.getQuery(); + $candidate = this.menu.selectableRelativeToCursor(delta); + data = this.menu.getSelectableData($candidate); + suggestion = data ? data.obj : null; + datasetName = data ? data.dataset : null; + id = $candidate ? $candidate.attr("id") : null; + this.input.trigger("cursorchange", id); + cancelMove = this._minLengthMet() && this.menu.update(query); + if (!cancelMove && !this.eventBus.before("cursorchange", suggestion, datasetName)) { + this.menu.setCursor($candidate); + if (data) { + if (typeof data.val === "string") { + this.input.setInputValue(data.val); + } + } else { + this.input.resetInputValue(); + this._updateHint(); + } + this.eventBus.trigger("cursorchange", suggestion, datasetName); + return true; + } + return false; + }, + destroy: function destroy() { + this.input.destroy(); + this.menu.destroy(); + } + }); + return Typeahead; + function c(ctx) { + var methods = [].slice.call(arguments, 1); + return function() { + var args = [].slice.call(arguments); + _.each(methods, function(method) { + return ctx[method].apply(ctx, args); + }); + }; + } + }(); + (function() { + "use strict"; + var old, keys, methods; + old = $.fn.typeahead; + keys = { + www: "tt-www", + attrs: "tt-attrs", + typeahead: "tt-typeahead" + }; + methods = { + initialize: function initialize(o, datasets) { + var www; + datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1); + o = o || {}; + www = WWW(o.classNames); + return this.each(attach); + function attach() { + var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor; + _.each(datasets, function(d) { + d.highlight = !!o.highlight; + }); + $input = $(this); + $wrapper = $(www.html.wrapper); + $hint = $elOrNull(o.hint); + $menu = $elOrNull(o.menu); + defaultHint = o.hint !== false && !$hint; + defaultMenu = o.menu !== false && !$menu; + defaultHint && ($hint = buildHintFromInput($input, www)); + defaultMenu && ($menu = $(www.html.menu).css(www.css.menu)); + $hint && $hint.val(""); + $input = prepInput($input, www); + if (defaultHint || defaultMenu) { + $wrapper.css(www.css.wrapper); + $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint); + $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null); + } + MenuConstructor = defaultMenu ? DefaultMenu : Menu; + eventBus = new EventBus({ + el: $input + }); + input = new Input({ + hint: $hint, + input: $input, + menu: $menu + }, www); + menu = new MenuConstructor({ + node: $menu, + datasets: datasets + }, www); + status = new Status({ + $input: $input, + menu: menu + }); + typeahead = new Typeahead({ + input: input, + menu: menu, + eventBus: eventBus, + minLength: o.minLength, + autoselect: o.autoselect + }, www); + $input.data(keys.www, www); + $input.data(keys.typeahead, typeahead); + } + }, + isEnabled: function isEnabled() { + var enabled; + ttEach(this.first(), function(t) { + enabled = t.isEnabled(); + }); + return enabled; + }, + enable: function enable() { + ttEach(this, function(t) { + t.enable(); + }); + return this; + }, + disable: function disable() { + ttEach(this, function(t) { + t.disable(); + }); + return this; + }, + isActive: function isActive() { + var active; + ttEach(this.first(), function(t) { + active = t.isActive(); + }); + return active; + }, + activate: function activate() { + ttEach(this, function(t) { + t.activate(); + }); + return this; + }, + deactivate: function deactivate() { + ttEach(this, function(t) { + t.deactivate(); + }); + return this; + }, + isOpen: function isOpen() { + var open; + ttEach(this.first(), function(t) { + open = t.isOpen(); + }); + return open; + }, + open: function open() { + ttEach(this, function(t) { + t.open(); + }); + return this; + }, + close: function close() { + ttEach(this, function(t) { + t.close(); + }); + return this; + }, + select: function select(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.select($el); + }); + return success; + }, + autocomplete: function autocomplete(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.autocomplete($el); + }); + return success; + }, + moveCursor: function moveCursoe(delta) { + var success = false; + ttEach(this.first(), function(t) { + success = t.moveCursor(delta); + }); + return success; + }, + val: function val(newVal) { + var query; + if (!arguments.length) { + ttEach(this.first(), function(t) { + query = t.getVal(); + }); + return query; + } else { + ttEach(this, function(t) { + t.setVal(_.toStr(newVal)); + }); + return this; + } + }, + destroy: function destroy() { + ttEach(this, function(typeahead, $input) { + revert($input); + typeahead.destroy(); + }); + return this; + } + }; + $.fn.typeahead = function(method) { + if (methods[method]) { + return methods[method].apply(this, [].slice.call(arguments, 1)); + } else { + return methods.initialize.apply(this, arguments); + } + }; + $.fn.typeahead.noConflict = function noConflict() { + $.fn.typeahead = old; + return this; + }; + function ttEach($els, fn) { + $els.each(function() { + var $input = $(this), typeahead; + (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input); + }); + } + function buildHintFromInput($input, www) { + return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({ + readonly: true, + required: false + }).removeAttr("id name placeholder").removeClass("required").attr({ + spellcheck: "false", + tabindex: -1 + }); + } + function prepInput($input, www) { + $input.data(keys.attrs, { + dir: $input.attr("dir"), + autocomplete: $input.attr("autocomplete"), + spellcheck: $input.attr("spellcheck"), + style: $input.attr("style") + }); + $input.addClass(www.classes.input).attr({ + spellcheck: false + }); + try { + !$input.attr("dir") && $input.attr("dir", "auto"); + } catch (e) {} + return $input; + } + function getBackgroundStyles($el) { + return { + backgroundAttachment: $el.css("background-attachment"), + backgroundClip: $el.css("background-clip"), + backgroundColor: $el.css("background-color"), + backgroundImage: $el.css("background-image"), + backgroundOrigin: $el.css("background-origin"), + backgroundPosition: $el.css("background-position"), + backgroundRepeat: $el.css("background-repeat"), + backgroundSize: $el.css("background-size") + }; + } + function revert($input) { + var www, $wrapper; + www = $input.data(keys.www); + $wrapper = $input.parent().filter(www.selectors.wrapper); + _.each($input.data(keys.attrs), function(val, key) { + _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val); + }); + $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input); + if ($wrapper.length) { + $input.detach().insertAfter($wrapper); + $wrapper.remove(); + } + } + function $elOrNull(obj) { + var isValid, $el; + isValid = _.isJQuery(obj) || _.isElement(obj); + $el = isValid ? $(obj).first() : []; + return $el.length ? $el : null; + } + })(); +}); \ No newline at end of file diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/search.json b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/search.json new file mode 100644 index 0000000..0ec754a --- /dev/null +++ b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/Documents/search.json @@ -0,0 +1 @@ +{"Structs.html#/s:14ButtonMerchant7VersionV":{"name":"Version","abstract":"\u003cp\u003eButton Merchant Library Version.\u003c/p\u003e"},"Protocols/Configurable.html#/c:@M@ButtonMerchant@objc(pl)Configurable(py)includesIFA":{"name":"includesIFA","abstract":"\u003cdiv class=\"aside aside-important\"\u003e","parent_name":"Configurable"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)id":{"name":"id","abstract":"\u003cp\u003eThe product identifier.\u003c/p\u003e","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)upc":{"name":"upc","abstract":"\u003cp\u003eThe UPC (Universal Product Code) of the product.\u003c/p\u003e","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)categories":{"name":"categories","abstract":"\u003cp\u003eA flat array of the names of the categories to which the product belongs.\u003c/p\u003e","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)name":{"name":"name","abstract":"\u003cp\u003eThe name of the product.\u003c/p\u003e","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)currency":{"name":"currency","abstract":"\u003cp\u003eThe ISO-4217 currency code in which the product\u0026rsquo;s value is reported.\u003c/p\u003e","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)value":{"name":"value","abstract":"\u003cp\u003eThe value of the order. Includes any discounts, if applicable. Example: 1234 for $12.34.\u003c/p\u003e","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)quantity":{"name":"quantity","abstract":"\u003cp\u003eThe quantity of the product.\u003c/p\u003e","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)url":{"name":"url","abstract":"\u003cp\u003eThe URL of the product.\u003c/p\u003e","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)attributes":{"name":"attributes","abstract":"\u003cp\u003eAny additional attributes to be included with the product.\u003c/p\u003e","parent_name":"ButtonProductCompatible"},"Protocols/Activity.html#/c:@M@ButtonMerchant@objc(pl)Activity(im)productViewed:":{"name":"productViewed(_:)","abstract":"\u003cp\u003eReport that the user has viewed a product.\u003c/p\u003e","parent_name":"Activity"},"Protocols/Activity.html#/c:@M@ButtonMerchant@objc(pl)Activity(im)productAddedToCart:":{"name":"productAddedToCart(_:)","abstract":"\u003cp\u003eReport that the user added a product to their cart.\u003c/p\u003e","parent_name":"Activity"},"Protocols/Activity.html#/c:@M@ButtonMerchant@objc(pl)Activity(im)cartViewed:":{"name":"cartViewed(_:)","abstract":"\u003cp\u003eReport that the user viewed their cart.\u003c/p\u003e","parent_name":"Activity"},"Protocols/Activity.html":{"name":"Activity","abstract":"\u003cp\u003eA protocol through which user activities can be reported.\u003c/p\u003e"},"Protocols/ButtonProductCompatible.html":{"name":"ButtonProductCompatible","abstract":"\u003cp\u003eA protocol that defines the product properties that may be provided when reporting user activity.\u003c/p\u003e"},"Protocols/Configurable.html":{"name":"Configurable"},"Enums/NetworkError.html#/s:14ButtonMerchant12NetworkErrorO7unknownyA2CmF":{"name":"unknown","abstract":"\u003cp\u003eThere was an unknown network error.\u003c/p\u003e","parent_name":"NetworkError"},"Enums/ConfigurationError.html#/s:14ButtonMerchant18ConfigurationErrorO15noApplicationIdyA2CmF":{"name":"noApplicationId","abstract":"\u003cp\u003eLibrary is not configured with an \u003ccode\u003eapplicationId\u003c/code\u003e\u003c/p\u003e","parent_name":"ConfigurationError"},"Enums/ConfigurationError.html#/s:14ButtonMerchant18ConfigurationErrorO20invalidApplicationIdyACSS_tcACmF":{"name":"invalidApplicationId(appicationId:)","parent_name":"ConfigurationError"},"Enums/ButtonMerchantError.html#/s:14ButtonMerchant0aB5ErrorO021trackOrderDeprecationC0yA2CmF":{"name":"trackOrderDeprecationError","parent_name":"ButtonMerchantError"},"Enums/ButtonMerchantError.html#/s:14ButtonMerchant0aB5ErrorO08noEventsC0yA2CmF":{"name":"noEventsError","parent_name":"ButtonMerchantError"},"Enums/ButtonMerchantError.html":{"name":"ButtonMerchantError","abstract":"\u003cp\u003eButton Merchant Library Errors.\u003c/p\u003e"},"Enums/ConfigurationError.html":{"name":"ConfigurationError","abstract":"\u003cp\u003eButton Merchant Library Configuration Error.\u003c/p\u003e"},"Enums/NetworkError.html":{"name":"NetworkError","abstract":"\u003cp\u003eButton Merchant Library Configuration Error.\u003c/p\u003e"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC8quantitySivp":{"name":"quantity","abstract":"\u003cp\u003eThe number of unique units represented by this line item (default is 1).\u003c/p\u003e","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC15itemDescriptionSSSgvp":{"name":"itemDescription","abstract":"\u003cp\u003eText describing the line item.\u003c/p\u003e","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC3skuSSSgvp":{"name":"sku","abstract":"\u003cp\u003eThe Stock Keeping Unit of the line item.\u003c/p\u003e","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC3upcSSSgvp":{"name":"upc","abstract":"\u003cp\u003eThe Universal Product Code of the line item.\u003c/p\u003e","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC8categorySaySSGSgvp":{"name":"category","abstract":"\u003cp\u003eThe category of the line item.","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC10attributesSDyS2SGSgvp":{"name":"attributes","abstract":"\u003cp\u003eA key/value store for strings to specify additional information about a line item.\u003c/p\u003e","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC2id5totalAESS_s5Int64Vtcfc":{"name":"init(id:total:)","abstract":"\u003cp\u003eAn array of the line item details that comprise the order\u003c/p\u003e","parent_name":"LineItem"},"Classes/Order/Customer.html#/s:14ButtonMerchant5OrderC8CustomerC5emailSSSgvp":{"name":"email","abstract":"\u003cdiv class=\"aside aside-important\"\u003e","parent_name":"Customer"},"Classes/Order/Customer.html#/s:14ButtonMerchant5OrderC8CustomerC5isNewSbSgvp":{"name":"isNew","abstract":"\u003cp\u003eA flag indicating whether the customer is new (or not).\u003c/p\u003e","parent_name":"Customer"},"Classes/Order/Customer.html#/s:14ButtonMerchant5OrderC8CustomerC2idAESS_tcfc":{"name":"init(id:)","abstract":"\u003cp\u003eInitializes a customer object with the passed parameters.\u003c/p\u003e","parent_name":"Customer"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(py)currencyCode":{"name":"currencyCode","abstract":"\u003cp\u003eThe ISO 4217 currency code (default is USD).\u003c/p\u003e","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(py)customerOrderId":{"name":"customerOrderId","abstract":"\u003cp\u003eThe customer-facing order id.\u003c/p\u003e","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(py)customer":{"name":"customer","abstract":"\u003cp\u003eThe customer related to the order\u003c/p\u003e","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(im)initWithId:purchaseDate:lineItems:":{"name":"init(id:purchaseDate:lineItems:)","abstract":"\u003cp\u003eInitializes an order object with the passed parameters.\u003c/p\u003e","parent_name":"Order"},"Classes/Order/Customer.html":{"name":"Customer","abstract":"\u003cp\u003eRepresents a customer in the order.\u003c/p\u003e","parent_name":"Order"},"Classes/Order/LineItem.html":{"name":"LineItem","abstract":"\u003cp\u003eRepresents a line item in the order.\u003c/p\u003e","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(im)initWithId:amount:currencyCode:":{"name":"init(id:amount:currencyCode:)","abstract":"\u003cp\u003eDeprecated.\u003c/p\u003e","parent_name":"Order"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)id":{"name":"id","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)upc":{"name":"upc","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)categories":{"name":"categories","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)name":{"name":"name","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)currency":{"name":"currency","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)value":{"name":"value","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)quantity":{"name":"quantity","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)url":{"name":"url","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)attributes":{"name":"attributes","parent_name":"ButtonProduct"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cpy)attributionToken":{"name":"attributionToken","abstract":"\u003cp\u003eThe last \u003ccode\u003eattributionToken\u003c/code\u003e from an inbound Button attributed URL.\u003c/p\u003e","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)configureWithApplicationId:":{"name":"configure(applicationId:)","abstract":"\u003cp\u003eConfigures ButtonMerchant with your application Id.\u003c/p\u003e","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)trackIncomingURL:":{"name":"trackIncomingURL(_:)","abstract":"\u003cp\u003eChecks the passed URL for a Button attribution and if present stores the token.\u003c/p\u003e","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)trackIncomingUserActivity:":{"name":"trackIncomingUserActivity(_:)","abstract":"\u003cp\u003eChecks the URL in the passed NSUserActivity for Button attribution and if present stores the token.\u003c/p\u003e","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)handlePostInstallURL:":{"name":"handlePostInstallURL(_:)","abstract":"\u003cp\u003eChecks to see if the user visited a url destined for your app prior to installing your app.\u003c/p\u003e","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)reportOrder:completion:":{"name":"reportOrder(_:completion:)","abstract":"\u003cp\u003eReports an order to Button.\u003c/p\u003e","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)clearAllData":{"name":"clearAllData()","abstract":"\u003cp\u003eDiscards the current session and all persisted data.\u003c/p\u003e","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cpy)features":{"name":"features","abstract":"\u003cp\u003eAn interface through which library features can be enabled/disabled.\u003c/p\u003e","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cpy)activity":{"name":"activity","abstract":"\u003cp\u003eAn interface through which user activity can be reported.\u003c/p\u003e","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html":{"name":"ButtonMerchant","abstract":"\u003cdiv class=\"aside aside-note\"\u003e"},"Classes/ButtonProduct.html":{"name":"ButtonProduct","abstract":"\u003cp\u003eA concrete implementation of the ButtonProductCompatible protocol.\u003c/p\u003e"},"Classes/Order.html":{"name":"Order","abstract":"\u003cp\u003eRepresents an order placed by the user to be reported using \u003ccode\u003eButtonMerchant.reportOrder(order)\u003c/code\u003e.\u003c/p\u003e"},"Classes.html":{"name":"Classes","abstract":"\u003cp\u003eThe following classes are available globally.\u003c/p\u003e"},"Enums.html":{"name":"Enumerations","abstract":"\u003cp\u003eThe following enumerations are available globally.\u003c/p\u003e"},"Protocols.html":{"name":"Protocols","abstract":"\u003cp\u003eThe following protocols are available globally.\u003c/p\u003e"},"Structs.html":{"name":"Structures","abstract":"\u003cp\u003eThe following structures are available globally.\u003c/p\u003e"}} \ No newline at end of file diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/docSet.dsidx b/docs/history/1.7.1/docsets/ButtonMerchant.docset/Contents/Resources/docSet.dsidx new file mode 100644 index 0000000000000000000000000000000000000000..db1c239a312ed51870a0cb45c2049c4f63dde317 GIT binary patch literal 28672 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 OPHt15+1-9_qvU^NYa#3a literal 0 HcmV?d00001 diff --git a/docs/history/1.7.1/docsets/ButtonMerchant.tgz b/docs/history/1.7.1/docsets/ButtonMerchant.tgz new file mode 100644 index 0000000000000000000000000000000000000000..13123ba1c07dd7b91805b5b1bc8be7f9e8368be3 GIT binary patch literal 80125 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℞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 NyaCx^ryBq^2LN|uMnM1o literal 0 HcmV?d00001 diff --git a/docs/history/1.7.1/img/carat.png b/docs/history/1.7.1/img/carat.png new file mode 100755 index 0000000000000000000000000000000000000000..29d2f7fd4955fca6bc6fb740e0373a2c358c398e GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRo!3HEV4DF?Wlw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JlqAi{-jv*Ddl5#RKJQ5NTUZgiPI4RUKGIKU?u8L&ndhX1t za+0CMVUnT(Gnb}ei=c~x==tMH^F1_tBocXwcoSWoO-SZY-o>!8%^=Bms)(~h;m_U( zXNixk28L}0LS5-jKyq@#2gyS|J&f#pGCLkTc<@2s1dqeyqJ*Rc0tSIETAgmODY;(s z2y|Mcp&2}7rpBprBBB~1qM1`N+}4SoxYVPqsXi&l`rxZp{(w0iSy$Nv5*Vy!RapG^ S^0y4=eg;ohKbLh*2~7a!Pg}VF literal 0 HcmV?d00001 diff --git a/docs/history/1.7.1/img/dash.png b/docs/history/1.7.1/img/dash.png new file mode 100755 index 0000000000000000000000000000000000000000..6f694c7a012b417908da3687a0a39aa182e91c74 GIT binary patch literal 1338 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 literal 0 HcmV?d00001 diff --git a/docs/history/1.7.1/index.html b/docs/history/1.7.1/index.html new file mode 100644 index 0000000..fb64956 --- /dev/null +++ b/docs/history/1.7.1/index.html @@ -0,0 +1,162 @@ + + + + ButtonMerchant Reference + + + + + + + + + + + + + + + +

+

+ + ButtonMerchant 1.7.1 Docs + + (95% documented) +

+ +
+
+ +
+
+ + +
+ + + +
+ +
+ +
+
+ +

Button Merchant Library

+ +

License: MIT +Version +Platform

+

Documentation

+ +

Documentation for the Merchant Library can be found on the Button Developer site.

+ +

Reference docs are also available.

+

Example

+ +

To run the example project, clone the repo, run pod install, and run the Example scheme.

+

Installation

+ +

ButtonMerchant is available through CocoaPods and Carthage.

+

Swift Pacakage Manager

+ +

In Xcode, navigate to File → Swift Packages → Add Package Dependency

+ +

Enter the package repository URL:

+ +

https://github.com/button/button-merchant-ios

+ +

Note: Ensure to select ‘Up to Next Major’ version when prompted.

+

CocoaPods

+ +

Add this line to your Podfile:

+
pod 'ButtonMerchant'
+
+

Carthage

+ +

Or, add this to your Cartfile:

+
github "button/button-merchant-ios" ~> 1.0
+
+

Author

+ +

Button, Inc.

+

License

+ +

ButtonMerchant is available under the MIT license. See the LICENSE file for more info.

+ +
+
+ + +
+
+ + + diff --git a/docs/history/1.7.1/js/jazzy.js b/docs/history/1.7.1/js/jazzy.js new file mode 100755 index 0000000..1984416 --- /dev/null +++ b/docs/history/1.7.1/js/jazzy.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +window.jazzy = {'docset': false} +if (typeof window.dash != 'undefined') { + document.documentElement.className += ' dash' + window.jazzy.docset = true +} +if (navigator.userAgent.match(/xcode/i)) { + document.documentElement.className += ' xcode' + window.jazzy.docset = true +} + +function toggleItem($link, $content) { + var animationDuration = 300; + $link.toggleClass('token-open'); + $content.slideToggle(animationDuration); +} + +function itemLinkToContent($link) { + return $link.parent().parent().next(); +} + +// On doc load + hash-change, open any targetted item +function openCurrentItemIfClosed() { + if (window.jazzy.docset) { + return; + } + var $link = $(`a[name="${location.hash.substring(1)}"]`).nextAll('.token'); + $content = itemLinkToContent($link); + if ($content.is(':hidden')) { + toggleItem($link, $content); + } +} + +$(openCurrentItemIfClosed); +$(window).on('hashchange', openCurrentItemIfClosed); + +// On item link ('token') click, toggle its discussion +$('.token').on('click', function(event) { + if (window.jazzy.docset) { + return; + } + var $link = $(this); + toggleItem($link, itemLinkToContent($link)); + + // Keeps the document from jumping to the hash. + var href = $link.attr('href'); + if (history.pushState) { + history.pushState({}, '', href); + } else { + location.hash = href; + } + event.preventDefault(); +}); + +// Clicks on links to the current, closed, item need to open the item +$("a:not('.token')").on('click', function() { + if (location == this.href) { + openCurrentItemIfClosed(); + } +}); + +// KaTeX rendering +if ("katex" in window) { + $($('.math').each( (_, element) => { + katex.render(element.textContent, element, { + displayMode: $(element).hasClass('m-block'), + throwOnError: false, + trust: true + }); + })) +} diff --git a/docs/history/1.7.1/js/jazzy.search.js b/docs/history/1.7.1/js/jazzy.search.js new file mode 100644 index 0000000..359cdbb --- /dev/null +++ b/docs/history/1.7.1/js/jazzy.search.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +$(function(){ + var $typeahead = $('[data-typeahead]'); + var $form = $typeahead.parents('form'); + var searchURL = $form.attr('action'); + + function displayTemplate(result) { + return result.name; + } + + function suggestionTemplate(result) { + var t = '
'; + t += '' + result.name + ''; + if (result.parent_name) { + t += '' + result.parent_name + ''; + } + t += '
'; + return t; + } + + $typeahead.one('focus', function() { + $form.addClass('loading'); + + $.getJSON(searchURL).then(function(searchData) { + const searchIndex = lunr(function() { + this.ref('url'); + this.field('name'); + this.field('abstract'); + for (const [url, doc] of Object.entries(searchData)) { + this.add({url: url, name: doc.name, abstract: doc.abstract}); + } + }); + + $typeahead.typeahead( + { + highlight: true, + minLength: 3, + autoselect: true + }, + { + limit: 10, + display: displayTemplate, + templates: { suggestion: suggestionTemplate }, + source: function(query, sync) { + const lcSearch = query.toLowerCase(); + const results = searchIndex.query(function(q) { + q.term(lcSearch, { boost: 100 }); + q.term(lcSearch, { + boost: 10, + wildcard: lunr.Query.wildcard.TRAILING + }); + }).map(function(result) { + var doc = searchData[result.ref]; + doc.url = result.ref; + return doc; + }); + sync(results); + } + } + ); + $form.removeClass('loading'); + $typeahead.trigger('focus'); + }); + }); + + var baseURL = searchURL.slice(0, -"search.json".length); + + $typeahead.on('typeahead:select', function(e, result) { + window.location = baseURL + result.url; + }); +}); diff --git a/docs/history/1.7.1/js/jquery.min.js b/docs/history/1.7.1/js/jquery.min.js new file mode 100644 index 0000000..7f37b5d --- /dev/null +++ b/docs/history/1.7.1/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 00){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); diff --git a/docs/history/1.7.1/js/typeahead.jquery.js b/docs/history/1.7.1/js/typeahead.jquery.js new file mode 100644 index 0000000..3a2d2ab --- /dev/null +++ b/docs/history/1.7.1/js/typeahead.jquery.js @@ -0,0 +1,1694 @@ +/*! + * typeahead.js 1.3.1 + * https://github.com/corejavascript/typeahead.js + * Copyright 2013-2020 Twitter, Inc. and other contributors; Licensed MIT + */ + + +(function(root, factory) { + if (typeof define === "function" && define.amd) { + define([ "jquery" ], function(a0) { + return factory(a0); + }); + } else if (typeof module === "object" && module.exports) { + module.exports = factory(require("jquery")); + } else { + factory(root["jQuery"]); + } +})(this, function($) { + var _ = function() { + "use strict"; + return { + isMsie: function() { + return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false; + }, + isBlankString: function(str) { + return !str || /^\s*$/.test(str); + }, + escapeRegExChars: function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }, + isString: function(obj) { + return typeof obj === "string"; + }, + isNumber: function(obj) { + return typeof obj === "number"; + }, + isArray: $.isArray, + isFunction: $.isFunction, + isObject: $.isPlainObject, + isUndefined: function(obj) { + return typeof obj === "undefined"; + }, + isElement: function(obj) { + return !!(obj && obj.nodeType === 1); + }, + isJQuery: function(obj) { + return obj instanceof $; + }, + toStr: function toStr(s) { + return _.isUndefined(s) || s === null ? "" : s + ""; + }, + bind: $.proxy, + each: function(collection, cb) { + $.each(collection, reverseArgs); + function reverseArgs(index, value) { + return cb(value, index); + } + }, + map: $.map, + filter: $.grep, + every: function(obj, test) { + var result = true; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (!(result = test.call(null, val, key, obj))) { + return false; + } + }); + return !!result; + }, + some: function(obj, test) { + var result = false; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (result = test.call(null, val, key, obj)) { + return false; + } + }); + return !!result; + }, + mixin: $.extend, + identity: function(x) { + return x; + }, + clone: function(obj) { + return $.extend(true, {}, obj); + }, + getIdGenerator: function() { + var counter = 0; + return function() { + return counter++; + }; + }, + templatify: function templatify(obj) { + return $.isFunction(obj) ? obj : template; + function template() { + return String(obj); + } + }, + defer: function(fn) { + setTimeout(fn, 0); + }, + debounce: function(func, wait, immediate) { + var timeout, result; + return function() { + var context = this, args = arguments, later, callNow; + later = function() { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + } + }; + callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + } + return result; + }; + }, + throttle: function(func, wait) { + var context, args, timeout, result, previous, later; + previous = 0; + later = function() { + previous = new Date(); + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date(), remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + } else if (!timeout) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + stringify: function(val) { + return _.isString(val) ? val : JSON.stringify(val); + }, + guid: function() { + function _p8(s) { + var p = (Math.random().toString(16) + "000000000").substr(2, 8); + return s ? "-" + p.substr(0, 4) + "-" + p.substr(4, 4) : p; + } + return "tt-" + _p8() + _p8(true) + _p8(true) + _p8(); + }, + noop: function() {} + }; + }(); + var WWW = function() { + "use strict"; + var defaultClassNames = { + wrapper: "twitter-typeahead", + input: "tt-input", + hint: "tt-hint", + menu: "tt-menu", + dataset: "tt-dataset", + suggestion: "tt-suggestion", + selectable: "tt-selectable", + empty: "tt-empty", + open: "tt-open", + cursor: "tt-cursor", + highlight: "tt-highlight" + }; + return build; + function build(o) { + var www, classes; + classes = _.mixin({}, defaultClassNames, o); + www = { + css: buildCss(), + classes: classes, + html: buildHtml(classes), + selectors: buildSelectors(classes) + }; + return { + css: www.css, + html: www.html, + classes: www.classes, + selectors: www.selectors, + mixin: function(o) { + _.mixin(o, www); + } + }; + } + function buildHtml(c) { + return { + wrapper: '', + menu: '
' + }; + } + function buildSelectors(classes) { + var selectors = {}; + _.each(classes, function(v, k) { + selectors[k] = "." + v; + }); + return selectors; + } + function buildCss() { + var css = { + wrapper: { + position: "relative", + display: "inline-block" + }, + hint: { + position: "absolute", + top: "0", + left: "0", + borderColor: "transparent", + boxShadow: "none", + opacity: "1" + }, + input: { + position: "relative", + verticalAlign: "top", + backgroundColor: "transparent" + }, + inputWithNoHint: { + position: "relative", + verticalAlign: "top" + }, + menu: { + position: "absolute", + top: "100%", + left: "0", + zIndex: "100", + display: "none" + }, + ltr: { + left: "0", + right: "auto" + }, + rtl: { + left: "auto", + right: " 0" + } + }; + if (_.isMsie()) { + _.mixin(css.input, { + backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)" + }); + } + return css; + } + }(); + var EventBus = function() { + "use strict"; + var namespace, deprecationMap; + namespace = "typeahead:"; + deprecationMap = { + render: "rendered", + cursorchange: "cursorchanged", + select: "selected", + autocomplete: "autocompleted" + }; + function EventBus(o) { + if (!o || !o.el) { + $.error("EventBus initialized without el"); + } + this.$el = $(o.el); + } + _.mixin(EventBus.prototype, { + _trigger: function(type, args) { + var $e = $.Event(namespace + type); + this.$el.trigger.call(this.$el, $e, args || []); + return $e; + }, + before: function(type) { + var args, $e; + args = [].slice.call(arguments, 1); + $e = this._trigger("before" + type, args); + return $e.isDefaultPrevented(); + }, + trigger: function(type) { + var deprecatedType; + this._trigger(type, [].slice.call(arguments, 1)); + if (deprecatedType = deprecationMap[type]) { + this._trigger(deprecatedType, [].slice.call(arguments, 1)); + } + } + }); + return EventBus; + }(); + var EventEmitter = function() { + "use strict"; + var splitter = /\s+/, nextTick = getNextTick(); + return { + onSync: onSync, + onAsync: onAsync, + off: off, + trigger: trigger + }; + function on(method, types, cb, context) { + var type; + if (!cb) { + return this; + } + types = types.split(splitter); + cb = context ? bindContext(cb, context) : cb; + this._callbacks = this._callbacks || {}; + while (type = types.shift()) { + this._callbacks[type] = this._callbacks[type] || { + sync: [], + async: [] + }; + this._callbacks[type][method].push(cb); + } + return this; + } + function onAsync(types, cb, context) { + return on.call(this, "async", types, cb, context); + } + function onSync(types, cb, context) { + return on.call(this, "sync", types, cb, context); + } + function off(types) { + var type; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + while (type = types.shift()) { + delete this._callbacks[type]; + } + return this; + } + function trigger(types) { + var type, callbacks, args, syncFlush, asyncFlush; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + args = [].slice.call(arguments, 1); + while ((type = types.shift()) && (callbacks = this._callbacks[type])) { + syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args)); + asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args)); + syncFlush() && nextTick(asyncFlush); + } + return this; + } + function getFlush(callbacks, context, args) { + return flush; + function flush() { + var cancelled; + for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) { + cancelled = callbacks[i].apply(context, args) === false; + } + return !cancelled; + } + } + function getNextTick() { + var nextTickFn; + if (window.setImmediate) { + nextTickFn = function nextTickSetImmediate(fn) { + setImmediate(function() { + fn(); + }); + }; + } else { + nextTickFn = function nextTickSetTimeout(fn) { + setTimeout(function() { + fn(); + }, 0); + }; + } + return nextTickFn; + } + function bindContext(fn, context) { + return fn.bind ? fn.bind(context) : function() { + fn.apply(context, [].slice.call(arguments, 0)); + }; + } + }(); + var highlight = function(doc) { + "use strict"; + var defaults = { + node: null, + pattern: null, + tagName: "strong", + className: null, + wordsOnly: false, + caseSensitive: false, + diacriticInsensitive: false + }; + var accented = { + A: "[AaªÀ-Åà-åĀ-ąǍǎȀ-ȃȦȧᴬᵃḀḁẚẠ-ảₐ℀℁℻⒜Ⓐⓐ㍱-㍴㎀-㎄㎈㎉㎩-㎯㏂㏊㏟㏿Aa]", + B: "[BbᴮᵇḂ-ḇℬ⒝Ⓑⓑ㍴㎅-㎇㏃㏈㏔㏝Bb]", + C: "[CcÇçĆ-čᶜ℀ℂ℃℅℆ℭⅭⅽ⒞Ⓒⓒ㍶㎈㎉㎝㎠㎤㏄-㏇Cc]", + D: "[DdĎďDŽ-džDZ-dzᴰᵈḊ-ḓⅅⅆⅮⅾ⒟Ⓓⓓ㋏㍲㍷-㍹㎗㎭-㎯㏅㏈Dd]", + E: "[EeÈ-Ëè-ëĒ-ěȄ-ȇȨȩᴱᵉḘ-ḛẸ-ẽₑ℡ℯℰⅇ⒠Ⓔⓔ㉐㋍㋎Ee]", + F: "[FfᶠḞḟ℉ℱ℻⒡Ⓕⓕ㎊-㎌㎙ff-fflFf]", + G: "[GgĜ-ģǦǧǴǵᴳᵍḠḡℊ⒢Ⓖⓖ㋌㋍㎇㎍-㎏㎓㎬㏆㏉㏒㏿Gg]", + H: "[HhĤĥȞȟʰᴴḢ-ḫẖℋ-ℎ⒣Ⓗⓗ㋌㍱㎐-㎔㏊㏋㏗Hh]", + I: "[IiÌ-Ïì-ïĨ-İIJijǏǐȈ-ȋᴵᵢḬḭỈ-ịⁱℐℑℹⅈⅠ-ⅣⅥ-ⅨⅪⅫⅰ-ⅳⅵ-ⅸⅺⅻ⒤Ⓘⓘ㍺㏌㏕fiffiIi]", + J: "[JjIJ-ĵLJ-njǰʲᴶⅉ⒥ⒿⓙⱼJj]", + K: "[KkĶķǨǩᴷᵏḰ-ḵK⒦Ⓚⓚ㎄㎅㎉㎏㎑㎘㎞㎢㎦㎪㎸㎾㏀㏆㏍-㏏Kk]", + L: "[LlĹ-ŀLJ-ljˡᴸḶḷḺ-ḽℒℓ℡Ⅼⅼ⒧Ⓛⓛ㋏㎈㎉㏐-㏓㏕㏖㏿flfflLl]", + M: "[MmᴹᵐḾ-ṃ℠™ℳⅯⅿ⒨Ⓜⓜ㍷-㍹㎃㎆㎎㎒㎖㎙-㎨㎫㎳㎷㎹㎽㎿㏁㏂㏎㏐㏔-㏖㏘㏙㏞㏟Mm]", + N: "[NnÑñŃ-ʼnNJ-njǸǹᴺṄ-ṋⁿℕ№⒩Ⓝⓝ㎁㎋㎚㎱㎵㎻㏌㏑Nn]", + O: "[OoºÒ-Öò-öŌ-őƠơǑǒǪǫȌ-ȏȮȯᴼᵒỌ-ỏₒ℅№ℴ⒪Ⓞⓞ㍵㏇㏒㏖Oo]", + P: "[PpᴾᵖṔ-ṗℙ⒫Ⓟⓟ㉐㍱㍶㎀㎊㎩-㎬㎰㎴㎺㏋㏗-㏚Pp]", + Q: "[Qqℚ⒬Ⓠⓠ㏃Qq]", + R: "[RrŔ-řȐ-ȓʳᴿᵣṘ-ṛṞṟ₨ℛ-ℝ⒭Ⓡⓡ㋍㍴㎭-㎯㏚㏛Rr]", + S: "[SsŚ-šſȘșˢṠ-ṣ₨℁℠⒮Ⓢⓢ㎧㎨㎮-㎳㏛㏜stSs]", + T: "[TtŢ-ťȚțᵀᵗṪ-ṱẗ℡™⒯Ⓣⓣ㉐㋏㎔㏏ſtstTt]", + U: "[UuÙ-Üù-üŨ-ųƯưǓǔȔ-ȗᵁᵘᵤṲ-ṷỤ-ủ℆⒰Ⓤⓤ㍳㍺Uu]", + V: "[VvᵛᵥṼ-ṿⅣ-Ⅷⅳ-ⅷ⒱Ⓥⓥⱽ㋎㍵㎴-㎹㏜㏞Vv]", + W: "[WwŴŵʷᵂẀ-ẉẘ⒲Ⓦⓦ㎺-㎿㏝Ww]", + X: "[XxˣẊ-ẍₓ℻Ⅸ-Ⅻⅸ-ⅻ⒳Ⓧⓧ㏓Xx]", + Y: "[YyÝýÿŶ-ŸȲȳʸẎẏẙỲ-ỹ⒴Ⓨⓨ㏉Yy]", + Z: "[ZzŹ-žDZ-dzᶻẐ-ẕℤℨ⒵Ⓩⓩ㎐-㎔Zz]" + }; + return function hightlight(o) { + var regex; + o = _.mixin({}, defaults, o); + if (!o.node || !o.pattern) { + return; + } + o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ]; + regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly, o.diacriticInsensitive); + traverse(o.node, hightlightTextNode); + function hightlightTextNode(textNode) { + var match, patternNode, wrapperNode; + if (match = regex.exec(textNode.data)) { + wrapperNode = doc.createElement(o.tagName); + o.className && (wrapperNode.className = o.className); + patternNode = textNode.splitText(match.index); + patternNode.splitText(match[0].length); + wrapperNode.appendChild(patternNode.cloneNode(true)); + textNode.parentNode.replaceChild(wrapperNode, patternNode); + } + return !!match; + } + function traverse(el, hightlightTextNode) { + var childNode, TEXT_NODE_TYPE = 3; + for (var i = 0; i < el.childNodes.length; i++) { + childNode = el.childNodes[i]; + if (childNode.nodeType === TEXT_NODE_TYPE) { + i += hightlightTextNode(childNode) ? 1 : 0; + } else { + traverse(childNode, hightlightTextNode); + } + } + } + }; + function accent_replacer(chr) { + return accented[chr.toUpperCase()] || chr; + } + function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensitive) { + var escapedPatterns = [], regexStr; + for (var i = 0, len = patterns.length; i < len; i++) { + var escapedWord = _.escapeRegExChars(patterns[i]); + if (diacriticInsensitive) { + escapedWord = escapedWord.replace(/\S/g, accent_replacer); + } + escapedPatterns.push(escapedWord); + } + regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")"; + return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i"); + } + }(window.document); + var Input = function() { + "use strict"; + var specialKeyCodeMap; + specialKeyCodeMap = { + 9: "tab", + 27: "esc", + 37: "left", + 39: "right", + 13: "enter", + 38: "up", + 40: "down" + }; + function Input(o, www) { + var id; + o = o || {}; + if (!o.input) { + $.error("input is missing"); + } + www.mixin(this); + this.$hint = $(o.hint); + this.$input = $(o.input); + this.$menu = $(o.menu); + id = this.$input.attr("id") || _.guid(); + this.$menu.attr("id", id + "_listbox"); + this.$hint.attr({ + "aria-hidden": true + }); + this.$input.attr({ + "aria-owns": id + "_listbox", + role: "combobox", + "aria-autocomplete": "list", + "aria-expanded": false + }); + this.query = this.$input.val(); + this.queryWhenFocused = this.hasFocus() ? this.query : null; + this.$overflowHelper = buildOverflowHelper(this.$input); + this._checkLanguageDirection(); + if (this.$hint.length === 0) { + this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop; + } + this.onSync("cursorchange", this._updateDescendent); + } + Input.normalizeQuery = function(str) { + return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " "); + }; + _.mixin(Input.prototype, EventEmitter, { + _onBlur: function onBlur() { + this.resetInputValue(); + this.trigger("blurred"); + }, + _onFocus: function onFocus() { + this.queryWhenFocused = this.query; + this.trigger("focused"); + }, + _onKeydown: function onKeydown($e) { + var keyName = specialKeyCodeMap[$e.which || $e.keyCode]; + this._managePreventDefault(keyName, $e); + if (keyName && this._shouldTrigger(keyName, $e)) { + this.trigger(keyName + "Keyed", $e); + } + }, + _onInput: function onInput() { + this._setQuery(this.getInputValue()); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + _managePreventDefault: function managePreventDefault(keyName, $e) { + var preventDefault; + switch (keyName) { + case "up": + case "down": + preventDefault = !withModifier($e); + break; + + default: + preventDefault = false; + } + preventDefault && $e.preventDefault(); + }, + _shouldTrigger: function shouldTrigger(keyName, $e) { + var trigger; + switch (keyName) { + case "tab": + trigger = !withModifier($e); + break; + + default: + trigger = true; + } + return trigger; + }, + _checkLanguageDirection: function checkLanguageDirection() { + var dir = (this.$input.css("direction") || "ltr").toLowerCase(); + if (this.dir !== dir) { + this.dir = dir; + this.$hint.attr("dir", dir); + this.trigger("langDirChanged", dir); + } + }, + _setQuery: function setQuery(val, silent) { + var areEquivalent, hasDifferentWhitespace; + areEquivalent = areQueriesEquivalent(val, this.query); + hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false; + this.query = val; + if (!silent && !areEquivalent) { + this.trigger("queryChanged", this.query); + } else if (!silent && hasDifferentWhitespace) { + this.trigger("whitespaceChanged", this.query); + } + }, + _updateDescendent: function updateDescendent(event, id) { + this.$input.attr("aria-activedescendant", id); + }, + bind: function() { + var that = this, onBlur, onFocus, onKeydown, onInput; + onBlur = _.bind(this._onBlur, this); + onFocus = _.bind(this._onFocus, this); + onKeydown = _.bind(this._onKeydown, this); + onInput = _.bind(this._onInput, this); + this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown); + if (!_.isMsie() || _.isMsie() > 9) { + this.$input.on("input.tt", onInput); + } else { + this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) { + if (specialKeyCodeMap[$e.which || $e.keyCode]) { + return; + } + _.defer(_.bind(that._onInput, that, $e)); + }); + } + return this; + }, + focus: function focus() { + this.$input.focus(); + }, + blur: function blur() { + this.$input.blur(); + }, + getLangDir: function getLangDir() { + return this.dir; + }, + getQuery: function getQuery() { + return this.query || ""; + }, + setQuery: function setQuery(val, silent) { + this.setInputValue(val); + this._setQuery(val, silent); + }, + hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() { + return this.query !== this.queryWhenFocused; + }, + getInputValue: function getInputValue() { + return this.$input.val(); + }, + setInputValue: function setInputValue(value) { + this.$input.val(value); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + resetInputValue: function resetInputValue() { + this.setInputValue(this.query); + }, + getHint: function getHint() { + return this.$hint.val(); + }, + setHint: function setHint(value) { + this.$hint.val(value); + }, + clearHint: function clearHint() { + this.setHint(""); + }, + clearHintIfInvalid: function clearHintIfInvalid() { + var val, hint, valIsPrefixOfHint, isValid; + val = this.getInputValue(); + hint = this.getHint(); + valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0; + isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow(); + !isValid && this.clearHint(); + }, + hasFocus: function hasFocus() { + return this.$input.is(":focus"); + }, + hasOverflow: function hasOverflow() { + var constraint = this.$input.width() - 2; + this.$overflowHelper.text(this.getInputValue()); + return this.$overflowHelper.width() >= constraint; + }, + isCursorAtEnd: function() { + var valueLength, selectionStart, range; + valueLength = this.$input.val().length; + selectionStart = this.$input[0].selectionStart; + if (_.isNumber(selectionStart)) { + return selectionStart === valueLength; + } else if (document.selection) { + range = document.selection.createRange(); + range.moveStart("character", -valueLength); + return valueLength === range.text.length; + } + return true; + }, + destroy: function destroy() { + this.$hint.off(".tt"); + this.$input.off(".tt"); + this.$overflowHelper.remove(); + this.$hint = this.$input = this.$overflowHelper = $("
"); + }, + setAriaExpanded: function setAriaExpanded(value) { + this.$input.attr("aria-expanded", value); + } + }); + return Input; + function buildOverflowHelper($input) { + return $('').css({ + position: "absolute", + visibility: "hidden", + whiteSpace: "pre", + fontFamily: $input.css("font-family"), + fontSize: $input.css("font-size"), + fontStyle: $input.css("font-style"), + fontVariant: $input.css("font-variant"), + fontWeight: $input.css("font-weight"), + wordSpacing: $input.css("word-spacing"), + letterSpacing: $input.css("letter-spacing"), + textIndent: $input.css("text-indent"), + textRendering: $input.css("text-rendering"), + textTransform: $input.css("text-transform") + }).insertAfter($input); + } + function areQueriesEquivalent(a, b) { + return Input.normalizeQuery(a) === Input.normalizeQuery(b); + } + function withModifier($e) { + return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey; + } + }(); + var Dataset = function() { + "use strict"; + var keys, nameGenerator; + keys = { + dataset: "tt-selectable-dataset", + val: "tt-selectable-display", + obj: "tt-selectable-object" + }; + nameGenerator = _.getIdGenerator(); + function Dataset(o, www) { + o = o || {}; + o.templates = o.templates || {}; + o.templates.notFound = o.templates.notFound || o.templates.empty; + if (!o.source) { + $.error("missing source"); + } + if (!o.node) { + $.error("missing node"); + } + if (o.name && !isValidName(o.name)) { + $.error("invalid dataset name: " + o.name); + } + www.mixin(this); + this.highlight = !!o.highlight; + this.name = _.toStr(o.name || nameGenerator()); + this.limit = o.limit || 5; + this.displayFn = getDisplayFn(o.display || o.displayKey); + this.templates = getTemplates(o.templates, this.displayFn); + this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source; + this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async; + this._resetLastSuggestion(); + this.$el = $(o.node).attr("role", "presentation").addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name); + } + Dataset.extractData = function extractData(el) { + var $el = $(el); + if ($el.data(keys.obj)) { + return { + dataset: $el.data(keys.dataset) || "", + val: $el.data(keys.val) || "", + obj: $el.data(keys.obj) || null + }; + } + return null; + }; + _.mixin(Dataset.prototype, EventEmitter, { + _overwrite: function overwrite(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (this.async && this.templates.pending) { + this._renderPending(query); + } else if (!this.async && this.templates.notFound) { + this._renderNotFound(query); + } else { + this._empty(); + } + this.trigger("rendered", suggestions, false, this.name); + }, + _append: function append(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length && this.$lastSuggestion.length) { + this._appendSuggestions(query, suggestions); + } else if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (!this.$lastSuggestion.length && this.templates.notFound) { + this._renderNotFound(query); + } + this.trigger("rendered", suggestions, true, this.name); + }, + _renderSuggestions: function renderSuggestions(query, suggestions) { + var $fragment; + $fragment = this._getSuggestionsFragment(query, suggestions); + this.$lastSuggestion = $fragment.children().last(); + this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions)); + }, + _appendSuggestions: function appendSuggestions(query, suggestions) { + var $fragment, $lastSuggestion; + $fragment = this._getSuggestionsFragment(query, suggestions); + $lastSuggestion = $fragment.children().last(); + this.$lastSuggestion.after($fragment); + this.$lastSuggestion = $lastSuggestion; + }, + _renderPending: function renderPending(query) { + var template = this.templates.pending; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _renderNotFound: function renderNotFound(query) { + var template = this.templates.notFound; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _empty: function empty() { + this.$el.empty(); + this._resetLastSuggestion(); + }, + _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) { + var that = this, fragment; + fragment = document.createDocumentFragment(); + _.each(suggestions, function getSuggestionNode(suggestion) { + var $el, context; + context = that._injectQuery(query, suggestion); + $el = $(that.templates.suggestion(context)).data(keys.dataset, that.name).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable); + fragment.appendChild($el[0]); + }); + this.highlight && highlight({ + className: this.classes.highlight, + node: fragment, + pattern: query + }); + return $(fragment); + }, + _getFooter: function getFooter(query, suggestions) { + return this.templates.footer ? this.templates.footer({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _getHeader: function getHeader(query, suggestions) { + return this.templates.header ? this.templates.header({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _resetLastSuggestion: function resetLastSuggestion() { + this.$lastSuggestion = $(); + }, + _injectQuery: function injectQuery(query, obj) { + return _.isObject(obj) ? _.mixin({ + _query: query + }, obj) : obj; + }, + update: function update(query) { + var that = this, canceled = false, syncCalled = false, rendered = 0; + this.cancel(); + this.cancel = function cancel() { + canceled = true; + that.cancel = $.noop; + that.async && that.trigger("asyncCanceled", query, that.name); + }; + this.source(query, sync, async); + !syncCalled && sync([]); + function sync(suggestions) { + if (syncCalled) { + return; + } + syncCalled = true; + suggestions = (suggestions || []).slice(0, that.limit); + rendered = suggestions.length; + that._overwrite(query, suggestions); + if (rendered < that.limit && that.async) { + that.trigger("asyncRequested", query, that.name); + } + } + function async(suggestions) { + suggestions = suggestions || []; + if (!canceled && rendered < that.limit) { + that.cancel = $.noop; + var idx = Math.abs(rendered - that.limit); + rendered += idx; + that._append(query, suggestions.slice(0, idx)); + that.async && that.trigger("asyncReceived", query, that.name); + } + } + }, + cancel: $.noop, + clear: function clear() { + this._empty(); + this.cancel(); + this.trigger("cleared"); + }, + isEmpty: function isEmpty() { + return this.$el.is(":empty"); + }, + destroy: function destroy() { + this.$el = $("
"); + } + }); + return Dataset; + function getDisplayFn(display) { + display = display || _.stringify; + return _.isFunction(display) ? display : displayFn; + function displayFn(obj) { + return obj[display]; + } + } + function getTemplates(templates, displayFn) { + return { + notFound: templates.notFound && _.templatify(templates.notFound), + pending: templates.pending && _.templatify(templates.pending), + header: templates.header && _.templatify(templates.header), + footer: templates.footer && _.templatify(templates.footer), + suggestion: templates.suggestion ? userSuggestionTemplate : suggestionTemplate + }; + function userSuggestionTemplate(context) { + var template = templates.suggestion; + return $(template(context)).attr("id", _.guid()); + } + function suggestionTemplate(context) { + return $('
').attr("id", _.guid()).text(displayFn(context)); + } + } + function isValidName(str) { + return /^[_a-zA-Z0-9-]+$/.test(str); + } + }(); + var Menu = function() { + "use strict"; + function Menu(o, www) { + var that = this; + o = o || {}; + if (!o.node) { + $.error("node is required"); + } + www.mixin(this); + this.$node = $(o.node); + this.query = null; + this.datasets = _.map(o.datasets, initializeDataset); + function initializeDataset(oDataset) { + var node = that.$node.find(oDataset.node).first(); + oDataset.node = node.length ? node : $("
").appendTo(that.$node); + return new Dataset(oDataset, www); + } + } + _.mixin(Menu.prototype, EventEmitter, { + _onSelectableClick: function onSelectableClick($e) { + this.trigger("selectableClicked", $($e.currentTarget)); + }, + _onRendered: function onRendered(type, dataset, suggestions, async) { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetRendered", dataset, suggestions, async); + }, + _onCleared: function onCleared() { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetCleared"); + }, + _propagate: function propagate() { + this.trigger.apply(this, arguments); + }, + _allDatasetsEmpty: function allDatasetsEmpty() { + return _.every(this.datasets, _.bind(function isDatasetEmpty(dataset) { + var isEmpty = dataset.isEmpty(); + this.$node.attr("aria-expanded", !isEmpty); + return isEmpty; + }, this)); + }, + _getSelectables: function getSelectables() { + return this.$node.find(this.selectors.selectable); + }, + _removeCursor: function _removeCursor() { + var $selectable = this.getActiveSelectable(); + $selectable && $selectable.removeClass(this.classes.cursor); + }, + _ensureVisible: function ensureVisible($el) { + var elTop, elBottom, nodeScrollTop, nodeHeight; + elTop = $el.position().top; + elBottom = elTop + $el.outerHeight(true); + nodeScrollTop = this.$node.scrollTop(); + nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10); + if (elTop < 0) { + this.$node.scrollTop(nodeScrollTop + elTop); + } else if (nodeHeight < elBottom) { + this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight)); + } + }, + bind: function() { + var that = this, onSelectableClick; + onSelectableClick = _.bind(this._onSelectableClick, this); + this.$node.on("click.tt", this.selectors.selectable, onSelectableClick); + this.$node.on("mouseover", this.selectors.selectable, function() { + that.setCursor($(this)); + }); + this.$node.on("mouseleave", function() { + that._removeCursor(); + }); + _.each(this.datasets, function(dataset) { + dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that); + }); + return this; + }, + isOpen: function isOpen() { + return this.$node.hasClass(this.classes.open); + }, + open: function open() { + this.$node.scrollTop(0); + this.$node.addClass(this.classes.open); + }, + close: function close() { + this.$node.attr("aria-expanded", false); + this.$node.removeClass(this.classes.open); + this._removeCursor(); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.attr("dir", dir); + }, + selectableRelativeToCursor: function selectableRelativeToCursor(delta) { + var $selectables, $oldCursor, oldIndex, newIndex; + $oldCursor = this.getActiveSelectable(); + $selectables = this._getSelectables(); + oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1; + newIndex = oldIndex + delta; + newIndex = (newIndex + 1) % ($selectables.length + 1) - 1; + newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex; + return newIndex === -1 ? null : $selectables.eq(newIndex); + }, + setCursor: function setCursor($selectable) { + this._removeCursor(); + if ($selectable = $selectable && $selectable.first()) { + $selectable.addClass(this.classes.cursor); + this._ensureVisible($selectable); + } + }, + getSelectableData: function getSelectableData($el) { + return $el && $el.length ? Dataset.extractData($el) : null; + }, + getActiveSelectable: function getActiveSelectable() { + var $selectable = this._getSelectables().filter(this.selectors.cursor).first(); + return $selectable.length ? $selectable : null; + }, + getTopSelectable: function getTopSelectable() { + var $selectable = this._getSelectables().first(); + return $selectable.length ? $selectable : null; + }, + update: function update(query) { + var isValidUpdate = query !== this.query; + if (isValidUpdate) { + this.query = query; + _.each(this.datasets, updateDataset); + } + return isValidUpdate; + function updateDataset(dataset) { + dataset.update(query); + } + }, + empty: function empty() { + _.each(this.datasets, clearDataset); + this.query = null; + this.$node.addClass(this.classes.empty); + function clearDataset(dataset) { + dataset.clear(); + } + }, + destroy: function destroy() { + this.$node.off(".tt"); + this.$node = $("
"); + _.each(this.datasets, destroyDataset); + function destroyDataset(dataset) { + dataset.destroy(); + } + } + }); + return Menu; + }(); + var Status = function() { + "use strict"; + function Status(options) { + this.$el = $("", { + role: "status", + "aria-live": "polite" + }).css({ + position: "absolute", + padding: "0", + border: "0", + height: "1px", + width: "1px", + "margin-bottom": "-1px", + "margin-right": "-1px", + overflow: "hidden", + clip: "rect(0 0 0 0)", + "white-space": "nowrap" + }); + options.$input.after(this.$el); + _.each(options.menu.datasets, _.bind(function(dataset) { + if (dataset.onSync) { + dataset.onSync("rendered", _.bind(this.update, this)); + dataset.onSync("cleared", _.bind(this.cleared, this)); + } + }, this)); + } + _.mixin(Status.prototype, { + update: function update(event, suggestions) { + var length = suggestions.length; + var words; + if (length === 1) { + words = { + result: "result", + is: "is" + }; + } else { + words = { + result: "results", + is: "are" + }; + } + this.$el.text(length + " " + words.result + " " + words.is + " available, use up and down arrow keys to navigate."); + }, + cleared: function() { + this.$el.text(""); + } + }); + return Status; + }(); + var DefaultMenu = function() { + "use strict"; + var s = Menu.prototype; + function DefaultMenu() { + Menu.apply(this, [].slice.call(arguments, 0)); + } + _.mixin(DefaultMenu.prototype, Menu.prototype, { + open: function open() { + !this._allDatasetsEmpty() && this._show(); + return s.open.apply(this, [].slice.call(arguments, 0)); + }, + close: function close() { + this._hide(); + return s.close.apply(this, [].slice.call(arguments, 0)); + }, + _onRendered: function onRendered() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onRendered.apply(this, [].slice.call(arguments, 0)); + }, + _onCleared: function onCleared() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onCleared.apply(this, [].slice.call(arguments, 0)); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl); + return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0)); + }, + _hide: function hide() { + this.$node.hide(); + }, + _show: function show() { + this.$node.css("display", "block"); + } + }); + return DefaultMenu; + }(); + var Typeahead = function() { + "use strict"; + function Typeahead(o, www) { + var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged; + o = o || {}; + if (!o.input) { + $.error("missing input"); + } + if (!o.menu) { + $.error("missing menu"); + } + if (!o.eventBus) { + $.error("missing event bus"); + } + www.mixin(this); + this.eventBus = o.eventBus; + this.minLength = _.isNumber(o.minLength) ? o.minLength : 1; + this.input = o.input; + this.menu = o.menu; + this.enabled = true; + this.autoselect = !!o.autoselect; + this.active = false; + this.input.hasFocus() && this.activate(); + this.dir = this.input.getLangDir(); + this._hacks(); + this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this); + onFocused = c(this, "activate", "open", "_onFocused"); + onBlurred = c(this, "deactivate", "_onBlurred"); + onEnterKeyed = c(this, "isActive", "isOpen", "_onEnterKeyed"); + onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed"); + onEscKeyed = c(this, "isActive", "_onEscKeyed"); + onUpKeyed = c(this, "isActive", "open", "_onUpKeyed"); + onDownKeyed = c(this, "isActive", "open", "_onDownKeyed"); + onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed"); + onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed"); + onQueryChanged = c(this, "_openIfActive", "_onQueryChanged"); + onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged"); + this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this); + } + _.mixin(Typeahead.prototype, { + _hacks: function hacks() { + var $input, $menu; + $input = this.input.$input || $("
"); + $menu = this.menu.$node || $("
"); + $input.on("blur.tt", function($e) { + var active, isActive, hasActive; + active = document.activeElement; + isActive = $menu.is(active); + hasActive = $menu.has(active).length > 0; + if (_.isMsie() && (isActive || hasActive)) { + $e.preventDefault(); + $e.stopImmediatePropagation(); + _.defer(function() { + $input.focus(); + }); + } + }); + $menu.on("mousedown.tt", function($e) { + $e.preventDefault(); + }); + }, + _onSelectableClicked: function onSelectableClicked(type, $el) { + this.select($el); + }, + _onDatasetCleared: function onDatasetCleared() { + this._updateHint(); + }, + _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) { + this._updateHint(); + if (this.autoselect) { + var cursorClass = this.selectors.cursor.substr(1); + this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass); + } + this.eventBus.trigger("render", suggestions, async, dataset); + }, + _onAsyncRequested: function onAsyncRequested(type, dataset, query) { + this.eventBus.trigger("asyncrequest", query, dataset); + }, + _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) { + this.eventBus.trigger("asynccancel", query, dataset); + }, + _onAsyncReceived: function onAsyncReceived(type, dataset, query) { + this.eventBus.trigger("asyncreceive", query, dataset); + }, + _onFocused: function onFocused() { + this._minLengthMet() && this.menu.update(this.input.getQuery()); + }, + _onBlurred: function onBlurred() { + if (this.input.hasQueryChangedSinceLastFocus()) { + this.eventBus.trigger("change", this.input.getQuery()); + } + }, + _onEnterKeyed: function onEnterKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + if (this.select($selectable)) { + $e.preventDefault(); + $e.stopPropagation(); + } + } else if (this.autoselect) { + if (this.select(this.menu.getTopSelectable())) { + $e.preventDefault(); + $e.stopPropagation(); + } + } + }, + _onTabKeyed: function onTabKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + this.select($selectable) && $e.preventDefault(); + } else if (this.autoselect) { + if ($selectable = this.menu.getTopSelectable()) { + this.autocomplete($selectable) && $e.preventDefault(); + } + } + }, + _onEscKeyed: function onEscKeyed() { + this.close(); + }, + _onUpKeyed: function onUpKeyed() { + this.moveCursor(-1); + }, + _onDownKeyed: function onDownKeyed() { + this.moveCursor(+1); + }, + _onLeftKeyed: function onLeftKeyed() { + if (this.dir === "rtl" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onRightKeyed: function onRightKeyed() { + if (this.dir === "ltr" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onQueryChanged: function onQueryChanged(e, query) { + this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty(); + }, + _onWhitespaceChanged: function onWhitespaceChanged() { + this._updateHint(); + }, + _onLangDirChanged: function onLangDirChanged(e, dir) { + if (this.dir !== dir) { + this.dir = dir; + this.menu.setLanguageDirection(dir); + } + }, + _openIfActive: function openIfActive() { + this.isActive() && this.open(); + }, + _minLengthMet: function minLengthMet(query) { + query = _.isString(query) ? query : this.input.getQuery() || ""; + return query.length >= this.minLength; + }, + _updateHint: function updateHint() { + var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match; + $selectable = this.menu.getTopSelectable(); + data = this.menu.getSelectableData($selectable); + val = this.input.getInputValue(); + if (data && !_.isBlankString(val) && !this.input.hasOverflow()) { + query = Input.normalizeQuery(val); + escapedQuery = _.escapeRegExChars(query); + frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i"); + match = frontMatchRegEx.exec(data.val); + match && this.input.setHint(val + match[1]); + } else { + this.input.clearHint(); + } + }, + isEnabled: function isEnabled() { + return this.enabled; + }, + enable: function enable() { + this.enabled = true; + }, + disable: function disable() { + this.enabled = false; + }, + isActive: function isActive() { + return this.active; + }, + activate: function activate() { + if (this.isActive()) { + return true; + } else if (!this.isEnabled() || this.eventBus.before("active")) { + return false; + } else { + this.active = true; + this.eventBus.trigger("active"); + return true; + } + }, + deactivate: function deactivate() { + if (!this.isActive()) { + return true; + } else if (this.eventBus.before("idle")) { + return false; + } else { + this.active = false; + this.close(); + this.eventBus.trigger("idle"); + return true; + } + }, + isOpen: function isOpen() { + return this.menu.isOpen(); + }, + open: function open() { + if (!this.isOpen() && !this.eventBus.before("open")) { + this.input.setAriaExpanded(true); + this.menu.open(); + this._updateHint(); + this.eventBus.trigger("open"); + } + return this.isOpen(); + }, + close: function close() { + if (this.isOpen() && !this.eventBus.before("close")) { + this.input.setAriaExpanded(false); + this.menu.close(); + this.input.clearHint(); + this.input.resetInputValue(); + this.eventBus.trigger("close"); + } + return !this.isOpen(); + }, + setVal: function setVal(val) { + this.input.setQuery(_.toStr(val)); + }, + getVal: function getVal() { + return this.input.getQuery(); + }, + select: function select($selectable) { + var data = this.menu.getSelectableData($selectable); + if (data && !this.eventBus.before("select", data.obj, data.dataset)) { + this.input.setQuery(data.val, true); + this.eventBus.trigger("select", data.obj, data.dataset); + this.close(); + return true; + } + return false; + }, + autocomplete: function autocomplete($selectable) { + var query, data, isValid; + query = this.input.getQuery(); + data = this.menu.getSelectableData($selectable); + isValid = data && query !== data.val; + if (isValid && !this.eventBus.before("autocomplete", data.obj, data.dataset)) { + this.input.setQuery(data.val); + this.eventBus.trigger("autocomplete", data.obj, data.dataset); + return true; + } + return false; + }, + moveCursor: function moveCursor(delta) { + var query, $candidate, data, suggestion, datasetName, cancelMove, id; + query = this.input.getQuery(); + $candidate = this.menu.selectableRelativeToCursor(delta); + data = this.menu.getSelectableData($candidate); + suggestion = data ? data.obj : null; + datasetName = data ? data.dataset : null; + id = $candidate ? $candidate.attr("id") : null; + this.input.trigger("cursorchange", id); + cancelMove = this._minLengthMet() && this.menu.update(query); + if (!cancelMove && !this.eventBus.before("cursorchange", suggestion, datasetName)) { + this.menu.setCursor($candidate); + if (data) { + if (typeof data.val === "string") { + this.input.setInputValue(data.val); + } + } else { + this.input.resetInputValue(); + this._updateHint(); + } + this.eventBus.trigger("cursorchange", suggestion, datasetName); + return true; + } + return false; + }, + destroy: function destroy() { + this.input.destroy(); + this.menu.destroy(); + } + }); + return Typeahead; + function c(ctx) { + var methods = [].slice.call(arguments, 1); + return function() { + var args = [].slice.call(arguments); + _.each(methods, function(method) { + return ctx[method].apply(ctx, args); + }); + }; + } + }(); + (function() { + "use strict"; + var old, keys, methods; + old = $.fn.typeahead; + keys = { + www: "tt-www", + attrs: "tt-attrs", + typeahead: "tt-typeahead" + }; + methods = { + initialize: function initialize(o, datasets) { + var www; + datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1); + o = o || {}; + www = WWW(o.classNames); + return this.each(attach); + function attach() { + var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor; + _.each(datasets, function(d) { + d.highlight = !!o.highlight; + }); + $input = $(this); + $wrapper = $(www.html.wrapper); + $hint = $elOrNull(o.hint); + $menu = $elOrNull(o.menu); + defaultHint = o.hint !== false && !$hint; + defaultMenu = o.menu !== false && !$menu; + defaultHint && ($hint = buildHintFromInput($input, www)); + defaultMenu && ($menu = $(www.html.menu).css(www.css.menu)); + $hint && $hint.val(""); + $input = prepInput($input, www); + if (defaultHint || defaultMenu) { + $wrapper.css(www.css.wrapper); + $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint); + $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null); + } + MenuConstructor = defaultMenu ? DefaultMenu : Menu; + eventBus = new EventBus({ + el: $input + }); + input = new Input({ + hint: $hint, + input: $input, + menu: $menu + }, www); + menu = new MenuConstructor({ + node: $menu, + datasets: datasets + }, www); + status = new Status({ + $input: $input, + menu: menu + }); + typeahead = new Typeahead({ + input: input, + menu: menu, + eventBus: eventBus, + minLength: o.minLength, + autoselect: o.autoselect + }, www); + $input.data(keys.www, www); + $input.data(keys.typeahead, typeahead); + } + }, + isEnabled: function isEnabled() { + var enabled; + ttEach(this.first(), function(t) { + enabled = t.isEnabled(); + }); + return enabled; + }, + enable: function enable() { + ttEach(this, function(t) { + t.enable(); + }); + return this; + }, + disable: function disable() { + ttEach(this, function(t) { + t.disable(); + }); + return this; + }, + isActive: function isActive() { + var active; + ttEach(this.first(), function(t) { + active = t.isActive(); + }); + return active; + }, + activate: function activate() { + ttEach(this, function(t) { + t.activate(); + }); + return this; + }, + deactivate: function deactivate() { + ttEach(this, function(t) { + t.deactivate(); + }); + return this; + }, + isOpen: function isOpen() { + var open; + ttEach(this.first(), function(t) { + open = t.isOpen(); + }); + return open; + }, + open: function open() { + ttEach(this, function(t) { + t.open(); + }); + return this; + }, + close: function close() { + ttEach(this, function(t) { + t.close(); + }); + return this; + }, + select: function select(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.select($el); + }); + return success; + }, + autocomplete: function autocomplete(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.autocomplete($el); + }); + return success; + }, + moveCursor: function moveCursoe(delta) { + var success = false; + ttEach(this.first(), function(t) { + success = t.moveCursor(delta); + }); + return success; + }, + val: function val(newVal) { + var query; + if (!arguments.length) { + ttEach(this.first(), function(t) { + query = t.getVal(); + }); + return query; + } else { + ttEach(this, function(t) { + t.setVal(_.toStr(newVal)); + }); + return this; + } + }, + destroy: function destroy() { + ttEach(this, function(typeahead, $input) { + revert($input); + typeahead.destroy(); + }); + return this; + } + }; + $.fn.typeahead = function(method) { + if (methods[method]) { + return methods[method].apply(this, [].slice.call(arguments, 1)); + } else { + return methods.initialize.apply(this, arguments); + } + }; + $.fn.typeahead.noConflict = function noConflict() { + $.fn.typeahead = old; + return this; + }; + function ttEach($els, fn) { + $els.each(function() { + var $input = $(this), typeahead; + (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input); + }); + } + function buildHintFromInput($input, www) { + return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({ + readonly: true, + required: false + }).removeAttr("id name placeholder").removeClass("required").attr({ + spellcheck: "false", + tabindex: -1 + }); + } + function prepInput($input, www) { + $input.data(keys.attrs, { + dir: $input.attr("dir"), + autocomplete: $input.attr("autocomplete"), + spellcheck: $input.attr("spellcheck"), + style: $input.attr("style") + }); + $input.addClass(www.classes.input).attr({ + spellcheck: false + }); + try { + !$input.attr("dir") && $input.attr("dir", "auto"); + } catch (e) {} + return $input; + } + function getBackgroundStyles($el) { + return { + backgroundAttachment: $el.css("background-attachment"), + backgroundClip: $el.css("background-clip"), + backgroundColor: $el.css("background-color"), + backgroundImage: $el.css("background-image"), + backgroundOrigin: $el.css("background-origin"), + backgroundPosition: $el.css("background-position"), + backgroundRepeat: $el.css("background-repeat"), + backgroundSize: $el.css("background-size") + }; + } + function revert($input) { + var www, $wrapper; + www = $input.data(keys.www); + $wrapper = $input.parent().filter(www.selectors.wrapper); + _.each($input.data(keys.attrs), function(val, key) { + _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val); + }); + $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input); + if ($wrapper.length) { + $input.detach().insertAfter($wrapper); + $wrapper.remove(); + } + } + function $elOrNull(obj) { + var isValid, $el; + isValid = _.isJQuery(obj) || _.isElement(obj); + $el = isValid ? $(obj).first() : []; + return $el.length ? $el : null; + } + })(); +}); \ No newline at end of file diff --git a/docs/history/1.7.1/search.json b/docs/history/1.7.1/search.json new file mode 100644 index 0000000..0ec754a --- /dev/null +++ b/docs/history/1.7.1/search.json @@ -0,0 +1 @@ +{"Structs.html#/s:14ButtonMerchant7VersionV":{"name":"Version","abstract":"\u003cp\u003eButton Merchant Library Version.\u003c/p\u003e"},"Protocols/Configurable.html#/c:@M@ButtonMerchant@objc(pl)Configurable(py)includesIFA":{"name":"includesIFA","abstract":"\u003cdiv class=\"aside aside-important\"\u003e","parent_name":"Configurable"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)id":{"name":"id","abstract":"\u003cp\u003eThe product identifier.\u003c/p\u003e","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)upc":{"name":"upc","abstract":"\u003cp\u003eThe UPC (Universal Product Code) of the product.\u003c/p\u003e","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)categories":{"name":"categories","abstract":"\u003cp\u003eA flat array of the names of the categories to which the product belongs.\u003c/p\u003e","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)name":{"name":"name","abstract":"\u003cp\u003eThe name of the product.\u003c/p\u003e","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)currency":{"name":"currency","abstract":"\u003cp\u003eThe ISO-4217 currency code in which the product\u0026rsquo;s value is reported.\u003c/p\u003e","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)value":{"name":"value","abstract":"\u003cp\u003eThe value of the order. Includes any discounts, if applicable. Example: 1234 for $12.34.\u003c/p\u003e","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)quantity":{"name":"quantity","abstract":"\u003cp\u003eThe quantity of the product.\u003c/p\u003e","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)url":{"name":"url","abstract":"\u003cp\u003eThe URL of the product.\u003c/p\u003e","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)attributes":{"name":"attributes","abstract":"\u003cp\u003eAny additional attributes to be included with the product.\u003c/p\u003e","parent_name":"ButtonProductCompatible"},"Protocols/Activity.html#/c:@M@ButtonMerchant@objc(pl)Activity(im)productViewed:":{"name":"productViewed(_:)","abstract":"\u003cp\u003eReport that the user has viewed a product.\u003c/p\u003e","parent_name":"Activity"},"Protocols/Activity.html#/c:@M@ButtonMerchant@objc(pl)Activity(im)productAddedToCart:":{"name":"productAddedToCart(_:)","abstract":"\u003cp\u003eReport that the user added a product to their cart.\u003c/p\u003e","parent_name":"Activity"},"Protocols/Activity.html#/c:@M@ButtonMerchant@objc(pl)Activity(im)cartViewed:":{"name":"cartViewed(_:)","abstract":"\u003cp\u003eReport that the user viewed their cart.\u003c/p\u003e","parent_name":"Activity"},"Protocols/Activity.html":{"name":"Activity","abstract":"\u003cp\u003eA protocol through which user activities can be reported.\u003c/p\u003e"},"Protocols/ButtonProductCompatible.html":{"name":"ButtonProductCompatible","abstract":"\u003cp\u003eA protocol that defines the product properties that may be provided when reporting user activity.\u003c/p\u003e"},"Protocols/Configurable.html":{"name":"Configurable"},"Enums/NetworkError.html#/s:14ButtonMerchant12NetworkErrorO7unknownyA2CmF":{"name":"unknown","abstract":"\u003cp\u003eThere was an unknown network error.\u003c/p\u003e","parent_name":"NetworkError"},"Enums/ConfigurationError.html#/s:14ButtonMerchant18ConfigurationErrorO15noApplicationIdyA2CmF":{"name":"noApplicationId","abstract":"\u003cp\u003eLibrary is not configured with an \u003ccode\u003eapplicationId\u003c/code\u003e\u003c/p\u003e","parent_name":"ConfigurationError"},"Enums/ConfigurationError.html#/s:14ButtonMerchant18ConfigurationErrorO20invalidApplicationIdyACSS_tcACmF":{"name":"invalidApplicationId(appicationId:)","parent_name":"ConfigurationError"},"Enums/ButtonMerchantError.html#/s:14ButtonMerchant0aB5ErrorO021trackOrderDeprecationC0yA2CmF":{"name":"trackOrderDeprecationError","parent_name":"ButtonMerchantError"},"Enums/ButtonMerchantError.html#/s:14ButtonMerchant0aB5ErrorO08noEventsC0yA2CmF":{"name":"noEventsError","parent_name":"ButtonMerchantError"},"Enums/ButtonMerchantError.html":{"name":"ButtonMerchantError","abstract":"\u003cp\u003eButton Merchant Library Errors.\u003c/p\u003e"},"Enums/ConfigurationError.html":{"name":"ConfigurationError","abstract":"\u003cp\u003eButton Merchant Library Configuration Error.\u003c/p\u003e"},"Enums/NetworkError.html":{"name":"NetworkError","abstract":"\u003cp\u003eButton Merchant Library Configuration Error.\u003c/p\u003e"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC8quantitySivp":{"name":"quantity","abstract":"\u003cp\u003eThe number of unique units represented by this line item (default is 1).\u003c/p\u003e","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC15itemDescriptionSSSgvp":{"name":"itemDescription","abstract":"\u003cp\u003eText describing the line item.\u003c/p\u003e","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC3skuSSSgvp":{"name":"sku","abstract":"\u003cp\u003eThe Stock Keeping Unit of the line item.\u003c/p\u003e","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC3upcSSSgvp":{"name":"upc","abstract":"\u003cp\u003eThe Universal Product Code of the line item.\u003c/p\u003e","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC8categorySaySSGSgvp":{"name":"category","abstract":"\u003cp\u003eThe category of the line item.","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC10attributesSDyS2SGSgvp":{"name":"attributes","abstract":"\u003cp\u003eA key/value store for strings to specify additional information about a line item.\u003c/p\u003e","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC2id5totalAESS_s5Int64Vtcfc":{"name":"init(id:total:)","abstract":"\u003cp\u003eAn array of the line item details that comprise the order\u003c/p\u003e","parent_name":"LineItem"},"Classes/Order/Customer.html#/s:14ButtonMerchant5OrderC8CustomerC5emailSSSgvp":{"name":"email","abstract":"\u003cdiv class=\"aside aside-important\"\u003e","parent_name":"Customer"},"Classes/Order/Customer.html#/s:14ButtonMerchant5OrderC8CustomerC5isNewSbSgvp":{"name":"isNew","abstract":"\u003cp\u003eA flag indicating whether the customer is new (or not).\u003c/p\u003e","parent_name":"Customer"},"Classes/Order/Customer.html#/s:14ButtonMerchant5OrderC8CustomerC2idAESS_tcfc":{"name":"init(id:)","abstract":"\u003cp\u003eInitializes a customer object with the passed parameters.\u003c/p\u003e","parent_name":"Customer"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(py)currencyCode":{"name":"currencyCode","abstract":"\u003cp\u003eThe ISO 4217 currency code (default is USD).\u003c/p\u003e","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(py)customerOrderId":{"name":"customerOrderId","abstract":"\u003cp\u003eThe customer-facing order id.\u003c/p\u003e","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(py)customer":{"name":"customer","abstract":"\u003cp\u003eThe customer related to the order\u003c/p\u003e","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(im)initWithId:purchaseDate:lineItems:":{"name":"init(id:purchaseDate:lineItems:)","abstract":"\u003cp\u003eInitializes an order object with the passed parameters.\u003c/p\u003e","parent_name":"Order"},"Classes/Order/Customer.html":{"name":"Customer","abstract":"\u003cp\u003eRepresents a customer in the order.\u003c/p\u003e","parent_name":"Order"},"Classes/Order/LineItem.html":{"name":"LineItem","abstract":"\u003cp\u003eRepresents a line item in the order.\u003c/p\u003e","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(im)initWithId:amount:currencyCode:":{"name":"init(id:amount:currencyCode:)","abstract":"\u003cp\u003eDeprecated.\u003c/p\u003e","parent_name":"Order"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)id":{"name":"id","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)upc":{"name":"upc","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)categories":{"name":"categories","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)name":{"name":"name","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)currency":{"name":"currency","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)value":{"name":"value","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)quantity":{"name":"quantity","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)url":{"name":"url","parent_name":"ButtonProduct"},"Classes/ButtonProduct.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)attributes":{"name":"attributes","parent_name":"ButtonProduct"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cpy)attributionToken":{"name":"attributionToken","abstract":"\u003cp\u003eThe last \u003ccode\u003eattributionToken\u003c/code\u003e from an inbound Button attributed URL.\u003c/p\u003e","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)configureWithApplicationId:":{"name":"configure(applicationId:)","abstract":"\u003cp\u003eConfigures ButtonMerchant with your application Id.\u003c/p\u003e","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)trackIncomingURL:":{"name":"trackIncomingURL(_:)","abstract":"\u003cp\u003eChecks the passed URL for a Button attribution and if present stores the token.\u003c/p\u003e","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)trackIncomingUserActivity:":{"name":"trackIncomingUserActivity(_:)","abstract":"\u003cp\u003eChecks the URL in the passed NSUserActivity for Button attribution and if present stores the token.\u003c/p\u003e","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)handlePostInstallURL:":{"name":"handlePostInstallURL(_:)","abstract":"\u003cp\u003eChecks to see if the user visited a url destined for your app prior to installing your app.\u003c/p\u003e","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)reportOrder:completion:":{"name":"reportOrder(_:completion:)","abstract":"\u003cp\u003eReports an order to Button.\u003c/p\u003e","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)clearAllData":{"name":"clearAllData()","abstract":"\u003cp\u003eDiscards the current session and all persisted data.\u003c/p\u003e","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cpy)features":{"name":"features","abstract":"\u003cp\u003eAn interface through which library features can be enabled/disabled.\u003c/p\u003e","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cpy)activity":{"name":"activity","abstract":"\u003cp\u003eAn interface through which user activity can be reported.\u003c/p\u003e","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html":{"name":"ButtonMerchant","abstract":"\u003cdiv class=\"aside aside-note\"\u003e"},"Classes/ButtonProduct.html":{"name":"ButtonProduct","abstract":"\u003cp\u003eA concrete implementation of the ButtonProductCompatible protocol.\u003c/p\u003e"},"Classes/Order.html":{"name":"Order","abstract":"\u003cp\u003eRepresents an order placed by the user to be reported using \u003ccode\u003eButtonMerchant.reportOrder(order)\u003c/code\u003e.\u003c/p\u003e"},"Classes.html":{"name":"Classes","abstract":"\u003cp\u003eThe following classes are available globally.\u003c/p\u003e"},"Enums.html":{"name":"Enumerations","abstract":"\u003cp\u003eThe following enumerations are available globally.\u003c/p\u003e"},"Protocols.html":{"name":"Protocols","abstract":"\u003cp\u003eThe following protocols are available globally.\u003c/p\u003e"},"Structs.html":{"name":"Structures","abstract":"\u003cp\u003eThe following structures are available globally.\u003c/p\u003e"}} \ No newline at end of file diff --git a/docs/history/1.7.1/undocumented.json b/docs/history/1.7.1/undocumented.json new file mode 100644 index 0000000..4a10f95 --- /dev/null +++ b/docs/history/1.7.1/undocumented.json @@ -0,0 +1,26 @@ +{ + "warnings": [ + { + "file": "/Users/wes/Developer/button-merchant-ios/Source/ButtonMerchantError.swift", + "line": 32, + "symbol": "ButtonMerchantError.trackOrderDeprecationError", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/wes/Developer/button-merchant-ios/Source/ButtonMerchantError.swift", + "line": 33, + "symbol": "ButtonMerchantError.noEventsError", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/wes/Developer/button-merchant-ios/Source/ConfigurationError.swift", + "line": 46, + "symbol": "ConfigurationError.invalidApplicationId(appicationId:)", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + } + ], + "source_directory": "/Users/wes/Developer/button-merchant-ios" +} \ No newline at end of file diff --git a/docs/latest b/docs/latest index 55457e1..b164bf6 120000 --- a/docs/latest +++ b/docs/latest @@ -1 +1 @@ -./history/1.7.0 \ No newline at end of file +./history/1.7.1 \ No newline at end of file