From ee23b82bbc2c3c1156aafe2562bc89b1e8eb78c2 Mon Sep 17 00:00:00 2001 From: button-bot <15862839+button-bot@users.noreply.github.com> Date: Thu, 18 Apr 2024 19:23:23 -0400 Subject: [PATCH] Release 1.7.0 --- .github/workflows/ci.yml | 35 +- .jazzy.yml | 4 +- ButtonMerchant.podspec | 5 +- ButtonMerchant.xcodeproj/project.pbxproj | 20 +- Gemfile | 1 + Gemfile.lock | 163 +- Package.swift | 7 +- Podfile.lock | 2 +- README.md | 7 - Source/ButtonMerchant.swift | 55 +- Source/Configurable.swift | 4 +- Source/Core.swift | 3 +- .../ButtonMerchantDeprecations.swift | 40 +- .../Extensions/ButtonMerchantExtensions.swift | 2 +- Source/Extensions/StringExtensions.swift | 12 - Source/Info.plist | 2 +- Source/Order.swift | 18 +- Source/Resources/PrivacyInfo.xcprivacy | 56 + Source/Version/Version.generated.swift | 2 +- Tests/UnitTests/CoreTests.swift | 5 +- Tests/UnitTests/OrderTests.swift | 8 +- Tests/UnitTests/ReportOrderBodyTests.swift | 6 +- .../Version/VersionTests.generated.swift | 4 +- docs/history/1.7.0/Classes.html | 225 +++ .../history/1.7.0/Classes/ButtonMerchant.html | 554 ++++++ docs/history/1.7.0/Classes/ButtonProduct.html | 372 ++++ docs/history/1.7.0/Classes/Order.html | 359 ++++ .../history/1.7.0/Classes/Order/Customer.html | 231 +++ .../history/1.7.0/Classes/Order/LineItem.html | 364 ++++ docs/history/1.7.0/Enums.html | 218 +++ .../1.7.0/Enums/ButtonMerchantError.html | 191 ++ .../1.7.0/Enums/ConfigurationError.html | 197 ++ docs/history/1.7.0/Enums/NetworkError.html | 166 ++ docs/history/1.7.0/Protocols.html | 217 +++ docs/history/1.7.0/Protocols/Activity.html | 232 +++ .../Protocols/ButtonProductCompatible.html | 382 ++++ .../history/1.7.0/Protocols/Configurable.html | 170 ++ docs/history/1.7.0/Structs.html | 163 ++ docs/history/1.7.0/badge.svg | 28 + docs/history/1.7.0/css/highlight.css | 202 ++ docs/history/1.7.0/css/jazzy.css | 404 ++++ .../ButtonMerchant.docset/Contents/Info.plist | 20 + .../Contents/Resources/Documents/Classes.html | 225 +++ .../Documents/Classes/ButtonMerchant.html | 554 ++++++ .../Documents/Classes/ButtonProduct.html | 372 ++++ .../Resources/Documents/Classes/Order.html | 359 ++++ .../Documents/Classes/Order/Customer.html | 231 +++ .../Documents/Classes/Order/LineItem.html | 364 ++++ .../Contents/Resources/Documents/Enums.html | 218 +++ .../Documents/Enums/ButtonMerchantError.html | 191 ++ .../Documents/Enums/ConfigurationError.html | 197 ++ .../Documents/Enums/NetworkError.html | 166 ++ .../Resources/Documents/Protocols.html | 217 +++ .../Documents/Protocols/Activity.html | 232 +++ .../Protocols/ButtonProductCompatible.html | 382 ++++ .../Documents/Protocols/Configurable.html | 170 ++ .../Contents/Resources/Documents/Structs.html | 163 ++ .../Resources/Documents/css/highlight.css | 202 ++ .../Resources/Documents/css/jazzy.css | 404 ++++ .../Resources/Documents/img/carat.png | Bin 0 -> 274 bytes .../Contents/Resources/Documents/img/dash.png | Bin 0 -> 1338 bytes .../Resources/Documents/img/spinner.gif | Bin 0 -> 1849 bytes .../Contents/Resources/Documents/index.html | 162 ++ .../Contents/Resources/Documents/js/jazzy.js | 74 + .../Resources/Documents/js/jazzy.search.js | 74 + .../Resources/Documents/js/jquery.min.js | 2 + .../Resources/Documents/js/lunr.min.js | 6 + .../Documents/js/typeahead.jquery.js | 1694 +++++++++++++++++ .../Contents/Resources/Documents/search.json | 1 + .../Contents/Resources/docSet.dsidx | Bin 0 -> 28672 bytes docs/history/1.7.0/docsets/ButtonMerchant.tgz | Bin 0 -> 80432 bytes docs/history/1.7.0/img/carat.png | Bin 0 -> 274 bytes docs/history/1.7.0/img/dash.png | Bin 0 -> 1338 bytes docs/history/1.7.0/img/spinner.gif | Bin 0 -> 1849 bytes docs/history/1.7.0/index.html | 162 ++ docs/history/1.7.0/js/jazzy.js | 74 + docs/history/1.7.0/js/jazzy.search.js | 74 + docs/history/1.7.0/js/jquery.min.js | 2 + docs/history/1.7.0/js/lunr.min.js | 6 + docs/history/1.7.0/js/typeahead.jquery.js | 1694 +++++++++++++++++ docs/history/1.7.0/search.json | 1 + docs/history/1.7.0/undocumented.json | 26 + docs/latest | 2 +- fastlane/Fastfile | 10 +- 84 files changed, 13651 insertions(+), 216 deletions(-) rename Tests/UnitTests/Extensions/StringTests.swift => Source/Extensions/ButtonMerchantDeprecations.swift (62%) create mode 100644 Source/Resources/PrivacyInfo.xcprivacy create mode 100644 docs/history/1.7.0/Classes.html create mode 100644 docs/history/1.7.0/Classes/ButtonMerchant.html create mode 100644 docs/history/1.7.0/Classes/ButtonProduct.html create mode 100644 docs/history/1.7.0/Classes/Order.html create mode 100644 docs/history/1.7.0/Classes/Order/Customer.html create mode 100644 docs/history/1.7.0/Classes/Order/LineItem.html create mode 100644 docs/history/1.7.0/Enums.html create mode 100644 docs/history/1.7.0/Enums/ButtonMerchantError.html create mode 100644 docs/history/1.7.0/Enums/ConfigurationError.html create mode 100644 docs/history/1.7.0/Enums/NetworkError.html create mode 100644 docs/history/1.7.0/Protocols.html create mode 100644 docs/history/1.7.0/Protocols/Activity.html create mode 100644 docs/history/1.7.0/Protocols/ButtonProductCompatible.html create mode 100644 docs/history/1.7.0/Protocols/Configurable.html create mode 100644 docs/history/1.7.0/Structs.html create mode 100644 docs/history/1.7.0/badge.svg create mode 100644 docs/history/1.7.0/css/highlight.css create mode 100644 docs/history/1.7.0/css/jazzy.css create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Info.plist create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes.html create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonMerchant.html create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/ButtonProduct.html create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order.html create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/Customer.html create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/LineItem.html create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums.html create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ButtonMerchantError.html create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ConfigurationError.html create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/NetworkError.html create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols.html create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Activity.html create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/ButtonProductCompatible.html create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Configurable.html create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Structs.html create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/highlight.css create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/jazzy.css create mode 100755 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/carat.png create mode 100755 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/dash.png create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/spinner.gif create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/index.html create mode 100755 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.js create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.search.js create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jquery.min.js create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/lunr.min.js create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/typeahead.jquery.js create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/search.json create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/docSet.dsidx create mode 100644 docs/history/1.7.0/docsets/ButtonMerchant.tgz create mode 100755 docs/history/1.7.0/img/carat.png create mode 100755 docs/history/1.7.0/img/dash.png create mode 100644 docs/history/1.7.0/img/spinner.gif create mode 100644 docs/history/1.7.0/index.html create mode 100755 docs/history/1.7.0/js/jazzy.js create mode 100644 docs/history/1.7.0/js/jazzy.search.js create mode 100644 docs/history/1.7.0/js/jquery.min.js create mode 100644 docs/history/1.7.0/js/lunr.min.js create mode 100644 docs/history/1.7.0/js/typeahead.jquery.js create mode 100644 docs/history/1.7.0/search.json create mode 100644 docs/history/1.7.0/undocumented.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 97922bc..18b751f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,32 +7,35 @@ on: branches: [master] jobs: test: - runs-on: macos-latest + runs-on: macos-14 + + strategy: + fail-fast: false + matrix: + tests: ['UnitTests', 'IntegrationTests'] + steps: - name: Clone Repo - uses: actions/checkout@v1 + uses: actions/checkout@v4 + - name: Gem Cache - uses: actions/cache@v1 + uses: ruby/setup-ruby@v1 with: - path: vendor/bundle - key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }} - restore-keys: | - ${{ runner.os }}-gem- - - name: Cocoapod Cache - uses: actions/cache@v1 + ruby-version: 2.7 + bundler-cache: true + + - name: CocoaPods Cache + uses: actions/cache@v4 with: path: Pods key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }} restore-keys: | ${{ runner.os }}-pods- - - name: Bundle Install - run: bundle --path vendor/bundle + - name: Pod Install run: | bundle exec pod install - - name: Run Unit Tests - run: | - bundle exec fastlane test scheme:"UnitTests" - - name: Run Integration Tests + + - name: ${{ matrix.tests }} Tests run: | - bundle exec fastlane test scheme:"IntegrationTests" + bundle exec fastlane test scheme:${{ matrix.tests }} os:17.2 name:"iPhone 15 Pro" diff --git a/.jazzy.yml b/.jazzy.yml index 65cf88e..dfe4162 100644 --- a/.jazzy.yml +++ b/.jazzy.yml @@ -1,9 +1,11 @@ +theme: "fullwidth" module: ButtonMerchant author: Button author_url: https://usebutton.com podspec: "ButtonMerchant.podspec" output: "docs/latest" +undocumented_text: "" exclude: - "Source/Extensions/*" -copyright: 'Copyright © 2018 Button, Inc. All rights reserved. (https://usebutton.com) under [MIT License](https://github.com/button/button-merchant-ios-private/blob/master/LICENSE).' +copyright: 'Copyright © 2024 Button, Inc. All rights reserved. (https://usebutton.com) under [MIT License](https://github.com/button/button-merchant-ios-private/blob/master/LICENSE).' diff --git a/ButtonMerchant.podspec b/ButtonMerchant.podspec index 6e0301e..035b0c7 100644 --- a/ButtonMerchant.podspec +++ b/ButtonMerchant.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'ButtonMerchant' - s.version = '1.6.0' + s.version = '1.7.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 @@ -18,6 +18,7 @@ and join the Button Marketplace. s.swift_version = '5.0' s.source_files = 'Source/**/*.{swift,h}' + s.resources = ["Source/Resources/PrivacyInfo.xcprivacy"] - s.pod_target_xcconfig = { "SWIFT_VERSION" => 5.0 } + s.pod_target_xcconfig = { "SWIFT_VERSION" => 5.3 } end diff --git a/ButtonMerchant.xcodeproj/project.pbxproj b/ButtonMerchant.xcodeproj/project.pbxproj index 166d4b6..1a7ac1e 100644 --- a/ButtonMerchant.xcodeproj/project.pbxproj +++ b/ButtonMerchant.xcodeproj/project.pbxproj @@ -19,7 +19,6 @@ 9E2B4314206C12BC009F2886 /* URLSessionDataTaskExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2B4312206C12BC009F2886 /* URLSessionDataTaskExtensions.swift */; }; 9E2B4315206C12BC009F2886 /* URLSessionExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2B4313206C12BC009F2886 /* URLSessionExtensions.swift */; }; 9E2B4317206C1335009F2886 /* EncodableExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E2B4316206C1335009F2886 /* EncodableExtensions.swift */; }; - 9E334DB822C2A62300F697DE /* StringTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E334DB722C2A62300F697DE /* StringTests.swift */; }; 9E4C496720616B040053E4CA /* CoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E4C496520616B040053E4CA /* CoreTests.swift */; }; 9E4C496820616B040053E4CA /* ButtonDefaultsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E4C496620616B040053E4CA /* ButtonDefaultsTests.swift */; }; 9E4C496B20616B130053E4CA /* TestUserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E4C496920616B130053E4CA /* TestUserDefaults.swift */; }; @@ -117,9 +116,11 @@ DE865F962052FE5D00F4054D /* ButtonMerchant.h in Headers */ = {isa = PBXBuildFile; fileRef = DE865F862052FE5D00F4054D /* ButtonMerchant.h */; settings = {ATTRIBUTES = (Public, ); }; }; DE865FA620530BCE00F4054D /* ButtonMerchant.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE865F792052F90600F4054D /* ButtonMerchant.swift */; }; DE95967E20856626004BC9EA /* ASIdentifierManagerExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE1706D820855676009FF30B /* ASIdentifierManagerExtensions.swift */; }; + DE9BF6362BC63BA800CD9B38 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = DE9BF6352BC63BA800CD9B38 /* PrivacyInfo.xcprivacy */; }; DEA3F6B92108F0A8009E720E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DE5464DC2107CB6E001809F3 /* Main.storyboard */; }; DEA3F6BA2108F280009E720E /* MessageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = DA4AF05420868015002C3E0E /* MessageView.xib */; }; DEA3F6BB2108F286009E720E /* MessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA4AF05220867FFB002C3E0E /* MessageView.swift */; }; + DED9E4B22BD0D667004F24F3 /* ButtonMerchantDeprecations.swift in Sources */ = {isa = PBXBuildFile; fileRef = DED9E4B12BD0D667004F24F3 /* ButtonMerchantDeprecations.swift */; }; DEE61B2D20656A090039E47A /* XCTestExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEE61B2C20656A090039E47A /* XCTestExtensions.swift */; }; FB5AA6AD24D0A19B0057F3A0 /* ApplicationIdTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB5AA6AC24D0A19B0057F3A0 /* ApplicationIdTests.swift */; }; FB5AA6AE24D0BADD0057F3A0 /* ApplicationId.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB5AA6AA24D0A11D0057F3A0 /* ApplicationId.swift */; }; @@ -213,7 +214,6 @@ 9E2B4312206C12BC009F2886 /* URLSessionDataTaskExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLSessionDataTaskExtensions.swift; sourceTree = ""; }; 9E2B4313206C12BC009F2886 /* URLSessionExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLSessionExtensions.swift; sourceTree = ""; }; 9E2B4316206C1335009F2886 /* EncodableExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EncodableExtensions.swift; sourceTree = ""; }; - 9E334DB722C2A62300F697DE /* StringTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringTests.swift; sourceTree = ""; }; 9E4C496520616B040053E4CA /* CoreTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreTests.swift; sourceTree = ""; }; 9E4C496620616B040053E4CA /* ButtonDefaultsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ButtonDefaultsTests.swift; sourceTree = ""; }; 9E4C496920616B130053E4CA /* TestUserDefaults.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestUserDefaults.swift; sourceTree = ""; }; @@ -322,6 +322,8 @@ DE865F862052FE5D00F4054D /* ButtonMerchant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ButtonMerchant.h; sourceTree = ""; }; DE865F8C2052FE5D00F4054D /* UnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; DE865FA2205304C700F4054D /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; + DE9BF6352BC63BA800CD9B38 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; + DED9E4B12BD0D667004F24F3 /* ButtonMerchantDeprecations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonMerchantDeprecations.swift; sourceTree = ""; }; DEE61B2C20656A090039E47A /* XCTestExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCTestExtensions.swift; sourceTree = ""; }; F3F48F5FBD0D52C07A253FB6 /* Pods-UnitTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-UnitTests.debug.xcconfig"; path = "Target Support Files/Pods-UnitTests/Pods-UnitTests.debug.xcconfig"; sourceTree = ""; }; FB5AA6AA24D0A11D0057F3A0 /* ApplicationId.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationId.swift; sourceTree = ""; }; @@ -553,6 +555,7 @@ 9E56CE5822B8049C00E75884 /* StringExtensions.swift */, FBEBC8CC2543557D00AAE9E5 /* UIApplicationExtensions.swift */, DE59498C28F49FA200FD9737 /* ButtonMerchantExtensions.swift */, + DED9E4B12BD0D667004F24F3 /* ButtonMerchantDeprecations.swift */, ); path = Extensions; sourceTree = ""; @@ -638,7 +641,6 @@ children = ( DA29D891209CDC3100537806 /* URLSessionTests.swift */, DA29D893209CF34D00537806 /* UIDeviceTests.swift */, - 9E334DB722C2A62300F697DE /* StringTests.swift */, ); path = Extensions; sourceTree = ""; @@ -673,6 +675,7 @@ DE865F762052F90600F4054D /* Source */ = { isa = PBXGroup; children = ( + DE8F54BD2BCDC8F800DB880B /* Resources */, FBEBC8BA25434A5700AAE9E5 /* AppIntegrationVerification.swift */, DE175A1920A09BB1005C97B9 /* Version */, DE865F792052F90600F4054D /* ButtonMerchant.swift */, @@ -712,6 +715,14 @@ name = "Supporting Files"; sourceTree = ""; }; + DE8F54BD2BCDC8F800DB880B /* Resources */ = { + isa = PBXGroup; + children = ( + DE9BF6352BC63BA800CD9B38 /* PrivacyInfo.xcprivacy */, + ); + path = Resources; + sourceTree = ""; + }; DEA3F6BC2108F6B9009E720E /* Shared */ = { isa = PBXGroup; children = ( @@ -957,6 +968,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + DE9BF6362BC63BA800CD9B38 /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1184,6 +1196,7 @@ DE1706E020855F4C009FF30B /* LocaleExtensions.swift in Sources */, DA4C8C7922D3D909000E15A9 /* ReportOrderRequest.swift in Sources */, 9E77202220605506005F740B /* ButtonDefaults.swift in Sources */, + DED9E4B22BD0D667004F24F3 /* ButtonMerchantDeprecations.swift in Sources */, DE1706DD20855B22009FF30B /* UIScreenExtensions.swift in Sources */, 9EEF58DD208F9161009DA9B6 /* UserAgent.swift in Sources */, 9E145C90208F86E600B01ECD /* BundleExtensions.swift in Sources */, @@ -1224,7 +1237,6 @@ DA29D896209CF38800537806 /* TestUTSName.swift in Sources */, 9E4C496C20616B130053E4CA /* TestButtonDefaults.swift in Sources */, 9EDED110208FA3930049A56A /* UserAgentTests.swift in Sources */, - 9E334DB822C2A62300F697DE /* StringTests.swift in Sources */, DA0FA2A3205C1EF2008296A6 /* TestCore.swift in Sources */, DA29D894209CF34D00537806 /* UIDeviceTests.swift in Sources */, FBEBC92125435D5900AAE9E5 /* TestAppIntegrationVerification.swift in Sources */, diff --git a/Gemfile b/Gemfile index b672349..d878361 100644 --- a/Gemfile +++ b/Gemfile @@ -2,6 +2,7 @@ source 'https://rubygems.org' gem 'cocoapods' gem 'fastlane' +gem 'sqlite3', '~> 1.5.0' gem 'jazzy' gem 'slather' diff --git a/Gemfile.lock b/Gemfile.lock index 83601b2..fecc72b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,49 +1,57 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.6) + CFPropertyList (3.0.7) + base64 + nkf rexml - activesupport (6.1.6.1) + activesupport (7.1.3.2) + base64 + bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) + connection_pool (>= 2.2.5) + drb i18n (>= 1.6, < 2) minitest (>= 5.1) + mutex_m tzinfo (~> 2.0) - zeitwerk (~> 2.3) - addressable (2.8.5) + addressable (2.8.6) public_suffix (>= 2.0.2, < 6.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) - artifactory (3.0.15) + artifactory (3.0.17) atomos (0.1.3) - aws-eventstream (1.2.0) - aws-partitions (1.828.0) - aws-sdk-core (3.183.1) - aws-eventstream (~> 1, >= 1.0.2) + aws-eventstream (1.3.0) + aws-partitions (1.915.0) + aws-sdk-core (3.192.0) + aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) - aws-sigv4 (~> 1.5) + aws-sigv4 (~> 1.8) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.71.0) - aws-sdk-core (~> 3, >= 3.177.0) + aws-sdk-kms (1.79.0) + aws-sdk-core (~> 3, >= 3.191.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.135.0) - aws-sdk-core (~> 3, >= 3.181.0) + aws-sdk-s3 (1.147.0) + aws-sdk-core (~> 3, >= 3.192.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.6) - aws-sigv4 (1.6.0) + aws-sigv4 (~> 1.8) + aws-sigv4 (1.8.0) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) + base64 (0.2.0) + bigdecimal (3.1.7) claide (1.1.0) clamp (1.3.2) - cocoapods (1.11.3) + cocoapods (1.15.2) addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.11.3) + cocoapods-core (= 1.15.2) cocoapods-deintegrate (>= 1.0.3, < 2.0) - cocoapods-downloader (>= 1.4.0, < 2.0) + cocoapods-downloader (>= 2.1, < 3.0) cocoapods-plugins (>= 1.0.0, < 2.0) cocoapods-search (>= 1.0.0, < 2.0) - cocoapods-trunk (>= 1.4.0, < 2.0) + cocoapods-trunk (>= 1.6.0, < 2.0) cocoapods-try (>= 1.1.0, < 2.0) colored2 (~> 3.1) escape (~> 0.0.4) @@ -51,10 +59,10 @@ GEM gh_inspector (~> 1.0) molinillo (~> 0.8.0) nap (~> 1.0) - ruby-macho (>= 1.0, < 3.0) - xcodeproj (>= 1.21.0, < 2.0) - cocoapods-core (1.11.3) - activesupport (>= 5.0, < 7) + ruby-macho (>= 2.3.0, < 3.0) + xcodeproj (>= 1.23.0, < 2.0) + cocoapods-core (1.15.2) + activesupport (>= 5.0, < 8) addressable (~> 2.8) algoliasearch (~> 1.0) concurrent-ruby (~> 1.1) @@ -64,7 +72,7 @@ GEM public_suffix (~> 4.0) typhoeus (~> 1.0) cocoapods-deintegrate (1.0.5) - cocoapods-downloader (1.6.3) + cocoapods-downloader (2.1) cocoapods-plugins (1.0.0) nap cocoapods-search (1.0.1) @@ -76,18 +84,19 @@ GEM colored2 (3.1.2) commander (4.6.0) highline (~> 2.0.0) - concurrent-ruby (1.1.10) + concurrent-ruby (1.2.3) + connection_pool (2.4.1) declarative (0.0.20) digest-crc (0.6.5) rake (>= 12.0.0, < 14.0.0) - domain_name (0.5.20190701) - unf (>= 0.0.5, < 1.0.0) + domain_name (0.6.20240107) dotenv (2.8.1) + drb (2.2.1) emoji_regex (3.2.3) escape (0.0.4) - ethon (0.15.0) + ethon (0.16.0) ffi (>= 1.15.0) - excon (0.103.0) + excon (0.110.0) faraday (1.10.3) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) @@ -116,15 +125,15 @@ GEM faraday-retry (1.0.3) faraday_middleware (1.2.0) faraday (~> 1.0) - fastimage (2.2.7) - fastlane (2.216.0) + fastimage (2.3.1) + fastlane (2.220.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) aws-sdk-s3 (~> 1.0) babosa (>= 1.0.3, < 2.0.0) bundler (>= 1.12.0, < 3.0.0) - colored + colored (~> 1.2) commander (~> 4.6) dotenv (>= 2.1.1, < 3.0.0) emoji_regex (>= 0.1, < 4.0) @@ -136,6 +145,7 @@ GEM gh_inspector (>= 1.1.2, < 2.0.0) google-apis-androidpublisher_v3 (~> 0.3) google-apis-playcustomapp_v1 (~> 0.1) + google-cloud-env (>= 1.6.0, < 2.0.0) google-cloud-storage (~> 1.31) highline (~> 2.0) http-cookie (~> 1.0.5) @@ -144,10 +154,10 @@ GEM mini_magick (>= 4.9.4, < 5.0.0) multipart-post (>= 2.0.0, < 3.0.0) naturally (~> 2.2) - optparse (~> 0.1.1) + optparse (>= 0.1.1, < 1.0.0) plist (>= 3.1.0, < 4.0.0) rubyzip (>= 2.0.0, < 3.0.0) - security (= 0.1.3) + security (= 0.1.5) simctl (~> 1.6.3) terminal-notifier (>= 2.0.0, < 3.0.0) terminal-table (~> 3) @@ -156,14 +166,14 @@ GEM word_wrap (~> 1.0.0) xcodeproj (>= 1.13.0, < 2.0.0) xcpretty (~> 0.3.0) - xcpretty-travis-formatter (>= 0.0.3) - ffi (1.15.5) + xcpretty-travis-formatter (>= 0.0.3, < 2.0.0) + ffi (1.16.3) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) - google-apis-androidpublisher_v3 (0.50.0) + google-apis-androidpublisher_v3 (0.54.0) google-apis-core (>= 0.11.0, < 2.a) - google-apis-core (0.11.1) + google-apis-core (0.11.3) addressable (~> 2.5, >= 2.5.1) googleauth (>= 0.16.2, < 2.a) httpclient (>= 2.8.1, < 3.a) @@ -171,24 +181,23 @@ GEM representable (~> 3.0) retriable (>= 2.0, < 4.a) rexml - webrick 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-apis-storage_v1 (0.31.0) + google-apis-core (>= 0.11.0, < 2.a) + google-cloud-core (1.7.0) + google-cloud-env (>= 1.0, < 3.a) google-cloud-errors (~> 1.0) google-cloud-env (1.6.0) faraday (>= 0.17.3, < 3.0) - google-cloud-errors (1.3.1) - google-cloud-storage (1.44.0) + google-cloud-errors (1.4.0) + google-cloud-storage (1.47.0) addressable (~> 2.8) digest-crc (~> 0.4) google-apis-iamcredentials_v1 (~> 0.1) - google-apis-storage_v1 (~> 0.19.0) + google-apis-storage_v1 (~> 0.31.0) google-cloud-core (~> 1.6) googleauth (>= 0.16.2, < 2.a) mini_mime (~> 1.0) @@ -202,45 +211,48 @@ GEM http-cookie (1.0.5) domain_name (~> 0.5) httpclient (2.8.3) - i18n (1.12.0) + i18n (1.14.4) concurrent-ruby (~> 1.0) - jazzy (0.14.2) + jazzy (0.14.4) cocoapods (~> 1.5) mustache (~> 1.1) open4 (~> 1.3) redcarpet (~> 3.4) rexml (~> 3.2) - rouge (>= 2.0.6, < 4.0) + rouge (>= 2.0.6, < 5.0) sassc (~> 2.1) sqlite3 (~> 1.3) xcinvoke (~> 0.3.0) jmespath (1.6.2) - json (2.6.3) - jwt (2.7.1) + json (2.7.2) + jwt (2.8.1) + base64 liferaft (0.0.6) mini_magick (4.12.0) mini_mime (1.1.5) - mini_portile2 (2.8.0) - minitest (5.16.3) + mini_portile2 (2.8.6) + minitest (5.22.3) molinillo (0.8.0) multi_json (1.15.0) - multipart-post (2.3.0) + multipart-post (2.4.0) mustache (1.1.1) + mutex_m (0.2.0) nanaimo (0.3.0) nap (1.1.0) naturally (2.2.1) netrc (0.11.0) - nokogiri (1.13.8) - mini_portile2 (~> 2.8.0) + nkf (0.2.0) + nokogiri (1.15.6) + mini_portile2 (~> 2.8.2) racc (~> 1.4) open4 (1.3.4) - optparse (0.1.1) + optparse (0.5.0) os (1.1.4) - plist (3.7.0) + plist (3.7.1) public_suffix (4.0.7) - racc (1.6.0) - rake (13.0.6) - redcarpet (3.5.1) + racc (1.7.3) + rake (13.2.1) + redcarpet (3.6.0) representable (3.2.0) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) @@ -253,8 +265,8 @@ GEM rubyzip (2.3.2) sassc (2.4.0) ffi (~> 1.9) - security (0.1.3) - signet (0.18.0) + security (0.1.5) + signet (0.19.0) addressable (~> 2.8) faraday (>= 0.17.5, < 3.a) jwt (>= 1.5, < 3.0) @@ -262,35 +274,32 @@ GEM simctl (1.6.10) CFPropertyList naturally - slather (2.7.2) + slather (2.8.0) CFPropertyList (>= 2.2, < 4) activesupport clamp (~> 1.3) - nokogiri (~> 1.12) + nokogiri (>= 1.14.3) xcodeproj (~> 1.21) - sqlite3 (1.4.4) + sqlite3 (1.5.4) + mini_portile2 (~> 2.8.0) terminal-notifier (2.0.0) 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) + tty-screen (0.8.2) tty-spinner (0.9.3) tty-cursor (~> 0.7) - typhoeus (1.4.0) + typhoeus (1.4.1) ethon (>= 0.9.0) - tzinfo (2.0.5) + tzinfo (2.0.6) concurrent-ruby (~> 1.0) uber (0.1.0) - unf (0.1.4) - unf_ext - unf_ext (0.0.8.2) - unicode-display_width (2.4.2) - webrick (1.8.1) + unicode-display_width (2.5.0) word_wrap (1.0.0) xcinvoke (0.3.0) liferaft (~> 0.0.6) - xcodeproj (1.23.0) + xcodeproj (1.24.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) @@ -301,7 +310,6 @@ GEM rouge (~> 2.0.7) xcpretty-travis-formatter (1.0.1) xcpretty (~> 0.2, >= 0.0.7) - zeitwerk (2.6.0) PLATFORMS ruby @@ -311,6 +319,7 @@ DEPENDENCIES fastlane jazzy slather + sqlite3 (~> 1.5.0) BUNDLED WITH 2.1.4 diff --git a/Package.swift b/Package.swift index 9f88bb0..2009470 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.0 +// swift-tools-version:5.3 // // Package.swift // @@ -38,7 +38,10 @@ let package = Package( targets: [ .target( name: "ButtonMerchant", - path: "Source"), + path: "Source", + resources: [ + .copy("Resources/PrivacyInfo.xcprivacy") + ]), .testTarget( name: "UnitTests", path: "Tests/UnitTests"), diff --git a/Podfile.lock b/Podfile.lock index a6cb233..077f39a 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -13,4 +13,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 652cb6e78be2f97c0e2a5f3885b6be555b5af666 -COCOAPODS: 1.12.1 +COCOAPODS: 1.15.2 diff --git a/README.md b/README.md index a3a9d40..5776154 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # Button Merchant Library [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) -[![Coverage Status](https://coveralls.io/repos/github/button/button-merchant-ios/badge.svg?t=Nu4idN)](https://coveralls.io/github/button/button-merchant-ios) [![Version](https://img.shields.io/cocoapods/v/ButtonMerchant.svg?style=flat)](http://cocoapods.org/pods/ButtonMerchant) [![Platform](https://img.shields.io/cocoapods/p/ButtonMerchant.svg?style=flat)](http://cocoapods.org/pods/ButtonMerchant) @@ -48,9 +47,3 @@ 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](opensource@usebutton.com). diff --git a/Source/ButtonMerchant.swift b/Source/ButtonMerchant.swift index b0b2ecc..d09234a 100644 --- a/Source/ButtonMerchant.swift +++ b/Source/ButtonMerchant.swift @@ -25,11 +25,12 @@ import UIKit /** - `ButtonMerchant` is the main entry point to the library. - - To get started with your integration, - get your application Id from from the [Button Dashboard](https://app.usebutton.com). - and follow our simple [integration guide](https://developer.usebutton.com/docs/ios-add-merchant-library) + - Note: + `ButtonMerchant` is the main entry point to the library. + + + To get started with your integration, get your application Id from from the [Button Dashboard](https://app.usebutton.com) and follow our simple + [integration guide](https://developer.usebutton.com/docs/ios-add-merchant-library). */ @objcMembers final public class ButtonMerchant: NSObject { @@ -47,10 +48,11 @@ final public class ButtonMerchant: NSObject { } /** - The last tracked `attributionToken` from an inbound Button attributed URL. + The last `attributionToken` from an inbound Button attributed URL. - Attention: - > For attribution to work correctly, you must: + 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 @@ -64,7 +66,7 @@ final public class ButtonMerchant: NSObject { Configures ButtonMerchant with your application Id. - Note: - > Get your application Id from from the [Button Dashboard](https://app.usebutton.com) + Get your application Id from from the [Button Dashboard](https://app.usebutton.com) - Parameters: - applicationId: Your application Id (required) @@ -83,7 +85,7 @@ final public class ButtonMerchant: NSObject { Checks the passed URL for a Button attribution and if present stores the token. - Attention: - > To correctly attribute customers, you must call this method with every + To correctly attribute customers, you must call this method with every incoming `url` and `userActivity` from the following `UIApplicationDelegate` methods: - `application(_:open:options:)` @@ -98,10 +100,10 @@ final public class ButtonMerchant: NSObject { } /** - Checks the URL in the passed NSUserActivity for a Button attribution and if present stores the token. + Checks the URL in the passed NSUserActivity for Button attribution and if present stores the token. - Attention: - > To correctly attribute customers, you must call this method with every + To correctly attribute customers, you must call this method with every incoming `userActivity` from the following `UIApplicationDelegate` method: - `application(_:userActivity:restorationHandler:)` @@ -118,14 +120,14 @@ final public class ButtonMerchant: NSObject { } /** - Checks to see if the user visited a url prior to installing your app. + Checks to see if the user visited a url destined for your app prior to installing your app. If a url is found, your completion handler will be called with the url and you are responsible for navigating the user to the relevant content in your app. If a url is not found or an error occurs, your completion handler will be called without a url and you can continue with your normal launch sequence. - Attention: - > This method checks for a post-install url exactly *one time* after a user has installed your app. + 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 @@ -145,8 +147,8 @@ final public class ButtonMerchant: NSObject { - order: Your order object to be reported. - completion: An optional completion block taking an optional error. - See also: Reporting Orders to Button - ([docs](https://developer.usebutton.com/guides/merchants/ios/report-orders-to-button#report-orders-to-buttons-order-api)) + - SeeAlso: + [Reporting Orders to Button](https://developer.usebutton.com/docs/client-side-order-reporting) */ @objc public static func reportOrder(_ order: Order, completion: ((Error?) -> Void)? = nil) { core.reportOrder(order, completion) @@ -197,26 +199,13 @@ final public class ButtonMerchant: NSObject { } } -// MARK: - Deprecations - -extension ButtonMerchant { - /** - Deprecated. - - This method is deprecated and will be removed in a future version. It is safe to remove your usage of this method. - */ - @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) { - guard let completion = completion else { - return - } - completion(ButtonMerchantError.trackOrderDeprecationError) - } -} - private class Configured: Configurable { /** - Deprecated. @see Configurable + - Important: + Deprecated. + + - SeeAlso: + Configurable */ var includesIFA: Bool { get { return false } diff --git a/Source/Configurable.swift b/Source/Configurable.swift index 1398182..805784b 100644 --- a/Source/Configurable.swift +++ b/Source/Configurable.swift @@ -25,12 +25,12 @@ import Foundation /** - An interface through which library features can be enabled/disabled. */ @objc public protocol Configurable: AnyObject { /** - Deprecated. This library does not read the advertising identifier even when permission is granted by the user. + - Important: + 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 101cd89..d83d149 100644 --- a/Source/Core.swift +++ b/Source/Core.swift @@ -120,7 +120,8 @@ final internal class Core: CoreType { updateAttributionIfNeeded(token: incomingToken) allowedQueryItems.append(item) case "from_landing", - "from_tracking", + "from_tracking", + "from_appstore", _ where item.name.lowercased().hasPrefix("btn_"): allowedQueryItems.append(item) default: diff --git a/Tests/UnitTests/Extensions/StringTests.swift b/Source/Extensions/ButtonMerchantDeprecations.swift similarity index 62% rename from Tests/UnitTests/Extensions/StringTests.swift rename to Source/Extensions/ButtonMerchantDeprecations.swift index 6cfa9b1..f397a38 100644 --- a/Tests/UnitTests/Extensions/StringTests.swift +++ b/Source/Extensions/ButtonMerchantDeprecations.swift @@ -1,7 +1,7 @@ // -// StringTests.swift +// ButtonMerchantDeprecations.swift // -// Copyright © 2019 Button, Inc. All rights reserved. (https://usebutton.com) +// Copyright © 2024 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 @@ -21,27 +21,21 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // - -import XCTest -class StringTests: XCTestCase { - - func testIsPlainTextEmail_arbitraryString_returnsFalse() { - let email = "not_an_email" - - XCTAssertFalse(email.isPlainTextEmail) - } - - func testIsPlainTextEmail_hexString_returnsFalse() { - let email = "314c70b69a726ae7934806b2a0621a0eb193139e38d9bf6134191faa61b7bb29" - - XCTAssertFalse(email.isPlainTextEmail) +import Foundation + +// MARK: - Deprecations + +extension ButtonMerchant { + /** + - Important: + This method is deprecated and will be removed in a future version. It is safe to remove your usage of this method. + */ + @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) { + guard let completion = completion else { + return + } + completion(ButtonMerchantError.trackOrderDeprecationError) } - - func testIsPlainTextEmail_returnsTrue() { - let email = "betty@usebutton.com" - - XCTAssertTrue(email.isPlainTextEmail) - } - } diff --git a/Source/Extensions/ButtonMerchantExtensions.swift b/Source/Extensions/ButtonMerchantExtensions.swift index 09bf606..b36238e 100644 --- a/Source/Extensions/ButtonMerchantExtensions.swift +++ b/Source/Extensions/ButtonMerchantExtensions.swift @@ -29,7 +29,7 @@ public extension ButtonMerchant { Reports an event to Button. - Attention: - > This method is not intended for use unless in coordination with your Button representative for your specific integration needs. + This method is not intended for use unless in coordination with your Button representative for your specific integration needs. - Parameters: - name: The name of the event diff --git a/Source/Extensions/StringExtensions.swift b/Source/Extensions/StringExtensions.swift index 926b4c7..64b9ab0 100644 --- a/Source/Extensions/StringExtensions.swift +++ b/Source/Extensions/StringExtensions.swift @@ -27,10 +27,6 @@ import CommonCrypto public extension String { - var isPlainTextEmail: Bool { - return NSPredicate(format: "SELF MATCHES %@", "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}").evaluate(with: self) - } - var sha256: String { guard let stringData = self.data(using: .utf8) else { return "" @@ -60,11 +56,3 @@ public extension String { return self.range(of: regex, options: .regularExpression, range: nil, locale: nil) != nil } } - -internal extension String { - static let ISO8601Formatter = { () -> DateFormatter in - let formatter = DateFormatter() - formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" - return formatter - }() -} diff --git a/Source/Info.plist b/Source/Info.plist index 8befd8e..73b6636 100644 --- a/Source/Info.plist +++ b/Source/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.6.0 + 1.7.0 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSPrincipalClass diff --git a/Source/Order.swift b/Source/Order.swift index 8e20e9c..3284b99 100644 --- a/Source/Order.swift +++ b/Source/Order.swift @@ -96,20 +96,13 @@ Represents an order placed by the user to be reported using `ButtonMerchant.repo let id: String /** - 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. + - Important: + Deprecated. This property is a no-op. Data is not collected. */ + @available(*, deprecated, message: "Setting this property is a no-op. Data is not collected.") public var email: String? { - didSet { - guard let email = self.email else { - return - } - if email.isPlainTextEmail { - self.email = email.lowercased().sha256 - } - } + set {} + get { return nil } } /** @@ -129,7 +122,6 @@ Represents an order placed by the user to be reported using `ButtonMerchant.repo enum CodingKeys: String, CodingKey { case id - case email = "email_sha256" case isNew = "is_new" } } diff --git a/Source/Resources/PrivacyInfo.xcprivacy b/Source/Resources/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..a9b80b8 --- /dev/null +++ b/Source/Resources/PrivacyInfo.xcprivacy @@ -0,0 +1,56 @@ + + + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + NSPrivacyCollectedDataTypes + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeUserID + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeProductInteraction + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + + + + + diff --git a/Source/Version/Version.generated.swift b/Source/Version/Version.generated.swift index be70b0d..af0e954 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.6.0" + static let stringValue = "1.7.0" } diff --git a/Tests/UnitTests/CoreTests.swift b/Tests/UnitTests/CoreTests.swift index 34ca225..516fb37 100644 --- a/Tests/UnitTests/CoreTests.swift +++ b/Tests/UnitTests/CoreTests.swift @@ -168,7 +168,7 @@ class CoreTests: XCTestCase { func testTrackIncomingURL_withFromLandingFromTrackingParams_tracksDeeplinkOpened() { // Arrange testSystem.testCurrentDate = Date.ISO8601Formatter.date(from: "2019-07-25T21:30:02Z")! - let url = URL(string: "http://usebutton.com/no-token/?from_landing=true&from_tracking=false")! + let url = URL(string: "http://usebutton.com/no-token/?from_landing=true&from_tracking=false&from_appstore=false")! // Act core.trackIncomingURL(url) @@ -448,7 +448,6 @@ class CoreTests: XCTestCase { expectation.fulfill() } - // swiftlint:disable line_length XCTAssertEqual(testClient.testReportOrderRequest!.parameters as NSDictionary, ["btn_ref": "srctok-abc123", "order_id": "order-abc", @@ -456,7 +455,7 @@ class CoreTests: XCTestCase { "purchase_date": date.ISO8601String, "customer_order_id": "customer-order-id-123", "line_items": [["identifier": "unique-id-1234", "quantity": 1, "total": 120]], - "customer": ["id": "customer-id-123", "email_sha256": "21f61e98ab4ae120e88ac6b5dd218ffb8cf3e481276b499a2e0adab80092899c", "is_new": 1]]) + "customer": ["id": "customer-id-123", "is_new": 1]]) testClient.reportOrderCompletion!(nil) diff --git a/Tests/UnitTests/OrderTests.swift b/Tests/UnitTests/OrderTests.swift index 1f96959..782ae4c 100644 --- a/Tests/UnitTests/OrderTests.swift +++ b/Tests/UnitTests/OrderTests.swift @@ -145,11 +145,11 @@ class OrderTests: XCTestCase { // Act let customer = Order.Customer(id: id) - customer.email = email + customer.email = email // Set to confirm deprecated no-op behavior // Assert XCTAssertEqual(customer.id, id) - XCTAssertEqual(customer.email, emailSha256) + XCTAssertNil(customer.email) // confirms no-op XCTAssertNil(customer.isNew) } @@ -160,11 +160,11 @@ class OrderTests: XCTestCase { // Act let customer = Order.Customer(id: id) - customer.email = emailSha256 + customer.email = emailSha256 // Set to confirm deprecated no-op behavior // Assert XCTAssertEqual(customer.id, id) - XCTAssertEqual(customer.email, emailSha256) + XCTAssertNil(customer.email) // confirms no-op XCTAssertNil(customer.isNew) } diff --git a/Tests/UnitTests/ReportOrderBodyTests.swift b/Tests/UnitTests/ReportOrderBodyTests.swift index 1da4d6c..c3440d3 100644 --- a/Tests/UnitTests/ReportOrderBodyTests.swift +++ b/Tests/UnitTests/ReportOrderBodyTests.swift @@ -31,7 +31,7 @@ class ReportOrderBodyTests: XCTestCase { // Arrange let date = Date() let customer = Order.Customer(id: "customer-id-123") - customer.email = "test@button.com" + customer.email = "test@button.com" // Set to confirm deprecated no-op behavior let lineItems = [Order.LineItem(id: "unique-id-1234", total: 120)] let order = Order(id: "order-abc", purchaseDate: date, lineItems: lineItems) @@ -56,7 +56,7 @@ class ReportOrderBodyTests: XCTestCase { let date: Date = Date.ISO8601Formatter.date(from: "2019-06-17T12:08:10-04:00")! let email = "test@button.com" let customer = Order.Customer(id: "customer-id-123") - customer.email = email + customer.email = email // Set to confirm deprecated no-op behavior let lineItems = [Order.LineItem(id: "unique-id-1234", total: 120)] let order = Order(id: "order-abc", purchaseDate: date, lineItems: lineItems) order.customer = customer @@ -75,7 +75,7 @@ class ReportOrderBodyTests: XCTestCase { "purchase_date": date.ISO8601String, "customer_order_id": "customer-order-id-123", "line_items": [["identifier": "unique-id-1234", "quantity": 1, "total": 120]], - "customer": ["id": "customer-id-123", "email_sha256": "21f61e98ab4ae120e88ac6b5dd218ffb8cf3e481276b499a2e0adab80092899c"]]) + "customer": ["id": "customer-id-123"]]) } func testAdvertisingIdSetToNil() { diff --git a/Tests/UnitTests/Version/VersionTests.generated.swift b/Tests/UnitTests/Version/VersionTests.generated.swift index c890bcd..c983311 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.6.0") + XCTAssertEqual(Version.stringValue, "1.7.0") } func testPlistVersion() { let libraryBundle = Bundle(for: ButtonMerchant.self) - XCTAssertEqual(libraryBundle.infoDictionary!["CFBundleShortVersionString"] as? String, "1.6.0") + XCTAssertEqual(libraryBundle.infoDictionary!["CFBundleShortVersionString"] as? String, "1.7.0") } } diff --git a/docs/history/1.7.0/Classes.html b/docs/history/1.7.0/Classes.html new file mode 100644 index 0000000..caf6012 --- /dev/null +++ b/docs/history/1.7.0/Classes.html @@ -0,0 +1,225 @@ + + + + Classes Reference + + + + + + + + + + + + + + + + +
+

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

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

