From e69f9f4caa6b88db48e0b291efa0ee1328269b43 Mon Sep 17 00:00:00 2001 From: button-bot Date: Tue, 26 Sep 2023 12:26:48 -0400 Subject: [PATCH] Release 1.6.0 --- ButtonMerchant.podspec | 2 +- ButtonMerchant.xcodeproj/project.pbxproj | 102 +- .../ButtonMerchant (Carthage).xcscheme | 2 +- .../xcschemes/ButtonMerchant.xcscheme | 2 +- .../xcschemes/Example-ObjC.xcscheme | 2 +- .../xcshareddata/xcschemes/Example.xcscheme | 2 +- .../xcschemes/IntegrationTests.xcscheme | 2 +- .../xcshareddata/xcschemes/UnitTests.xcscheme | 2 +- Gemfile.lock | 97 +- Podfile | 2 + Podfile.lock | 4 +- Source/ActivityRequestBody.swift | 2 - Source/AppEventsRequestBody.swift | 3 +- Source/ButtonMerchant.swift | 14 +- Source/Client.swift | 8 +- Source/Configurable.swift | 5 +- Source/Core.swift | 4 +- Source/Info.plist | 2 +- Source/ReportOrderBody.swift | 3 - Source/System.swift | 20 +- Source/Version/Version.generated.swift | 2 +- .../UnitTests/ActivityRequestBodyTests.swift | 20 +- .../UnitTests/AppEventsRequestBodyTests.swift | 8 +- Tests/UnitTests/ButtonMerchantTests.swift | 4 +- Tests/UnitTests/ClientTests.swift | 15 +- Tests/UnitTests/CoreTests.swift | 5 +- .../UnitTests/Extensions/UIDeviceTests.swift | 5 - Tests/UnitTests/ReportOrderBodyTests.swift | 4 +- Tests/UnitTests/SystemTests.swift | 41 - .../Foundation/TestAdIdManager.swift | 47 - Tests/UnitTests/TestObjects/TestClient.swift | 4 +- Tests/UnitTests/TestObjects/TestSystem.swift | 7 - .../Version/VersionTests.generated.swift | 4 +- docs/history/1.6.0/Classes.html | 208 ++ .../history/1.6.0/Classes/ButtonMerchant.html | 595 ++++++ docs/history/1.6.0/Classes/ButtonProduct.html | 358 ++++ docs/history/1.6.0/Classes/Order.html | 345 ++++ .../history/1.6.0/Classes/Order/Customer.html | 215 +++ .../history/1.6.0/Classes/Order/LineItem.html | 350 ++++ docs/history/1.6.0/Enums.html | 204 ++ .../1.6.0/Enums/ButtonMerchantError.html | 179 ++ .../1.6.0/Enums/ConfigurationError.html | 184 ++ docs/history/1.6.0/Enums/NetworkError.html | 152 ++ docs/history/1.6.0/Protocols.html | 204 ++ docs/history/1.6.0/Protocols/Activity.html | 218 +++ .../Protocols/ButtonProductCompatible.html | 368 ++++ .../history/1.6.0/Protocols/Configurable.html | 153 ++ docs/history/1.6.0/Structs.html | 149 ++ docs/history/1.6.0/badge.svg | 28 + docs/history/1.6.0/css/highlight.css | 202 ++ docs/history/1.6.0/css/jazzy.css | 439 +++++ .../ButtonMerchant.docset/Contents/Info.plist | 20 + .../Contents/Resources/Documents/Classes.html | 208 ++ .../Documents/Classes/ButtonMerchant.html | 595 ++++++ .../Documents/Classes/ButtonProduct.html | 358 ++++ .../Resources/Documents/Classes/Order.html | 345 ++++ .../Documents/Classes/Order/Customer.html | 215 +++ .../Documents/Classes/Order/LineItem.html | 350 ++++ .../Contents/Resources/Documents/Enums.html | 204 ++ .../Documents/Enums/ButtonMerchantError.html | 179 ++ .../Documents/Enums/ConfigurationError.html | 184 ++ .../Documents/Enums/NetworkError.html | 152 ++ .../Resources/Documents/Protocols.html | 204 ++ .../Documents/Protocols/Activity.html | 218 +++ .../Protocols/ButtonProductCompatible.html | 368 ++++ .../Documents/Protocols/Configurable.html | 153 ++ .../Contents/Resources/Documents/Structs.html | 149 ++ .../Resources/Documents/css/highlight.css | 202 ++ .../Resources/Documents/css/jazzy.css | 439 +++++ .../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 | 156 ++ .../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.6.0/docsets/ButtonMerchant.tgz | Bin 0 -> 80689 bytes docs/history/1.6.0/img/carat.png | Bin 0 -> 274 bytes docs/history/1.6.0/img/dash.png | Bin 0 -> 1338 bytes docs/history/1.6.0/img/spinner.gif | Bin 0 -> 1849 bytes docs/history/1.6.0/index.html | 156 ++ docs/history/1.6.0/js/jazzy.js | 74 + docs/history/1.6.0/js/jazzy.search.js | 74 + docs/history/1.6.0/js/jquery.min.js | 2 + docs/history/1.6.0/js/lunr.min.js | 6 + docs/history/1.6.0/js/typeahead.jquery.js | 1694 +++++++++++++++++ docs/history/1.6.0/search.json | 1 + docs/history/1.6.0/undocumented.json | 26 + docs/latest | 2 +- 93 files changed, 13324 insertions(+), 258 deletions(-) delete mode 100644 Tests/UnitTests/TestObjects/Foundation/TestAdIdManager.swift create mode 100644 docs/history/1.6.0/Classes.html create mode 100644 docs/history/1.6.0/Classes/ButtonMerchant.html create mode 100644 docs/history/1.6.0/Classes/ButtonProduct.html create mode 100644 docs/history/1.6.0/Classes/Order.html create mode 100644 docs/history/1.6.0/Classes/Order/Customer.html create mode 100644 docs/history/1.6.0/Classes/Order/LineItem.html create mode 100644 docs/history/1.6.0/Enums.html create mode 100644 docs/history/1.6.0/Enums/ButtonMerchantError.html create mode 100644 docs/history/1.6.0/Enums/ConfigurationError.html create mode 100644 docs/history/1.6.0/Enums/NetworkError.html create mode 100644 docs/history/1.6.0/Protocols.html create mode 100644 docs/history/1.6.0/Protocols/Activity.html create mode 100644 docs/history/1.6.0/Protocols/ButtonProductCompatible.html create mode 100644 docs/history/1.6.0/Protocols/Configurable.html create mode 100644 docs/history/1.6.0/Structs.html create mode 100644 docs/history/1.6.0/badge.svg create mode 100644 docs/history/1.6.0/css/highlight.css create mode 100644 docs/history/1.6.0/css/jazzy.css create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Info.plist create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes.html create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonMerchant.html create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonProduct.html create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order.html create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/Customer.html create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/LineItem.html create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums.html create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ButtonMerchantError.html create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ConfigurationError.html create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/NetworkError.html create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols.html create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Activity.html create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/ButtonProductCompatible.html create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Configurable.html create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Structs.html create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/highlight.css create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/jazzy.css create mode 100755 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/carat.png create mode 100755 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/dash.png create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/spinner.gif create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/index.html create mode 100755 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.js create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.search.js create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jquery.min.js create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/lunr.min.js create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/typeahead.jquery.js create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/search.json create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/docSet.dsidx create mode 100644 docs/history/1.6.0/docsets/ButtonMerchant.tgz create mode 100755 docs/history/1.6.0/img/carat.png create mode 100755 docs/history/1.6.0/img/dash.png create mode 100644 docs/history/1.6.0/img/spinner.gif create mode 100644 docs/history/1.6.0/index.html create mode 100755 docs/history/1.6.0/js/jazzy.js create mode 100644 docs/history/1.6.0/js/jazzy.search.js create mode 100644 docs/history/1.6.0/js/jquery.min.js create mode 100644 docs/history/1.6.0/js/lunr.min.js create mode 100644 docs/history/1.6.0/js/typeahead.jquery.js create mode 100644 docs/history/1.6.0/search.json create mode 100644 docs/history/1.6.0/undocumented.json diff --git a/ButtonMerchant.podspec b/ButtonMerchant.podspec index 36abbf1..6e0301e 100644 --- a/ButtonMerchant.podspec +++ b/ButtonMerchant.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'ButtonMerchant' - s.version = '1.5.1' + s.version = '1.6.0' 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 923c953..166d4b6 100644 --- a/ButtonMerchant.xcodeproj/project.pbxproj +++ b/ButtonMerchant.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -99,7 +99,6 @@ DE1706E32085633A009FF30B /* TestDevice.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE1706E120856336009FF30B /* TestDevice.swift */; }; DE1706E5208563D7009FF30B /* TestLocale.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE1706E4208563D7009FF30B /* TestLocale.swift */; }; DE1706E7208563F1009FF30B /* TestScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE1706E6208563F1009FF30B /* TestScreen.swift */; }; - DE1706E920856417009FF30B /* TestAdIdManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE1706E820856417009FF30B /* TestAdIdManager.swift */; }; DE175A1C20A09DEA005C97B9 /* Version.generated.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE175A1A20A09DDE005C97B9 /* Version.generated.swift */; }; DE175A2120A0AFF6005C97B9 /* VersionTests.generated.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE175A2020A0AFF6005C97B9 /* VersionTests.generated.swift */; }; DE2F7450208F6552001E4BD6 /* ConfigurationError.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE2F744E208F6535001E4BD6 /* ConfigurationError.swift */; }; @@ -111,6 +110,8 @@ DE59498D28F49FA200FD9737 /* ButtonMerchantExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE59498C28F49FA200FD9737 /* ButtonMerchantExtensions.swift */; }; DE5D375328B7D173001AA004 /* Order.m in Sources */ = {isa = PBXBuildFile; fileRef = DE0F12AD28B7CD970047A61E /* Order.m */; }; DE5D375428B7D174001AA004 /* Order.m in Sources */ = {isa = PBXBuildFile; fileRef = DE0F12AD28B7CD970047A61E /* Order.m */; }; + DE74427F2A8F04DF009D6BD1 /* ButtonMerchant.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE865F842052FE5D00F4054D /* ButtonMerchant.framework */; }; + DE7442802A8F04DF009D6BD1 /* ButtonMerchant.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DE865F842052FE5D00F4054D /* ButtonMerchant.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; DE865F722052E79A00F4054D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE865F712052E79A00F4054D /* AppDelegate.swift */; }; DE865F8D2052FE5D00F4054D /* ButtonMerchant.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE865F842052FE5D00F4054D /* ButtonMerchant.framework */; }; DE865F962052FE5D00F4054D /* ButtonMerchant.h in Headers */ = {isa = PBXBuildFile; fileRef = DE865F862052FE5D00F4054D /* ButtonMerchant.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -159,6 +160,13 @@ remoteGlobalIDString = DE865F832052FE5D00F4054D; remoteInfo = ButtonMerchant; }; + DE7442812A8F04DF009D6BD1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 607FACC81AFB9204008FA782 /* Project object */; + proxyType = 1; + remoteGlobalIDString = DE865F832052FE5D00F4054D; + remoteInfo = ButtonMerchant; + }; DE865F8E2052FE5D00F4054D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 607FACC81AFB9204008FA782 /* Project object */; @@ -168,6 +176,20 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + DE7442832A8F04DF009D6BD1 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + DE7442802A8F04DF009D6BD1 /* ButtonMerchant.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 1056D6CD4EC26DA7A7B7E86D /* Pods-Example-ObjC.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example-ObjC.release.xcconfig"; path = "Target Support Files/Pods-Example-ObjC/Pods-Example-ObjC.release.xcconfig"; sourceTree = ""; }; 1885C61CD9A0729B7F905B78 /* Pods-UnitTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-UnitTests.release.xcconfig"; path = "Target Support Files/Pods-UnitTests/Pods-UnitTests.release.xcconfig"; sourceTree = ""; }; @@ -275,7 +297,6 @@ DE1706E120856336009FF30B /* TestDevice.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestDevice.swift; sourceTree = ""; }; DE1706E4208563D7009FF30B /* TestLocale.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestLocale.swift; sourceTree = ""; }; DE1706E6208563F1009FF30B /* TestScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestScreen.swift; sourceTree = ""; }; - DE1706E820856417009FF30B /* TestAdIdManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestAdIdManager.swift; sourceTree = ""; }; DE175A1A20A09DDE005C97B9 /* Version.generated.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Version.generated.swift; sourceTree = ""; }; DE175A2020A0AFF6005C97B9 /* VersionTests.generated.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VersionTests.generated.swift; sourceTree = ""; }; DE2F744E208F6535001E4BD6 /* ConfigurationError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfigurationError.swift; sourceTree = ""; }; @@ -325,6 +346,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + DE74427F2A8F04DF009D6BD1 /* ButtonMerchant.framework in Frameworks */, 20B25FD4CC0EFA64DBAB0EC0 /* Pods_Example.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -544,7 +566,6 @@ 9E5475E3206D91A900947A1C /* TestURLSessionDataTask.swift */, 9EAA60C4207AC9AC00D21601 /* TestFileManager.swift */, 9EAA60C6207AC9FF00D21601 /* TestCalendar.swift */, - DE1706E820856417009FF30B /* TestAdIdManager.swift */, DE1706E120856336009FF30B /* TestDevice.swift */, DE1706E6208563F1009FF30B /* TestScreen.swift */, DE1706E4208563D7009FF30B /* TestLocale.swift */, @@ -743,11 +764,13 @@ 607FACCC1AFB9204008FA782 /* Sources */, 607FACCD1AFB9204008FA782 /* Frameworks */, 607FACCE1AFB9204008FA782 /* Resources */, + DE7442832A8F04DF009D6BD1 /* Embed Frameworks */, ); buildRules = ( ); dependencies = ( DE18FC5B28B7E24500558C2E /* PBXTargetDependency */, + DE7442822A8F04DF009D6BD1 /* PBXTargetDependency */, ); name = Example; productName = ButtonMerchant; @@ -839,7 +862,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1240; + LastUpgradeCheck = 1500; ORGANIZATIONNAME = "Button, Inc."; TargetAttributes = { 607FACCF1AFB9204008FA782 = { @@ -1020,6 +1043,7 @@ }; DA0FA2BC2061AAD8008296A6 /* Swift Lint */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -1034,6 +1058,7 @@ }; DA0FA2C82062EF38008296A6 /* Swift Lint */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -1048,6 +1073,7 @@ }; DECAAF592065816600E2D983 /* Swift Lint */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -1062,6 +1088,7 @@ }; DECF9F28206B01F0009F3930 /* Swift Lint */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -1201,7 +1228,6 @@ DA0FA2A3205C1EF2008296A6 /* TestCore.swift in Sources */, DA29D894209CF34D00537806 /* UIDeviceTests.swift in Sources */, FBEBC92125435D5900AAE9E5 /* TestAppIntegrationVerification.swift in Sources */, - DE1706E920856417009FF30B /* TestAdIdManager.swift in Sources */, DA29D892209CDC3100537806 /* URLSessionTests.swift in Sources */, DA756B7922B2DB67003397E3 /* SessionDelegateTests.swift in Sources */, FB70030B24CF46260050E021 /* AppEventsRequestBodyTests.swift in Sources */, @@ -1260,6 +1286,11 @@ target = DE865F832052FE5D00F4054D /* ButtonMerchant */; targetProxy = DE18FC5C28B7E24900558C2E /* PBXContainerItemProxy */; }; + DE7442822A8F04DF009D6BD1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = DE865F832052FE5D00F4054D /* ButtonMerchant */; + targetProxy = DE7442812A8F04DF009D6BD1 /* PBXContainerItemProxy */; + }; DE865F8F2052FE5D00F4054D /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = DE865F832052FE5D00F4054D /* ButtonMerchant */; @@ -1406,7 +1437,8 @@ IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; VALIDATE_PRODUCT = YES; }; @@ -1421,7 +1453,10 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; DEVELOPMENT_TEAM = 39F27QYP2C; INFOPLIST_FILE = "$(SRCROOT)/Examples/Swift/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); MODULE_NAME = ExampleApp; PRODUCT_BUNDLE_IDENTIFIER = "com.usebutton.merchant-example"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1440,7 +1475,10 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; DEVELOPMENT_TEAM = 39F27QYP2C; INFOPLIST_FILE = "$(SRCROOT)/Examples/Swift/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); MODULE_NAME = ExampleApp; PRODUCT_BUNDLE_IDENTIFIER = "com.usebutton.merchant-example"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1466,7 +1504,11 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Tests/IntegrationTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.button.IntegrationTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; @@ -1492,7 +1534,11 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Tests/IntegrationTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.button.IntegrationTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; @@ -1518,7 +1564,10 @@ DEVELOPMENT_TEAM = 39F27QYP2C; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "$(SRCROOT)/Examples/Objective-C/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = "com.usebutton.merchant-example-objc"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Examples/Objective-C/Example-ObjC-Bridging-Header.h"; @@ -1545,7 +1594,10 @@ DEVELOPMENT_TEAM = 39F27QYP2C; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = "$(SRCROOT)/Examples/Objective-C/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = "com.usebutton.merchant-example-objc"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Examples/Objective-C/Example-ObjC-Bridging-Header.h"; @@ -1576,7 +1628,11 @@ GCC_TREAT_WARNINGS_AS_ERRORS = YES; INFOPLIST_FILE = Source/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.usebutton.merchant; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; @@ -1610,7 +1666,11 @@ GCC_TREAT_WARNINGS_AS_ERRORS = YES; INFOPLIST_FILE = Source/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.usebutton.merchant; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; @@ -1638,7 +1698,11 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Tests/UnitTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.usebutton.ButtonMerchantTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; @@ -1662,7 +1726,11 @@ GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Tests/UnitTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.usebutton.ButtonMerchantTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; diff --git a/ButtonMerchant.xcodeproj/xcshareddata/xcschemes/ButtonMerchant (Carthage).xcscheme b/ButtonMerchant.xcodeproj/xcshareddata/xcschemes/ButtonMerchant (Carthage).xcscheme index 0bdad51..a407e80 100644 --- a/ButtonMerchant.xcodeproj/xcshareddata/xcschemes/ButtonMerchant (Carthage).xcscheme +++ b/ButtonMerchant.xcodeproj/xcshareddata/xcschemes/ButtonMerchant (Carthage).xcscheme @@ -1,6 +1,6 @@ 1.0, >= 1.0.2) @@ -9,7 +9,7 @@ GEM minitest (>= 5.1) tzinfo (~> 2.0) zeitwerk (~> 2.3) - addressable (2.8.1) + addressable (2.8.5) public_suffix (>= 2.0.2, < 6.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) @@ -17,20 +17,20 @@ GEM artifactory (3.0.15) atomos (0.1.3) aws-eventstream (1.2.0) - aws-partitions (1.621.0) - aws-sdk-core (3.135.0) + aws-partitions (1.828.0) + aws-sdk-core (3.183.1) aws-eventstream (~> 1, >= 1.0.2) - aws-partitions (~> 1, >= 1.525.0) - aws-sigv4 (~> 1.1) + aws-partitions (~> 1, >= 1.651.0) + aws-sigv4 (~> 1.5) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.58.0) - aws-sdk-core (~> 3, >= 3.127.0) + aws-sdk-kms (1.71.0) + aws-sdk-core (~> 3, >= 3.177.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.114.0) - aws-sdk-core (~> 3, >= 3.127.0) + aws-sdk-s3 (1.135.0) + aws-sdk-core (~> 3, >= 3.181.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.4) - aws-sigv4 (1.5.1) + aws-sigv4 (~> 1.6) + aws-sigv4 (1.6.0) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) claide (1.1.0) @@ -78,7 +78,7 @@ GEM highline (~> 2.0.0) concurrent-ruby (1.1.10) declarative (0.0.20) - digest-crc (0.6.4) + digest-crc (0.6.5) rake (>= 12.0.0, < 14.0.0) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) @@ -87,8 +87,8 @@ GEM escape (0.0.4) ethon (0.15.0) ffi (>= 1.15.0) - excon (0.92.4) - faraday (1.10.2) + excon (0.103.0) + faraday (1.10.3) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) @@ -116,8 +116,8 @@ GEM faraday-retry (1.0.3) faraday_middleware (1.2.0) faraday (~> 1.0) - fastimage (2.2.6) - fastlane (2.209.1) + fastimage (2.2.7) + fastlane (2.216.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -138,10 +138,11 @@ GEM google-apis-playcustomapp_v1 (~> 0.1) google-cloud-storage (~> 1.31) highline (~> 2.0) + http-cookie (~> 1.0.5) json (< 3.0.0) jwt (>= 2.1.0, < 3) mini_magick (>= 4.9.4, < 5.0.0) - multipart-post (~> 2.0.0) + multipart-post (>= 2.0.0, < 3.0.0) naturally (~> 2.2) optparse (~> 0.1.1) plist (>= 3.1.0, < 4.0.0) @@ -149,7 +150,7 @@ GEM security (= 0.1.3) simctl (~> 1.6.3) terminal-notifier (>= 2.0.0, < 3.0.0) - terminal-table (>= 1.4.5, < 2.0.0) + terminal-table (~> 3) tty-screen (>= 0.6.3, < 1.0.0) tty-spinner (>= 0.8.0, < 1.0.0) word_wrap (~> 1.0.0) @@ -160,9 +161,9 @@ GEM fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) - google-apis-androidpublisher_v3 (0.25.0) - google-apis-core (>= 0.7, < 2.a) - google-apis-core (0.7.0) + google-apis-androidpublisher_v3 (0.50.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-core (0.11.1) addressable (~> 2.5, >= 2.5.1) googleauth (>= 0.16.2, < 2.a) httpclient (>= 2.8.1, < 3.a) @@ -171,30 +172,29 @@ GEM retriable (>= 2.0, < 4.a) rexml webrick - google-apis-iamcredentials_v1 (0.13.0) - google-apis-core (>= 0.7, < 2.a) - google-apis-playcustomapp_v1 (0.10.0) - google-apis-core (>= 0.7, < 2.a) - google-apis-storage_v1 (0.17.0) - google-apis-core (>= 0.7, < 2.a) + google-apis-iamcredentials_v1 (0.17.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-playcustomapp_v1 (0.13.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-storage_v1 (0.19.0) + google-apis-core (>= 0.9.0, < 2.a) google-cloud-core (1.6.0) google-cloud-env (~> 1.0) google-cloud-errors (~> 1.0) google-cloud-env (1.6.0) faraday (>= 0.17.3, < 3.0) - google-cloud-errors (1.2.0) - google-cloud-storage (1.39.0) + google-cloud-errors (1.3.1) + google-cloud-storage (1.44.0) addressable (~> 2.8) digest-crc (~> 0.4) google-apis-iamcredentials_v1 (~> 0.1) - google-apis-storage_v1 (~> 0.17.0) + google-apis-storage_v1 (~> 0.19.0) google-cloud-core (~> 1.6) googleauth (>= 0.16.2, < 2.a) mini_mime (~> 1.0) - googleauth (1.2.0) + googleauth (1.8.1) faraday (>= 0.17.3, < 3.a) jwt (>= 1.4, < 3.0) - memoist (~> 0.16) multi_json (~> 1.11) os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) @@ -214,18 +214,17 @@ GEM sassc (~> 2.1) sqlite3 (~> 1.3) xcinvoke (~> 0.3.0) - jmespath (1.6.1) - json (2.6.2) - jwt (2.4.1) + jmespath (1.6.2) + json (2.6.3) + jwt (2.7.1) liferaft (0.0.6) - memoist (0.16.2) - mini_magick (4.11.0) - mini_mime (1.1.2) + mini_magick (4.12.0) + mini_mime (1.1.5) mini_portile2 (2.8.0) minitest (5.16.3) molinillo (0.8.0) multi_json (1.15.0) - multipart-post (2.0.0) + multipart-post (2.3.0) mustache (1.1.1) nanaimo (0.3.0) nap (1.1.0) @@ -237,7 +236,7 @@ GEM open4 (1.3.4) optparse (0.1.1) os (1.1.4) - plist (3.6.0) + plist (3.7.0) public_suffix (4.0.7) racc (1.6.0) rake (13.0.6) @@ -247,7 +246,7 @@ GEM trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.2.5) + rexml (3.2.6) rouge (2.0.7) ruby-macho (2.5.1) ruby2_keywords (0.0.5) @@ -255,12 +254,12 @@ GEM sassc (2.4.0) ffi (~> 1.9) security (0.1.3) - signet (0.17.0) + signet (0.18.0) addressable (~> 2.8) faraday (>= 0.17.5, < 3.a) jwt (>= 1.5, < 3.0) multi_json (~> 1.10) - simctl (1.6.8) + simctl (1.6.10) CFPropertyList naturally slather (2.7.2) @@ -271,8 +270,8 @@ GEM xcodeproj (~> 1.21) sqlite3 (1.4.4) terminal-notifier (2.0.0) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) trailblazer-option (0.1.2) tty-cursor (0.7.1) tty-screen (0.8.1) @@ -286,12 +285,12 @@ GEM unf (0.1.4) unf_ext unf_ext (0.0.8.2) - unicode-display_width (1.8.0) - webrick (1.7.0) + unicode-display_width (2.4.2) + webrick (1.8.1) word_wrap (1.0.0) xcinvoke (0.3.0) liferaft (~> 0.0.6) - xcodeproj (1.22.0) + xcodeproj (1.23.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) diff --git a/Podfile b/Podfile index 8dcdb5e..08d3c06 100644 --- a/Podfile +++ b/Podfile @@ -1,3 +1,5 @@ +source 'https://cdn.cocoapods.org/' + platform :ios, '9.0' use_frameworks! diff --git a/Podfile.lock b/Podfile.lock index 78ebad8..a6cb233 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -11,6 +11,6 @@ SPEC REPOS: SPEC CHECKSUMS: SwiftLint: e14651157288e9e01d6e1a71db7014fb5744a8ea -PODFILE CHECKSUM: e9cd3d2666ced63918b1c94ad12206c66e3f14c0 +PODFILE CHECKSUM: 652cb6e78be2f97c0e2a5f3885b6be555b5af666 -COCOAPODS: 1.11.3 +COCOAPODS: 1.12.1 diff --git a/Source/ActivityRequestBody.swift b/Source/ActivityRequestBody.swift index eb832a2..0ee5203 100644 --- a/Source/ActivityRequestBody.swift +++ b/Source/ActivityRequestBody.swift @@ -25,14 +25,12 @@ import Foundation internal struct ActivityRequestBody { - let ifa: String? let attributionToken: String? let name: String let products: [ButtonProductCompatible]? var dictionaryRepresentation: [String: Any] { var dict: [String: Any?] = [ - "ifa": ifa, "btn_ref": attributionToken ] var data: [String: Any?] = ["name": name] diff --git a/Source/AppEventsRequestBody.swift b/Source/AppEventsRequestBody.swift index 6c11133..96ac6a4 100644 --- a/Source/AppEventsRequestBody.swift +++ b/Source/AppEventsRequestBody.swift @@ -25,12 +25,11 @@ import Foundation internal struct AppEventsRequestBody: Codable { - let ifa: String? let events: [AppEvent] let currentTime: String enum CodingKeys: String, CodingKey { - case ifa, events + case events case currentTime = "current_time" } } diff --git a/Source/ButtonMerchant.swift b/Source/ButtonMerchant.swift index fb1fd8c..b0b2ecc 100644 --- a/Source/ButtonMerchant.swift +++ b/Source/ButtonMerchant.swift @@ -23,7 +23,6 @@ // import UIKit -import AdSupport /** `ButtonMerchant` is the main entry point to the library. @@ -164,7 +163,7 @@ final public class ButtonMerchant: NSObject { An interface through which library features can be enabled/disabled. */ @objc public static var features: Configurable { - return core.system + return Configured() } /** @@ -179,7 +178,6 @@ final public class ButtonMerchant: NSObject { private static func createCore() -> CoreType { let system = System(fileManager: FileManager.default, calendar: Calendar.current, - adIdManager: ASIdentifierManager.shared(), device: UIDevice.current, screen: UIScreen.main, locale: NSLocale.current, @@ -215,3 +213,13 @@ extension ButtonMerchant { completion(ButtonMerchantError.trackOrderDeprecationError) } } + +private class Configured: Configurable { + /** + Deprecated. @see Configurable + */ + var includesIFA: Bool { + get { return false } + set {} + } +} diff --git a/Source/Client.swift b/Source/Client.swift index c447c5b..72936f1 100644 --- a/Source/Client.swift +++ b/Source/Client.swift @@ -58,7 +58,7 @@ internal protocol ClientType: Activity { var pendingTasks: [PendingTask] { get set } func fetchPostInstallURL(_ completion: @escaping (URL?, String?) -> Void) func reportOrder(orderRequest: ReportOrderRequestType, _ completion: ((Error?) -> Void)?) - func reportEvents(_ events: [AppEvent], ifa: String?, _ completion: ((Error?) -> Void)?) + func reportEvents(_ events: [AppEvent], _ completion: ((Error?) -> Void)?) init(session: URLSessionType, userAgent: UserAgentType, defaults: ButtonDefaultsType, system: SystemType) } @@ -111,14 +111,14 @@ internal final class Client: ClientType { } } - func reportEvents(_ events: [AppEvent], ifa: String?, _ completion: ((Error?) -> Void)?) { + func reportEvents(_ events: [AppEvent], _ completion: ((Error?) -> Void)?) { guard events.count > 0 else { if let completion = completion { completion(ButtonMerchantError.noEventsError) } return } - let body = AppEventsRequestBody(ifa: ifa, events: events, currentTime: system.currentDate.ISO8601String) + let body = AppEventsRequestBody(events: events, currentTime: system.currentDate.ISO8601String) let request = urlRequest(url: Service.appEvents.urlWith(applicationId), parameters: body.dictionaryRepresentation) enqueueRequest(request: request) { _, error in if let completion = completion { @@ -227,7 +227,7 @@ internal extension Client { } func reportActivity(_ name: String, products: [ButtonProductCompatible]?) { - let body = ActivityRequestBody(ifa: system.advertisingId, attributionToken: ButtonMerchant.attributionToken, name: name, products: products) + let body = ActivityRequestBody(attributionToken: ButtonMerchant.attributionToken, name: name, products: products) let request = urlRequest(url: Service.activity.urlWith(applicationId), parameters: body.dictionaryRepresentation) enqueueRequest(request: request) { _, _ in diff --git a/Source/Configurable.swift b/Source/Configurable.swift index 52d00af..1398182 100644 --- a/Source/Configurable.swift +++ b/Source/Configurable.swift @@ -30,9 +30,8 @@ import Foundation @objc public protocol Configurable: AnyObject { /** - Indicates whether or not the library will attach IFA to outgoing requests. - - The default value is `true`. If set to `false`, or if the user has limited IFA usage in their device settings, the IFA will not be attached. + Deprecated. This library does not read the advertising identifier even when permission is granted by the user. */ + @available(*, deprecated, message: "Advertising identifier is not accessed by this library.") var includesIFA: Bool { get set } } diff --git a/Source/Core.swift b/Source/Core.swift index 96ef5ae..101cd89 100644 --- a/Source/Core.swift +++ b/Source/Core.swift @@ -142,7 +142,7 @@ final internal class Core: CoreType { time: system.currentDate.ISO8601String, uuid: UUID().uuidString, source: .button) - client.reportEvents([event], ifa: system.advertisingId, nil) + client.reportEvents([event], nil) } private func updateAttributionIfNeeded(token: String?) { @@ -211,6 +211,6 @@ final internal class Core: CoreType { time: system.currentDate.ISO8601String, uuid: UUID().uuidString, source: .custom) - client.reportEvents([event], ifa: system.advertisingId, nil) + client.reportEvents([event], nil) } } diff --git a/Source/Info.plist b/Source/Info.plist index 79efccc..8befd8e 100644 --- a/Source/Info.plist +++ b/Source/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.5.0 + 1.6.0 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSPrincipalClass diff --git a/Source/ReportOrderBody.swift b/Source/ReportOrderBody.swift index 62778d8..9347f7e 100644 --- a/Source/ReportOrderBody.swift +++ b/Source/ReportOrderBody.swift @@ -33,7 +33,6 @@ internal struct ReportOrderBody: Codable { let customerOrderId: String? let lineItems: [Order.LineItem]? let customer: Order.Customer? - let advertisingId: String? enum CodingKeys: String, CodingKey { case attributionToken = "btn_ref" @@ -43,7 +42,6 @@ internal struct ReportOrderBody: Codable { case customerOrderId = "customer_order_id" case lineItems = "line_items" case customer - case advertisingId = "advertising_id" } init(system: SystemType, @@ -57,7 +55,6 @@ internal struct ReportOrderBody: Codable { self.customerOrderId = order.customerOrderId self.lineItems = order.lineItems self.customer = order.customer - self.advertisingId = system.advertisingId } } diff --git a/Source/System.swift b/Source/System.swift index 706f155..b090f94 100644 --- a/Source/System.swift +++ b/Source/System.swift @@ -24,11 +24,9 @@ import UIKit -internal protocol SystemType: Configurable { +internal protocol SystemType: AnyObject { var fileManager: FileManagerType { get } var calendar: CalendarType { get } - var adIdManager: ASIdentifierManagerType { get } - var advertisingId: String? { get } var device: UIDeviceType { get } var screen: UIScreenType { get } var locale: LocaleType { get } @@ -37,7 +35,6 @@ internal protocol SystemType: Configurable { var isNewInstall: Bool { get } init(fileManager: FileManagerType, calendar: CalendarType, - adIdManager: ASIdentifierManagerType, device: UIDeviceType, screen: UIScreenType, locale: LocaleType, @@ -46,24 +43,12 @@ internal protocol SystemType: Configurable { internal final class System: SystemType { - static let allZerosPattern = "^(?:[0+\\-]+){10,}$" - - var includesIFA: Bool var fileManager: FileManagerType var calendar: CalendarType - var adIdManager: ASIdentifierManagerType var device: UIDeviceType var screen: UIScreenType var locale: LocaleType var bundle: BundleType - - var advertisingId: String? { - let ifa = self.adIdManager.advertisingIdentifier.uuidString - guard self.includesIFA && !ifa.matches(System.allZerosPattern) else { - return nil - } - return ifa - } var currentDate: Date { return Date() @@ -82,18 +67,15 @@ internal final class System: SystemType { init(fileManager: FileManagerType, calendar: CalendarType, - adIdManager: ASIdentifierManagerType, device: UIDeviceType, screen: UIScreenType, locale: LocaleType, bundle: BundleType) { self.fileManager = fileManager self.calendar = calendar - self.adIdManager = adIdManager self.device = device self.screen = screen self.locale = locale self.bundle = bundle - self.includesIFA = true } } diff --git a/Source/Version/Version.generated.swift b/Source/Version/Version.generated.swift index bc4968f..be70b0d 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.5.0" + static let stringValue = "1.6.0" } diff --git a/Tests/UnitTests/ActivityRequestBodyTests.swift b/Tests/UnitTests/ActivityRequestBodyTests.swift index d2eba0b..d0aa3d2 100644 --- a/Tests/UnitTests/ActivityRequestBodyTests.swift +++ b/Tests/UnitTests/ActivityRequestBodyTests.swift @@ -30,15 +30,14 @@ class ActivityRequestBodyTests: XCTestCase { func testInitialization_createsInstance() { let product = ButtonProduct() product.id = "some id" - let body = ActivityRequestBody(ifa: "some ifa", attributionToken: "some srctok", name: "some name", products: [product]) + let body = ActivityRequestBody(attributionToken: "some srctok", name: "some name", products: [product]) XCTAssertNotNil(body) - XCTAssertEqual(body.ifa, "some ifa") XCTAssertEqual(body.name, "some name") XCTAssertEqual(body.products?.first?.id, "some id") } func testDictionaryRepresentation_noIFA() { - let body = ActivityRequestBody(ifa: nil, attributionToken: nil, name: "some name", products: nil) + let body = ActivityRequestBody(attributionToken: nil, name: "some name", products: nil) XCTAssertEqual(body.dictionaryRepresentation as NSDictionary, ["activity_data": [ "name": "some name" @@ -46,16 +45,15 @@ class ActivityRequestBodyTests: XCTestCase { } func testDictionaryRepresentation_withIFA() { - let body = ActivityRequestBody(ifa: "some ifa", attributionToken: nil, name: "some name", products: nil) + let body = ActivityRequestBody(attributionToken: nil, name: "some name", products: nil) XCTAssertEqual(body.dictionaryRepresentation as NSDictionary, - ["ifa": "some ifa", - "activity_data": [ + ["activity_data": [ "name": "some name" ]]) } func testDictionaryRepresentation_withAttributionToken() { - let body = ActivityRequestBody(ifa: nil, attributionToken: "some srctok", name: "some name", products: nil) + let body = ActivityRequestBody(attributionToken: "some srctok", name: "some name", products: nil) XCTAssertEqual(body.dictionaryRepresentation as NSDictionary, ["btn_ref": "some srctok", "activity_data": [ @@ -64,10 +62,9 @@ class ActivityRequestBodyTests: XCTestCase { } func testDictionaryRepresentation_emptyProducts() { - let body = ActivityRequestBody(ifa: "some ifa", attributionToken: nil, name: "some name", products: [ButtonProduct(), ButtonProduct()]) + let body = ActivityRequestBody(attributionToken: nil, name: "some name", products: [ButtonProduct(), ButtonProduct()]) XCTAssertEqual(body.dictionaryRepresentation as NSDictionary, - ["ifa": "some ifa", - "activity_data": [ + ["activity_data": [ "name": "some name", "products": [[:], [:]] ]]) @@ -84,10 +81,9 @@ class ActivityRequestBodyTests: XCTestCase { product.quantity = 25 product.url = "example.com" product.attributes = ["a": "z", "b": "y"] - let body = ActivityRequestBody(ifa: "some ifa", attributionToken: nil, name: "some name", products: [product]) + let body = ActivityRequestBody(attributionToken: nil, name: "some name", products: [product]) XCTAssertEqual(body.dictionaryRepresentation as NSDictionary, [ - "ifa": "some ifa", "activity_data": [ "name": "some name", "products": [[ diff --git a/Tests/UnitTests/AppEventsRequestBodyTests.swift b/Tests/UnitTests/AppEventsRequestBodyTests.swift index c455c71..f5be4e9 100644 --- a/Tests/UnitTests/AppEventsRequestBodyTests.swift +++ b/Tests/UnitTests/AppEventsRequestBodyTests.swift @@ -34,9 +34,8 @@ class AppEventsRequestBodyTests: XCTestCase { time: "2019-07-25T21:30:02.844Z", uuid: "3b3024dc-e56f-412e-8015-5c2c308126fd", source: .button) - let body = AppEventsRequestBody(ifa: "some ifa", events: [event], currentTime: "some time") + let body = AppEventsRequestBody(events: [event], currentTime: "some time") - XCTAssertEqual(body.ifa, "some ifa") XCTAssertEqual(body.currentTime, "some time") XCTAssertEqual(body.events.count, 1) XCTAssertEqual(body.events.first?.name, "test-event") @@ -54,11 +53,10 @@ class AppEventsRequestBodyTests: XCTestCase { time: "2019-07-25T21:30:02.844Z", uuid: "3b3024dc-e56f-412e-8015-5c2c308126fd", source: .button) - let body = AppEventsRequestBody(ifa: "some ifa", events: [event], currentTime: "some time") + let body = AppEventsRequestBody(events: [event], currentTime: "some time") XCTAssertEqual(body.dictionaryRepresentation as NSDictionary, [ - "ifa": "some ifa", "current_time": "some time", "events": [ [ @@ -79,7 +77,7 @@ class AppEventsRequestBodyTests: XCTestCase { time: "2019-07-25T21:30:02.844Z", uuid: "3b3024dc-e56f-412e-8015-5c2c308126fd", source: .button) - let body = AppEventsRequestBody(ifa: nil, events: [event], currentTime: "some time") + let body = AppEventsRequestBody(events: [event], currentTime: "some time") XCTAssertEqual(body.dictionaryRepresentation as NSDictionary, [ diff --git a/Tests/UnitTests/ButtonMerchantTests.swift b/Tests/UnitTests/ButtonMerchantTests.swift index dd81d0f..d70639d 100644 --- a/Tests/UnitTests/ButtonMerchantTests.swift +++ b/Tests/UnitTests/ButtonMerchantTests.swift @@ -193,7 +193,7 @@ class ButtonMerchantTests: XCTestCase { XCTAssertFalse(ButtonMerchant.features.includesIFA) } - func testIFASetTrue() { + func testIFASetTrueRemainsFalse() { // Arrange ButtonMerchant._core = testCore @@ -201,7 +201,7 @@ class ButtonMerchantTests: XCTestCase { ButtonMerchant.features.includesIFA = true // Assert - XCTAssertTrue(ButtonMerchant.features.includesIFA) + XCTAssertFalse(ButtonMerchant.features.includesIFA) } func testActivity_returnsClient() { diff --git a/Tests/UnitTests/ClientTests.swift b/Tests/UnitTests/ClientTests.swift index 93cb334..7cef1ae 100644 --- a/Tests/UnitTests/ClientTests.swift +++ b/Tests/UnitTests/ClientTests.swift @@ -580,7 +580,7 @@ class ClientTests: XCTestCase { attributionToken: "some token", time: "some time", uuid: "some uuid", source: .button) // Act - client.reportEvents([event], ifa: "some ifa") { error in + client.reportEvents([event]) { error in let request = testSession.lastDataTask?.originalRequest! let body = try? JSONDecoder().decode(AppEventsRequestBody.self, from: request!.httpBody!) @@ -588,7 +588,6 @@ class ClientTests: XCTestCase { XCTAssertNil(error) XCTAssertEqual(request?.url?.absoluteString, "https://app-abc123.mobileapi.usebutton.com/v1/app/events") XCTAssertEqual(body.dictionaryRepresentation as NSDictionary, [ - "ifa": "some ifa", "current_time": "2019-07-25T21:30:02Z", "events": [ [ @@ -622,7 +621,7 @@ class ClientTests: XCTestCase { client.applicationId = ApplicationId("app-abc123") // Act - client.reportEvents([], ifa: "some ifa") { error in + client.reportEvents([]) { error in // Assert XCTAssertFalse(testSession.didCallDataTaskWithRequest) @@ -644,7 +643,7 @@ class ClientTests: XCTestCase { // Act client.fetchPostInstallURL { _, _ in } - client.reportEvents([event], ifa: "some ifa") { _ in } + client.reportEvents([event]) { _ in } // Assert XCTAssertEqual(client.pendingTasks.count, 2) @@ -689,7 +688,7 @@ class ClientTests: XCTestCase { system: TestSystem()) let event = AppEvent(name: "event1", value: nil, attributionToken: "some token", time: "some time", uuid: "some uuid", source: .button) client.fetchPostInstallURL { _, _ in } - client.reportEvents([event], ifa: "some ifa") { _ in } + client.reportEvents([event]) { _ in } // Act client.applicationId = ApplicationId("app-test") @@ -711,7 +710,6 @@ class ClientTests: XCTestCase { // Arrange let testURLSession = TestURLSession() let testSystem = TestSystem() - testSystem.advertisingId = "some ifa" let client = Client(session: testURLSession, userAgent: TestUserAgent(), defaults: TestButtonDefaults(userDefaults: TestUserDefaults()), @@ -727,7 +725,6 @@ class ClientTests: XCTestCase { XCTAssertEqual(task.originalRequest?.url?.absoluteString, "https://app-abc123.mobileapi.usebutton.com/v1/app/activity") let json = try? JSONSerialization.jsonObject(with: task.originalRequest!.httpBody!) as? NSDictionary - XCTAssertEqual(json?["ifa"] as? String, "some ifa") XCTAssertEqual((json?["activity_data"] as? NSDictionary)?["name"] as? String, "product-viewed") } @@ -735,7 +732,6 @@ class ClientTests: XCTestCase { // Arrange let testURLSession = TestURLSession() let testSystem = TestSystem() - testSystem.advertisingId = "some ifa" let client = Client(session: testURLSession, userAgent: TestUserAgent(), defaults: TestButtonDefaults(userDefaults: TestUserDefaults()), @@ -751,7 +747,6 @@ class ClientTests: XCTestCase { XCTAssertEqual(task.originalRequest?.url?.absoluteString, "https://app-abc123.mobileapi.usebutton.com/v1/app/activity") let json = try? JSONSerialization.jsonObject(with: task.originalRequest!.httpBody!) as? NSDictionary - XCTAssertEqual(json?["ifa"] as? String, "some ifa") XCTAssertEqual((json?["activity_data"] as? NSDictionary)?["name"] as? String, "add-to-cart") } @@ -759,7 +754,6 @@ class ClientTests: XCTestCase { // Arrange let testURLSession = TestURLSession() let testSystem = TestSystem() - testSystem.advertisingId = "some ifa" let client = Client(session: testURLSession, userAgent: TestUserAgent(), defaults: TestButtonDefaults(userDefaults: TestUserDefaults()), @@ -775,7 +769,6 @@ class ClientTests: XCTestCase { XCTAssertEqual(task.originalRequest?.url?.absoluteString, "https://app-abc123.mobileapi.usebutton.com/v1/app/activity") let json = try? JSONSerialization.jsonObject(with: task.originalRequest!.httpBody!) as? NSDictionary - XCTAssertEqual(json?["ifa"] as? String, "some ifa") XCTAssertEqual((json?["activity_data"] as? NSDictionary)?["name"] as? String, "cart-viewed") } } diff --git a/Tests/UnitTests/CoreTests.swift b/Tests/UnitTests/CoreTests.swift index d022fc0..34ca225 100644 --- a/Tests/UnitTests/CoreTests.swift +++ b/Tests/UnitTests/CoreTests.swift @@ -113,7 +113,6 @@ class CoreTests: XCTestCase { func testTrackIncomingURL_withToken_tracksDeeplinkOpened() { // Arrange - testSystem.advertisingId = "some ifa" testSystem.testCurrentDate = Date.ISO8601Formatter.date(from: "2019-07-25T21:30:02Z")! let url = URL(string: "http://usebutton.com/with-token?btn_ref=faketok-abc123")! @@ -122,7 +121,6 @@ class CoreTests: XCTestCase { // Assert XCTAssertTrue(testClient.didCallReportEvents) - XCTAssertEqual(testClient.actualIFA, "some ifa") XCTAssertEqual(testClient.actualEvents?.count, 1) XCTAssertEqual(testClient.actualEvents?.first?.name, "btn:deeplink-opened") XCTAssertEqual(testClient.actualEvents?.first?.value?["url"], url.absoluteString) @@ -452,8 +450,7 @@ class CoreTests: XCTestCase { // swiftlint:disable line_length XCTAssertEqual(testClient.testReportOrderRequest!.parameters as NSDictionary, - ["advertising_id": "00000000-0000-0000-0000-000000000000", - "btn_ref": "srctok-abc123", + ["btn_ref": "srctok-abc123", "order_id": "order-abc", "currency": "USD", "purchase_date": date.ISO8601String, diff --git a/Tests/UnitTests/Extensions/UIDeviceTests.swift b/Tests/UnitTests/Extensions/UIDeviceTests.swift index 7a28378..a099b28 100644 --- a/Tests/UnitTests/Extensions/UIDeviceTests.swift +++ b/Tests/UnitTests/Extensions/UIDeviceTests.swift @@ -27,11 +27,6 @@ import XCTest class UIDeviceTests: XCTestCase { - func testModelName() { - let modelName = UIDevice.current.modelName - XCTAssertEqual(modelName, "x86_64") - } - func testMachineName() { let machineName = UIDevice.current.machineName(from: TestUTSName.systemInfo) XCTAssertEqual(machineName, "iPhone10,6") diff --git a/Tests/UnitTests/ReportOrderBodyTests.swift b/Tests/UnitTests/ReportOrderBodyTests.swift index ce2bb2f..1da4d6c 100644 --- a/Tests/UnitTests/ReportOrderBodyTests.swift +++ b/Tests/UnitTests/ReportOrderBodyTests.swift @@ -69,8 +69,7 @@ class ReportOrderBodyTests: XCTestCase { // Assert XCTAssertEqual(body.dictionaryRepresentation as NSDictionary, - ["advertising_id": "00000000-0000-0000-0000-000000000000", - "btn_ref": "srctok-abc123", + ["btn_ref": "srctok-abc123", "order_id": "order-abc", "currency": "USD", "purchase_date": date.ISO8601String, @@ -85,7 +84,6 @@ class ReportOrderBodyTests: XCTestCase { let date: Date = Date.ISO8601Formatter.date(from: "2019-06-17T12:08:10-04:00")! let order = Order(id: "order-abc", purchaseDate: date, lineItems: []) let testSystem = TestSystem() - testSystem.advertisingId = nil // Act let body = ReportOrderBody(system: testSystem, attributionToken: "srctok-abc123", diff --git a/Tests/UnitTests/SystemTests.swift b/Tests/UnitTests/SystemTests.swift index 0ae72be..9f79b7b 100644 --- a/Tests/UnitTests/SystemTests.swift +++ b/Tests/UnitTests/SystemTests.swift @@ -29,7 +29,6 @@ class SystemTests: XCTestCase { var fileManager: TestFileManager! var calendar: TestCalendar! - var adIdManager: TestAdIdManager! var device: TestDevice! var screen: TestScreen! var locale: TestLocale! @@ -41,14 +40,12 @@ class SystemTests: XCTestCase { super.setUp() fileManager = TestFileManager() calendar = TestCalendar() - adIdManager = TestAdIdManager() device = TestDevice() screen = TestScreen() locale = TestLocale() bundle = TestBundle() system = System(fileManager: fileManager, calendar: calendar, - adIdManager: adIdManager, device: device, screen: screen, locale: locale, @@ -118,42 +115,4 @@ class SystemTests: XCTestCase { // Assert XCTAssertFalse(isNewInstall) } - - func testIFADefaultValue() { - XCTAssertTrue(system.includesIFA) - } - - func testAdvertisingId_whenValid_returnsString() { - // Arrange - adIdManager.stubbedID = .validId - XCTAssertEqual(system.advertisingId, "11111111-1111-1111-1111-111111111111") - adIdManager.stubbedID = .validIdWithLeadingZeros - XCTAssertEqual(system.advertisingId, "00000000-0011-1111-1111-111111111111") - adIdManager.stubbedID = .validIdWithMidZeros - XCTAssertEqual(system.advertisingId, "11111111-1000-0000-0001-111111111111") - adIdManager.stubbedID = .validIdWithTrailingZeros - XCTAssertEqual(system.advertisingId, "11111111-1111-1111-1111-110000000000") - } - - func testAdvertisingId_whenInvalid_returnsNil() { - // Arrange - system.adIdManager = TestAdIdManager(.invalidId) - - // Act - let advertisingId = system.advertisingId - - // Assert - XCTAssertNil(advertisingId) - } - - func testincludesIFASetToFalse() { - // Arrange - system.includesIFA = false - - // Act - let advertisingId = system.advertisingId - - // Assert - XCTAssertNil(advertisingId) - } } diff --git a/Tests/UnitTests/TestObjects/Foundation/TestAdIdManager.swift b/Tests/UnitTests/TestObjects/Foundation/TestAdIdManager.swift deleted file mode 100644 index badfda9..0000000 --- a/Tests/UnitTests/TestObjects/Foundation/TestAdIdManager.swift +++ /dev/null @@ -1,47 +0,0 @@ -// -// TestAdIdManager.swift -// -// Copyright © 2018 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 TestAdIdManager: ASIdentifierManagerType { - - enum AdIDType: String { - case validId = "11111111-1111-1111-1111-111111111111" - case validIdWithLeadingZeros = "00000000-0011-1111-1111-111111111111" - case validIdWithTrailingZeros = "11111111-1111-1111-1111-110000000000" - case validIdWithMidZeros = "11111111-1000-0000-0001-111111111111" - case invalidId = "00000000-0000-0000-0000-000000000000" - } - - var stubbedID: AdIDType - - var advertisingIdentifier: UUID { - return UUID(uuidString: stubbedID.rawValue)! - } - - init(_ adIDType: AdIDType = .validId) { - stubbedID = adIDType - } -} diff --git a/Tests/UnitTests/TestObjects/TestClient.swift b/Tests/UnitTests/TestObjects/TestClient.swift index f348f8c..c77d8c8 100644 --- a/Tests/UnitTests/TestObjects/TestClient.swift +++ b/Tests/UnitTests/TestObjects/TestClient.swift @@ -52,7 +52,6 @@ class TestClient: ClientType { var reportOrderCompletion: ((Error?) -> Void)? var actualEvents: [AppEvent]? - var actualIFA: String? var actualReportEventsCompletion: ((Error?) -> Void)? var actualProduct: ButtonProductCompatible? var actualProducts: [ButtonProductCompatible]? @@ -82,10 +81,9 @@ class TestClient: ClientType { reportOrderCompletion = completion } - func reportEvents(_ events: [AppEvent], ifa: String?, _ completion: ((Error?) -> Void)?) { + func reportEvents(_ events: [AppEvent], _ completion: ((Error?) -> Void)?) { didCallReportEvents = true actualEvents = events - actualIFA = ifa actualReportEventsCompletion = completion } diff --git a/Tests/UnitTests/TestObjects/TestSystem.swift b/Tests/UnitTests/TestObjects/TestSystem.swift index 551f767..e0b6b74 100644 --- a/Tests/UnitTests/TestObjects/TestSystem.swift +++ b/Tests/UnitTests/TestObjects/TestSystem.swift @@ -32,17 +32,13 @@ final class TestSystem: SystemType { var testCurrentDate: Date // SystemType - var includesIFA: Bool var fileManager: FileManagerType var calendar: CalendarType - var adIdManager: ASIdentifierManagerType var device: UIDeviceType var screen: UIScreenType var locale: LocaleType var bundle: BundleType - var advertisingId: String? = "00000000-0000-0000-0000-000000000000" - var currentDate: Date { return testCurrentDate } @@ -53,7 +49,6 @@ final class TestSystem: SystemType { init(fileManager: FileManagerType = TestFileManager(), calendar: CalendarType = TestCalendar(), - adIdManager: ASIdentifierManagerType = TestAdIdManager(), device: UIDeviceType = TestDevice(), screen: UIScreenType = TestScreen(), locale: LocaleType = TestLocale(), @@ -65,11 +60,9 @@ final class TestSystem: SystemType { self.fileManager = fileManager self.calendar = calendar - self.adIdManager = adIdManager self.device = device self.screen = screen self.locale = locale self.bundle = bundle - self.includesIFA = true } } diff --git a/Tests/UnitTests/Version/VersionTests.generated.swift b/Tests/UnitTests/Version/VersionTests.generated.swift index e821505..c890bcd 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.5.0") + XCTAssertEqual(Version.stringValue, "1.6.0") } func testPlistVersion() { let libraryBundle = Bundle(for: ButtonMerchant.self) - XCTAssertEqual(libraryBundle.infoDictionary!["CFBundleShortVersionString"] as? String, "1.5.0") + XCTAssertEqual(libraryBundle.infoDictionary!["CFBundleShortVersionString"] as? String, "1.6.0") } } diff --git a/docs/history/1.6.0/Classes.html b/docs/history/1.6.0/Classes.html new file mode 100644 index 0000000..e25ab8b --- /dev/null +++ b/docs/history/1.6.0/Classes.html @@ -0,0 +1,208 @@ + + + + Classes Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Classes

+

The following classes are available globally.

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

    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.6.0/Classes/ButtonMerchant.html b/docs/history/1.6.0/Classes/ButtonMerchant.html new file mode 100644 index 0000000..6ff0bd1 --- /dev/null +++ b/docs/history/1.6.0/Classes/ButtonMerchant.html @@ -0,0 +1,595 @@ + + + + ButtonMerchant Class Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

ButtonMerchant

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

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 tracked 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

    +

    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

    +

    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 a Button attribution and if present stores the token.

    +
    +

    Attention

    +

    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 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

    +

    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 +(docs)

    + +
    +
    +

    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 }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Deprecations +

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

    Deprecated.

    + +

    This method is deprecated and will be removed in a future version. It is safe to remove your usage of this method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "No longer supported. You can safely remove your usage of this method.")
    +@objc
    +public static func trackOrder(_ order: Order, completion: ((Error?) -> Void)? = nil)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/Classes/ButtonProduct.html b/docs/history/1.6.0/Classes/ButtonProduct.html new file mode 100644 index 0000000..73be652 --- /dev/null +++ b/docs/history/1.6.0/Classes/ButtonProduct.html @@ -0,0 +1,358 @@ + + + + ButtonProduct Class Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 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.6.0/Classes/Order.html b/docs/history/1.6.0/Classes/Order.html new file mode 100644 index 0000000..02af6c5 --- /dev/null +++ b/docs/history/1.6.0/Classes/Order.html @@ -0,0 +1,345 @@ + + + + Order Class Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 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.6.0/Classes/Order/Customer.html b/docs/history/1.6.0/Classes/Order/Customer.html new file mode 100644 index 0000000..e27f88d --- /dev/null +++ b/docs/history/1.6.0/Classes/Order/Customer.html @@ -0,0 +1,215 @@ + + + + Customer Class Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Customer

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

