diff --git a/docs/Classes.html b/docs/Classes.html new file mode 100644 index 0000000..8560825 --- /dev/null +++ b/docs/Classes.html @@ -0,0 +1,277 @@ + + + + Classes Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

Classes

+

The following classes are available globally.

+ +
+
+
+
    +
  • +
    + + + + ClickstreamObjc + +
    +
    +
    +
    +
    +
    +

    ClickstreamAnalytics api for objective-c

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +public class ClickstreamObjc : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + EventName + +
    +
    +
    +
    +
    +
    +

    ClickstreamAnalytics preset events

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +public class EventName : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Attr + +
    +
    +
    +
    +
    +
    +

    ClickstreamANalytics preset attributes

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +public class Attr : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ClickstreamItemKey + +
    +
    +
    +
    +
    +
    +

    ClickstreamAnalytics preset item keys for objective-c +In addition to the item attributes defined below, you can add up to 10 custom attributes to an item.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +public class ClickstreamItemKey : NSObject
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

ClickstreamContext +

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

    The configuration object for clickstream, modify the params after sdk initialize

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +public class ClickstreamConfiguration : NSObject
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Classes/Attr.html b/docs/Classes/Attr.html new file mode 100644 index 0000000..6cfdc49 --- /dev/null +++ b/docs/Classes/Attr.html @@ -0,0 +1,479 @@ + + + + Attr Class Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

Attr

+
+
+ +
@objcMembers
+public class Attr : NSObject
+ +
+
+

ClickstreamANalytics preset attributes

+ +
+
+
+
    +
  • +
    + + + + SCREEN_NAME + +
    +
    +
    +
    +
    +
    +

    Preset attribute screen name

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let SCREEN_NAME: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SCREEN_UNIQUE_ID + +
    +
    +
    +
    +
    +
    +

    Preset attribute screen unique id

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let SCREEN_UNIQUE_ID: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + TRAFFIC_SOURCE_SOURCE + +
    +
    +
    +
    +
    +
    +

    Preset attribute traffic source source

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_SOURCE: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + TRAFFIC_SOURCE_MEDIUM + +
    +
    +
    +
    +
    +
    +

    Preset attribute traffic source medium

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_MEDIUM: String
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Preset attribute traffic source campaign

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_CAMPAIGN: String
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Preset attribute traffic source campaign id

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_CAMPAIGN_ID: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + TRAFFIC_SOURCE_TERM + +
    +
    +
    +
    +
    +
    +

    Preset attribute traffic source term

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_TERM: String
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Preset attribute traffic source content

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_CONTENT: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + TRAFFIC_SOURCE_CLID + +
    +
    +
    +
    +
    +
    +

    Preset attribute traffic source clid

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_CLID: String
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Preset attribute traffic source clid platform

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_CLID_PLATFORM: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + APP_INSTALL_CHANNEL + +
    +
    +
    +
    +
    +
    +

    Preset attribute app install channel

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let APP_INSTALL_CHANNEL: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + VALUE + +
    +
    +
    +
    +
    +
    +

    Preset attribute event value

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let VALUE: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CURRENCY + +
    +
    +
    +
    +
    +
    +

    Preset attribute event currency

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let CURRENCY: String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Classes/ClickstreamConfiguration.html b/docs/Classes/ClickstreamConfiguration.html new file mode 100644 index 0000000..6c59bd7 --- /dev/null +++ b/docs/Classes/ClickstreamConfiguration.html @@ -0,0 +1,440 @@ + + + + ClickstreamConfiguration Class Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

ClickstreamConfiguration

+
+
+ +
@objcMembers
+public class ClickstreamConfiguration : NSObject
+ +
+
+

The configuration object for clickstream, modify the params after sdk initialize