Classes

+

The following classes are available globally.

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

    Note

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

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

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

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

    A concrete implementation of the ButtonProductCompatible protocol.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

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

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

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

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

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

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

ButtonMerchant

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

Note

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

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

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

    The last attributionToken from an inbound Button attributed URL.

    +
    +

    Attention

    +

    For attribution to work correctly, you must:

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

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

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

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

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

    Configures ButtonMerchant with your application Id.

    +
    +

    Note

    +

    Get your application Id from from the Button Dashboard

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

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

    Parameters

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

    Your application Id (required)

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

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

    +
    +

    Attention

    +

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

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

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

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

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

    Parameters

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

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

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

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

    +
    +

    Attention

    +

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

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

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

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

    Parameters

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

    A NSUserActivity with which your app has been continued.

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

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

    + +

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

    +
    +

    Attention

    +

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

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

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

    Parameters

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

    A completion block taking an optional url and optional error.

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

    Reports an order to Button.

    +
    +

    See also

    +

    Reporting Orders to Button

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

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

    Parameters

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

    Your order object to be reported.

    +
    +
    + + completion + + +
    +

    An optional completion block taking an optional error.

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

    Discards the current session and all persisted data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

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

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

    + +
    +
    +

    Declaration

    +
    +

    Swift

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

    An interface through which user activity can be reported.

    + +
    +
    +

    Declaration

    +
    +

    Swift

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