Represents a customer in the order.

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

    The SHA-256 hash of the transacting customer’s lowercase email, as a 64-character hex string.

    + +

    Note: The value of the e-mail address must be converted to lowercase before +computing the hash. The hash itself may use uppercase or lowercase hex characters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    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.6.0/Classes/Order/LineItem.html b/docs/history/1.6.0/Classes/Order/LineItem.html new file mode 100644 index 0000000..9075bcd --- /dev/null +++ b/docs/history/1.6.0/Classes/Order/LineItem.html @@ -0,0 +1,350 @@ + + + + LineItem Class Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 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.6.0/Enums.html b/docs/history/1.6.0/Enums.html new file mode 100644 index 0000000..f7bc5ba --- /dev/null +++ b/docs/history/1.6.0/Enums.html @@ -0,0 +1,204 @@ + + + + Enumerations Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 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.6.0/Enums/ButtonMerchantError.html b/docs/history/1.6.0/Enums/ButtonMerchantError.html new file mode 100644 index 0000000..df5daca --- /dev/null +++ b/docs/history/1.6.0/Enums/ButtonMerchantError.html @@ -0,0 +1,179 @@ + + + + ButtonMerchantError Enumeration Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

ButtonMerchantError

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

Button Merchant Library Errors.

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

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

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

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case noEventsError
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/Enums/ConfigurationError.html b/docs/history/1.6.0/Enums/ConfigurationError.html new file mode 100644 index 0000000..4d71f73 --- /dev/null +++ b/docs/history/1.6.0/Enums/ConfigurationError.html @@ -0,0 +1,184 @@ + + + + ConfigurationError Enumeration Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 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
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

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