+ +
+
+
+
    +
  • +
    + + + + withAppId(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withAppId(_ appId: String) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + withEndpoint(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withEndpoint(_ endpoint: String) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withSendEventInterval(_ sendEventsInterval: Int) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withTrackAppExceptionEvents(_ isTrackAppExceptionEvents: Bool) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withTrackScreenViewEvents(_ isTrackScreenViewEvents: Bool) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withTrackUserEngagementEvents(_ isTrackUserEngagementEvents: Bool) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withCompressEvents(_ isCompressEvents: Bool) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + withLogEvents(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withLogEvents(_ isLogEvents: Bool) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + withAuthCookie(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withAuthCookie(_ authCookie: String) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withSessionTimeoutDuration(_ sessionTimeoutDuration: Int64) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withInitialGlobalAttributes(_ globalAttributes: ClickstreamAttribute) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withInitialGlobalAttributesObjc(_ globalAttributes: NSDictionary) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Classes/ClickstreamItemKey.html b/docs/Classes/ClickstreamItemKey.html new file mode 100644 index 0000000..dd85e24 --- /dev/null +++ b/docs/Classes/ClickstreamItemKey.html @@ -0,0 +1,507 @@ + + + + ClickstreamItemKey Class Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

ClickstreamItemKey

+
+
+ +
@objcMembers
+public class ClickstreamItemKey : NSObject
+ +
+
+

ClickstreamAnalytics preset item keys for objective-c +In addition to the item attributes defined below, you can add up to 10 custom attributes to an item.

+ +
+
+
+
    +
  • +
    + + + + ITEM_ID + +
    +
    +
    +
    +
    +
    +

    The id of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_ID: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_NAME + +
    +
    +
    +
    +
    +
    +

    The name of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_NAME: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LOCATION_ID + +
    +
    +
    +
    +
    +
    +

    The location id of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let LOCATION_ID: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_BRAND + +
    +
    +
    +
    +
    +
    +

    The brand of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_BRAND: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CURRENCY + +
    +
    +
    +
    +
    +
    +

    The currency of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let CURRENCY: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + PRICE + +
    +
    +
    +
    +
    +
    +

    The price of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let PRICE: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + QUANTITY + +
    +
    +
    +
    +
    +
    +

    The quantity of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let QUANTITY: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CREATIVE_NAME + +
    +
    +
    +
    +
    +
    +

    The creative name of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let CREATIVE_NAME: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CREATIVE_SLOT + +
    +
    +
    +
    +
    +
    +

    The creative slot of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let CREATIVE_SLOT: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_CATEGORY + +
    +
    +
    +
    +
    +
    +

    The category of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_CATEGORY: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_CATEGORY2 + +
    +
    +
    +
    +
    +
    +

    The category2 of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_CATEGORY2: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_CATEGORY3 + +
    +
    +
    +
    +
    +
    +

    The category3 of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_CATEGORY3: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_CATEGORY4 + +
    +
    +
    +
    +
    +
    +

    The category4 of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_CATEGORY4: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_CATEGORY5 + +
    +
    +
    +
    +
    +
    +

    The category5 of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_CATEGORY5: String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Classes/ClickstreamObjc.html b/docs/Classes/ClickstreamObjc.html new file mode 100644 index 0000000..31a256b --- /dev/null +++ b/docs/Classes/ClickstreamObjc.html @@ -0,0 +1,652 @@ + + + + ClickstreamObjc Class Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

ClickstreamObjc

+
+
+ +
@objcMembers
+public class ClickstreamObjc : NSObject
+ +
+
+

ClickstreamAnalytics api for objective-c

+ +
+
+
+
    +
  • +
    + + + + initSDK() + +
    +
    +
    +
    +
    +
    +

    Init the Clickstream sdk

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func initSDK() throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + initSDK(_:) + +
    +
    +
    +
    +
    +
    +

    Init the Clickstream sdk

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func initSDK(_ configuration: ClickstreamConfiguration) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + recordEvent(_:) + +
    +
    +
    +
    +
    +
    +

    Use this method to record event

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func recordEvent(_ eventName: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + eventName + + +
    +

    the event name

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + recordEvent(_:_:) + +
    +
    +
    +
    +
    +
    +

    The method to record event with attributes

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func recordEvent(_ eventName: String, _ attributes: NSDictionary)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + eventName + + +
    +

    the event name

    +
    +
    + + attributes + + +
    +

    the event attributes which type is NSDictionary

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + recordEvent(_:_:_:) + +
    +
    +
    +
    +
    +
    +

    The method to record event with attributes and items

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func recordEvent(_ eventName: String, _ attributes: NSDictionary, _ items: [NSDictionary] = [])
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + eventName + + +
    +

    the event name

    +
    +
    + + attributes + + +
    +

    the event attributes which type is NSDictionary

    +
    +
    + + items + + +
    +

    the event items which type is NSDictionary

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + flushEvents() + +
    +
    +
    +
    +
    +
    +

    Use this method to send events immediately

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func flushEvents()
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Add global attributes

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func addGlobalAttributes(_ attributes: NSDictionary)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + attributes + + +
    +

    the global attributes to add

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

    Delete global attributes

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func deleteGlobalAttributes(_ attributes: [String])
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + attributes + + +
    +

    the global attributes names to delete

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + addUserAttributes(_:) + +
    +
    +
    +
    +
    +
    +

    Add user attributes

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func addUserAttributes(_ attributes: NSDictionary)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + attributes + + +
    +

    the user attributes to add

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + setUserId(_:) + +
    +
    +
    +
    +
    +
    +

    Set user id for login and logout

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func setUserId(_ userId: String?)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + userId + + +
    +

    current userId, nil for logout

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

    Get Clickstream configuration, please config it after initialize sdk

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func getClickstreamConfiguration() throws -> ClickstreamConfiguration
    + +
    +
    +
    +

    Return Value

    +

    ClickstreamContextConfiguration to modify the configuration of clickstream sdk

    +
    +
    +
    +
  • +
  • +
    + + + + disable() + +
    +
    +
    +
    +
    +
    +

    Disable the SDK

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func disable()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + enable() + +
    +
    +
    +
    +
    +
    +

    Enable the SDK

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func enable()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Classes/EventName.html b/docs/Classes/EventName.html new file mode 100644 index 0000000..c43a385 --- /dev/null +++ b/docs/Classes/EventName.html @@ -0,0 +1,155 @@ + + + + EventName Class Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

EventName

+
+
+ +
@objcMembers
+public class EventName : NSObject
+ +
+
+

ClickstreamAnalytics preset events

+ +
+
+
+
    +
  • +
    + + + + SCREEN_VIEW + +
    +
    +
    +
    +
    +
    +

    Preset event screen view

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let SCREEN_VIEW: String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Enums.html b/docs/Enums.html new file mode 100644 index 0000000..6de9299 --- /dev/null +++ b/docs/Enums.html @@ -0,0 +1,146 @@ + + + + Enumerations Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

Enumerations

+

The following enumerations are available globally.

+ +
+
+
+
    +
  • +
    + + + + ClickstreamAnalytics + +
    +
    +
    +
    +
    +
    +

    ClickstreamAnalytics api for swift

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ClickstreamAnalytics
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Enums/ClickstreamAnalytics.html b/docs/Enums/ClickstreamAnalytics.html new file mode 100644 index 0000000..6808726 --- /dev/null +++ b/docs/Enums/ClickstreamAnalytics.html @@ -0,0 +1,679 @@ + + + + ClickstreamAnalytics Enumeration Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

ClickstreamAnalytics

+
+
+ +
public enum ClickstreamAnalytics
+ +
+
+

ClickstreamAnalytics api for swift

+ +
+
+
+
    +
  • +
    + + + + initSDK(_:) + +
    +
    +
    +
    +
    +
    +

    Init ClickstreamAnalytics

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func initSDK(_ configuration: ClickstreamConfiguration? = nil) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + recordEvent(_:) + +
    +
    +
    +
    +
    +
    +

    Use this method to record event

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func recordEvent(_ eventName: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + eventName + + +
    +

    the event name

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + recordEvent(_:_:_:) + +
    +
    +
    +
    +
    +
    +

    The method to record event with ClickstreamAttribute

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func recordEvent(_ eventName: String,
    +                               _ attributes: ClickstreamAttribute,
    +                               _ items: [ClickstreamAttribute] = [])
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + eventName + + +
    +

    the event name

    +
    +
    + + attributes + + +
    +

    the event attributes

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + flushEvents() + +
    +
    +
    +
    +
    +
    +

    Use this method to send events immediately

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func flushEvents()
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Add global attributes

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func addGlobalAttributes(_ attributes: ClickstreamAttribute)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + attributes + + +
    +

    the global attributes to add

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

    Delete global attributes

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func deleteGlobalAttributes(_ attributes: String...)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + attributes + + +
    +

    the global attributes names to delete

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + addUserAttributes(_:) + +
    +
    +
    +
    +
    +
    +

    Add user attributes

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func addUserAttributes(_ attributes: ClickstreamAttribute)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + attributes + + +
    +

    the user attributes to add

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + setUserId(_:) + +
    +
    +
    +
    +
    +
    +

    Set user id for login and logout

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func setUserId(_ userId: String?)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + userId + + +
    +

    current userId, nil for logout

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

    Get Clickstream configuration, please config it after initialize sdk

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func getClickstreamConfiguration() throws -> ClickstreamConfiguration
    + +
    +
    +
    +

    Return Value

    +

    ClickstreamContextConfiguration to modify the configuration of clickstream sdk

    +
    +
    +
    +
  • +
  • +
    + + + + disable() + +
    +
    +
    +
    +
    +
    +

    Disable the SDK

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func disable()
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + userId + + +
    +

    current userId, nil for logout

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + enable() + +
    +
    +
    +
    +
    +
    +

    Enable the SDK

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func enable()
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + userId + + +
    +

    current userId, nil for logout

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + EventName + +
    +
    +
    +
    +
    +
    +

    ClickstreamAnalytics preset events

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum EventName
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Attr + +
    +
    +
    +
    +
    +
    +

    ClickstreamANalytics preset attributes

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Attr
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Item + +
    +
    +
    +
    +
    +
    +

    ClickstreamAnalytics preset item attributes +In addition to the item attributes defined below, you can add up to 10 custom attributes to an item.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Item
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Enums/ClickstreamAnalytics/Attr.html b/docs/Enums/ClickstreamAnalytics/Attr.html new file mode 100644 index 0000000..9bd3bbc --- /dev/null +++ b/docs/Enums/ClickstreamAnalytics/Attr.html @@ -0,0 +1,480 @@ + + + + Attr Enumeration Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

Attr

+
+
+ +
public enum Attr
+ +
+
+

ClickstreamANalytics preset attributes

+ +
+
+
+
    +
  • +
    + + + + SCREEN_NAME + +
    +
    +
    +
    +
    +
    +

    Preset attribute screen name

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let SCREEN_NAME: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SCREEN_UNIQUE_ID + +
    +
    +
    +
    +
    +
    +

    Preset attribute screen unique id

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let SCREEN_UNIQUE_ID: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + TRAFFIC_SOURCE_SOURCE + +
    +
    +
    +
    +
    +
    +

    Preset attribute traffic source source

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_SOURCE: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + TRAFFIC_SOURCE_MEDIUM + +
    +
    +
    +
    +
    +
    +

    Preset attribute traffic source medium

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_MEDIUM: String
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Preset attribute traffic source campaign

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_CAMPAIGN: String
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Preset attribute traffic source campaign id

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_CAMPAIGN_ID: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + TRAFFIC_SOURCE_TERM + +
    +
    +
    +
    +
    +
    +

    Preset attribute traffic source term

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_TERM: String
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Preset attribute traffic source content

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_CONTENT: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + TRAFFIC_SOURCE_CLID + +
    +
    +
    +
    +
    +
    +

    Preset attribute traffic source clid

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_CLID: String
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Preset attribute traffic source clid platform

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_CLID_PLATFORM: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + APP_INSTALL_CHANNEL + +
    +
    +
    +
    +
    +
    +

    Preset attribute app install channel

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let APP_INSTALL_CHANNEL: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + VALUE + +
    +
    +
    +
    +
    +
    +

    Preset attribute event value

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let VALUE: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CURRENCY + +
    +
    +
    +
    +
    +
    +

    Preset attribute event currency

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let CURRENCY: String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Enums/ClickstreamAnalytics/EventName.html b/docs/Enums/ClickstreamAnalytics/EventName.html new file mode 100644 index 0000000..63b2ef2 --- /dev/null +++ b/docs/Enums/ClickstreamAnalytics/EventName.html @@ -0,0 +1,155 @@ + + + + EventName Enumeration Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

EventName

+
+
+ +
public enum EventName
+ +
+
+

ClickstreamAnalytics preset events

+ +
+
+
+
    +
  • +
    + + + + SCREEN_VIEW + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let SCREEN_VIEW: String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Enums/ClickstreamAnalytics/Item.html b/docs/Enums/ClickstreamAnalytics/Item.html new file mode 100644 index 0000000..f847a63 --- /dev/null +++ b/docs/Enums/ClickstreamAnalytics/Item.html @@ -0,0 +1,508 @@ + + + + Item Enumeration Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

Item

+
+
+ +
public enum Item
+ +
+
+

ClickstreamAnalytics preset item attributes +In addition to the item attributes defined below, you can add up to 10 custom attributes to an item.

+ +
+
+
+
    +
  • +
    + + + + ITEM_ID + +
    +
    +
    +
    +
    +
    +

    The id of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_ID: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_NAME + +
    +
    +
    +
    +
    +
    +

    The name of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_NAME: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LOCATION_ID + +
    +
    +
    +
    +
    +
    +

    The location id of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let LOCATION_ID: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_BRAND + +
    +
    +
    +
    +
    +
    +

    The brand of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_BRAND: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CURRENCY + +
    +
    +
    +
    +
    +
    +

    The currency of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let CURRENCY: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + PRICE + +
    +
    +
    +
    +
    +
    +

    The price of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let PRICE: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + QUANTITY + +
    +
    +
    +
    +
    +
    +

    The quantity of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let QUANTITY: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CREATIVE_NAME + +
    +
    +
    +
    +
    +
    +

    The creative name of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let CREATIVE_NAME: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CREATIVE_SLOT + +
    +
    +
    +
    +
    +
    +

    The creative slot of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let CREATIVE_SLOT: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_CATEGORY + +
    +
    +
    +
    +
    +
    +

    The category of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_CATEGORY: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_CATEGORY2 + +
    +
    +
    +
    +
    +
    +

    The category2 of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_CATEGORY2: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_CATEGORY3 + +
    +
    +
    +
    +
    +
    +

    The category3 of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_CATEGORY3: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_CATEGORY4 + +
    +
    +
    +
    +
    +
    +

    The category4 of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_CATEGORY4: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_CATEGORY5 + +
    +
    +
    +
    +
    +
    +

    The category5 of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_CATEGORY5: String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Extensions.html b/docs/Extensions.html new file mode 100644 index 0000000..136bc5f --- /dev/null +++ b/docs/Extensions.html @@ -0,0 +1,171 @@ + + + + Extensions Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

Extensions

+

The following extensions are available globally.

+ +
+
+
+
    +
  • +
    + + + + Int64 + +
    +
    +
    +
    +
    +
    +

    for support Int64 attribute value

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    extension Int64: AnalyticsPropertyValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Decimal + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    extension Decimal: AnalyticsPropertyValue
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/Typealiases.html b/docs/Typealiases.html new file mode 100644 index 0000000..54c6192 --- /dev/null +++ b/docs/Typealiases.html @@ -0,0 +1,145 @@ + + + + Type Aliases Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

Type Aliases

+

The following type aliases are available globally.

+ +
+
+
+
    +
  • +
    + + + + ClickstreamAttribute + +
    +
    +
    +
    +
    +
    +

    the attribute for Clickstream which support String, Int, Int64, Double and Bool

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias ClickstreamAttribute = AnalyticsProperties
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/css/highlight.css b/docs/css/highlight.css new file mode 100644 index 0000000..c170357 --- /dev/null +++ b/docs/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/css/jazzy.css b/docs/css/jazzy.css new file mode 100644 index 0000000..f84ef86 --- /dev/null +++ b/docs/css/jazzy.css @@ -0,0 +1,442 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { + background: transparent; + border: 0; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; } + +body { + background-color: #f2f2f2; + font-family: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + -webkit-font-smoothing: subpixel-antialiased; + word-wrap: break-word; } + +h1, h2, h3 { + margin-top: 0.8em; + margin-bottom: 0.3em; + font-weight: 100; + color: black; } + +h1 { + font-size: 2.5em; } + +h2 { + font-size: 2em; + border-bottom: 1px solid #e2e2e2; } + +h4 { + font-size: 13px; + line-height: 1.5; + margin-top: 21px; } + +h5 { + font-size: 1.1em; } + +h6 { + font-size: 1.1em; + color: #777; } + +.section-name { + color: gray; + display: block; + font-family: Helvetica; + font-size: 22px; + font-weight: 100; + margin-bottom: 15px; } + +pre, code { + font: 0.95em Menlo, monospace; + color: #777; + word-wrap: normal; } + +p code, li code { + background-color: #eee; + padding: 2px 4px; + border-radius: 4px; } + +pre > code { + padding: 0; } + +a { + color: #0088cc; + text-decoration: none; } + a code { + color: inherit; } + +ul { + padding-left: 15px; } + +li { + line-height: 1.8em; } + +img { + max-width: 100%; } + +blockquote { + margin-left: 0; + padding: 0 10px; + border-left: 4px solid #ccc; } + +hr { + height: 1px; + border: none; + background-color: #e2e2e2; } + +.footnote-ref { + display: inline-block; + scroll-margin-top: 70px; } + +.footnote-def { + scroll-margin-top: 70px; } + +.content-wrapper { + margin: 0 auto; + width: 980px; } + +header { + font-size: 0.85em; + line-height: 32px; + background-color: #414141; + position: fixed; + width: 100%; + z-index: 3; } + header img { + padding-right: 6px; + vertical-align: -3px; + height: 16px; } + header a { + color: #fff; } + header p { + float: left; + color: #999; } + header .header-right { + float: right; + margin-left: 16px; } + +#breadcrumbs { + background-color: #f2f2f2; + height: 26px; + padding-top: 12px; + position: fixed; + width: inherit; + z-index: 2; + margin-top: 32px; + white-space: nowrap; + overflow-x: scroll; } + #breadcrumbs #carat { + height: 10px; + margin: 0 5px; } + +.sidebar { + background-color: #f9f9f9; + border: 1px solid #e2e2e2; + overflow-y: auto; + overflow-x: hidden; + position: fixed; + top: 70px; + bottom: 0; + width: 230px; + word-wrap: normal; } + +.nav-groups { + list-style-type: none; + background: #fff; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #e2e2e2; + font-size: 1.1em; + font-weight: 100; + padding: 15px 0 15px 20px; } + .nav-group-name > a { + color: #333; } + +.nav-group-tasks { + margin-top: 5px; } + +.nav-group-task { + font-size: 0.9em; + list-style-type: none; + white-space: nowrap; } + .nav-group-task a { + color: #888; } + +.main-content { + background-color: #fff; + border: 1px solid #e2e2e2; + margin-left: 246px; + position: absolute; + overflow: hidden; + padding-bottom: 20px; + top: 70px; + width: 734px; } + .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { + margin-bottom: 1em; } + .main-content p { + line-height: 1.8em; } + .main-content section .section:first-child { + margin-top: 0; + padding-top: 0; } + .main-content section .task-group-section .task-group:first-of-type { + padding-top: 10px; } + .main-content section .task-group-section .task-group:first-of-type .section-name { + padding-top: 15px; } + .main-content section .heading:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .main-content .section-name p { + margin-bottom: inherit; + line-height: inherit; } + .main-content .section-name code { + background-color: inherit; + padding: inherit; + color: inherit; } + +.section { + padding: 0 25px; } + +.highlight { + background-color: #eee; + padding: 10px 12px; + border: 1px solid #e2e2e2; + border-radius: 4px; + overflow-x: auto; } + +.declaration .highlight { + overflow-x: initial; + padding: 0 40px 40px 0; + margin-bottom: -25px; + background-color: transparent; + border: none; } + +.section-name { + margin: 0; + margin-left: 18px; } + +.task-group-section { + margin-top: 10px; + padding-left: 6px; + border-top: 1px solid #e2e2e2; } + +.task-group { + padding-top: 0px; } + +.task-name-container a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + +.section-name-container { + position: relative; + display: inline-block; } + .section-name-container .section-name-link { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin-bottom: 0; } + .section-name-container .section-name { + position: relative; + pointer-events: none; + z-index: 1; } + .section-name-container .section-name a { + pointer-events: auto; } + +.item { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .item code { + background-color: transparent; + padding: 0; } + .item .token, .item .direct-link { + display: inline-block; + text-indent: -20px; + padding-left: 3px; + margin-left: 35px; + font-size: 11.9px; + transition: all 300ms; } + .item .token-open { + margin-left: 20px; } + .item .discouraged { + text-decoration: line-through; } + +.declaration-note { + font-size: .85em; + color: gray; + font-style: italic; } + +.pointer-container { + border-bottom: 1px solid #e2e2e2; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + background: #f9f9f9; + border-left: 1px solid #e2e2e2; + border-top: 1px solid #e2e2e2; + height: 12px; + left: 21px; + top: -7px; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + position: absolute; + width: 12px; } + +.height-container { + display: none; + left: -25px; + padding: 0 25px; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #f9f9f9; + border-bottom: 1px solid #e2e2e2; + left: -25px; + position: relative; + width: 100%; + padding-top: 10px; + padding-bottom: 5px; } + +.aside, .language { + padding: 6px 12px; + margin: 12px 0; + border-left: 5px solid #dddddd; + overflow-y: hidden; } + .aside .aside-title, .language .aside-title { + font-size: 9px; + letter-spacing: 2px; + text-transform: uppercase; + padding-bottom: 0; + margin: 0; + color: #aaa; + -webkit-user-select: none; } + .aside p:last-child, .language p:last-child { + margin-bottom: 0; } + +.language { + border-left: 5px solid #cde9f4; } + .language .aside-title { + color: #4b8afb; } + +.aside-warning, .aside-deprecated, .aside-unavailable { + border-left: 5px solid #ff6666; } + .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title { + color: #ff0000; } + +.graybox { + border-collapse: collapse; + width: 100%; } + .graybox p { + margin: 0; + word-break: break-word; + min-width: 50px; } + .graybox td { + border: 1px solid #e2e2e2; + padding: 5px 25px 5px 10px; + vertical-align: middle; } + .graybox tr td:first-of-type { + text-align: right; + padding: 7px; + vertical-align: top; + word-break: normal; + width: 40px; } + +.slightly-smaller { + font-size: 0.9em; } + +#footer { + position: relative; + top: 10px; + bottom: 0px; + margin-left: 25px; } + #footer p { + margin: 0; + color: #aaa; + font-size: 0.8em; } + +html.dash header, html.dash #breadcrumbs, html.dash .sidebar { + display: none; } + +html.dash .main-content { + width: 980px; + margin-left: 0; + border: none; + width: 100%; + top: 0; + padding-bottom: 0; } + +html.dash .height-container { + display: block; } + +html.dash .item .token { + margin-left: 0; } + +html.dash .content-wrapper { + width: auto; } + +html.dash #footer { + position: static; } + +form[role=search] { + float: right; } + form[role=search] input { + font: Helvetica, freesans, Arial, sans-serif; + margin-top: 6px; + font-size: 13px; + line-height: 20px; + padding: 0px 10px; + border: none; + border-radius: 1em; } + .loading form[role=search] input { + background: white url(../img/spinner.gif) center right 4px no-repeat; } + form[role=search] .tt-menu { + margin: 0; + min-width: 300px; + background: #fff; + color: #333; + border: 1px solid #e2e2e2; + z-index: 4; } + form[role=search] .tt-highlight { + font-weight: bold; } + form[role=search] .tt-suggestion { + font: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + padding: 0 8px; } + form[role=search] .tt-suggestion span { + display: table-cell; + white-space: nowrap; } + form[role=search] .tt-suggestion .doc-parent-name { + width: 100%; + text-align: right; + font-weight: normal; + font-size: 0.9em; + padding-left: 16px; } + form[role=search] .tt-suggestion:hover, + form[role=search] .tt-suggestion.tt-cursor { + cursor: pointer; + background-color: #4183c4; + color: #fff; } + form[role=search] .tt-suggestion:hover .doc-parent-name, + form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { + color: #fff; } diff --git a/docs/docsets/Clickstream.docset/Contents/Info.plist b/docs/docsets/Clickstream.docset/Contents/Info.plist new file mode 100644 index 0000000..4c32bf1 --- /dev/null +++ b/docs/docsets/Clickstream.docset/Contents/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleIdentifier + com.jazzy.clickstream + CFBundleName + Clickstream + DocSetPlatformFamily + clickstream + isDashDocset + + dashIndexFilePath + index.html + isJavaScriptEnabled + + DashDocSetFamily + dashtoc + + diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Classes.html b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Classes.html new file mode 100644 index 0000000..8560825 --- /dev/null +++ b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Classes.html @@ -0,0 +1,277 @@ + + + + Classes Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

Classes

+

The following classes are available globally.

+ +
+
+
+
    +
  • +
    + + + + ClickstreamObjc + +
    +
    +
    +
    +
    +
    +

    ClickstreamAnalytics api for objective-c

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +public class ClickstreamObjc : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + EventName + +
    +
    +
    +
    +
    +
    +

    ClickstreamAnalytics preset events

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +public class EventName : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Attr + +
    +
    +
    +
    +
    +
    +

    ClickstreamANalytics preset attributes

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +public class Attr : NSObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ClickstreamItemKey + +
    +
    +
    +
    +
    +
    +

    ClickstreamAnalytics preset item keys for objective-c +In addition to the item attributes defined below, you can add up to 10 custom attributes to an item.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +public class ClickstreamItemKey : NSObject
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

ClickstreamContext +

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

    The configuration object for clickstream, modify the params after sdk initialize

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @objcMembers
    +public class ClickstreamConfiguration : NSObject
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Classes/Attr.html b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Classes/Attr.html new file mode 100644 index 0000000..6cfdc49 --- /dev/null +++ b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Classes/Attr.html @@ -0,0 +1,479 @@ + + + + Attr Class Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

Attr

+
+
+ +
@objcMembers
+public class Attr : NSObject
+ +
+
+

ClickstreamANalytics preset attributes

+ +
+
+
+
    +
  • +
    + + + + SCREEN_NAME + +
    +
    +
    +
    +
    +
    +

    Preset attribute screen name

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let SCREEN_NAME: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SCREEN_UNIQUE_ID + +
    +
    +
    +
    +
    +
    +

    Preset attribute screen unique id

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let SCREEN_UNIQUE_ID: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + TRAFFIC_SOURCE_SOURCE + +
    +
    +
    +
    +
    +
    +

    Preset attribute traffic source source

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_SOURCE: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + TRAFFIC_SOURCE_MEDIUM + +
    +
    +
    +
    +
    +
    +

    Preset attribute traffic source medium

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_MEDIUM: String
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Preset attribute traffic source campaign

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_CAMPAIGN: String
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Preset attribute traffic source campaign id

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_CAMPAIGN_ID: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + TRAFFIC_SOURCE_TERM + +
    +
    +
    +
    +
    +
    +

    Preset attribute traffic source term

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_TERM: String
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Preset attribute traffic source content

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_CONTENT: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + TRAFFIC_SOURCE_CLID + +
    +
    +
    +
    +
    +
    +

    Preset attribute traffic source clid

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_CLID: String
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Preset attribute traffic source clid platform

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_CLID_PLATFORM: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + APP_INSTALL_CHANNEL + +
    +
    +
    +
    +
    +
    +

    Preset attribute app install channel

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let APP_INSTALL_CHANNEL: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + VALUE + +
    +
    +
    +
    +
    +
    +

    Preset attribute event value

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let VALUE: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CURRENCY + +
    +
    +
    +
    +
    +
    +

    Preset attribute event currency

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let CURRENCY: String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Classes/ClickstreamConfiguration.html b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Classes/ClickstreamConfiguration.html new file mode 100644 index 0000000..6c59bd7 --- /dev/null +++ b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Classes/ClickstreamConfiguration.html @@ -0,0 +1,440 @@ + + + + ClickstreamConfiguration Class Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

ClickstreamConfiguration

+
+
+ +
@objcMembers
+public class ClickstreamConfiguration : NSObject
+ +
+
+

The configuration object for clickstream, modify the params after sdk initialize

+ +
+
+
+
    +
  • +
    + + + + withAppId(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withAppId(_ appId: String) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + withEndpoint(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withEndpoint(_ endpoint: String) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withSendEventInterval(_ sendEventsInterval: Int) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withTrackAppExceptionEvents(_ isTrackAppExceptionEvents: Bool) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withTrackScreenViewEvents(_ isTrackScreenViewEvents: Bool) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withTrackUserEngagementEvents(_ isTrackUserEngagementEvents: Bool) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withCompressEvents(_ isCompressEvents: Bool) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + withLogEvents(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withLogEvents(_ isLogEvents: Bool) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + withAuthCookie(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withAuthCookie(_ authCookie: String) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withSessionTimeoutDuration(_ sessionTimeoutDuration: Int64) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withInitialGlobalAttributes(_ globalAttributes: ClickstreamAttribute) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withInitialGlobalAttributesObjc(_ globalAttributes: NSDictionary) -> ClickstreamConfiguration
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Classes/ClickstreamItemKey.html b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Classes/ClickstreamItemKey.html new file mode 100644 index 0000000..dd85e24 --- /dev/null +++ b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Classes/ClickstreamItemKey.html @@ -0,0 +1,507 @@ + + + + ClickstreamItemKey Class Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

ClickstreamItemKey

+
+
+ +
@objcMembers
+public class ClickstreamItemKey : NSObject
+ +
+
+

ClickstreamAnalytics preset item keys for objective-c +In addition to the item attributes defined below, you can add up to 10 custom attributes to an item.

+ +
+
+
+
    +
  • +
    + + + + ITEM_ID + +
    +
    +
    +
    +
    +
    +

    The id of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_ID: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_NAME + +
    +
    +
    +
    +
    +
    +

    The name of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_NAME: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LOCATION_ID + +
    +
    +
    +
    +
    +
    +

    The location id of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let LOCATION_ID: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_BRAND + +
    +
    +
    +
    +
    +
    +

    The brand of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_BRAND: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CURRENCY + +
    +
    +
    +
    +
    +
    +

    The currency of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let CURRENCY: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + PRICE + +
    +
    +
    +
    +
    +
    +

    The price of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let PRICE: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + QUANTITY + +
    +
    +
    +
    +
    +
    +

    The quantity of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let QUANTITY: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CREATIVE_NAME + +
    +
    +
    +
    +
    +
    +

    The creative name of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let CREATIVE_NAME: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CREATIVE_SLOT + +
    +
    +
    +
    +
    +
    +

    The creative slot of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let CREATIVE_SLOT: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_CATEGORY + +
    +
    +
    +
    +
    +
    +

    The category of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_CATEGORY: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_CATEGORY2 + +
    +
    +
    +
    +
    +
    +

    The category2 of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_CATEGORY2: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_CATEGORY3 + +
    +
    +
    +
    +
    +
    +

    The category3 of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_CATEGORY3: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_CATEGORY4 + +
    +
    +
    +
    +
    +
    +

    The category4 of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_CATEGORY4: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_CATEGORY5 + +
    +
    +
    +
    +
    +
    +

    The category5 of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_CATEGORY5: String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Classes/ClickstreamObjc.html b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Classes/ClickstreamObjc.html new file mode 100644 index 0000000..31a256b --- /dev/null +++ b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Classes/ClickstreamObjc.html @@ -0,0 +1,652 @@ + + + + ClickstreamObjc Class Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

ClickstreamObjc

+
+
+ +
@objcMembers
+public class ClickstreamObjc : NSObject
+ +
+
+

ClickstreamAnalytics api for objective-c

+ +
+
+
+
    +
  • +
    + + + + initSDK() + +
    +
    +
    +
    +
    +
    +

    Init the Clickstream sdk

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func initSDK() throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + initSDK(_:) + +
    +
    +
    +
    +
    +
    +

    Init the Clickstream sdk

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func initSDK(_ configuration: ClickstreamConfiguration) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + recordEvent(_:) + +
    +
    +
    +
    +
    +
    +

    Use this method to record event

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func recordEvent(_ eventName: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + eventName + + +
    +

    the event name

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + recordEvent(_:_:) + +
    +
    +
    +
    +
    +
    +

    The method to record event with attributes

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func recordEvent(_ eventName: String, _ attributes: NSDictionary)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + eventName + + +
    +

    the event name

    +
    +
    + + attributes + + +
    +

    the event attributes which type is NSDictionary

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + recordEvent(_:_:_:) + +
    +
    +
    +
    +
    +
    +

    The method to record event with attributes and items

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func recordEvent(_ eventName: String, _ attributes: NSDictionary, _ items: [NSDictionary] = [])
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + eventName + + +
    +

    the event name

    +
    +
    + + attributes + + +
    +

    the event attributes which type is NSDictionary

    +
    +
    + + items + + +
    +

    the event items which type is NSDictionary

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + flushEvents() + +
    +
    +
    +
    +
    +
    +

    Use this method to send events immediately

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func flushEvents()
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Add global attributes

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func addGlobalAttributes(_ attributes: NSDictionary)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + attributes + + +
    +

    the global attributes to add

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

    Delete global attributes

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func deleteGlobalAttributes(_ attributes: [String])
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + attributes + + +
    +

    the global attributes names to delete

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + addUserAttributes(_:) + +
    +
    +
    +
    +
    +
    +

    Add user attributes

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func addUserAttributes(_ attributes: NSDictionary)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + attributes + + +
    +

    the user attributes to add

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + setUserId(_:) + +
    +
    +
    +
    +
    +
    +

    Set user id for login and logout

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func setUserId(_ userId: String?)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + userId + + +
    +

    current userId, nil for logout

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

    Get Clickstream configuration, please config it after initialize sdk

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func getClickstreamConfiguration() throws -> ClickstreamConfiguration
    + +
    +
    +
    +

    Return Value

    +

    ClickstreamContextConfiguration to modify the configuration of clickstream sdk

    +
    +
    +
    +
  • +
  • +
    + + + + disable() + +
    +
    +
    +
    +
    +
    +

    Disable the SDK

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func disable()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + enable() + +
    +
    +
    +
    +
    +
    +

    Enable the SDK

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func enable()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Classes/EventName.html b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Classes/EventName.html new file mode 100644 index 0000000..c43a385 --- /dev/null +++ b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Classes/EventName.html @@ -0,0 +1,155 @@ + + + + EventName Class Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

EventName

+
+
+ +
@objcMembers
+public class EventName : NSObject
+ +
+
+

ClickstreamAnalytics preset events

+ +
+
+
+
    +
  • +
    + + + + SCREEN_VIEW + +
    +
    +
    +
    +
    +
    +

    Preset event screen view

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let SCREEN_VIEW: String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Enums.html b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Enums.html new file mode 100644 index 0000000..6de9299 --- /dev/null +++ b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Enums.html @@ -0,0 +1,146 @@ + + + + Enumerations Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

Enumerations

+

The following enumerations are available globally.

+ +
+
+
+
    +
  • +
    + + + + ClickstreamAnalytics + +
    +
    +
    +
    +
    +
    +

    ClickstreamAnalytics api for swift

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ClickstreamAnalytics
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Enums/ClickstreamAnalytics.html b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Enums/ClickstreamAnalytics.html new file mode 100644 index 0000000..6808726 --- /dev/null +++ b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Enums/ClickstreamAnalytics.html @@ -0,0 +1,679 @@ + + + + ClickstreamAnalytics Enumeration Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

ClickstreamAnalytics

+
+
+ +
public enum ClickstreamAnalytics
+ +
+
+

ClickstreamAnalytics api for swift

+ +
+
+
+
    +
  • +
    + + + + initSDK(_:) + +
    +
    +
    +
    +
    +
    +

    Init ClickstreamAnalytics

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func initSDK(_ configuration: ClickstreamConfiguration? = nil) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + recordEvent(_:) + +
    +
    +
    +
    +
    +
    +

    Use this method to record event

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func recordEvent(_ eventName: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + eventName + + +
    +

    the event name

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + recordEvent(_:_:_:) + +
    +
    +
    +
    +
    +
    +

    The method to record event with ClickstreamAttribute

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func recordEvent(_ eventName: String,
    +                               _ attributes: ClickstreamAttribute,
    +                               _ items: [ClickstreamAttribute] = [])
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + eventName + + +
    +

    the event name

    +
    +
    + + attributes + + +
    +

    the event attributes

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + flushEvents() + +
    +
    +
    +
    +
    +
    +

    Use this method to send events immediately

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func flushEvents()
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Add global attributes

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func addGlobalAttributes(_ attributes: ClickstreamAttribute)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + attributes + + +
    +

    the global attributes to add

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

    Delete global attributes

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func deleteGlobalAttributes(_ attributes: String...)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + attributes + + +
    +

    the global attributes names to delete

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + addUserAttributes(_:) + +
    +
    +
    +
    +
    +
    +

    Add user attributes

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func addUserAttributes(_ attributes: ClickstreamAttribute)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + attributes + + +
    +

    the user attributes to add

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + setUserId(_:) + +
    +
    +
    +
    +
    +
    +

    Set user id for login and logout

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func setUserId(_ userId: String?)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + userId + + +
    +

    current userId, nil for logout

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

    Get Clickstream configuration, please config it after initialize sdk

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func getClickstreamConfiguration() throws -> ClickstreamConfiguration
    + +
    +
    +
    +

    Return Value

    +

    ClickstreamContextConfiguration to modify the configuration of clickstream sdk

    +
    +
    +
    +
  • +
  • +
    + + + + disable() + +
    +
    +
    +
    +
    +
    +

    Disable the SDK

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func disable()
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + userId + + +
    +

    current userId, nil for logout

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + enable() + +
    +
    +
    +
    +
    +
    +

    Enable the SDK

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func enable()
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + userId + + +
    +

    current userId, nil for logout

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + EventName + +
    +
    +
    +
    +
    +
    +

    ClickstreamAnalytics preset events

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum EventName
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Attr + +
    +
    +
    +
    +
    +
    +

    ClickstreamANalytics preset attributes

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Attr
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Item + +
    +
    +
    +
    +
    +
    +

    ClickstreamAnalytics preset item attributes +In addition to the item attributes defined below, you can add up to 10 custom attributes to an item.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Item
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Enums/ClickstreamAnalytics/Attr.html b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Enums/ClickstreamAnalytics/Attr.html new file mode 100644 index 0000000..9bd3bbc --- /dev/null +++ b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Enums/ClickstreamAnalytics/Attr.html @@ -0,0 +1,480 @@ + + + + Attr Enumeration Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

Attr

+
+
+ +
public enum Attr
+ +
+
+

ClickstreamANalytics preset attributes

+ +
+
+
+
    +
  • +
    + + + + SCREEN_NAME + +
    +
    +
    +
    +
    +
    +

    Preset attribute screen name

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let SCREEN_NAME: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SCREEN_UNIQUE_ID + +
    +
    +
    +
    +
    +
    +

    Preset attribute screen unique id

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let SCREEN_UNIQUE_ID: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + TRAFFIC_SOURCE_SOURCE + +
    +
    +
    +
    +
    +
    +

    Preset attribute traffic source source

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_SOURCE: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + TRAFFIC_SOURCE_MEDIUM + +
    +
    +
    +
    +
    +
    +

    Preset attribute traffic source medium

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_MEDIUM: String
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Preset attribute traffic source campaign

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_CAMPAIGN: String
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Preset attribute traffic source campaign id

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_CAMPAIGN_ID: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + TRAFFIC_SOURCE_TERM + +
    +
    +
    +
    +
    +
    +

    Preset attribute traffic source term

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_TERM: String
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Preset attribute traffic source content

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_CONTENT: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + TRAFFIC_SOURCE_CLID + +
    +
    +
    +
    +
    +
    +

    Preset attribute traffic source clid

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_CLID: String
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Preset attribute traffic source clid platform

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let TRAFFIC_SOURCE_CLID_PLATFORM: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + APP_INSTALL_CHANNEL + +
    +
    +
    +
    +
    +
    +

    Preset attribute app install channel

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let APP_INSTALL_CHANNEL: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + VALUE + +
    +
    +
    +
    +
    +
    +

    Preset attribute event value

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let VALUE: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CURRENCY + +
    +
    +
    +
    +
    +
    +

    Preset attribute event currency

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let CURRENCY: String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Enums/ClickstreamAnalytics/EventName.html b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Enums/ClickstreamAnalytics/EventName.html new file mode 100644 index 0000000..63b2ef2 --- /dev/null +++ b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Enums/ClickstreamAnalytics/EventName.html @@ -0,0 +1,155 @@ + + + + EventName Enumeration Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

EventName

+
+
+ +
public enum EventName
+ +
+
+

ClickstreamAnalytics preset events

+ +
+
+
+
    +
  • +
    + + + + SCREEN_VIEW + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let SCREEN_VIEW: String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Enums/ClickstreamAnalytics/Item.html b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Enums/ClickstreamAnalytics/Item.html new file mode 100644 index 0000000..f847a63 --- /dev/null +++ b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Enums/ClickstreamAnalytics/Item.html @@ -0,0 +1,508 @@ + + + + Item Enumeration Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

Item

+
+
+ +
public enum Item
+ +
+
+

ClickstreamAnalytics preset item attributes +In addition to the item attributes defined below, you can add up to 10 custom attributes to an item.

+ +
+
+
+
    +
  • +
    + + + + ITEM_ID + +
    +
    +
    +
    +
    +
    +

    The id of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_ID: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_NAME + +
    +
    +
    +
    +
    +
    +

    The name of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_NAME: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + LOCATION_ID + +
    +
    +
    +
    +
    +
    +

    The location id of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let LOCATION_ID: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_BRAND + +
    +
    +
    +
    +
    +
    +

    The brand of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_BRAND: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CURRENCY + +
    +
    +
    +
    +
    +
    +

    The currency of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let CURRENCY: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + PRICE + +
    +
    +
    +
    +
    +
    +

    The price of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let PRICE: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + QUANTITY + +
    +
    +
    +
    +
    +
    +

    The quantity of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let QUANTITY: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CREATIVE_NAME + +
    +
    +
    +
    +
    +
    +

    The creative name of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let CREATIVE_NAME: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CREATIVE_SLOT + +
    +
    +
    +
    +
    +
    +

    The creative slot of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let CREATIVE_SLOT: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_CATEGORY + +
    +
    +
    +
    +
    +
    +

    The category of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_CATEGORY: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_CATEGORY2 + +
    +
    +
    +
    +
    +
    +

    The category2 of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_CATEGORY2: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_CATEGORY3 + +
    +
    +
    +
    +
    +
    +

    The category3 of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_CATEGORY3: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_CATEGORY4 + +
    +
    +
    +
    +
    +
    +

    The category4 of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_CATEGORY4: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ITEM_CATEGORY5 + +
    +
    +
    +
    +
    +
    +

    The category5 of the item

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ITEM_CATEGORY5: String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Extensions.html b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Extensions.html new file mode 100644 index 0000000..136bc5f --- /dev/null +++ b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Extensions.html @@ -0,0 +1,171 @@ + + + + Extensions Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

Extensions

+

The following extensions are available globally.

+ +
+
+
+
    +
  • +
    + + + + Int64 + +
    +
    +
    +
    +
    +
    +

    for support Int64 attribute value

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    extension Int64: AnalyticsPropertyValue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Decimal + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    extension Decimal: AnalyticsPropertyValue
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Typealiases.html b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Typealiases.html new file mode 100644 index 0000000..54c6192 --- /dev/null +++ b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/Typealiases.html @@ -0,0 +1,145 @@ + + + + Type Aliases Reference + + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

Type Aliases

+

The following type aliases are available globally.

+ +
+
+
+
    +
  • +
    + + + + ClickstreamAttribute + +
    +
    +
    +
    +
    +
    +

    the attribute for Clickstream which support String, Int, Int64, Double and Bool

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias ClickstreamAttribute = AnalyticsProperties
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/Documents/css/highlight.css b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/css/highlight.css new file mode 100644 index 0000000..c170357 --- /dev/null +++ b/docs/docsets/Clickstream.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/docsets/Clickstream.docset/Contents/Resources/Documents/css/jazzy.css b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/css/jazzy.css new file mode 100644 index 0000000..f84ef86 --- /dev/null +++ b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/css/jazzy.css @@ -0,0 +1,442 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { + background: transparent; + border: 0; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; } + +body { + background-color: #f2f2f2; + font-family: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + -webkit-font-smoothing: subpixel-antialiased; + word-wrap: break-word; } + +h1, h2, h3 { + margin-top: 0.8em; + margin-bottom: 0.3em; + font-weight: 100; + color: black; } + +h1 { + font-size: 2.5em; } + +h2 { + font-size: 2em; + border-bottom: 1px solid #e2e2e2; } + +h4 { + font-size: 13px; + line-height: 1.5; + margin-top: 21px; } + +h5 { + font-size: 1.1em; } + +h6 { + font-size: 1.1em; + color: #777; } + +.section-name { + color: gray; + display: block; + font-family: Helvetica; + font-size: 22px; + font-weight: 100; + margin-bottom: 15px; } + +pre, code { + font: 0.95em Menlo, monospace; + color: #777; + word-wrap: normal; } + +p code, li code { + background-color: #eee; + padding: 2px 4px; + border-radius: 4px; } + +pre > code { + padding: 0; } + +a { + color: #0088cc; + text-decoration: none; } + a code { + color: inherit; } + +ul { + padding-left: 15px; } + +li { + line-height: 1.8em; } + +img { + max-width: 100%; } + +blockquote { + margin-left: 0; + padding: 0 10px; + border-left: 4px solid #ccc; } + +hr { + height: 1px; + border: none; + background-color: #e2e2e2; } + +.footnote-ref { + display: inline-block; + scroll-margin-top: 70px; } + +.footnote-def { + scroll-margin-top: 70px; } + +.content-wrapper { + margin: 0 auto; + width: 980px; } + +header { + font-size: 0.85em; + line-height: 32px; + background-color: #414141; + position: fixed; + width: 100%; + z-index: 3; } + header img { + padding-right: 6px; + vertical-align: -3px; + height: 16px; } + header a { + color: #fff; } + header p { + float: left; + color: #999; } + header .header-right { + float: right; + margin-left: 16px; } + +#breadcrumbs { + background-color: #f2f2f2; + height: 26px; + padding-top: 12px; + position: fixed; + width: inherit; + z-index: 2; + margin-top: 32px; + white-space: nowrap; + overflow-x: scroll; } + #breadcrumbs #carat { + height: 10px; + margin: 0 5px; } + +.sidebar { + background-color: #f9f9f9; + border: 1px solid #e2e2e2; + overflow-y: auto; + overflow-x: hidden; + position: fixed; + top: 70px; + bottom: 0; + width: 230px; + word-wrap: normal; } + +.nav-groups { + list-style-type: none; + background: #fff; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #e2e2e2; + font-size: 1.1em; + font-weight: 100; + padding: 15px 0 15px 20px; } + .nav-group-name > a { + color: #333; } + +.nav-group-tasks { + margin-top: 5px; } + +.nav-group-task { + font-size: 0.9em; + list-style-type: none; + white-space: nowrap; } + .nav-group-task a { + color: #888; } + +.main-content { + background-color: #fff; + border: 1px solid #e2e2e2; + margin-left: 246px; + position: absolute; + overflow: hidden; + padding-bottom: 20px; + top: 70px; + width: 734px; } + .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { + margin-bottom: 1em; } + .main-content p { + line-height: 1.8em; } + .main-content section .section:first-child { + margin-top: 0; + padding-top: 0; } + .main-content section .task-group-section .task-group:first-of-type { + padding-top: 10px; } + .main-content section .task-group-section .task-group:first-of-type .section-name { + padding-top: 15px; } + .main-content section .heading:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .main-content .section-name p { + margin-bottom: inherit; + line-height: inherit; } + .main-content .section-name code { + background-color: inherit; + padding: inherit; + color: inherit; } + +.section { + padding: 0 25px; } + +.highlight { + background-color: #eee; + padding: 10px 12px; + border: 1px solid #e2e2e2; + border-radius: 4px; + overflow-x: auto; } + +.declaration .highlight { + overflow-x: initial; + padding: 0 40px 40px 0; + margin-bottom: -25px; + background-color: transparent; + border: none; } + +.section-name { + margin: 0; + margin-left: 18px; } + +.task-group-section { + margin-top: 10px; + padding-left: 6px; + border-top: 1px solid #e2e2e2; } + +.task-group { + padding-top: 0px; } + +.task-name-container a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + +.section-name-container { + position: relative; + display: inline-block; } + .section-name-container .section-name-link { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin-bottom: 0; } + .section-name-container .section-name { + position: relative; + pointer-events: none; + z-index: 1; } + .section-name-container .section-name a { + pointer-events: auto; } + +.item { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .item code { + background-color: transparent; + padding: 0; } + .item .token, .item .direct-link { + display: inline-block; + text-indent: -20px; + padding-left: 3px; + margin-left: 35px; + font-size: 11.9px; + transition: all 300ms; } + .item .token-open { + margin-left: 20px; } + .item .discouraged { + text-decoration: line-through; } + +.declaration-note { + font-size: .85em; + color: gray; + font-style: italic; } + +.pointer-container { + border-bottom: 1px solid #e2e2e2; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + background: #f9f9f9; + border-left: 1px solid #e2e2e2; + border-top: 1px solid #e2e2e2; + height: 12px; + left: 21px; + top: -7px; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + position: absolute; + width: 12px; } + +.height-container { + display: none; + left: -25px; + padding: 0 25px; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #f9f9f9; + border-bottom: 1px solid #e2e2e2; + left: -25px; + position: relative; + width: 100%; + padding-top: 10px; + padding-bottom: 5px; } + +.aside, .language { + padding: 6px 12px; + margin: 12px 0; + border-left: 5px solid #dddddd; + overflow-y: hidden; } + .aside .aside-title, .language .aside-title { + font-size: 9px; + letter-spacing: 2px; + text-transform: uppercase; + padding-bottom: 0; + margin: 0; + color: #aaa; + -webkit-user-select: none; } + .aside p:last-child, .language p:last-child { + margin-bottom: 0; } + +.language { + border-left: 5px solid #cde9f4; } + .language .aside-title { + color: #4b8afb; } + +.aside-warning, .aside-deprecated, .aside-unavailable { + border-left: 5px solid #ff6666; } + .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title { + color: #ff0000; } + +.graybox { + border-collapse: collapse; + width: 100%; } + .graybox p { + margin: 0; + word-break: break-word; + min-width: 50px; } + .graybox td { + border: 1px solid #e2e2e2; + padding: 5px 25px 5px 10px; + vertical-align: middle; } + .graybox tr td:first-of-type { + text-align: right; + padding: 7px; + vertical-align: top; + word-break: normal; + width: 40px; } + +.slightly-smaller { + font-size: 0.9em; } + +#footer { + position: relative; + top: 10px; + bottom: 0px; + margin-left: 25px; } + #footer p { + margin: 0; + color: #aaa; + font-size: 0.8em; } + +html.dash header, html.dash #breadcrumbs, html.dash .sidebar { + display: none; } + +html.dash .main-content { + width: 980px; + margin-left: 0; + border: none; + width: 100%; + top: 0; + padding-bottom: 0; } + +html.dash .height-container { + display: block; } + +html.dash .item .token { + margin-left: 0; } + +html.dash .content-wrapper { + width: auto; } + +html.dash #footer { + position: static; } + +form[role=search] { + float: right; } + form[role=search] input { + font: Helvetica, freesans, Arial, sans-serif; + margin-top: 6px; + font-size: 13px; + line-height: 20px; + padding: 0px 10px; + border: none; + border-radius: 1em; } + .loading form[role=search] input { + background: white url(../img/spinner.gif) center right 4px no-repeat; } + form[role=search] .tt-menu { + margin: 0; + min-width: 300px; + background: #fff; + color: #333; + border: 1px solid #e2e2e2; + z-index: 4; } + form[role=search] .tt-highlight { + font-weight: bold; } + form[role=search] .tt-suggestion { + font: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + padding: 0 8px; } + form[role=search] .tt-suggestion span { + display: table-cell; + white-space: nowrap; } + form[role=search] .tt-suggestion .doc-parent-name { + width: 100%; + text-align: right; + font-weight: normal; + font-size: 0.9em; + padding-left: 16px; } + form[role=search] .tt-suggestion:hover, + form[role=search] .tt-suggestion.tt-cursor { + cursor: pointer; + background-color: #4183c4; + color: #fff; } + form[role=search] .tt-suggestion:hover .doc-parent-name, + form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { + color: #fff; } diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/Documents/img/carat.png b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/img/carat.png new file mode 100755 index 0000000..29d2f7f Binary files /dev/null and b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/img/carat.png differ diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/Documents/img/dash.png b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/img/dash.png new file mode 100755 index 0000000..6f694c7 Binary files /dev/null and b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/img/dash.png differ diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/Documents/img/gh.png b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/img/gh.png new file mode 100755 index 0000000..628da97 Binary files /dev/null and b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/img/gh.png differ diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/Documents/img/spinner.gif b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/img/spinner.gif new file mode 100644 index 0000000..e3038d0 Binary files /dev/null and b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/img/spinner.gif differ diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/Documents/index.html b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/index.html new file mode 100644 index 0000000..1c7080c --- /dev/null +++ b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/index.html @@ -0,0 +1,398 @@ + + + + Clickstream Reference + + + + + + + + + + + + +
+
+

Clickstream Docs

+

GitHubView on GitHub

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

AWS Solution Clickstream Analytics SDK for Swift

+

Introduction

+ +

Clickstream Swift SDK can help you easily collect and report in-app events from iOS devices to AWS. This SDK is part of an AWS solution - Clickstream Analytics on AWS, which provisions data pipeline to ingest and process event data into AWS services such as S3, Redshift.

+ +

The SDK relies on the Amplify for Swift Core Library and is developed according to the Amplify Swift SDK plug-in specification. In addition, we’ve added features that automatically collect common user events and attributes (e.g., screen view, first open) to simplify data collection for users.

+ +

Visit our Documentation site and to learn more about Clickstream Swift SDK.

+

Platform Support

+ +

The Clickstream SDK supports iOS 13+.

+ +

API Documentation

+ + +

Integrate SDK

+ +

Clickstream requires Xcode 13.4 or higher to build.

+

1.Add Package

+ +

We use Swift Package Manager to distribute Clickstream Swift SDK, open your project in Xcode and select File > Add Pckages.

+ +

+ +

Enter the Clickstream Library for Swift GitHub repo URL (https://github.com/awslabs/clickstream-swift) into the search bar, you’ll see the Clickstream Library for Swift repository rules for which version of Clickstream you want Swift Package Manager to install. Choose Up to Next Major Version, then click Add Package, make the Clickstream product checked as default, and click Add Package again.

+ +

+

2.Parameter configuration

+ +

Downlod your amplifyconfiguration.json file from your Clickstream solution control plane, and paste it to your project root folder:

+ +

+ +

the json file will be as follows:

+
{
+  "analytics": {
+    "plugins": {
+      "awsClickstreamPlugin ": {
+        "appId": "appId",
+        "endpoint": "https://example.com/collect",
+        "isCompressEvents": true,
+        "autoFlushEventsInterval": 10000,
+        "isTrackAppExceptionEvents": false
+      }
+    }
+  }
+}
+
+ +

Your appId and endpoint are already set up in it, here’s an explanation of each property:

+ +
    +
  • appId: the app id of your project in control plane.
  • +
  • endpoint: the endpoint url you will upload the event to AWS server.
  • +
  • isCompressEvents: whether to compress event content when uploading events, default is true
  • +
  • autoFlushEventsInterval: event sending interval, the default is 10s
  • +
  • isTrackAppExceptionEvents: whether auto track exception event in app, default is false
  • +
+

3.Initialize the SDK

+ +

Once you have configured the parameters, you need to initialize it in your app delegate’s application(_:didFinishLaunchingWithOptions:) lifecycle method:

+

3.1 Initialize the SDK with default configuration

+
import Clickstream
+...
+func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+    do {
+        try ClickstreamAnalytics.initSDK()
+    } catch {
+        assertionFailure("Fail to initialize ClickstreamAnalytics: \(error)")
+    }
+    return true
+}
+
+

3.2 Initialize the SDK with global attributes and custom configuration

+ +

The following example code shows how to add traffic source fields as global attributes when initializing the SDK.

+
import Clickstream
+...
+func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+    do {
+        let configuration = ClickstreamConfiguration()
+            .withAppId("your appId")
+            .withEndpoint("https://example.com/collect")
+            .withLogEvents(true)
+            .withInitialGlobalAttributes([
+                ClickstreamAnalytics.Attr.TRAFFIC_SOURCE_SOURCE: "amazon",
+                ClickstreamAnalytics.Attr.TRAFFIC_SOURCE_MEDIUM: "cpc",
+                ClickstreamAnalytics.Attr.TRAFFIC_SOURCE_CAMPAIGN: "summer_promotion",
+                ClickstreamAnalytics.Attr.TRAFFIC_SOURCE_CAMPAIGN_ID: "summer_promotion_01",
+                ClickstreamAnalytics.Attr.TRAFFIC_SOURCE_TERM: "running_shoes",
+                ClickstreamAnalytics.Attr.TRAFFIC_SOURCE_CONTENT: "banner_ad_1",
+                ClickstreamAnalytics.Attr.TRAFFIC_SOURCE_CLID: "amazon_ad_123",
+                ClickstreamAnalytics.Attr.TRAFFIC_SOURCE_CLID_PLATFORM: "amazon_ads",
+                ClickstreamAnalytics.Attr.APP_INSTALL_CHANNEL: "App Store"
+            ])
+        try ClickstreamAnalytics.initSDK(configuration)
+    } catch {
+        assertionFailure("Fail to initialize ClickstreamAnalytics: \(error)")
+    }
+    return true
+}
+
+ +

By default, we will use the configurations in amplifyconfiguration.json file. If you add a custom configuration, the added configuration items will override the default values.

+ +

You can also add all the configuration parameters you need in the initSDK method without using the amplifyconfiguration.json file.

+

3.3 SwiftUI configuration

+ +

If your project is developed with SwiftUI, you need to create an application delegate and attach it to your App through UIApplicationDelegateAdaptor.

+
@main
+struct YourApp: App {
+    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
+    var body: some Scene {
+        WindowGroup {
+            YourView()
+        }
+    }
+}
+
+ +

Clickstream Swift SDK depends on method swizzling to automatically record screen views. SwiftUI apps must record screen view events manually, and disable automatic tracking of screen view events by setting configuration.withTrackScreenViewEvents(false) when the SDK is initialized.

+

4. Update Configuration

+
import Clickstream
+
+// configure the sdk after initialize.
+do {
+    let configuration = try ClickstreamAnalytics.getClickstreamConfiguration()
+    configuration.withAppId("your appId")
+        .withEndpoint("https://example.com/collect")
+        .withLogEvents(true)
+        .withCompressEvents(true)
+        .withSessionTimeoutDuration(1800000)
+        .withTrackAppExceptionEvents(true)
+        .withTrackScreenViewEvents(true)
+        .withTrackUserEngagementEvents(true)
+} catch {
+    print("Failed to config ClickstreamAnalytics: \(error)")
+}
+
+
+

Note

+

this configuation will override the default configuation in amplifyconfiguration.json file

+ +
+

Start using

+

Recored event.

+ +

Add the following code where you need to complete the event report.

+
import Clickstream
+
+let attributes: ClickstreamAttribute = [
+    "Channel": "apple",
+    "Successful": true,
+    "ProcessDuration": 12.33,
+    "UserAge": 20,
+]
+ClickstreamAnalytics.recordEvent("testEvent", attributes)
+
+// for record an event with event name
+ClickstreamAnalytics.recordEvent("button_click")
+
+

Record event with items

+ +

You can add the following code to log an event with an item.

+ +

Note: Only pipelines from version 1.1+ can handle items with custom attribute.

+
import Clickstream
+
+let attributes: ClickstreamAttribute = [
+    ClickstreamAnalytics.Item.ITEM_ID: "123",
+    ClickstreamAnalytics.Item.CURRENCY: "USD",
+    "event_category": "recommended"
+]
+
+let item_book: ClickstreamAttribute = [
+    ClickstreamAnalytics.Item.ITEM_ID: 123,
+    ClickstreamAnalytics.Item.ITEM_NAME: "Nature",
+    ClickstreamAnalytics.Item.ITEM_CATEGORY: "book",
+    ClickstreamAnalytics.Item.PRICE: 99.9,
+    "book_publisher": "Nature Research"
+]
+ClickstreamAnalytics.recordEvent("view_item", attributes, [item_book])
+
+

Record Screen View events manually

+ +

By default, SDK will automatically track the preset _screen_view event when ViewController triggers viewDidAppear.

+ +

You can also manually record screen view events whether or not automatic screen view tracking is enabled, add the following code to record a screen view event with two attributes.

+ +
    +
  • SCREEN_NAME Required. Your screen’s name.
  • +
  • SCREEN_UNIQUE_ID Optional. Set the hashValue of your ViewController or UIView. If you do not set, SDK will set a default value based on the current ViewController’s hashValue.
  • +
+
import Clickstream
+
+ClickstreamAnalytics.recordEvent(ClickstreamAnalytics.EventName.SCREEN_VIEW, [
+    ClickstreamAnalytics.Attr.SCREEN_NAME: "HomeView",
+    ClickstreamAnalytics.Attr.SCREEN_UNIQUE_ID: homeView.hashValue
+])
+
+

Add global attribute

+
import Clickstream
+
+let globalAttribute: ClickstreamAttribute = [
+    ClickstreamAnalytics.Attr.APP_INSTALL_CHANNEL: "apple",
+    "class": 6,
+    "level": 5.1,
+    "isOpenNotification": true,
+]
+ClickstreamAnalytics.addGlobalAttributes(globalAttribute)
+
+// for delete an global attribute
+ClickstreamAnalytics.deleteGlobalAttributes("level")
+
+

Login and logout

+
import Clickstream
+
+// when user login usccess.
+ClickstreamAnalytics.setUserId("userId")
+
+// when user logout
+ClickstreamAnalytics.setUserId(nil)
+
+ +

When we log into another user, we will clear the before user’s user attributes, after setUserId() you need to add new user’s attribute.

+

Add user attribute

+
import Clickstream
+
+let userAttributes : ClickstreamAttribute=[
+    "_user_age": 21,
+    "_user_name": "carl"
+]
+ClickstreamAnalytics.addUserAttributes(userAttributes)
+
+ +

Current login user‘s attributes will be cached in disk, so the next time app launch you don’t need to set all user’s attribute again, of course you can update the current user’s attribute when it changes.

+

Log the event json in debug mode

+
import Clickstream
+
+// log the event in debug mode.
+do {
+    var configuration = try ClickstreamAnalytics.getClickstreamConfiguration()
+    configuration.isLogEvents = true
+} catch {
+    print("Failed to config ClickstreamAnalytics: \(error)")
+}
+
+ +

After config configuration.isLogEvents = true and when you record an event, you can see the event json at your Xcode log pannel by filter EventRecorder.

+

Send event immediately

+
import Clickstream
+// for send event immediately.
+ClickstreamAnalytics.flushEvents()
+
+

Disable SDK

+ +

You can disable the SDK in the scenario you need. After disabling the SDK, the SDK will not handle the logging and sending of any events. Of course you can enable the SDK when you need to continue logging events.

+
import Clickstream
+
+// disable SDK
+ClickstreamAnalytics.disable()
+
+// enable SDK
+ClickstreamAnalytics.enable()
+
+

How to build&test locally

+

Config your code format

+ +

Install swiftformat plugin in your Xcode, and config shortcut for code format.

+

Config your code lint

+ +

Install swiftlint, and execute the below command at the project root folder:

+
swiftlint
+
+

Build

+ +

Open an termial window, at the root project folder to execute:

+
swift build
+
+

Test

+
swift test
+
+

Security

+ +

See CONTRIBUTING for more information.

+

License

+ +

This library is licensed under Apache 2.0 License.

+ +
+
+ +
+
+ + diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/Documents/js/jazzy.js b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/js/jazzy.js new file mode 100755 index 0000000..1984416 --- /dev/null +++ b/docs/docsets/Clickstream.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/docsets/Clickstream.docset/Contents/Resources/Documents/js/jazzy.search.js b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/js/jazzy.search.js new file mode 100644 index 0000000..359cdbb --- /dev/null +++ b/docs/docsets/Clickstream.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/docsets/Clickstream.docset/Contents/Resources/Documents/js/jquery.min.js b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/js/jquery.min.js new file mode 100644 index 0000000..7f37b5d --- /dev/null +++ b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 00){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/Documents/js/typeahead.jquery.js b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/js/typeahead.jquery.js new file mode 100644 index 0000000..bcb734b --- /dev/null +++ b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/js/typeahead.jquery.js @@ -0,0 +1,1695 @@ +/*! + * typeahead.js 1.3.3 + * https://github.com/corejavascript/typeahead.js + * Copyright 2013-2024 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", + "aria-controls": 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/docsets/Clickstream.docset/Contents/Resources/Documents/search.json b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/search.json new file mode 100644 index 0000000..6393e8b --- /dev/null +++ b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/search.json @@ -0,0 +1 @@ +{"Typealiases.html#/s:11Clickstream0A9Attributea":{"name":"ClickstreamAttribute","abstract":"

the attribute for Clickstream which support String, Int, Int64, Double and Bool

"},"Extensions.html#/s:s5Int64V":{"name":"Int64","abstract":"

for support Int64 attribute value

"},"Extensions.html#/c:@SA@NSDecimal":{"name":"Decimal"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO7ITEM_IDSSvpZ":{"name":"ITEM_ID","abstract":"

The id of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO9ITEM_NAMESSvpZ":{"name":"ITEM_NAME","abstract":"

The name of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO11LOCATION_IDSSvpZ":{"name":"LOCATION_ID","abstract":"

The location id of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO10ITEM_BRANDSSvpZ":{"name":"ITEM_BRAND","abstract":"

The brand of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO8CURRENCYSSvpZ":{"name":"CURRENCY","abstract":"

The currency of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO5PRICESSvpZ":{"name":"PRICE","abstract":"

The price of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO8QUANTITYSSvpZ":{"name":"QUANTITY","abstract":"

The quantity of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO13CREATIVE_NAMESSvpZ":{"name":"CREATIVE_NAME","abstract":"

The creative name of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO13CREATIVE_SLOTSSvpZ":{"name":"CREATIVE_SLOT","abstract":"

The creative slot of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO13ITEM_CATEGORYSSvpZ":{"name":"ITEM_CATEGORY","abstract":"

The category of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO14ITEM_CATEGORY2SSvpZ":{"name":"ITEM_CATEGORY2","abstract":"

The category2 of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO14ITEM_CATEGORY3SSvpZ":{"name":"ITEM_CATEGORY3","abstract":"

The category3 of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO14ITEM_CATEGORY4SSvpZ":{"name":"ITEM_CATEGORY4","abstract":"

The category4 of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO14ITEM_CATEGORY5SSvpZ":{"name":"ITEM_CATEGORY5","abstract":"

The category5 of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO11SCREEN_NAMESSvpZ":{"name":"SCREEN_NAME","abstract":"

Preset attribute screen name

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO16SCREEN_UNIQUE_IDSSvpZ":{"name":"SCREEN_UNIQUE_ID","abstract":"

Preset attribute screen unique id

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO015TRAFFIC_SOURCE_E0SSvpZ":{"name":"TRAFFIC_SOURCE_SOURCE","abstract":"

Preset attribute traffic source source

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO21TRAFFIC_SOURCE_MEDIUMSSvpZ":{"name":"TRAFFIC_SOURCE_MEDIUM","abstract":"

Preset attribute traffic source medium

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO23TRAFFIC_SOURCE_CAMPAIGNSSvpZ":{"name":"TRAFFIC_SOURCE_CAMPAIGN","abstract":"

Preset attribute traffic source campaign

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO26TRAFFIC_SOURCE_CAMPAIGN_IDSSvpZ":{"name":"TRAFFIC_SOURCE_CAMPAIGN_ID","abstract":"

Preset attribute traffic source campaign id

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO19TRAFFIC_SOURCE_TERMSSvpZ":{"name":"TRAFFIC_SOURCE_TERM","abstract":"

Preset attribute traffic source term

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO22TRAFFIC_SOURCE_CONTENTSSvpZ":{"name":"TRAFFIC_SOURCE_CONTENT","abstract":"

Preset attribute traffic source content

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO19TRAFFIC_SOURCE_CLIDSSvpZ":{"name":"TRAFFIC_SOURCE_CLID","abstract":"

Preset attribute traffic source clid

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO28TRAFFIC_SOURCE_CLID_PLATFORMSSvpZ":{"name":"TRAFFIC_SOURCE_CLID_PLATFORM","abstract":"

Preset attribute traffic source clid platform

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO19APP_INSTALL_CHANNELSSvpZ":{"name":"APP_INSTALL_CHANNEL","abstract":"

Preset attribute app install channel

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO5VALUESSvpZ":{"name":"VALUE","abstract":"

Preset attribute event value

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO8CURRENCYSSvpZ":{"name":"CURRENCY","abstract":"

Preset attribute event currency

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/EventName.html#/s:11Clickstream0A9AnalyticsO9EventNameO11SCREEN_VIEWSSvpZ":{"name":"SCREEN_VIEW","parent_name":"EventName"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO7initSDKyyAA0A13ConfigurationCSgKFZ":{"name":"initSDK(_:)","abstract":"

Init ClickstreamAnalytics

","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO11recordEventyySSFZ":{"name":"recordEvent(_:)","abstract":"

Use this method to record event

","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO11recordEventyySS_SDySS7Amplify0B13PropertyValue_pGSayAGGtFZ":{"name":"recordEvent(_:_:_:)","abstract":"

The method to record event with ClickstreamAttribute

","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO11flushEventsyyFZ":{"name":"flushEvents()","abstract":"

Use this method to send events immediately

","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO19addGlobalAttributesyySDySS7Amplify0B13PropertyValue_pGFZ":{"name":"addGlobalAttributes(_:)","abstract":"

Add global attributes

","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO22deleteGlobalAttributesyySSd_tFZ":{"name":"deleteGlobalAttributes(_:)","abstract":"

Delete global attributes

","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO17addUserAttributesyySDySS7Amplify0B13PropertyValue_pGFZ":{"name":"addUserAttributes(_:)","abstract":"

Add user attributes

","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO9setUserIdyySSSgFZ":{"name":"setUserId(_:)","abstract":"

Set user id for login and logout

","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO03getA13ConfigurationAA0aD0CyKFZ":{"name":"getClickstreamConfiguration()","abstract":"

Get Clickstream configuration, please config it after initialize sdk

","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO7disableyyFZ":{"name":"disable()","abstract":"

Disable the SDK

","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO6enableyyFZ":{"name":"enable()","abstract":"

Enable the SDK

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

ClickstreamAnalytics preset events

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

ClickstreamANalytics preset attributes

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

ClickstreamAnalytics preset item attributes","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html":{"name":"ClickstreamAnalytics","abstract":"

ClickstreamAnalytics api for swift

"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withAppId:":{"name":"withAppId(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withEndpoint:":{"name":"withEndpoint(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withSendEventInterval:":{"name":"withSendEventInterval(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withTrackAppExceptionEvents:":{"name":"withTrackAppExceptionEvents(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withTrackScreenViewEvents:":{"name":"withTrackScreenViewEvents(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withTrackUserEngagementEvents:":{"name":"withTrackUserEngagementEvents(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withCompressEvents:":{"name":"withCompressEvents(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withLogEvents:":{"name":"withLogEvents(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withAuthCookie:":{"name":"withAuthCookie(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withSessionTimeoutDuration:":{"name":"withSessionTimeoutDuration(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/s:11Clickstream0A13ConfigurationC27withInitialGlobalAttributesyACSDySS7Amplify22AnalyticsPropertyValue_pGF":{"name":"withInitialGlobalAttributes(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withInitialGlobalAttributesObjc:":{"name":"withInitialGlobalAttributesObjc(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)ITEM_ID":{"name":"ITEM_ID","abstract":"

The id of the item

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

The name of the item

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

The location id of the item

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

The brand of the item

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

The currency of the item

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

The price of the item

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

The quantity of the item

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

The creative name of the item

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

The creative slot of the item

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

The category of the item

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

The category2 of the item

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

The category3 of the item

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

The category4 of the item

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

The category5 of the item

","parent_name":"ClickstreamItemKey"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)SCREEN_NAME":{"name":"SCREEN_NAME","abstract":"

Preset attribute screen name

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

Preset attribute screen unique id

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

Preset attribute traffic source source

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

Preset attribute traffic source medium

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

Preset attribute traffic source campaign

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

Preset attribute traffic source campaign id

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

Preset attribute traffic source term

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

Preset attribute traffic source content

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

Preset attribute traffic source clid

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

Preset attribute traffic source clid platform

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

Preset attribute app install channel

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

Preset attribute event value

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

Preset attribute event currency

","parent_name":"Attr"},"Classes/EventName.html#/c:@M@Clickstream@objc(cs)EventName(cpy)SCREEN_VIEW":{"name":"SCREEN_VIEW","abstract":"

Preset event screen view

","parent_name":"EventName"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)initSDKAndReturnError:":{"name":"initSDK()","abstract":"

Init the Clickstream sdk

","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)initSDK:error:":{"name":"initSDK(_:)","abstract":"

Init the Clickstream sdk

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

Use this method to record event

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

The method to record event with attributes

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

The method to record event with attributes and items

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

Use this method to send events immediately

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

Add global attributes

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

Delete global attributes

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

Add user attributes

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

Set user id for login and logout

","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)getClickstreamConfigurationAndReturnError:":{"name":"getClickstreamConfiguration()","abstract":"

Get Clickstream configuration, please config it after initialize sdk

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

Disable the SDK

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

Enable the SDK

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

ClickstreamAnalytics api for objective-c

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

ClickstreamAnalytics preset events

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

ClickstreamANalytics preset attributes

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

ClickstreamAnalytics preset item keys for objective-c"},"Classes/ClickstreamConfiguration.html":{"name":"ClickstreamConfiguration","abstract":"

The configuration object for clickstream, modify the params after sdk initialize

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

The following classes are available globally.

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

The following enumerations are available globally.

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

The following extensions are available globally.

"},"Typealiases.html":{"name":"Type Aliases","abstract":"

The following type aliases are available globally.

"}} \ No newline at end of file diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/docSet.dsidx b/docs/docsets/Clickstream.docset/Contents/Resources/docSet.dsidx new file mode 100644 index 0000000..1014c58 Binary files /dev/null and b/docs/docsets/Clickstream.docset/Contents/Resources/docSet.dsidx differ diff --git a/docs/docsets/Clickstream.tgz b/docs/docsets/Clickstream.tgz new file mode 100644 index 0000000..3051717 Binary files /dev/null and b/docs/docsets/Clickstream.tgz differ diff --git a/docs/images/add_amplify_config_json_file.png b/docs/images/add_amplify_config_json_file.png new file mode 100644 index 0000000..f289edd Binary files /dev/null and b/docs/images/add_amplify_config_json_file.png differ diff --git a/docs/images/add_package.png b/docs/images/add_package.png new file mode 100644 index 0000000..87db679 Binary files /dev/null and b/docs/images/add_package.png differ diff --git a/docs/images/add_package_url.png b/docs/images/add_package_url.png new file mode 100644 index 0000000..5c8f63c Binary files /dev/null and b/docs/images/add_package_url.png differ diff --git a/docs/img/carat.png b/docs/img/carat.png new file mode 100755 index 0000000..29d2f7f Binary files /dev/null and b/docs/img/carat.png differ diff --git a/docs/img/dash.png b/docs/img/dash.png new file mode 100755 index 0000000..6f694c7 Binary files /dev/null and b/docs/img/dash.png differ diff --git a/docs/img/gh.png b/docs/img/gh.png new file mode 100755 index 0000000..628da97 Binary files /dev/null and b/docs/img/gh.png differ diff --git a/docs/img/spinner.gif b/docs/img/spinner.gif new file mode 100644 index 0000000..e3038d0 Binary files /dev/null and b/docs/img/spinner.gif differ diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..1c7080c --- /dev/null +++ b/docs/index.html @@ -0,0 +1,398 @@ + + + + Clickstream Reference + + + + + + + + + + + + +
+ +
+
+ +
+
+ +
+
+
+ +

AWS Solution Clickstream Analytics SDK for Swift

+

Introduction

+ +

Clickstream Swift SDK can help you easily collect and report in-app events from iOS devices to AWS. This SDK is part of an AWS solution - Clickstream Analytics on AWS, which provisions data pipeline to ingest and process event data into AWS services such as S3, Redshift.

+ +

The SDK relies on the Amplify for Swift Core Library and is developed according to the Amplify Swift SDK plug-in specification. In addition, we’ve added features that automatically collect common user events and attributes (e.g., screen view, first open) to simplify data collection for users.

+ +

Visit our Documentation site and to learn more about Clickstream Swift SDK.

+

Platform Support

+ +

The Clickstream SDK supports iOS 13+.

+ +

API Documentation

+ + +

Integrate SDK

+ +

Clickstream requires Xcode 13.4 or higher to build.

+

1.Add Package

+ +

We use Swift Package Manager to distribute Clickstream Swift SDK, open your project in Xcode and select File > Add Pckages.

+ +

+ +

Enter the Clickstream Library for Swift GitHub repo URL (https://github.com/awslabs/clickstream-swift) into the search bar, you’ll see the Clickstream Library for Swift repository rules for which version of Clickstream you want Swift Package Manager to install. Choose Up to Next Major Version, then click Add Package, make the Clickstream product checked as default, and click Add Package again.

+ +

+

2.Parameter configuration

+ +

Downlod your amplifyconfiguration.json file from your Clickstream solution control plane, and paste it to your project root folder:

+ +

+ +

the json file will be as follows:

+
{
+  "analytics": {
+    "plugins": {
+      "awsClickstreamPlugin ": {
+        "appId": "appId",
+        "endpoint": "https://example.com/collect",
+        "isCompressEvents": true,
+        "autoFlushEventsInterval": 10000,
+        "isTrackAppExceptionEvents": false
+      }
+    }
+  }
+}
+
+ +

Your appId and endpoint are already set up in it, here’s an explanation of each property:

+ +
    +
  • appId: the app id of your project in control plane.
  • +
  • endpoint: the endpoint url you will upload the event to AWS server.
  • +
  • isCompressEvents: whether to compress event content when uploading events, default is true
  • +
  • autoFlushEventsInterval: event sending interval, the default is 10s
  • +
  • isTrackAppExceptionEvents: whether auto track exception event in app, default is false
  • +
+

3.Initialize the SDK

+ +

Once you have configured the parameters, you need to initialize it in your app delegate’s application(_:didFinishLaunchingWithOptions:) lifecycle method:

+

3.1 Initialize the SDK with default configuration

+
import Clickstream
+...
+func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+    do {
+        try ClickstreamAnalytics.initSDK()
+    } catch {
+        assertionFailure("Fail to initialize ClickstreamAnalytics: \(error)")
+    }
+    return true
+}
+
+

3.2 Initialize the SDK with global attributes and custom configuration

+ +

The following example code shows how to add traffic source fields as global attributes when initializing the SDK.

+
import Clickstream
+...
+func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+    do {
+        let configuration = ClickstreamConfiguration()
+            .withAppId("your appId")
+            .withEndpoint("https://example.com/collect")
+            .withLogEvents(true)
+            .withInitialGlobalAttributes([
+                ClickstreamAnalytics.Attr.TRAFFIC_SOURCE_SOURCE: "amazon",
+                ClickstreamAnalytics.Attr.TRAFFIC_SOURCE_MEDIUM: "cpc",
+                ClickstreamAnalytics.Attr.TRAFFIC_SOURCE_CAMPAIGN: "summer_promotion",
+                ClickstreamAnalytics.Attr.TRAFFIC_SOURCE_CAMPAIGN_ID: "summer_promotion_01",
+                ClickstreamAnalytics.Attr.TRAFFIC_SOURCE_TERM: "running_shoes",
+                ClickstreamAnalytics.Attr.TRAFFIC_SOURCE_CONTENT: "banner_ad_1",
+                ClickstreamAnalytics.Attr.TRAFFIC_SOURCE_CLID: "amazon_ad_123",
+                ClickstreamAnalytics.Attr.TRAFFIC_SOURCE_CLID_PLATFORM: "amazon_ads",
+                ClickstreamAnalytics.Attr.APP_INSTALL_CHANNEL: "App Store"
+            ])
+        try ClickstreamAnalytics.initSDK(configuration)
+    } catch {
+        assertionFailure("Fail to initialize ClickstreamAnalytics: \(error)")
+    }
+    return true
+}
+
+ +

By default, we will use the configurations in amplifyconfiguration.json file. If you add a custom configuration, the added configuration items will override the default values.

+ +

You can also add all the configuration parameters you need in the initSDK method without using the amplifyconfiguration.json file.

+

3.3 SwiftUI configuration

+ +

If your project is developed with SwiftUI, you need to create an application delegate and attach it to your App through UIApplicationDelegateAdaptor.

+
@main
+struct YourApp: App {
+    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
+    var body: some Scene {
+        WindowGroup {
+            YourView()
+        }
+    }
+}
+
+ +

Clickstream Swift SDK depends on method swizzling to automatically record screen views. SwiftUI apps must record screen view events manually, and disable automatic tracking of screen view events by setting configuration.withTrackScreenViewEvents(false) when the SDK is initialized.

+

4. Update Configuration

+
import Clickstream
+
+// configure the sdk after initialize.
+do {
+    let configuration = try ClickstreamAnalytics.getClickstreamConfiguration()
+    configuration.withAppId("your appId")
+        .withEndpoint("https://example.com/collect")
+        .withLogEvents(true)
+        .withCompressEvents(true)
+        .withSessionTimeoutDuration(1800000)
+        .withTrackAppExceptionEvents(true)
+        .withTrackScreenViewEvents(true)
+        .withTrackUserEngagementEvents(true)
+} catch {
+    print("Failed to config ClickstreamAnalytics: \(error)")
+}
+
+
+

Note

+

this configuation will override the default configuation in amplifyconfiguration.json file

+ +
+

Start using

+

Recored event.

+ +

Add the following code where you need to complete the event report.

+
import Clickstream
+
+let attributes: ClickstreamAttribute = [
+    "Channel": "apple",
+    "Successful": true,
+    "ProcessDuration": 12.33,
+    "UserAge": 20,
+]
+ClickstreamAnalytics.recordEvent("testEvent", attributes)
+
+// for record an event with event name
+ClickstreamAnalytics.recordEvent("button_click")
+
+

Record event with items

+ +

You can add the following code to log an event with an item.

+ +

Note: Only pipelines from version 1.1+ can handle items with custom attribute.

+
import Clickstream
+
+let attributes: ClickstreamAttribute = [
+    ClickstreamAnalytics.Item.ITEM_ID: "123",
+    ClickstreamAnalytics.Item.CURRENCY: "USD",
+    "event_category": "recommended"
+]
+
+let item_book: ClickstreamAttribute = [
+    ClickstreamAnalytics.Item.ITEM_ID: 123,
+    ClickstreamAnalytics.Item.ITEM_NAME: "Nature",
+    ClickstreamAnalytics.Item.ITEM_CATEGORY: "book",
+    ClickstreamAnalytics.Item.PRICE: 99.9,
+    "book_publisher": "Nature Research"
+]
+ClickstreamAnalytics.recordEvent("view_item", attributes, [item_book])
+
+

Record Screen View events manually

+ +

By default, SDK will automatically track the preset _screen_view event when ViewController triggers viewDidAppear.

+ +

You can also manually record screen view events whether or not automatic screen view tracking is enabled, add the following code to record a screen view event with two attributes.

+ +
    +
  • SCREEN_NAME Required. Your screen’s name.
  • +
  • SCREEN_UNIQUE_ID Optional. Set the hashValue of your ViewController or UIView. If you do not set, SDK will set a default value based on the current ViewController’s hashValue.
  • +
+
import Clickstream
+
+ClickstreamAnalytics.recordEvent(ClickstreamAnalytics.EventName.SCREEN_VIEW, [
+    ClickstreamAnalytics.Attr.SCREEN_NAME: "HomeView",
+    ClickstreamAnalytics.Attr.SCREEN_UNIQUE_ID: homeView.hashValue
+])
+
+

Add global attribute

+
import Clickstream
+
+let globalAttribute: ClickstreamAttribute = [
+    ClickstreamAnalytics.Attr.APP_INSTALL_CHANNEL: "apple",
+    "class": 6,
+    "level": 5.1,
+    "isOpenNotification": true,
+]
+ClickstreamAnalytics.addGlobalAttributes(globalAttribute)
+
+// for delete an global attribute
+ClickstreamAnalytics.deleteGlobalAttributes("level")
+
+

Login and logout

+
import Clickstream
+
+// when user login usccess.
+ClickstreamAnalytics.setUserId("userId")
+
+// when user logout
+ClickstreamAnalytics.setUserId(nil)
+
+ +

When we log into another user, we will clear the before user’s user attributes, after setUserId() you need to add new user’s attribute.

+

Add user attribute

+
import Clickstream
+
+let userAttributes : ClickstreamAttribute=[
+    "_user_age": 21,
+    "_user_name": "carl"
+]
+ClickstreamAnalytics.addUserAttributes(userAttributes)
+
+ +

Current login user‘s attributes will be cached in disk, so the next time app launch you don’t need to set all user’s attribute again, of course you can update the current user’s attribute when it changes.

+

Log the event json in debug mode

+
import Clickstream
+
+// log the event in debug mode.
+do {
+    var configuration = try ClickstreamAnalytics.getClickstreamConfiguration()
+    configuration.isLogEvents = true
+} catch {
+    print("Failed to config ClickstreamAnalytics: \(error)")
+}
+
+ +

After config configuration.isLogEvents = true and when you record an event, you can see the event json at your Xcode log pannel by filter EventRecorder.

+

Send event immediately

+
import Clickstream
+// for send event immediately.
+ClickstreamAnalytics.flushEvents()
+
+

Disable SDK

+ +

You can disable the SDK in the scenario you need. After disabling the SDK, the SDK will not handle the logging and sending of any events. Of course you can enable the SDK when you need to continue logging events.

+
import Clickstream
+
+// disable SDK
+ClickstreamAnalytics.disable()
+
+// enable SDK
+ClickstreamAnalytics.enable()
+
+

How to build&test locally

+

Config your code format

+ +

Install swiftformat plugin in your Xcode, and config shortcut for code format.

+

Config your code lint

+ +

Install swiftlint, and execute the below command at the project root folder:

+
swiftlint
+
+

Build

+ +

Open an termial window, at the root project folder to execute:

+
swift build
+
+

Test

+
swift test
+
+

Security

+ +

See CONTRIBUTING for more information.

+

License

+ +

This library is licensed under Apache 2.0 License.

+ +
+
+ +
+
+ + diff --git a/docs/js/jazzy.js b/docs/js/jazzy.js new file mode 100755 index 0000000..1984416 --- /dev/null +++ b/docs/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/js/jazzy.search.js b/docs/js/jazzy.search.js new file mode 100644 index 0000000..359cdbb --- /dev/null +++ b/docs/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/js/jquery.min.js b/docs/js/jquery.min.js new file mode 100644 index 0000000..7f37b5d --- /dev/null +++ b/docs/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 00){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); diff --git a/docs/js/typeahead.jquery.js b/docs/js/typeahead.jquery.js new file mode 100644 index 0000000..bcb734b --- /dev/null +++ b/docs/js/typeahead.jquery.js @@ -0,0 +1,1695 @@ +/*! + * typeahead.js 1.3.3 + * https://github.com/corejavascript/typeahead.js + * Copyright 2013-2024 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", + "aria-controls": 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/search.json b/docs/search.json new file mode 100644 index 0000000..6393e8b --- /dev/null +++ b/docs/search.json @@ -0,0 +1 @@ +{"Typealiases.html#/s:11Clickstream0A9Attributea":{"name":"ClickstreamAttribute","abstract":"

the attribute for Clickstream which support String, Int, Int64, Double and Bool

"},"Extensions.html#/s:s5Int64V":{"name":"Int64","abstract":"

for support Int64 attribute value

"},"Extensions.html#/c:@SA@NSDecimal":{"name":"Decimal"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO7ITEM_IDSSvpZ":{"name":"ITEM_ID","abstract":"

The id of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO9ITEM_NAMESSvpZ":{"name":"ITEM_NAME","abstract":"

The name of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO11LOCATION_IDSSvpZ":{"name":"LOCATION_ID","abstract":"

The location id of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO10ITEM_BRANDSSvpZ":{"name":"ITEM_BRAND","abstract":"

The brand of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO8CURRENCYSSvpZ":{"name":"CURRENCY","abstract":"

The currency of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO5PRICESSvpZ":{"name":"PRICE","abstract":"

The price of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO8QUANTITYSSvpZ":{"name":"QUANTITY","abstract":"

The quantity of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO13CREATIVE_NAMESSvpZ":{"name":"CREATIVE_NAME","abstract":"

The creative name of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO13CREATIVE_SLOTSSvpZ":{"name":"CREATIVE_SLOT","abstract":"

The creative slot of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO13ITEM_CATEGORYSSvpZ":{"name":"ITEM_CATEGORY","abstract":"

The category of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO14ITEM_CATEGORY2SSvpZ":{"name":"ITEM_CATEGORY2","abstract":"

The category2 of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO14ITEM_CATEGORY3SSvpZ":{"name":"ITEM_CATEGORY3","abstract":"

The category3 of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO14ITEM_CATEGORY4SSvpZ":{"name":"ITEM_CATEGORY4","abstract":"

The category4 of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO14ITEM_CATEGORY5SSvpZ":{"name":"ITEM_CATEGORY5","abstract":"

The category5 of the item

","parent_name":"Item"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO11SCREEN_NAMESSvpZ":{"name":"SCREEN_NAME","abstract":"

Preset attribute screen name

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO16SCREEN_UNIQUE_IDSSvpZ":{"name":"SCREEN_UNIQUE_ID","abstract":"

Preset attribute screen unique id

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO015TRAFFIC_SOURCE_E0SSvpZ":{"name":"TRAFFIC_SOURCE_SOURCE","abstract":"

Preset attribute traffic source source

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO21TRAFFIC_SOURCE_MEDIUMSSvpZ":{"name":"TRAFFIC_SOURCE_MEDIUM","abstract":"

Preset attribute traffic source medium

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO23TRAFFIC_SOURCE_CAMPAIGNSSvpZ":{"name":"TRAFFIC_SOURCE_CAMPAIGN","abstract":"

Preset attribute traffic source campaign

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO26TRAFFIC_SOURCE_CAMPAIGN_IDSSvpZ":{"name":"TRAFFIC_SOURCE_CAMPAIGN_ID","abstract":"

Preset attribute traffic source campaign id

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO19TRAFFIC_SOURCE_TERMSSvpZ":{"name":"TRAFFIC_SOURCE_TERM","abstract":"

Preset attribute traffic source term

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO22TRAFFIC_SOURCE_CONTENTSSvpZ":{"name":"TRAFFIC_SOURCE_CONTENT","abstract":"

Preset attribute traffic source content

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO19TRAFFIC_SOURCE_CLIDSSvpZ":{"name":"TRAFFIC_SOURCE_CLID","abstract":"

Preset attribute traffic source clid

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO28TRAFFIC_SOURCE_CLID_PLATFORMSSvpZ":{"name":"TRAFFIC_SOURCE_CLID_PLATFORM","abstract":"

Preset attribute traffic source clid platform

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO19APP_INSTALL_CHANNELSSvpZ":{"name":"APP_INSTALL_CHANNEL","abstract":"

Preset attribute app install channel

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO5VALUESSvpZ":{"name":"VALUE","abstract":"

Preset attribute event value

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO8CURRENCYSSvpZ":{"name":"CURRENCY","abstract":"

Preset attribute event currency

","parent_name":"Attr"},"Enums/ClickstreamAnalytics/EventName.html#/s:11Clickstream0A9AnalyticsO9EventNameO11SCREEN_VIEWSSvpZ":{"name":"SCREEN_VIEW","parent_name":"EventName"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO7initSDKyyAA0A13ConfigurationCSgKFZ":{"name":"initSDK(_:)","abstract":"

Init ClickstreamAnalytics

","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO11recordEventyySSFZ":{"name":"recordEvent(_:)","abstract":"

Use this method to record event

","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO11recordEventyySS_SDySS7Amplify0B13PropertyValue_pGSayAGGtFZ":{"name":"recordEvent(_:_:_:)","abstract":"

The method to record event with ClickstreamAttribute

","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO11flushEventsyyFZ":{"name":"flushEvents()","abstract":"

Use this method to send events immediately

","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO19addGlobalAttributesyySDySS7Amplify0B13PropertyValue_pGFZ":{"name":"addGlobalAttributes(_:)","abstract":"

Add global attributes

","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO22deleteGlobalAttributesyySSd_tFZ":{"name":"deleteGlobalAttributes(_:)","abstract":"

Delete global attributes

","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO17addUserAttributesyySDySS7Amplify0B13PropertyValue_pGFZ":{"name":"addUserAttributes(_:)","abstract":"

Add user attributes

","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO9setUserIdyySSSgFZ":{"name":"setUserId(_:)","abstract":"

Set user id for login and logout

","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO03getA13ConfigurationAA0aD0CyKFZ":{"name":"getClickstreamConfiguration()","abstract":"

Get Clickstream configuration, please config it after initialize sdk

","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO7disableyyFZ":{"name":"disable()","abstract":"

Disable the SDK

","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO6enableyyFZ":{"name":"enable()","abstract":"

Enable the SDK

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

ClickstreamAnalytics preset events

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

ClickstreamANalytics preset attributes

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

ClickstreamAnalytics preset item attributes","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html":{"name":"ClickstreamAnalytics","abstract":"

ClickstreamAnalytics api for swift

"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withAppId:":{"name":"withAppId(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withEndpoint:":{"name":"withEndpoint(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withSendEventInterval:":{"name":"withSendEventInterval(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withTrackAppExceptionEvents:":{"name":"withTrackAppExceptionEvents(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withTrackScreenViewEvents:":{"name":"withTrackScreenViewEvents(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withTrackUserEngagementEvents:":{"name":"withTrackUserEngagementEvents(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withCompressEvents:":{"name":"withCompressEvents(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withLogEvents:":{"name":"withLogEvents(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withAuthCookie:":{"name":"withAuthCookie(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withSessionTimeoutDuration:":{"name":"withSessionTimeoutDuration(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/s:11Clickstream0A13ConfigurationC27withInitialGlobalAttributesyACSDySS7Amplify22AnalyticsPropertyValue_pGF":{"name":"withInitialGlobalAttributes(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withInitialGlobalAttributesObjc:":{"name":"withInitialGlobalAttributesObjc(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)ITEM_ID":{"name":"ITEM_ID","abstract":"

The id of the item

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

The name of the item

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

The location id of the item

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

The brand of the item

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

The currency of the item

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

The price of the item

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

The quantity of the item

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

The creative name of the item

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

The creative slot of the item

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

The category of the item

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

The category2 of the item

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

The category3 of the item

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

The category4 of the item

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

The category5 of the item

","parent_name":"ClickstreamItemKey"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)SCREEN_NAME":{"name":"SCREEN_NAME","abstract":"

Preset attribute screen name

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

Preset attribute screen unique id

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

Preset attribute traffic source source

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

Preset attribute traffic source medium

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

Preset attribute traffic source campaign

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

Preset attribute traffic source campaign id

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

Preset attribute traffic source term

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

Preset attribute traffic source content

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

Preset attribute traffic source clid

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

Preset attribute traffic source clid platform

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

Preset attribute app install channel

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

Preset attribute event value

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

Preset attribute event currency

","parent_name":"Attr"},"Classes/EventName.html#/c:@M@Clickstream@objc(cs)EventName(cpy)SCREEN_VIEW":{"name":"SCREEN_VIEW","abstract":"

Preset event screen view

","parent_name":"EventName"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)initSDKAndReturnError:":{"name":"initSDK()","abstract":"

Init the Clickstream sdk

","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)initSDK:error:":{"name":"initSDK(_:)","abstract":"

Init the Clickstream sdk

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

Use this method to record event

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

The method to record event with attributes

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

The method to record event with attributes and items

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

Use this method to send events immediately

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

Add global attributes

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

Delete global attributes

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

Add user attributes

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

Set user id for login and logout

","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)getClickstreamConfigurationAndReturnError:":{"name":"getClickstreamConfiguration()","abstract":"

Get Clickstream configuration, please config it after initialize sdk

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

Disable the SDK

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

Enable the SDK

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

ClickstreamAnalytics api for objective-c

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

ClickstreamAnalytics preset events

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

ClickstreamANalytics preset attributes

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

ClickstreamAnalytics preset item keys for objective-c"},"Classes/ClickstreamConfiguration.html":{"name":"ClickstreamConfiguration","abstract":"

The configuration object for clickstream, modify the params after sdk initialize

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

The following classes are available globally.

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

The following enumerations are available globally.

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

The following extensions are available globally.

"},"Typealiases.html":{"name":"Type Aliases","abstract":"

The following type aliases are available globally.

"}} \ No newline at end of file diff --git a/docs/undocumented.json b/docs/undocumented.json new file mode 100644 index 0000000..f5325ca --- /dev/null +++ b/docs/undocumented.json @@ -0,0 +1,96 @@ +{ + "warnings": [ + { + "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/ClickstreamAnalytics.swift", + "line": 111, + "symbol": "ClickstreamAnalytics.EventName.SCREEN_VIEW", + "symbol_kind": "source.lang.swift.decl.var.static", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift", + "line": 73, + "symbol": "ClickstreamConfiguration.withAppId(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift", + "line": 78, + "symbol": "ClickstreamConfiguration.withEndpoint(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift", + "line": 83, + "symbol": "ClickstreamConfiguration.withSendEventInterval(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift", + "line": 88, + "symbol": "ClickstreamConfiguration.withTrackAppExceptionEvents(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift", + "line": 93, + "symbol": "ClickstreamConfiguration.withTrackScreenViewEvents(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift", + "line": 98, + "symbol": "ClickstreamConfiguration.withTrackUserEngagementEvents(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift", + "line": 103, + "symbol": "ClickstreamConfiguration.withCompressEvents(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift", + "line": 108, + "symbol": "ClickstreamConfiguration.withLogEvents(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift", + "line": 113, + "symbol": "ClickstreamConfiguration.withAuthCookie(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift", + "line": 118, + "symbol": "ClickstreamConfiguration.withSessionTimeoutDuration(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift", + "line": 123, + "symbol": "ClickstreamConfiguration.withInitialGlobalAttributes(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift", + "line": 128, + "symbol": "ClickstreamConfiguration.withInitialGlobalAttributesObjc(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + } + ], + "source_directory": "/Users/runner/work/clickstream-swift/clickstream-swift" +} \ No newline at end of file