+ + ButtonMerchant 1.7.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.7.0/Classes/Order.html b/docs/history/1.7.0/Classes/Order.html new file mode 100644 index 0000000..0a9629c --- /dev/null +++ b/docs/history/1.7.0/Classes/Order.html @@ -0,0 +1,359 @@ + + + + Order Class Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.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.7.0/Classes/Order/Customer.html b/docs/history/1.7.0/Classes/Order/Customer.html new file mode 100644 index 0000000..8ac1792 --- /dev/null +++ b/docs/history/1.7.0/Classes/Order/Customer.html @@ -0,0 +1,231 @@ + + + + Customer Class Reference + + + + + + + + + + + + + + + + +
+

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

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

Customer

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

Represents a customer in the order.

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

    Important

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

    Declaration

    +
    +

    Swift

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

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

    + +
    +
    +

    Declaration

    +
    +

    Swift

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

    Initializes a customer object with the passed parameters.

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

    Declaration

    +
    +

    Swift

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

+ + ButtonMerchant 1.7.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.7.0/Enums.html b/docs/history/1.7.0/Enums.html new file mode 100644 index 0000000..73db738 --- /dev/null +++ b/docs/history/1.7.0/Enums.html @@ -0,0 +1,218 @@ + + + + Enumerations Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.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.7.0/Enums/ButtonMerchantError.html b/docs/history/1.7.0/Enums/ButtonMerchantError.html new file mode 100644 index 0000000..272b54d --- /dev/null +++ b/docs/history/1.7.0/Enums/ButtonMerchantError.html @@ -0,0 +1,191 @@ + + + + ButtonMerchantError Enumeration Reference + + + + + + + + + + + + + + + + +
+

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

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