ButtonMerchant 1.6.0 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.6.0/Protocols.html b/docs/history/1.6.0/Protocols.html new file mode 100644 index 0000000..0eabce7 --- /dev/null +++ b/docs/history/1.6.0/Protocols.html @@ -0,0 +1,204 @@ + + + + Protocols Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 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 + +
    +
    +
    +
    +
    +
    +

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

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

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

ButtonMerchant 1.6.0 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.6.0/Protocols/ButtonProductCompatible.html b/docs/history/1.6.0/Protocols/ButtonProductCompatible.html new file mode 100644 index 0000000..5f641b3 --- /dev/null +++ b/docs/history/1.6.0/Protocols/ButtonProductCompatible.html @@ -0,0 +1,368 @@ + + + + ButtonProductCompatible Protocol Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 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.6.0/Protocols/Configurable.html b/docs/history/1.6.0/Protocols/Configurable.html new file mode 100644 index 0000000..25d70b8 --- /dev/null +++ b/docs/history/1.6.0/Protocols/Configurable.html @@ -0,0 +1,153 @@ + + + + Configurable Protocol Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Configurable

+
+
+ +
@objc
+public protocol Configurable
+ +
+
+

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

+ +
+
+
+
    +
  • +
    + + + + includesIFA + +
    +
    +
    +
    +
    +
    +

    Deprecated. This library does not read the advertising identifier even when premission 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.6.0/Structs.html b/docs/history/1.6.0/Structs.html new file mode 100644 index 0000000..4a507f0 --- /dev/null +++ b/docs/history/1.6.0/Structs.html @@ -0,0 +1,149 @@ + + + + Structures Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 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.6.0/badge.svg b/docs/history/1.6.0/badge.svg new file mode 100644 index 0000000..19d671e --- /dev/null +++ b/docs/history/1.6.0/badge.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + documentation + + + documentation + + + 95% + + + 95% + + + diff --git a/docs/history/1.6.0/css/highlight.css b/docs/history/1.6.0/css/highlight.css new file mode 100644 index 0000000..c170357 --- /dev/null +++ b/docs/history/1.6.0/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.6.0/css/jazzy.css b/docs/history/1.6.0/css/jazzy.css new file mode 100644 index 0000000..2e38713 --- /dev/null +++ b/docs/history/1.6.0/css/jazzy.css @@ -0,0 +1,439 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { + background: transparent; + border: 0; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; } + +body { + background-color: #f2f2f2; + font-family: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + -webkit-font-smoothing: subpixel-antialiased; + word-wrap: break-word; } + +h1, h2, h3 { + margin-top: 0.8em; + margin-bottom: 0.3em; + font-weight: 100; + color: black; } + +h1 { + font-size: 2.5em; } + +h2 { + font-size: 2em; + border-bottom: 1px solid #e2e2e2; } + +h4 { + font-size: 13px; + line-height: 1.5; + margin-top: 21px; } + +h5 { + font-size: 1.1em; } + +h6 { + font-size: 1.1em; + color: #777; } + +.section-name { + color: gray; + display: block; + font-family: Helvetica; + font-size: 22px; + font-weight: 100; + margin-bottom: 15px; } + +pre, code { + font: 0.95em Menlo, monospace; + color: #777; + word-wrap: normal; } + +p code, li code { + background-color: #eee; + padding: 2px 4px; + border-radius: 4px; } + +pre > code { + padding: 0; } + +a { + color: #0088cc; + text-decoration: none; } + a code { + color: inherit; } + +ul { + padding-left: 15px; } + +li { + line-height: 1.8em; } + +img { + max-width: 100%; } + +blockquote { + margin-left: 0; + padding: 0 10px; + border-left: 4px solid #ccc; } + +hr { + height: 1px; + border: none; + background-color: #e2e2e2; } + +.footnote-ref { + display: inline-block; + scroll-margin-top: 70px; } + +.footnote-def { + scroll-margin-top: 70px; } + +.content-wrapper { + margin: 0 auto; + width: 980px; } + +header { + font-size: 0.85em; + line-height: 32px; + background-color: #414141; + position: fixed; + width: 100%; + z-index: 3; } + header img { + padding-right: 6px; + vertical-align: -3px; + height: 16px; } + header a { + color: #fff; } + header p { + float: left; + color: #999; } + header .header-right { + float: right; + margin-left: 16px; } + +#breadcrumbs { + background-color: #f2f2f2; + height: 21px; + padding-top: 17px; + position: fixed; + width: 100%; + z-index: 2; + margin-top: 32px; } + #breadcrumbs #carat { + height: 10px; + margin: 0 5px; } + +.sidebar { + background-color: #f9f9f9; + border: 1px solid #e2e2e2; + overflow-y: auto; + overflow-x: hidden; + position: fixed; + top: 70px; + bottom: 0; + width: 230px; + word-wrap: normal; } + +.nav-groups { + list-style-type: none; + background: #fff; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #e2e2e2; + font-size: 1.1em; + font-weight: 100; + padding: 15px 0 15px 20px; } + .nav-group-name > a { + color: #333; } + +.nav-group-tasks { + margin-top: 5px; } + +.nav-group-task { + font-size: 0.9em; + list-style-type: none; + white-space: nowrap; } + .nav-group-task a { + color: #888; } + +.main-content { + background-color: #fff; + border: 1px solid #e2e2e2; + margin-left: 246px; + position: absolute; + overflow: hidden; + padding-bottom: 20px; + top: 70px; + width: 734px; } + .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { + margin-bottom: 1em; } + .main-content p { + line-height: 1.8em; } + .main-content section .section:first-child { + margin-top: 0; + padding-top: 0; } + .main-content section .task-group-section .task-group:first-of-type { + padding-top: 10px; } + .main-content section .task-group-section .task-group:first-of-type .section-name { + padding-top: 15px; } + .main-content section .heading:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .main-content .section-name p { + margin-bottom: inherit; + line-height: inherit; } + .main-content .section-name code { + background-color: inherit; + padding: inherit; + color: inherit; } + +.section { + padding: 0 25px; } + +.highlight { + background-color: #eee; + padding: 10px 12px; + border: 1px solid #e2e2e2; + border-radius: 4px; + overflow-x: auto; } + +.declaration .highlight { + overflow-x: initial; + padding: 0 40px 40px 0; + margin-bottom: -25px; + background-color: transparent; + border: none; } + +.section-name { + margin: 0; + margin-left: 18px; } + +.task-group-section { + margin-top: 10px; + padding-left: 6px; + border-top: 1px solid #e2e2e2; } + +.task-group { + padding-top: 0px; } + +.task-name-container a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + +.section-name-container { + position: relative; + display: inline-block; } + .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 { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .item code { + background-color: transparent; + padding: 0; } + .item .token, .item .direct-link { + display: inline-block; + text-indent: -20px; + padding-left: 3px; + margin-left: 35px; + font-size: 11.9px; + transition: all 300ms; } + .item .token-open { + margin-left: 20px; } + .item .discouraged { + text-decoration: line-through; } + .item .declaration-note { + font-size: .85em; + color: gray; + font-style: italic; } + +.pointer-container { + border-bottom: 1px solid #e2e2e2; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + background: #f9f9f9; + border-left: 1px solid #e2e2e2; + border-top: 1px solid #e2e2e2; + height: 12px; + left: 21px; + top: -7px; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + position: absolute; + width: 12px; } + +.height-container { + display: none; + left: -25px; + padding: 0 25px; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #f9f9f9; + border-bottom: 1px solid #e2e2e2; + left: -25px; + position: relative; + width: 100%; + padding-top: 10px; + padding-bottom: 5px; } + +.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: #4b8afb; } + +.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 #e2e2e2; + 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 { + position: relative; + top: 10px; + bottom: 0px; + margin-left: 25px; } + #footer p { + margin: 0; + color: #aaa; + font-size: 0.8em; } + +html.dash header, html.dash #breadcrumbs, html.dash .sidebar { + display: none; } + +html.dash .main-content { + width: 980px; + margin-left: 0; + border: none; + width: 100%; + top: 0; + padding-bottom: 0; } + +html.dash .height-container { + display: block; } + +html.dash .item .token { + margin-left: 0; } + +html.dash .content-wrapper { + width: auto; } + +html.dash #footer { + position: static; } + +form[role=search] { + float: right; } + form[role=search] input { + font: Helvetica, freesans, Arial, sans-serif; + margin-top: 6px; + font-size: 13px; + line-height: 20px; + padding: 0px 10px; + 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: #fff; + color: #333; + border: 1px solid #e2e2e2; + z-index: 4; } + form[role=search] .tt-highlight { + font-weight: bold; } + form[role=search] .tt-suggestion { + font: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + 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.6.0/docsets/ButtonMerchant.docset/Contents/Info.plist b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Info.plist new file mode 100644 index 0000000..49cb17c --- /dev/null +++ b/docs/history/1.6.0/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.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes.html new file mode 100644 index 0000000..e25ab8b --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes.html @@ -0,0 +1,208 @@ + + + + Classes Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Classes

+

The following classes are available globally.

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

    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.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonMerchant.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonMerchant.html new file mode 100644 index 0000000..6ff0bd1 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonMerchant.html @@ -0,0 +1,595 @@ + + + + ButtonMerchant Class Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

ButtonMerchant

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

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 tracked 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

    +

    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

    +

    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 a Button attribution and if present stores the token.

    +
    +

    Attention

    +

    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 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

    +

    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 +(docs)

    + +
    +
    +

    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 }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Deprecations +

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

    Deprecated.

    + +

    This method is deprecated and will be removed in a future version. It is safe to remove your usage of this method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "No longer supported. You can safely remove your usage of this method.")
    +@objc
    +public static func trackOrder(_ order: Order, completion: ((Error?) -> Void)? = nil)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonProduct.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonProduct.html new file mode 100644 index 0000000..73be652 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonProduct.html @@ -0,0 +1,358 @@ + + + + ButtonProduct Class Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 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.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order.html new file mode 100644 index 0000000..02af6c5 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order.html @@ -0,0 +1,345 @@ + + + + Order Class Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 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.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/Customer.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/Customer.html new file mode 100644 index 0000000..e27f88d --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/Customer.html @@ -0,0 +1,215 @@ + + + + Customer Class Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Customer

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