ButtonMerchantError

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

Button Merchant Library Errors.

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

    Declaration

    +
    +

    Swift

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

    Declaration

    +
    +

    Swift

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

+ + ButtonMerchant 1.7.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
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

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

+ + ButtonMerchant 1.7.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.7.0/Protocols.html b/docs/history/1.7.0/Protocols.html new file mode 100644 index 0000000..8f041c8 --- /dev/null +++ b/docs/history/1.7.0/Protocols.html @@ -0,0 +1,217 @@ + + + + Protocols Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.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 + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

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

+ + ButtonMerchant 1.7.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.7.0/Protocols/ButtonProductCompatible.html b/docs/history/1.7.0/Protocols/ButtonProductCompatible.html new file mode 100644 index 0000000..c139621 --- /dev/null +++ b/docs/history/1.7.0/Protocols/ButtonProductCompatible.html @@ -0,0 +1,382 @@ + + + + ButtonProductCompatible Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.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.7.0/Protocols/Configurable.html b/docs/history/1.7.0/Protocols/Configurable.html new file mode 100644 index 0000000..3b3025d --- /dev/null +++ b/docs/history/1.7.0/Protocols/Configurable.html @@ -0,0 +1,170 @@ + + + + Configurable Protocol Reference + + + + + + + + + + + + + + + + +
+

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

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