Represents a customer in the order.

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

    The SHA-256 hash of the transacting customer’s lowercase email, as a 64-character hex string.

    + +

    Note: The value of the e-mail address must be converted to lowercase before +computing the hash. The hash itself may use uppercase or lowercase hex characters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    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.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/LineItem.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/LineItem.html new file mode 100644 index 0000000..9075bcd --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/LineItem.html @@ -0,0 +1,350 @@ + + + + LineItem Class Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 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.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums.html new file mode 100644 index 0000000..f7bc5ba --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums.html @@ -0,0 +1,204 @@ + + + + Enumerations Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 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.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ButtonMerchantError.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ButtonMerchantError.html new file mode 100644 index 0000000..df5daca --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ButtonMerchantError.html @@ -0,0 +1,179 @@ + + + + ButtonMerchantError Enumeration Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

ButtonMerchantError

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

Button Merchant Library Errors.

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

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

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

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

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

ButtonMerchant 1.6.0 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
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

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

ButtonMerchant 1.6.0 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.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols.html new file mode 100644 index 0000000..0eabce7 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols.html @@ -0,0 +1,204 @@ + + + + Protocols Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 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 + +
    +
    +
    +
    +
    +
    +

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

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

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

ButtonMerchant 1.6.0 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.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/ButtonProductCompatible.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/ButtonProductCompatible.html new file mode 100644 index 0000000..5f641b3 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/ButtonProductCompatible.html @@ -0,0 +1,368 @@ + + + + ButtonProductCompatible Protocol Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 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.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Configurable.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Configurable.html new file mode 100644 index 0000000..25d70b8 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Configurable.html @@ -0,0 +1,153 @@ + + + + Configurable Protocol Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Configurable

+
+
+ +
@objc
+public protocol Configurable
+ +
+
+

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

+ +
+
+
+
    +
  • +
    + + + + includesIFA + +
    +
    +
    +
    +
    +
    +

    Deprecated. This library does not read the advertising identifier even when premission 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.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Structs.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Structs.html new file mode 100644 index 0000000..4a507f0 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Structs.html @@ -0,0 +1,149 @@ + + + + Structures Reference + + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 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.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/highlight.css b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/highlight.css new file mode 100644 index 0000000..c170357 --- /dev/null +++ b/docs/history/1.6.0/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.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/jazzy.css b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/jazzy.css new file mode 100644 index 0000000..2e38713 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/jazzy.css @@ -0,0 +1,439 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { + background: transparent; + border: 0; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; } + +body { + background-color: #f2f2f2; + font-family: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + -webkit-font-smoothing: subpixel-antialiased; + word-wrap: break-word; } + +h1, h2, h3 { + margin-top: 0.8em; + margin-bottom: 0.3em; + font-weight: 100; + color: black; } + +h1 { + font-size: 2.5em; } + +h2 { + font-size: 2em; + border-bottom: 1px solid #e2e2e2; } + +h4 { + font-size: 13px; + line-height: 1.5; + margin-top: 21px; } + +h5 { + font-size: 1.1em; } + +h6 { + font-size: 1.1em; + color: #777; } + +.section-name { + color: gray; + display: block; + font-family: Helvetica; + font-size: 22px; + font-weight: 100; + margin-bottom: 15px; } + +pre, code { + font: 0.95em Menlo, monospace; + color: #777; + word-wrap: normal; } + +p code, li code { + background-color: #eee; + padding: 2px 4px; + border-radius: 4px; } + +pre > code { + padding: 0; } + +a { + color: #0088cc; + text-decoration: none; } + a code { + color: inherit; } + +ul { + padding-left: 15px; } + +li { + line-height: 1.8em; } + +img { + max-width: 100%; } + +blockquote { + margin-left: 0; + padding: 0 10px; + border-left: 4px solid #ccc; } + +hr { + height: 1px; + border: none; + background-color: #e2e2e2; } + +.footnote-ref { + display: inline-block; + scroll-margin-top: 70px; } + +.footnote-def { + scroll-margin-top: 70px; } + +.content-wrapper { + margin: 0 auto; + width: 980px; } + +header { + font-size: 0.85em; + line-height: 32px; + background-color: #414141; + position: fixed; + width: 100%; + z-index: 3; } + header img { + padding-right: 6px; + vertical-align: -3px; + height: 16px; } + header a { + color: #fff; } + header p { + float: left; + color: #999; } + header .header-right { + float: right; + margin-left: 16px; } + +#breadcrumbs { + background-color: #f2f2f2; + height: 21px; + padding-top: 17px; + position: fixed; + width: 100%; + z-index: 2; + margin-top: 32px; } + #breadcrumbs #carat { + height: 10px; + margin: 0 5px; } + +.sidebar { + background-color: #f9f9f9; + border: 1px solid #e2e2e2; + overflow-y: auto; + overflow-x: hidden; + position: fixed; + top: 70px; + bottom: 0; + width: 230px; + word-wrap: normal; } + +.nav-groups { + list-style-type: none; + background: #fff; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #e2e2e2; + font-size: 1.1em; + font-weight: 100; + padding: 15px 0 15px 20px; } + .nav-group-name > a { + color: #333; } + +.nav-group-tasks { + margin-top: 5px; } + +.nav-group-task { + font-size: 0.9em; + list-style-type: none; + white-space: nowrap; } + .nav-group-task a { + color: #888; } + +.main-content { + background-color: #fff; + border: 1px solid #e2e2e2; + margin-left: 246px; + position: absolute; + overflow: hidden; + padding-bottom: 20px; + top: 70px; + width: 734px; } + .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { + margin-bottom: 1em; } + .main-content p { + line-height: 1.8em; } + .main-content section .section:first-child { + margin-top: 0; + padding-top: 0; } + .main-content section .task-group-section .task-group:first-of-type { + padding-top: 10px; } + .main-content section .task-group-section .task-group:first-of-type .section-name { + padding-top: 15px; } + .main-content section .heading:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .main-content .section-name p { + margin-bottom: inherit; + line-height: inherit; } + .main-content .section-name code { + background-color: inherit; + padding: inherit; + color: inherit; } + +.section { + padding: 0 25px; } + +.highlight { + background-color: #eee; + padding: 10px 12px; + border: 1px solid #e2e2e2; + border-radius: 4px; + overflow-x: auto; } + +.declaration .highlight { + overflow-x: initial; + padding: 0 40px 40px 0; + margin-bottom: -25px; + background-color: transparent; + border: none; } + +.section-name { + margin: 0; + margin-left: 18px; } + +.task-group-section { + margin-top: 10px; + padding-left: 6px; + border-top: 1px solid #e2e2e2; } + +.task-group { + padding-top: 0px; } + +.task-name-container a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + +.section-name-container { + position: relative; + display: inline-block; } + .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 { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .item code { + background-color: transparent; + padding: 0; } + .item .token, .item .direct-link { + display: inline-block; + text-indent: -20px; + padding-left: 3px; + margin-left: 35px; + font-size: 11.9px; + transition: all 300ms; } + .item .token-open { + margin-left: 20px; } + .item .discouraged { + text-decoration: line-through; } + .item .declaration-note { + font-size: .85em; + color: gray; + font-style: italic; } + +.pointer-container { + border-bottom: 1px solid #e2e2e2; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + background: #f9f9f9; + border-left: 1px solid #e2e2e2; + border-top: 1px solid #e2e2e2; + height: 12px; + left: 21px; + top: -7px; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + position: absolute; + width: 12px; } + +.height-container { + display: none; + left: -25px; + padding: 0 25px; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #f9f9f9; + border-bottom: 1px solid #e2e2e2; + left: -25px; + position: relative; + width: 100%; + padding-top: 10px; + padding-bottom: 5px; } + +.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: #4b8afb; } + +.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 #e2e2e2; + 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 { + position: relative; + top: 10px; + bottom: 0px; + margin-left: 25px; } + #footer p { + margin: 0; + color: #aaa; + font-size: 0.8em; } + +html.dash header, html.dash #breadcrumbs, html.dash .sidebar { + display: none; } + +html.dash .main-content { + width: 980px; + margin-left: 0; + border: none; + width: 100%; + top: 0; + padding-bottom: 0; } + +html.dash .height-container { + display: block; } + +html.dash .item .token { + margin-left: 0; } + +html.dash .content-wrapper { + width: auto; } + +html.dash #footer { + position: static; } + +form[role=search] { + float: right; } + form[role=search] input { + font: Helvetica, freesans, Arial, sans-serif; + margin-top: 6px; + font-size: 13px; + line-height: 20px; + padding: 0px 10px; + 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: #fff; + color: #333; + border: 1px solid #e2e2e2; + z-index: 4; } + form[role=search] .tt-highlight { + font-weight: bold; } + form[role=search] .tt-suggestion { + font: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + 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.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/carat.png b/docs/history/1.6.0/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.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/dash.png b/docs/history/1.6.0/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.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/index.html b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/index.html new file mode 100644 index 0000000..c313d5a --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/index.html @@ -0,0 +1,156 @@ + + + + ButtonMerchant Reference + + + + + + + + + + + + +
+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Button Merchant Library

+ +

License: MIT +Coverage Status +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.

+

Contributing

+ +

We are looking forward to accepting your contributions to this project very soon!

+ +

Until then, if you have something you would like to contribute, please get in touch.

+ +
+
+ +
+
+ + diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.js b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.js new file mode 100755 index 0000000..1984416 --- /dev/null +++ b/docs/history/1.6.0/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.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.search.js b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.search.js new file mode 100644 index 0000000..359cdbb --- /dev/null +++ b/docs/history/1.6.0/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.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jquery.min.js b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jquery.min.js new file mode 100644 index 0000000..c4c6022 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (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(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=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))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(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&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(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&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(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 ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);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&&E){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=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(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(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===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]||se.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]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(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(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(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=se.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 j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.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 S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(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 je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.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)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.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),m(t)&&(t=t.call(e,n,S.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)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.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"===S.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"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(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)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(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?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.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.mouseenter(e).mouseleave(t||e)}}),S.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){S.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.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/typeahead.jquery.js b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/typeahead.jquery.js new file mode 100644 index 0000000..3a2d2ab --- /dev/null +++ b/docs/history/1.6.0/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.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/search.json b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/search.json new file mode 100644 index 0000000..a80e836 --- /dev/null +++ b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/search.json @@ -0,0 +1 @@ +{"Structs.html#/s:14ButtonMerchant7VersionV":{"name":"Version","abstract":"

Button Merchant Library Version.

"},"Protocols/Configurable.html#/c:@M@ButtonMerchant@objc(pl)Configurable(py)includesIFA":{"name":"includesIFA","abstract":"

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

","parent_name":"Configurable"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)id":{"name":"id","abstract":"

The product identifier.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)upc":{"name":"upc","abstract":"

The UPC (Universal Product Code) of the product.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)categories":{"name":"categories","abstract":"

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

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)name":{"name":"name","abstract":"

The name of the product.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)currency":{"name":"currency","abstract":"

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

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)value":{"name":"value","abstract":"

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

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)quantity":{"name":"quantity","abstract":"

The quantity of the product.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)url":{"name":"url","abstract":"