Configurable

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

    Important

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

    Declaration

    +
    +

    Swift

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

+ + ButtonMerchant 1.7.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.7.0/badge.svg b/docs/history/1.7.0/badge.svg new file mode 100644 index 0000000..19d671e --- /dev/null +++ b/docs/history/1.7.0/badge.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + documentation + + + documentation + + + 95% + + + 95% + + + diff --git a/docs/history/1.7.0/css/highlight.css b/docs/history/1.7.0/css/highlight.css new file mode 100644 index 0000000..c170357 --- /dev/null +++ b/docs/history/1.7.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.7.0/css/jazzy.css b/docs/history/1.7.0/css/jazzy.css new file mode 100644 index 0000000..c7bb9fe --- /dev/null +++ b/docs/history/1.7.0/css/jazzy.css @@ -0,0 +1,404 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +*, *:before, *:after { + box-sizing: inherit; } + +body { + margin: 0; + background: #fff; + color: #333; + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + letter-spacing: .2px; + -webkit-font-smoothing: antialiased; + box-sizing: border-box; } + +h1 { + font-size: 2rem; + font-weight: 700; + margin: 1.275em 0 0.6em; } + +h2 { + font-size: 1.75rem; + font-weight: 700; + margin: 1.275em 0 0.3em; } + +h3 { + font-size: 1.5rem; + font-weight: 700; + margin: 1em 0 0.3em; } + +h4 { + font-size: 1.25rem; + font-weight: 700; + margin: 1.275em 0 0.85em; } + +h5 { + font-size: 1rem; + font-weight: 700; + margin: 1.275em 0 0.85em; } + +h6 { + font-size: 1rem; + font-weight: 700; + margin: 1.275em 0 0.85em; + color: #777; } + +p { + margin: 0 0 1em; } + +ul, ol { + padding: 0 0 0 2em; + margin: 0 0 0.85em; } + +blockquote { + margin: 0 0 0.85em; + padding: 0 15px; + color: #858585; + border-left: 4px solid #e5e5e5; } + +img { + max-width: 100%; } + +a { + color: #4183c4; + text-decoration: none; } + a:hover, a:focus { + outline: 0; + text-decoration: underline; } + a.discouraged { + text-decoration: line-through; } + a.discouraged:hover, a.discouraged:focus { + text-decoration: underline line-through; } + +table { + background: #fff; + width: 100%; + border-collapse: collapse; + border-spacing: 0; + overflow: auto; + margin: 0 0 0.85em; } + +tr:nth-child(2n) { + background-color: #fbfbfb; } + +th, td { + padding: 6px 13px; + border: 1px solid #ddd; } + +hr { + height: 1px; + border: none; + background-color: #ddd; } + +pre { + margin: 0 0 1.275em; + padding: .85em 1em; + overflow: auto; + background: #f7f7f7; + font-size: .85em; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } + +code { + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } + +.item-container p > code, .item-container li > code, .top-matter p > code, .top-matter li > code { + background: #f7f7f7; + padding: .2em; } + .item-container p > code:before, .item-container p > code:after, .item-container li > code:before, .item-container li > code:after, .top-matter p > code:before, .top-matter p > code:after, .top-matter li > code:before, .top-matter li > code:after { + letter-spacing: -.2em; + content: "\00a0"; } + +pre code { + padding: 0; + white-space: pre; } + +.content-wrapper { + display: flex; + flex-direction: column; } + @media (min-width: 768px) { + .content-wrapper { + flex-direction: row; } } +.header { + display: flex; + padding: 8px; + font-size: 0.875em; + background: #444; + color: #999; } + +.header-col { + margin: 0; + padding: 0 8px; } + +.header-col--primary { + flex: 1; } + +.header-link { + color: #fff; } + +.header-icon { + padding-right: 2px; + vertical-align: -3px; + height: 16px; } + +.breadcrumbs { + font-size: 0.875em; + padding: 8px 16px; + margin: 0; + background: #fbfbfb; + border-bottom: 1px solid #ddd; } + +.carat { + height: 10px; + margin: 0 5px; } + +.navigation { + order: 2; } + @media (min-width: 768px) { + .navigation { + order: 1; + width: 25%; + max-width: 300px; + padding-bottom: 64px; + overflow: hidden; + word-wrap: normal; + background: #fbfbfb; + border-right: 1px solid #ddd; } } +.nav-groups { + list-style-type: none; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #ddd; + padding: 8px 0 8px 16px; } + +.nav-group-name-link { + color: #333; } + +.nav-group-tasks { + margin: 8px 0; + padding: 0 0 0 8px; } + +.nav-group-task { + font-size: 1em; + list-style-type: none; + white-space: nowrap; } + +.nav-group-task-link { + color: #808080; } + +.main-content { + order: 1; } + @media (min-width: 768px) { + .main-content { + order: 2; + flex: 1; + padding-bottom: 60px; } } +.section { + padding: 0 32px; + border-bottom: 1px solid #ddd; } + +.section-content { + max-width: 834px; + margin: 0 auto; + padding: 16px 0; } + +.section-name { + color: #666; + display: block; } + .section-name p { + margin-bottom: inherit; } + +.declaration .highlight { + overflow-x: initial; + padding: 8px 0; + margin: 0; + background-color: transparent; + border: none; } + +.task-group-section { + border-top: 1px solid #ddd; } + +.task-group { + padding-top: 0px; } + +.task-name-container a[name]:before { + content: ""; + display: block; } + +.section-name-container { + position: relative; } + .section-name-container .section-name-link { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin-bottom: 0; } + .section-name-container .section-name { + position: relative; + pointer-events: none; + z-index: 1; } + .section-name-container .section-name a { + pointer-events: auto; } + +.item-container { + padding: 0; } + +.item { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; } + .item .token, .item .direct-link { + display: inline-block; + text-indent: -20px; + padding-left: 3px; + margin-left: 20px; + font-size: 1rem; } + .item .declaration-note { + font-size: .85em; + color: #808080; + font-style: italic; } + +.pointer-container { + border-bottom: 1px solid #ddd; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + left: 21px; + top: 7px; + display: block; + position: absolute; + width: 12px; + height: 12px; + border-left: 1px solid #ddd; + border-top: 1px solid #ddd; + background: #fff; + transform: rotate(45deg); } + +.height-container { + display: none; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #fff; + border: 1px solid #ddd; + border-top-width: 0; + padding-top: 10px; + padding-bottom: 5px; + padding: 8px 16px; } + +.aside, .language { + padding: 6px 12px; + margin: 12px 0; + border-left: 5px solid #dddddd; + overflow-y: hidden; } + .aside .aside-title, .language .aside-title { + font-size: 9px; + letter-spacing: 2px; + text-transform: uppercase; + padding-bottom: 0; + margin: 0; + color: #aaa; + -webkit-user-select: none; } + .aside p:last-child, .language p:last-child { + margin-bottom: 0; } + +.language { + border-left: 5px solid #cde9f4; } + .language .aside-title { + color: #4183c4; } + +.aside-warning, .aside-deprecated, .aside-unavailable { + border-left: 5px solid #ff6666; } + .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title { + color: #ff0000; } + +.graybox { + border-collapse: collapse; + width: 100%; } + .graybox p { + margin: 0; + word-break: break-word; + min-width: 50px; } + .graybox td { + border: 1px solid #ddd; + padding: 5px 25px 5px 10px; + vertical-align: middle; } + .graybox tr td:first-of-type { + text-align: right; + padding: 7px; + vertical-align: top; + word-break: normal; + width: 40px; } + +.slightly-smaller { + font-size: 0.9em; } + +.footer { + padding: 8px 16px; + background: #444; + color: #ddd; + font-size: 0.8em; } + .footer p { + margin: 8px 0; } + .footer a { + color: #fff; } + +html.dash .header, html.dash .breadcrumbs, html.dash .navigation { + display: none; } + +html.dash .height-container { + display: block; } + +form[role=search] input { + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 24px; + padding: 0 10px; + margin: 0; + border: none; + border-radius: 1em; } + .loading form[role=search] input { + background: white url(../img/spinner.gif) center right 4px no-repeat; } + +form[role=search] .tt-menu { + margin: 0; + min-width: 300px; + background: #fbfbfb; + color: #333; + border: 1px solid #ddd; } + +form[role=search] .tt-highlight { + font-weight: bold; } + +form[role=search] .tt-suggestion { + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + padding: 0 8px; } + form[role=search] .tt-suggestion span { + display: table-cell; + white-space: nowrap; } + form[role=search] .tt-suggestion .doc-parent-name { + width: 100%; + text-align: right; + font-weight: normal; + font-size: 0.9em; + padding-left: 16px; } + +form[role=search] .tt-suggestion:hover, +form[role=search] .tt-suggestion.tt-cursor { + cursor: pointer; + background-color: #4183c4; + color: #fff; } + +form[role=search] .tt-suggestion:hover .doc-parent-name, +form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { + color: #fff; } diff --git a/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Info.plist b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Info.plist new file mode 100644 index 0000000..49cb17c --- /dev/null +++ b/docs/history/1.7.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.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes.html b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes.html new file mode 100644 index 0000000..caf6012 --- /dev/null +++ b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes.html @@ -0,0 +1,225 @@ + + + + Classes Reference + + + + + + + + + + + + + + + + +
+

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

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

Classes

+

The following classes are available globally.

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

    Note

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

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

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

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

    A concrete implementation of the ButtonProductCompatible protocol.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

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

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

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

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

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

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

ButtonMerchant

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

Note

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

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

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

    The last attributionToken from an inbound Button attributed URL.

    +
    +

    Attention

    +

    For attribution to work correctly, you must:

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

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

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

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

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

    Configures ButtonMerchant with your application Id.

    +
    +

    Note

    +

    Get your application Id from from the Button Dashboard

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

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

    Parameters

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

    Your application Id (required)

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

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

    +
    +

    Attention

    +

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

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

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

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

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

    Parameters

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

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

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

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

    +
    +

    Attention

    +

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

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

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

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

    Parameters

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

    A NSUserActivity with which your app has been continued.

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

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

    + +

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

    +
    +

    Attention

    +

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

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

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

    Parameters

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

    A completion block taking an optional url and optional error.

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

    Reports an order to Button.

    +
    +

    See also

    +

    Reporting Orders to Button

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

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

    Parameters

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

    Your order object to be reported.

    +
    +
    + + completion + + +
    +

    An optional completion block taking an optional error.

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

    Discards the current session and all persisted data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

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

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

    + +
    +
    +

    Declaration

    +
    +

    Swift

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

    An interface through which user activity can be reported.

    + +
    +
    +

    Declaration

    +
    +

    Swift

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

+ + ButtonMerchant 1.7.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.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order.html b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order.html new file mode 100644 index 0000000..0a9629c --- /dev/null +++ b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order.html @@ -0,0 +1,359 @@ + + + + Order Class Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.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.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/Customer.html b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/Customer.html new file mode 100644 index 0000000..8ac1792 --- /dev/null +++ b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Classes/Order/Customer.html @@ -0,0 +1,231 @@ + + + + Customer Class Reference + + + + + + + + + + + + + + + + +
+

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

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

Customer

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

Represents a customer in the order.

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

    Important

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

    Declaration

    +
    +

    Swift

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

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

    + +
    +
    +

    Declaration

    +
    +

    Swift

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

    Initializes a customer object with the passed parameters.

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

    Declaration

    +
    +

    Swift

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

+ + ButtonMerchant 1.7.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.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums.html b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums.html new file mode 100644 index 0000000..73db738 --- /dev/null +++ b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums.html @@ -0,0 +1,218 @@ + + + + Enumerations Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.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.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ButtonMerchantError.html b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ButtonMerchantError.html new file mode 100644 index 0000000..272b54d --- /dev/null +++ b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Enums/ButtonMerchantError.html @@ -0,0 +1,191 @@ + + + + ButtonMerchantError Enumeration Reference + + + + + + + + + + + + + + + + +
+

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

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

ButtonMerchantError

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

Button Merchant Library Errors.

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

    Declaration

    +
    +

    Swift

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

    Declaration

    +
    +

    Swift

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

+ + ButtonMerchant 1.7.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
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

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

+ + ButtonMerchant 1.7.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.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols.html b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols.html new file mode 100644 index 0000000..8f041c8 --- /dev/null +++ b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols.html @@ -0,0 +1,217 @@ + + + + Protocols Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.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 + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

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

+ + ButtonMerchant 1.7.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.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/ButtonProductCompatible.html b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/ButtonProductCompatible.html new file mode 100644 index 0000000..c139621 --- /dev/null +++ b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/ButtonProductCompatible.html @@ -0,0 +1,382 @@ + + + + ButtonProductCompatible Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + ButtonMerchant 1.7.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.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Configurable.html b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Configurable.html new file mode 100644 index 0000000..3b3025d --- /dev/null +++ b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/Protocols/Configurable.html @@ -0,0 +1,170 @@ + + + + Configurable Protocol Reference + + + + + + + + + + + + + + + + +
+

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

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

Configurable

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

    Important

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

    Declaration

    +
    +

    Swift

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

+ + ButtonMerchant 1.7.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.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/highlight.css b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/highlight.css new file mode 100644 index 0000000..c170357 --- /dev/null +++ b/docs/history/1.7.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.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/jazzy.css b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/jazzy.css new file mode 100644 index 0000000..c7bb9fe --- /dev/null +++ b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/css/jazzy.css @@ -0,0 +1,404 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +*, *:before, *:after { + box-sizing: inherit; } + +body { + margin: 0; + background: #fff; + color: #333; + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + letter-spacing: .2px; + -webkit-font-smoothing: antialiased; + box-sizing: border-box; } + +h1 { + font-size: 2rem; + font-weight: 700; + margin: 1.275em 0 0.6em; } + +h2 { + font-size: 1.75rem; + font-weight: 700; + margin: 1.275em 0 0.3em; } + +h3 { + font-size: 1.5rem; + font-weight: 700; + margin: 1em 0 0.3em; } + +h4 { + font-size: 1.25rem; + font-weight: 700; + margin: 1.275em 0 0.85em; } + +h5 { + font-size: 1rem; + font-weight: 700; + margin: 1.275em 0 0.85em; } + +h6 { + font-size: 1rem; + font-weight: 700; + margin: 1.275em 0 0.85em; + color: #777; } + +p { + margin: 0 0 1em; } + +ul, ol { + padding: 0 0 0 2em; + margin: 0 0 0.85em; } + +blockquote { + margin: 0 0 0.85em; + padding: 0 15px; + color: #858585; + border-left: 4px solid #e5e5e5; } + +img { + max-width: 100%; } + +a { + color: #4183c4; + text-decoration: none; } + a:hover, a:focus { + outline: 0; + text-decoration: underline; } + a.discouraged { + text-decoration: line-through; } + a.discouraged:hover, a.discouraged:focus { + text-decoration: underline line-through; } + +table { + background: #fff; + width: 100%; + border-collapse: collapse; + border-spacing: 0; + overflow: auto; + margin: 0 0 0.85em; } + +tr:nth-child(2n) { + background-color: #fbfbfb; } + +th, td { + padding: 6px 13px; + border: 1px solid #ddd; } + +hr { + height: 1px; + border: none; + background-color: #ddd; } + +pre { + margin: 0 0 1.275em; + padding: .85em 1em; + overflow: auto; + background: #f7f7f7; + font-size: .85em; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } + +code { + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } + +.item-container p > code, .item-container li > code, .top-matter p > code, .top-matter li > code { + background: #f7f7f7; + padding: .2em; } + .item-container p > code:before, .item-container p > code:after, .item-container li > code:before, .item-container li > code:after, .top-matter p > code:before, .top-matter p > code:after, .top-matter li > code:before, .top-matter li > code:after { + letter-spacing: -.2em; + content: "\00a0"; } + +pre code { + padding: 0; + white-space: pre; } + +.content-wrapper { + display: flex; + flex-direction: column; } + @media (min-width: 768px) { + .content-wrapper { + flex-direction: row; } } +.header { + display: flex; + padding: 8px; + font-size: 0.875em; + background: #444; + color: #999; } + +.header-col { + margin: 0; + padding: 0 8px; } + +.header-col--primary { + flex: 1; } + +.header-link { + color: #fff; } + +.header-icon { + padding-right: 2px; + vertical-align: -3px; + height: 16px; } + +.breadcrumbs { + font-size: 0.875em; + padding: 8px 16px; + margin: 0; + background: #fbfbfb; + border-bottom: 1px solid #ddd; } + +.carat { + height: 10px; + margin: 0 5px; } + +.navigation { + order: 2; } + @media (min-width: 768px) { + .navigation { + order: 1; + width: 25%; + max-width: 300px; + padding-bottom: 64px; + overflow: hidden; + word-wrap: normal; + background: #fbfbfb; + border-right: 1px solid #ddd; } } +.nav-groups { + list-style-type: none; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #ddd; + padding: 8px 0 8px 16px; } + +.nav-group-name-link { + color: #333; } + +.nav-group-tasks { + margin: 8px 0; + padding: 0 0 0 8px; } + +.nav-group-task { + font-size: 1em; + list-style-type: none; + white-space: nowrap; } + +.nav-group-task-link { + color: #808080; } + +.main-content { + order: 1; } + @media (min-width: 768px) { + .main-content { + order: 2; + flex: 1; + padding-bottom: 60px; } } +.section { + padding: 0 32px; + border-bottom: 1px solid #ddd; } + +.section-content { + max-width: 834px; + margin: 0 auto; + padding: 16px 0; } + +.section-name { + color: #666; + display: block; } + .section-name p { + margin-bottom: inherit; } + +.declaration .highlight { + overflow-x: initial; + padding: 8px 0; + margin: 0; + background-color: transparent; + border: none; } + +.task-group-section { + border-top: 1px solid #ddd; } + +.task-group { + padding-top: 0px; } + +.task-name-container a[name]:before { + content: ""; + display: block; } + +.section-name-container { + position: relative; } + .section-name-container .section-name-link { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin-bottom: 0; } + .section-name-container .section-name { + position: relative; + pointer-events: none; + z-index: 1; } + .section-name-container .section-name a { + pointer-events: auto; } + +.item-container { + padding: 0; } + +.item { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; } + .item .token, .item .direct-link { + display: inline-block; + text-indent: -20px; + padding-left: 3px; + margin-left: 20px; + font-size: 1rem; } + .item .declaration-note { + font-size: .85em; + color: #808080; + font-style: italic; } + +.pointer-container { + border-bottom: 1px solid #ddd; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + left: 21px; + top: 7px; + display: block; + position: absolute; + width: 12px; + height: 12px; + border-left: 1px solid #ddd; + border-top: 1px solid #ddd; + background: #fff; + transform: rotate(45deg); } + +.height-container { + display: none; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #fff; + border: 1px solid #ddd; + border-top-width: 0; + padding-top: 10px; + padding-bottom: 5px; + padding: 8px 16px; } + +.aside, .language { + padding: 6px 12px; + margin: 12px 0; + border-left: 5px solid #dddddd; + overflow-y: hidden; } + .aside .aside-title, .language .aside-title { + font-size: 9px; + letter-spacing: 2px; + text-transform: uppercase; + padding-bottom: 0; + margin: 0; + color: #aaa; + -webkit-user-select: none; } + .aside p:last-child, .language p:last-child { + margin-bottom: 0; } + +.language { + border-left: 5px solid #cde9f4; } + .language .aside-title { + color: #4183c4; } + +.aside-warning, .aside-deprecated, .aside-unavailable { + border-left: 5px solid #ff6666; } + .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title { + color: #ff0000; } + +.graybox { + border-collapse: collapse; + width: 100%; } + .graybox p { + margin: 0; + word-break: break-word; + min-width: 50px; } + .graybox td { + border: 1px solid #ddd; + padding: 5px 25px 5px 10px; + vertical-align: middle; } + .graybox tr td:first-of-type { + text-align: right; + padding: 7px; + vertical-align: top; + word-break: normal; + width: 40px; } + +.slightly-smaller { + font-size: 0.9em; } + +.footer { + padding: 8px 16px; + background: #444; + color: #ddd; + font-size: 0.8em; } + .footer p { + margin: 8px 0; } + .footer a { + color: #fff; } + +html.dash .header, html.dash .breadcrumbs, html.dash .navigation { + display: none; } + +html.dash .height-container { + display: block; } + +form[role=search] input { + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 24px; + padding: 0 10px; + margin: 0; + border: none; + border-radius: 1em; } + .loading form[role=search] input { + background: white url(../img/spinner.gif) center right 4px no-repeat; } + +form[role=search] .tt-menu { + margin: 0; + min-width: 300px; + background: #fbfbfb; + color: #333; + border: 1px solid #ddd; } + +form[role=search] .tt-highlight { + font-weight: bold; } + +form[role=search] .tt-suggestion { + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + padding: 0 8px; } + form[role=search] .tt-suggestion span { + display: table-cell; + white-space: nowrap; } + form[role=search] .tt-suggestion .doc-parent-name { + width: 100%; + text-align: right; + font-weight: normal; + font-size: 0.9em; + padding-left: 16px; } + +form[role=search] .tt-suggestion:hover, +form[role=search] .tt-suggestion.tt-cursor { + cursor: pointer; + background-color: #4183c4; + color: #fff; } + +form[role=search] .tt-suggestion:hover .doc-parent-name, +form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { + color: #fff; } diff --git a/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/carat.png b/docs/history/1.7.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.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/img/dash.png b/docs/history/1.7.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.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/index.html b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/index.html new file mode 100644 index 0000000..247f7d9 --- /dev/null +++ b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/index.html @@ -0,0 +1,162 @@ + + + + ButtonMerchant Reference + + + + + + + + + + + + + + + +
+

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

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

Button Merchant Library

+ +

License: MIT +Version +Platform

+

Documentation

+ +

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

+ +

Reference docs are also available.

+

Example

+ +

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

+

Installation

+ +

ButtonMerchant is available through CocoaPods and Carthage.

+

Swift Pacakage Manager

+ +

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

+ +

Enter the package repository URL:

+ +

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

+ +

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

+

CocoaPods

+ +

Add this line to your Podfile:

+
pod 'ButtonMerchant'
+
+

Carthage

+ +

Or, add this to your Cartfile:

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

Author

+ +

Button, Inc.

+

License

+ +

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

+ +
+
+ + +
+
+ + + diff --git a/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.js b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.js new file mode 100755 index 0000000..1984416 --- /dev/null +++ b/docs/history/1.7.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.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.search.js b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jazzy.search.js new file mode 100644 index 0000000..359cdbb --- /dev/null +++ b/docs/history/1.7.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.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jquery.min.js b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/jquery.min.js new file mode 100644 index 0000000..c4c6022 --- /dev/null +++ b/docs/history/1.7.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.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/typeahead.jquery.js b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/js/typeahead.jquery.js new file mode 100644 index 0000000..3a2d2ab --- /dev/null +++ b/docs/history/1.7.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.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/search.json b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/Documents/search.json new file mode 100644 index 0000000..9e98251 --- /dev/null +++ b/docs/history/1.7.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":"
","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"},"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:)","parent_name":"ConfigurationError"},"Enums/ButtonMerchantError.html#/s:14ButtonMerchant0aB5ErrorO021trackOrderDeprecationC0yA2CmF":{"name":"trackOrderDeprecationError","parent_name":"ButtonMerchantError"},"Enums/ButtonMerchantError.html#/s:14ButtonMerchant0aB5ErrorO08noEventsC0yA2CmF":{"name":"noEventsError","parent_name":"ButtonMerchantError"},"Enums/ButtonMerchantError.html":{"name":"ButtonMerchantError","abstract":"

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":"
","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 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 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 destined for your app 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":{"name":"ButtonMerchant","abstract":"
"},"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.7.0/docsets/ButtonMerchant.docset/Contents/Resources/docSet.dsidx b/docs/history/1.7.0/docsets/ButtonMerchant.docset/Contents/Resources/docSet.dsidx new file mode 100644 index 0000000000000000000000000000000000000000..fffad3c7e34c34de4b345805ed86a61651fc9ae0 GIT binary patch literal 28672 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 LpV{AWb^-Yxf=Rpk literal 0 HcmV?d00001 diff --git a/docs/history/1.7.0/docsets/ButtonMerchant.tgz b/docs/history/1.7.0/docsets/ButtonMerchant.tgz new file mode 100644 index 0000000000000000000000000000000000000000..604c81aa36079613fecb7261de5d66d3d7121a98 GIT binary patch literal 80432 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�qUazmq#tep_^|}hcjV$q zFJBO(IQ^~FcHr#+&ufi~VRltjoD3`H!o`uW*+iv^M=Upa43-Qq{N4+-7(;Ixw#}}CwCQ5&t;$l#4vS?lMgLWFY}2wH*kzunTk)d9 z9Cb|~67{aPFqIiz+v4vYKjnQm1D-Vt*}PmsM|J2Uod48XaTNO2Qg|yykVPooWJYKE zX!&SDgBgGq15YBo#JEx|T(Gw+Dfj>C{g+^@EH zBjPJ&9yi>dp@j`ka+QdQeB$U>MpGqYI}s%;BZ*^9$_6!~H^%Fcq8K+z8HcI)NJPtr ztwRX>VDd2o-dCnbzLWMYX%`jRx1G>~T)7>lNZcm&7Yl6Uu_gQf?aMvEr=Zz=&^)x1 z-dV1_>N-xQmthWL+Gt3L{($2Aou9(Iw`kiviQjUCRYOQ5@}Pxse^uL3wysAC&h6#N z(Gg-;F&-k#NjQRnRUPjHp@1z^@iHmQfWmFCuMVFkz1`%od7_-$%svf&UJz>!_} z;D=UntZr0hxhRqPy>0C-d)0iw;U))Af4hZeGVI-O-vA9xq2%DsN~cf7i^Z#yLg?~a zi##yB{d}UjM~XL9*nKSp5iQ+%aqCu5jdHW_2|1uB+F|MpwIn(nDt_|2Glt>DJj^XR zWsI|V8vKm6IU;qWXz6$mWAzjpy@Mq#eEpE*c`|irBHAB<%Eeyb&%Xp!vs(O6S)9vZ z^(d~Lw9##jVMjt#K#q~I*cuf}<}kT1_{=GFwWNlSyf;Lwkcngy%?r%+LK9XSx^12L zX%_6o{N5mYO*a^3{s`A20J+t1oz0CVnOXaI{wg}CaIu!}m^~Td$JjQV0BekX^;S?y z+jk`CFI8zOm^LBn_JtW@QdwXL9X-EtNYNy_vgf!UyJF-g9H$7KuAEiu>J>S;Zp1S-BW6=iDq;2- z78Kg%ASN`Nbtisin4=N^P(MQ@dYy@_Mxzii$x&6OFs;iSUbii->MHHExuC0{ASBk?0Qb<2gLg?q$+Bl^kAf)o z8>n3%C2l3rh?N4d8;$VV<3|jdenL+M)l25TxXxC@&n;`LhN+0-gnCg?^#}bcOB?m*Qu{pKJEa9<#upDT?#H? z?}K8KfA>U&!|c9+MNHvL>*e&Mca|=q8S)_19?feCNkDZK+w! zlFO*^>j;N;N9>vkbSR7?cK8bUCldi|r-i zkmhP9$bwybnWavR3oQFm`pNr}G~=iBOH%712i|N=wa}4@JPk3QjN`}L0~`Z;ACz%j zl2WpT3u#rHC{z#c@koIsY6oHaxu27V(~BI1vBGV399S{WDVZB&psDZftkYMke277a zvalW*0ky{Ih+w+GU>>t13iF_)6X0^5SorP{WZE#i9V96oe;Z#;xPOw?=FAk2ggjYU z-?pZHdKAXp0o%5MeBJttEJBYxUm{(A*&WIZqi}}7e$c#g!=Zm2Q1GpDN%%C)mS&`>qZQ@s?xS2nr>Ps+XU)H6%*>_ZFL){ zVjDq)G%U6fEc-zvkypuBJt1U6Pdy{l8*7{TxnJi7*GWXUmqzA^Sb(B>nKc6?bj+r$ zTc~)&9g6x%gN))dwAh2?_B+*?L9Q@s88aBnTx;(zFO8TVmF zOV+Wjdbg~byBM<@W-lHnVtH#03b%%~nA$hs?CHH}s>ZEzde# z5UsU?S*b)F(dFNI?M=7yZrVOKteQhxyC6B_vTJ09S+C zLW>34ykk9wuf57{YuaLm3Ua%6VGml@Lz%i8er4oa*4E)V6OXs+YH0U)HjYslrbs8~ z{uTqNhznNmq6fd7e(^KSO|HRZgH0G*5!+x_s?KVuXX_hg>U~3WAk_yh>*U4sYDxEL zPHPY)!w<`uNEedaFkN9hVIOT`FSy>4m0ckdr+2<1H>fSSu_TBNrGsL{WpGlw=#b;FB459J^uR2E9rpDIW1TDhm%vbiKhl)#ZgJ_EHxAEW3-jTOJ&%bexGC#9nb zVic%A-pf4I!i79l%ZC{|5NXl#>jH@)dli%r#*F}p%m$3O9JhgaUu3Bk=7Qf=Rv{

>Iy~)n&3cP^UyQRXGI>Vk(7jo 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ΝHYMWef*i)XQG&{(paenHe`;H>CZ%qa*=ZoDjiyE6 zGivyk50THIebElPmuA0b>dM%bdsr65VTB)e*xu8E0IdpZOZENx$@*xUxG z-eSkg)-RQRyeKDFzQq*~*t1%Q9u>-&rZ#+(*7rMIo6A9ds8o^5_I5!=p+tfnb1h-d zQEnl|dBLRWlz&d-e>gD9QlBoy4Z_2}o?wz1P?u5U1diT@JX>30Z~r#jcsS_kO7DXh zm)2O1CsW~NyIYdfsY`h^DEbEn-bc-_4_BI;u*qc!2nR_Eoe$;Cei*=Y zmXf@8d%jA8E|u3d_8El={0qT3rWP2EOvJaTTEbET_2OKEnd#724@Z7=2G>!hzQR3z zwM;46f95;LjDcA*-py7hUGCulC-q$#29u%oB-xecM7*f%?vp@TXv)|YWs*r%`aOF1N?FRpii{? zNkH@ClW49p7&8$}7NBMbJWiH9;lV7b^f`5G6=UIavOYMb3`Cn>Q#9^d%enP-ZQ9-C zt~>FVfwxX#UrG)u?If#sf(?K*9Pn~xz?_uQiF1GIO}Xl+i4mymkq^jsM#`1lY(x~s z8uBHivZp|AnG!VSQ%P#yAi}%%lvA*#WG@)i{~b(|6*$0z5~A4?CV~;{C4Juohgxq% z41O0D*C_0DD)O1V=qHaYiOJsXgX>y8=NbzUukhy?{`jP^?F}i=WNuI9BgR zEy^@FLtNNOLT2&(WFS2!Y2Vub0++T<3IM`-S%(a%|bv7=$MkP+zyy)*^O7bJqLw zmFL*@wjo(9pP>Di=-^AWD%BDtbxs}lHkKPEr9>P-_UsEF1%ZZtX?dvuJ+sK#PY|%@ zc2-yaXu{Agn5E)<`eq|kI1>t6q10J>J4Ex5MHcoJs6~xp7aqgi}?c7jZCuuRh*vEUerUdm%&e z56FyByjhp4U0#J=`yHh)A1RPs`|x&uTue`*Jh_jmqYBfDv`gNVs6|w6-3d#bAPk?E zdEKY`4XxHq_9{dlyp?2d67J~-9vV{J%?*A1Y^WN+A&HnzG`T@kS(q}CP-53FnZ{I3 zwrQ5M+%B0|<9%>@0c*IO&#C@4Z`JY2TN;L>_8rG4)t5c?X2e#Kp&8haQTj5KbwbE) zFd*nl#k3ZY3AfFEw}3LPOxJ}?_C;%DQ$T)qgbtq@pe?``UArVv7HrGv8naqRGWb(O zptgu)Mdp}yduJ^^Cu~*aukMKF%SjKXPA82$H$W>d+DAr*I_O0T|+T5RrYmF rIiFo>r2#YIrtU?0T#xB44qIh2cEf?kcEr!#8^lCsjsS!k8svWf2JY0x literal 0 HcmV?d00001 diff --git a/docs/history/1.7.0/img/carat.png b/docs/history/1.7.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.7.0/img/dash.png b/docs/history/1.7.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.7.0/index.html b/docs/history/1.7.0/index.html new file mode 100644 index 0000000..247f7d9 --- /dev/null +++ b/docs/history/1.7.0/index.html @@ -0,0 +1,162 @@ + + + + ButtonMerchant Reference + + + + + + + + + + + + + + + +

+

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

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

Button Merchant Library

+ +

License: MIT +Version +Platform

+

Documentation

+ +

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

+ +

Reference docs are also available.

+

Example

+ +

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

+

Installation

+ +

ButtonMerchant is available through CocoaPods and Carthage.

+

Swift Pacakage Manager

+ +

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

+ +

Enter the package repository URL:

+ +

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

+ +

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

+

CocoaPods

+ +

Add this line to your Podfile:

+
pod 'ButtonMerchant'
+
+

Carthage

+ +

Or, add this to your Cartfile:

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

Author

+ +

Button, Inc.

+

License

+ +

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

+ +
+
+ + +
+
+ + + diff --git a/docs/history/1.7.0/js/jazzy.js b/docs/history/1.7.0/js/jazzy.js new file mode 100755 index 0000000..1984416 --- /dev/null +++ b/docs/history/1.7.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.7.0/js/jazzy.search.js b/docs/history/1.7.0/js/jazzy.search.js new file mode 100644 index 0000000..359cdbb --- /dev/null +++ b/docs/history/1.7.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.7.0/js/jquery.min.js b/docs/history/1.7.0/js/jquery.min.js new file mode 100644 index 0000000..c4c6022 --- /dev/null +++ b/docs/history/1.7.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.7.0/js/typeahead.jquery.js b/docs/history/1.7.0/js/typeahead.jquery.js new file mode 100644 index 0000000..3a2d2ab --- /dev/null +++ b/docs/history/1.7.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.7.0/search.json b/docs/history/1.7.0/search.json new file mode 100644 index 0000000..9e98251 --- /dev/null +++ b/docs/history/1.7.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":"
","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"},"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:)","parent_name":"ConfigurationError"},"Enums/ButtonMerchantError.html#/s:14ButtonMerchant0aB5ErrorO021trackOrderDeprecationC0yA2CmF":{"name":"trackOrderDeprecationError","parent_name":"ButtonMerchantError"},"Enums/ButtonMerchantError.html#/s:14ButtonMerchant0aB5ErrorO08noEventsC0yA2CmF":{"name":"noEventsError","parent_name":"ButtonMerchantError"},"Enums/ButtonMerchantError.html":{"name":"ButtonMerchantError","abstract":"

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":"
","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 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 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 destined for your app 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":{"name":"ButtonMerchant","abstract":"
"},"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.7.0/undocumented.json b/docs/history/1.7.0/undocumented.json new file mode 100644 index 0000000..4a10f95 --- /dev/null +++ b/docs/history/1.7.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 b35bc9c..55457e1 120000 --- a/docs/latest +++ b/docs/latest @@ -1 +1 @@ -./history/1.6.0 \ No newline at end of file +./history/1.7.0 \ No newline at end of file diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 1cf2196..941e327 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -28,12 +28,11 @@ platform :ios do desc "Run the Button merchant library tests" lane :test do |options| - lint - run_tests( + xcodebuild( + xcargs: "test", workspace: "ButtonMerchant.xcworkspace", scheme: options[:scheme], - device: "iPhone X", - slack_message: "button-merchant-ios #{options[:scheme]}" + destination: "name=#{options[:name]},OS=#{options[:os]}" ) end @@ -43,8 +42,7 @@ platform :ios do workspace: "ButtonMerchant.xcworkspace", proj: "ButtonMerchant.xcodeproj", scheme: "ButtonMerchant", - ignore: ["Tests/**.*", "Example/**.*"], - travis_pro: !options[:show], + ignore: ["Tests/**.*", "Example/**.*", "Source/*/UIApplicationExtensions.swift"], coveralls: !options[:show], simple_output: !options[:show], html: options[:show],