The URL of the product.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)attributes":{"name":"attributes","abstract":"

Any additional attributes to be included with the product.

","parent_name":"ButtonProductCompatible"},"Protocols/Activity.html#/c:@M@ButtonMerchant@objc(pl)Activity(im)productViewed:":{"name":"productViewed(_:)","abstract":"

Report that the user has viewed a product.

","parent_name":"Activity"},"Protocols/Activity.html#/c:@M@ButtonMerchant@objc(pl)Activity(im)productAddedToCart:":{"name":"productAddedToCart(_:)","abstract":"

Report that the user added a product to their cart.

","parent_name":"Activity"},"Protocols/Activity.html#/c:@M@ButtonMerchant@objc(pl)Activity(im)cartViewed:":{"name":"cartViewed(_:)","abstract":"

Report that the user viewed their cart.

","parent_name":"Activity"},"Protocols/Activity.html":{"name":"Activity","abstract":"

A protocol through which user activities can be reported.

"},"Protocols/ButtonProductCompatible.html":{"name":"ButtonProductCompatible","abstract":"

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

"},"Protocols/Configurable.html":{"name":"Configurable","abstract":"

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

"},"Enums/NetworkError.html#/s:14ButtonMerchant12NetworkErrorO7unknownyA2CmF":{"name":"unknown","abstract":"

There was an unknown network error.

","parent_name":"NetworkError"},"Enums/ConfigurationError.html#/s:14ButtonMerchant18ConfigurationErrorO15noApplicationIdyA2CmF":{"name":"noApplicationId","abstract":"

Library is not configured with an applicationId

","parent_name":"ConfigurationError"},"Enums/ConfigurationError.html#/s:14ButtonMerchant18ConfigurationErrorO20invalidApplicationIdyACSS_tcACmF":{"name":"invalidApplicationId(appicationId:)","abstract":"

Undocumented

","parent_name":"ConfigurationError"},"Enums/ButtonMerchantError.html#/s:14ButtonMerchant0aB5ErrorO021trackOrderDeprecationC0yA2CmF":{"name":"trackOrderDeprecationError","abstract":"

Undocumented

","parent_name":"ButtonMerchantError"},"Enums/ButtonMerchantError.html#/s:14ButtonMerchant0aB5ErrorO08noEventsC0yA2CmF":{"name":"noEventsError","abstract":"

Undocumented

","parent_name":"ButtonMerchantError"},"Enums/ButtonMerchantError.html":{"name":"ButtonMerchantError","abstract":"

Button Merchant Library Errors.

"},"Enums/ConfigurationError.html":{"name":"ConfigurationError","abstract":"

Button Merchant Library Configuration Error.

"},"Enums/NetworkError.html":{"name":"NetworkError","abstract":"

Button Merchant Library Configuration Error.

"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC8quantitySivp":{"name":"quantity","abstract":"

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

","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC15itemDescriptionSSSgvp":{"name":"itemDescription","abstract":"

Text describing the line item.

","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC3skuSSSgvp":{"name":"sku","abstract":"

The Stock Keeping Unit of the line item.

","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC3upcSSSgvp":{"name":"upc","abstract":"

The Universal Product Code of the line item.

","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC8categorySaySSGSgvp":{"name":"category","abstract":"

The category of the line item.","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC10attributesSDyS2SGSgvp":{"name":"attributes","abstract":"

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

","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC2id5totalAESS_s5Int64Vtcfc":{"name":"init(id:total:)","abstract":"

An array of the line item details that comprise the order

","parent_name":"LineItem"},"Classes/Order/Customer.html#/s:14ButtonMerchant5OrderC8CustomerC5emailSSSgvp":{"name":"email","abstract":"

The SHA-256 hash of the transacting customer’s lowercase email, as a 64-character hex string.

","parent_name":"Customer"},"Classes/Order/Customer.html#/s:14ButtonMerchant5OrderC8CustomerC5isNewSbSgvp":{"name":"isNew","abstract":"

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

","parent_name":"Customer"},"Classes/Order/Customer.html#/s:14ButtonMerchant5OrderC8CustomerC2idAESS_tcfc":{"name":"init(id:)","abstract":"

Initializes a customer object with the passed parameters.

","parent_name":"Customer"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(py)currencyCode":{"name":"currencyCode","abstract":"

The ISO 4217 currency code (default is USD).

","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(py)customerOrderId":{"name":"customerOrderId","abstract":"

The customer-facing order id.

","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(py)customer":{"name":"customer","abstract":"

The customer related to the order

","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(im)initWithId:purchaseDate:lineItems:":{"name":"init(id:purchaseDate:lineItems:)","abstract":"

Initializes an order object with the passed parameters.

","parent_name":"Order"},"Classes/Order/Customer.html":{"name":"Customer","abstract":"

Represents a customer in the order.

","parent_name":"Order"},"Classes/Order/LineItem.html":{"name":"LineItem","abstract":"

Represents a line item in the order.

","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(im)initWithId:amount:currencyCode:":{"name":"init(id:amount:currencyCode:)","abstract":"

Deprecated.

","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":"

The last tracked attributionToken from an inbound Button attributed URL.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)configureWithApplicationId:":{"name":"configure(applicationId:)","abstract":"

Configures ButtonMerchant with your application Id.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)trackIncomingURL:":{"name":"trackIncomingURL(_:)","abstract":"

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

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)trackIncomingUserActivity:":{"name":"trackIncomingUserActivity(_:)","abstract":"

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

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)handlePostInstallURL:":{"name":"handlePostInstallURL(_:)","abstract":"

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

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)reportOrder:completion:":{"name":"reportOrder(_:completion:)","abstract":"

Reports an order to Button.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)clearAllData":{"name":"clearAllData()","abstract":"

Discards the current session and all persisted data.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cpy)features":{"name":"features","abstract":"

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

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cpy)activity":{"name":"activity","abstract":"

An interface through which user activity can be reported.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@CM@ButtonMerchant@objc(cs)ButtonMerchant(cm)trackOrder:completion:":{"name":"trackOrder(_:completion:)","abstract":"

Deprecated.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html":{"name":"ButtonMerchant","abstract":"

ButtonMerchant is the main entry point to the library.

"},"Classes/ButtonProduct.html":{"name":"ButtonProduct","abstract":"

A concrete implementation of the ButtonProductCompatible protocol.

"},"Classes/Order.html":{"name":"Order","abstract":"

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

"},"Classes.html":{"name":"Classes","abstract":"

The following classes are available globally.

"},"Enums.html":{"name":"Enumerations","abstract":"

The following enumerations are available globally.

"},"Protocols.html":{"name":"Protocols","abstract":"

The following protocols are available globally.

"},"Structs.html":{"name":"Structures","abstract":"

The following structures are available globally.

"}} \ No newline at end of file diff --git a/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/docSet.dsidx b/docs/history/1.6.0/docsets/ButtonMerchant.docset/Contents/Resources/docSet.dsidx new file mode 100644 index 0000000000000000000000000000000000000000..a2556dbb657d46ccda43fc126325d134766ee29c GIT binary patch literal 28672 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 literal 0 HcmV?d00001 diff --git a/docs/history/1.6.0/img/carat.png b/docs/history/1.6.0/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.6.0/img/dash.png b/docs/history/1.6.0/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.6.0/index.html b/docs/history/1.6.0/index.html new file mode 100644 index 0000000..c313d5a --- /dev/null +++ b/docs/history/1.6.0/index.html @@ -0,0 +1,156 @@ + + + + ButtonMerchant Reference + + + + + + + + + + + + +

+
+

ButtonMerchant 1.6.0 Docs (95% documented)

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

Button Merchant Library

+ +

License: MIT +Coverage Status +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.

+

Contributing

+ +

We are looking forward to accepting your contributions to this project very soon!

+ +

Until then, if you have something you would like to contribute, please get in touch.

+ +
+
+ +
+
+ + diff --git a/docs/history/1.6.0/js/jazzy.js b/docs/history/1.6.0/js/jazzy.js new file mode 100755 index 0000000..1984416 --- /dev/null +++ b/docs/history/1.6.0/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.6.0/js/jazzy.search.js b/docs/history/1.6.0/js/jazzy.search.js new file mode 100644 index 0000000..359cdbb --- /dev/null +++ b/docs/history/1.6.0/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.6.0/js/jquery.min.js b/docs/history/1.6.0/js/jquery.min.js new file mode 100644 index 0000000..c4c6022 --- /dev/null +++ b/docs/history/1.6.0/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (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(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=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))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(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&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(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&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(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 ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);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&&E){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=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(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(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===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]||se.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]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(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(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(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=se.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 j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.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 S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(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 je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.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)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.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),m(t)&&(t=t.call(e,n,S.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)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.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"===S.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"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(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)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(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?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.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.mouseenter(e).mouseleave(t||e)}}),S.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){S.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.6.0/js/typeahead.jquery.js b/docs/history/1.6.0/js/typeahead.jquery.js new file mode 100644 index 0000000..3a2d2ab --- /dev/null +++ b/docs/history/1.6.0/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.6.0/search.json b/docs/history/1.6.0/search.json new file mode 100644 index 0000000..a80e836 --- /dev/null +++ b/docs/history/1.6.0/search.json @@ -0,0 +1 @@ +{"Structs.html#/s:14ButtonMerchant7VersionV":{"name":"Version","abstract":"

Button Merchant Library Version.

"},"Protocols/Configurable.html#/c:@M@ButtonMerchant@objc(pl)Configurable(py)includesIFA":{"name":"includesIFA","abstract":"

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

","parent_name":"Configurable"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)id":{"name":"id","abstract":"

The product identifier.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)upc":{"name":"upc","abstract":"

The UPC (Universal Product Code) of the product.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)categories":{"name":"categories","abstract":"

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

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)name":{"name":"name","abstract":"

The name of the product.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)currency":{"name":"currency","abstract":"

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

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)value":{"name":"value","abstract":"

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

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)quantity":{"name":"quantity","abstract":"

The quantity of the product.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)url":{"name":"url","abstract":"

The URL of the product.

","parent_name":"ButtonProductCompatible"},"Protocols/ButtonProductCompatible.html#/c:@M@ButtonMerchant@objc(pl)ButtonProductCompatible(py)attributes":{"name":"attributes","abstract":"

Any additional attributes to be included with the product.

","parent_name":"ButtonProductCompatible"},"Protocols/Activity.html#/c:@M@ButtonMerchant@objc(pl)Activity(im)productViewed:":{"name":"productViewed(_:)","abstract":"

Report that the user has viewed a product.

","parent_name":"Activity"},"Protocols/Activity.html#/c:@M@ButtonMerchant@objc(pl)Activity(im)productAddedToCart:":{"name":"productAddedToCart(_:)","abstract":"

Report that the user added a product to their cart.

","parent_name":"Activity"},"Protocols/Activity.html#/c:@M@ButtonMerchant@objc(pl)Activity(im)cartViewed:":{"name":"cartViewed(_:)","abstract":"

Report that the user viewed their cart.

","parent_name":"Activity"},"Protocols/Activity.html":{"name":"Activity","abstract":"

A protocol through which user activities can be reported.

"},"Protocols/ButtonProductCompatible.html":{"name":"ButtonProductCompatible","abstract":"

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

"},"Protocols/Configurable.html":{"name":"Configurable","abstract":"

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

"},"Enums/NetworkError.html#/s:14ButtonMerchant12NetworkErrorO7unknownyA2CmF":{"name":"unknown","abstract":"

There was an unknown network error.

","parent_name":"NetworkError"},"Enums/ConfigurationError.html#/s:14ButtonMerchant18ConfigurationErrorO15noApplicationIdyA2CmF":{"name":"noApplicationId","abstract":"

Library is not configured with an applicationId

","parent_name":"ConfigurationError"},"Enums/ConfigurationError.html#/s:14ButtonMerchant18ConfigurationErrorO20invalidApplicationIdyACSS_tcACmF":{"name":"invalidApplicationId(appicationId:)","abstract":"

Undocumented

","parent_name":"ConfigurationError"},"Enums/ButtonMerchantError.html#/s:14ButtonMerchant0aB5ErrorO021trackOrderDeprecationC0yA2CmF":{"name":"trackOrderDeprecationError","abstract":"

Undocumented

","parent_name":"ButtonMerchantError"},"Enums/ButtonMerchantError.html#/s:14ButtonMerchant0aB5ErrorO08noEventsC0yA2CmF":{"name":"noEventsError","abstract":"

Undocumented

","parent_name":"ButtonMerchantError"},"Enums/ButtonMerchantError.html":{"name":"ButtonMerchantError","abstract":"

Button Merchant Library Errors.

"},"Enums/ConfigurationError.html":{"name":"ConfigurationError","abstract":"

Button Merchant Library Configuration Error.

"},"Enums/NetworkError.html":{"name":"NetworkError","abstract":"

Button Merchant Library Configuration Error.

"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC8quantitySivp":{"name":"quantity","abstract":"

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

","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC15itemDescriptionSSSgvp":{"name":"itemDescription","abstract":"

Text describing the line item.

","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC3skuSSSgvp":{"name":"sku","abstract":"

The Stock Keeping Unit of the line item.

","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC3upcSSSgvp":{"name":"upc","abstract":"

The Universal Product Code of the line item.

","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC8categorySaySSGSgvp":{"name":"category","abstract":"

The category of the line item.","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC10attributesSDyS2SGSgvp":{"name":"attributes","abstract":"

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

","parent_name":"LineItem"},"Classes/Order/LineItem.html#/s:14ButtonMerchant5OrderC8LineItemC2id5totalAESS_s5Int64Vtcfc":{"name":"init(id:total:)","abstract":"

An array of the line item details that comprise the order

","parent_name":"LineItem"},"Classes/Order/Customer.html#/s:14ButtonMerchant5OrderC8CustomerC5emailSSSgvp":{"name":"email","abstract":"

The SHA-256 hash of the transacting customer’s lowercase email, as a 64-character hex string.

","parent_name":"Customer"},"Classes/Order/Customer.html#/s:14ButtonMerchant5OrderC8CustomerC5isNewSbSgvp":{"name":"isNew","abstract":"

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

","parent_name":"Customer"},"Classes/Order/Customer.html#/s:14ButtonMerchant5OrderC8CustomerC2idAESS_tcfc":{"name":"init(id:)","abstract":"

Initializes a customer object with the passed parameters.

","parent_name":"Customer"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(py)currencyCode":{"name":"currencyCode","abstract":"

The ISO 4217 currency code (default is USD).

","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(py)customerOrderId":{"name":"customerOrderId","abstract":"

The customer-facing order id.

","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(py)customer":{"name":"customer","abstract":"

The customer related to the order

","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(im)initWithId:purchaseDate:lineItems:":{"name":"init(id:purchaseDate:lineItems:)","abstract":"

Initializes an order object with the passed parameters.

","parent_name":"Order"},"Classes/Order/Customer.html":{"name":"Customer","abstract":"

Represents a customer in the order.

","parent_name":"Order"},"Classes/Order/LineItem.html":{"name":"LineItem","abstract":"

Represents a line item in the order.

","parent_name":"Order"},"Classes/Order.html#/c:@M@ButtonMerchant@objc(cs)BTNOrder(im)initWithId:amount:currencyCode:":{"name":"init(id:amount:currencyCode:)","abstract":"

Deprecated.

","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":"

The last tracked attributionToken from an inbound Button attributed URL.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)configureWithApplicationId:":{"name":"configure(applicationId:)","abstract":"

Configures ButtonMerchant with your application Id.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)trackIncomingURL:":{"name":"trackIncomingURL(_:)","abstract":"

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

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)trackIncomingUserActivity:":{"name":"trackIncomingUserActivity(_:)","abstract":"

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

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)handlePostInstallURL:":{"name":"handlePostInstallURL(_:)","abstract":"

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

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)reportOrder:completion:":{"name":"reportOrder(_:completion:)","abstract":"

Reports an order to Button.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cm)clearAllData":{"name":"clearAllData()","abstract":"

Discards the current session and all persisted data.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cpy)features":{"name":"features","abstract":"

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

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@M@ButtonMerchant@objc(cs)ButtonMerchant(cpy)activity":{"name":"activity","abstract":"

An interface through which user activity can be reported.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html#/c:@CM@ButtonMerchant@objc(cs)ButtonMerchant(cm)trackOrder:completion:":{"name":"trackOrder(_:completion:)","abstract":"

Deprecated.

","parent_name":"ButtonMerchant"},"Classes/ButtonMerchant.html":{"name":"ButtonMerchant","abstract":"

ButtonMerchant is the main entry point to the library.

"},"Classes/ButtonProduct.html":{"name":"ButtonProduct","abstract":"

A concrete implementation of the ButtonProductCompatible protocol.

"},"Classes/Order.html":{"name":"Order","abstract":"

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

"},"Classes.html":{"name":"Classes","abstract":"

The following classes are available globally.

"},"Enums.html":{"name":"Enumerations","abstract":"

The following enumerations are available globally.

"},"Protocols.html":{"name":"Protocols","abstract":"

The following protocols are available globally.

"},"Structs.html":{"name":"Structures","abstract":"

The following structures are available globally.

"}} \ No newline at end of file diff --git a/docs/history/1.6.0/undocumented.json b/docs/history/1.6.0/undocumented.json new file mode 100644 index 0000000..4a10f95 --- /dev/null +++ b/docs/history/1.6.0/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 8502778..b35bc9c 120000 --- a/docs/latest +++ b/docs/latest @@ -1 +1 @@ -./history/1.5.1 \ No newline at end of file +./history/1.6.0 \ No newline at end of file