@zoho_apptics/apptics-js-sdk 1.0.1 → 2.0.0-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +87 -0
- package/LICENSE +13 -0
- package/README.md +747 -11
- package/dist/apptics.esm.min.js +3 -0
- package/dist/apptics.esm.min.js.map +1 -0
- package/dist/apptics.min.js +3 -0
- package/dist/apptics.min.js.map +1 -0
- package/dist/chunks/batch-BU_mTpm1.min.js +3 -0
- package/dist/chunks/batch-BU_mTpm1.min.js.map +1 -0
- package/dist/chunks/logs-Bea5zUW_.min.js +3 -0
- package/dist/chunks/logs-Bea5zUW_.min.js.map +1 -0
- package/dist/cjs/auto-init.d.ts +8 -0
- package/dist/cjs/auto-init.js +32 -0
- package/dist/cjs/core/attempts.d.ts +28 -0
- package/dist/cjs/core/attempts.js +113 -0
- package/dist/cjs/core/batch.d.ts +32 -0
- package/dist/cjs/core/batch.js +115 -0
- package/dist/cjs/core/callsite.d.ts +28 -0
- package/dist/cjs/core/callsite.js +93 -0
- package/dist/cjs/core/consent.d.ts +23 -0
- package/dist/cjs/core/consent.js +130 -0
- package/dist/cjs/core/constants.d.ts +212 -0
- package/dist/cjs/core/constants.js +299 -0
- package/dist/cjs/core/db.d.ts +40 -0
- package/dist/cjs/core/db.js +334 -0
- package/dist/cjs/core/debug.d.ts +22 -0
- package/dist/cjs/core/debug.js +88 -0
- package/dist/cjs/core/env.d.ts +28 -0
- package/dist/cjs/core/env.js +267 -0
- package/dist/cjs/core/framework-id.d.ts +1 -0
- package/dist/cjs/core/framework-id.js +9 -0
- package/dist/cjs/core/guard.d.ts +2 -0
- package/dist/cjs/core/guard.js +72 -0
- package/dist/cjs/core/hooks.d.ts +41 -0
- package/dist/cjs/core/hooks.js +23 -0
- package/dist/cjs/core/logger.d.ts +16 -0
- package/dist/cjs/core/logger.js +86 -0
- package/dist/cjs/core/state.d.ts +69 -0
- package/dist/cjs/core/state.js +78 -0
- package/dist/cjs/core/storage.d.ts +46 -0
- package/dist/cjs/core/storage.js +229 -0
- package/dist/cjs/core/transport.d.ts +83 -0
- package/dist/cjs/core/transport.js +441 -0
- package/dist/cjs/core/utils.d.ts +26 -0
- package/dist/cjs/core/utils.js +175 -0
- package/dist/cjs/core/validate.d.ts +18 -0
- package/dist/cjs/core/validate.js +233 -0
- package/dist/cjs/device/appversion.d.ts +20 -0
- package/dist/cjs/device/appversion.js +158 -0
- package/dist/cjs/device/index.d.ts +23 -0
- package/dist/cjs/device/index.js +372 -0
- package/dist/cjs/engagement/api-rules.d.ts +84 -0
- package/dist/cjs/engagement/api-rules.js +219 -0
- package/dist/cjs/engagement/auto-api.d.ts +7 -0
- package/dist/cjs/engagement/auto-api.js +200 -0
- package/dist/cjs/engagement/auto-screen.d.ts +16 -0
- package/dist/cjs/engagement/auto-screen.js +241 -0
- package/dist/cjs/engagement/defined-events.d.ts +23 -0
- package/dist/cjs/engagement/defined-events.js +58 -0
- package/dist/cjs/engagement/send.d.ts +6 -0
- package/dist/cjs/engagement/send.js +99 -0
- package/dist/cjs/engagement/session.d.ts +42 -0
- package/dist/cjs/engagement/session.js +327 -0
- package/dist/cjs/engagement/track.d.ts +56 -0
- package/dist/cjs/engagement/track.js +350 -0
- package/dist/cjs/errors/send.d.ts +6 -0
- package/dist/cjs/errors/send.js +73 -0
- package/dist/cjs/errors/track.d.ts +4 -0
- package/dist/cjs/errors/track.js +127 -0
- package/dist/cjs/feedback/controls.d.ts +31 -0
- package/dist/cjs/feedback/controls.js +286 -0
- package/dist/cjs/feedback/index.d.ts +8 -0
- package/dist/cjs/feedback/index.js +37 -0
- package/dist/cjs/feedback/logs.d.ts +40 -0
- package/dist/cjs/feedback/logs.js +202 -0
- package/dist/cjs/feedback/send.d.ts +25 -0
- package/dist/cjs/feedback/send.js +178 -0
- package/dist/cjs/feedback/template.d.ts +2 -0
- package/dist/cjs/feedback/template.js +162 -0
- package/dist/cjs/feedback/ui.d.ts +55 -0
- package/dist/cjs/feedback/ui.js +631 -0
- package/dist/cjs/heatmap/index.d.ts +16 -0
- package/dist/cjs/heatmap/index.js +22 -0
- package/dist/cjs/heatmap/send.d.ts +13 -0
- package/dist/cjs/heatmap/send.js +82 -0
- package/dist/cjs/heatmap/track.d.ts +4 -0
- package/dist/cjs/heatmap/track.js +377 -0
- package/dist/cjs/index.d.ts +68 -0
- package/dist/cjs/index.js +150 -0
- package/dist/cjs/lifecycle.d.ts +14 -0
- package/dist/cjs/lifecycle.js +538 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/remoteconfig/custom.d.ts +10 -0
- package/dist/cjs/remoteconfig/custom.js +78 -0
- package/dist/cjs/remoteconfig/evaluate.d.ts +24 -0
- package/dist/cjs/remoteconfig/evaluate.js +171 -0
- package/dist/cjs/remoteconfig/fetch.d.ts +24 -0
- package/dist/cjs/remoteconfig/fetch.js +214 -0
- package/dist/cjs/remoteconfig/index.d.ts +13 -0
- package/dist/cjs/remoteconfig/index.js +90 -0
- package/dist/cjs/remoteconfig/store.d.ts +18 -0
- package/dist/cjs/remoteconfig/store.js +98 -0
- package/dist/cjs/remotelog/gate.d.ts +11 -0
- package/dist/cjs/remotelog/gate.js +54 -0
- package/dist/cjs/remotelog/index.d.ts +25 -0
- package/dist/cjs/remotelog/index.js +55 -0
- package/dist/cjs/remotelog/logger.d.ts +28 -0
- package/dist/cjs/remotelog/logger.js +139 -0
- package/dist/cjs/remotelog/send.d.ts +13 -0
- package/dist/cjs/remotelog/send.js +153 -0
- package/dist/cjs/scheduler.d.ts +8 -0
- package/dist/cjs/scheduler.js +78 -0
- package/dist/cjs/types.d.ts +312 -0
- package/dist/cjs/user/index.d.ts +33 -0
- package/dist/cjs/user/index.js +178 -0
- package/dist/esm/auto-init.d.ts +8 -0
- package/dist/esm/auto-init.js +29 -0
- package/dist/esm/core/attempts.d.ts +28 -0
- package/dist/esm/core/attempts.js +106 -0
- package/dist/esm/core/batch.d.ts +32 -0
- package/dist/esm/core/batch.js +108 -0
- package/dist/esm/core/callsite.d.ts +28 -0
- package/dist/esm/core/callsite.js +89 -0
- package/dist/esm/core/consent.d.ts +23 -0
- package/dist/esm/core/consent.js +120 -0
- package/dist/esm/core/constants.d.ts +212 -0
- package/dist/esm/core/constants.js +277 -0
- package/dist/esm/core/db.d.ts +40 -0
- package/dist/esm/core/db.js +324 -0
- package/dist/esm/core/debug.d.ts +22 -0
- package/dist/esm/core/debug.js +81 -0
- package/dist/esm/core/env.d.ts +28 -0
- package/dist/esm/core/env.js +251 -0
- package/dist/esm/core/framework-id.d.ts +1 -0
- package/dist/esm/core/framework-id.js +7 -0
- package/dist/esm/core/guard.d.ts +2 -0
- package/dist/esm/core/guard.js +70 -0
- package/dist/esm/core/hooks.d.ts +41 -0
- package/dist/esm/core/hooks.js +21 -0
- package/dist/esm/core/logger.d.ts +16 -0
- package/dist/esm/core/logger.js +82 -0
- package/dist/esm/core/state.d.ts +69 -0
- package/dist/esm/core/state.js +73 -0
- package/dist/esm/core/storage.d.ts +46 -0
- package/dist/esm/core/storage.js +219 -0
- package/dist/esm/core/transport.d.ts +83 -0
- package/dist/esm/core/transport.js +425 -0
- package/dist/esm/core/utils.d.ts +26 -0
- package/dist/esm/core/utils.js +161 -0
- package/dist/esm/core/validate.d.ts +18 -0
- package/dist/esm/core/validate.js +226 -0
- package/dist/esm/device/appversion.d.ts +20 -0
- package/dist/esm/device/appversion.js +153 -0
- package/dist/esm/device/index.d.ts +23 -0
- package/dist/esm/device/index.js +362 -0
- package/dist/esm/engagement/api-rules.d.ts +84 -0
- package/dist/esm/engagement/api-rules.js +211 -0
- package/dist/esm/engagement/auto-api.d.ts +7 -0
- package/dist/esm/engagement/auto-api.js +198 -0
- package/dist/esm/engagement/auto-screen.d.ts +16 -0
- package/dist/esm/engagement/auto-screen.js +238 -0
- package/dist/esm/engagement/defined-events.d.ts +23 -0
- package/dist/esm/engagement/defined-events.js +55 -0
- package/dist/esm/engagement/send.d.ts +6 -0
- package/dist/esm/engagement/send.js +96 -0
- package/dist/esm/engagement/session.d.ts +42 -0
- package/dist/esm/engagement/session.js +315 -0
- package/dist/esm/engagement/track.d.ts +56 -0
- package/dist/esm/engagement/track.js +340 -0
- package/dist/esm/errors/send.d.ts +6 -0
- package/dist/esm/errors/send.js +70 -0
- package/dist/esm/errors/track.d.ts +4 -0
- package/dist/esm/errors/track.js +123 -0
- package/dist/esm/feedback/controls.d.ts +31 -0
- package/dist/esm/feedback/controls.js +280 -0
- package/dist/esm/feedback/index.d.ts +8 -0
- package/dist/esm/feedback/index.js +30 -0
- package/dist/esm/feedback/logs.d.ts +40 -0
- package/dist/esm/feedback/logs.js +188 -0
- package/dist/esm/feedback/send.d.ts +25 -0
- package/dist/esm/feedback/send.js +175 -0
- package/dist/esm/feedback/template.d.ts +2 -0
- package/dist/esm/feedback/template.js +159 -0
- package/dist/esm/feedback/ui.d.ts +55 -0
- package/dist/esm/feedback/ui.js +626 -0
- package/dist/esm/heatmap/index.d.ts +16 -0
- package/dist/esm/heatmap/index.js +17 -0
- package/dist/esm/heatmap/send.d.ts +13 -0
- package/dist/esm/heatmap/send.js +79 -0
- package/dist/esm/heatmap/track.d.ts +4 -0
- package/dist/esm/heatmap/track.js +374 -0
- package/dist/esm/index.d.ts +68 -0
- package/dist/esm/index.js +122 -0
- package/dist/esm/lifecycle.d.ts +14 -0
- package/dist/esm/lifecycle.js +534 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/remoteconfig/custom.d.ts +10 -0
- package/dist/esm/remoteconfig/custom.js +74 -0
- package/dist/esm/remoteconfig/evaluate.d.ts +24 -0
- package/dist/esm/remoteconfig/evaluate.js +166 -0
- package/dist/esm/remoteconfig/fetch.d.ts +24 -0
- package/dist/esm/remoteconfig/fetch.js +210 -0
- package/dist/esm/remoteconfig/index.d.ts +13 -0
- package/dist/esm/remoteconfig/index.js +85 -0
- package/dist/esm/remoteconfig/store.d.ts +18 -0
- package/dist/esm/remoteconfig/store.js +91 -0
- package/dist/esm/remotelog/gate.d.ts +11 -0
- package/dist/esm/remotelog/gate.js +48 -0
- package/dist/esm/remotelog/index.d.ts +25 -0
- package/dist/esm/remotelog/index.js +51 -0
- package/dist/esm/remotelog/logger.d.ts +28 -0
- package/dist/esm/remotelog/logger.js +136 -0
- package/dist/esm/remotelog/send.d.ts +13 -0
- package/dist/esm/remotelog/send.js +149 -0
- package/dist/esm/scheduler.d.ts +8 -0
- package/dist/esm/scheduler.js +74 -0
- package/dist/esm/types.d.ts +312 -0
- package/dist/esm/user/index.d.ts +33 -0
- package/dist/esm/user/index.js +170 -0
- package/dist/feedback.esm.min.js +3 -0
- package/dist/feedback.esm.min.js.map +1 -0
- package/dist/heatmap.esm.min.js +3 -0
- package/dist/heatmap.esm.min.js.map +1 -0
- package/dist/style.css +1 -0
- package/package.json +124 -7
- package/src/appticssdk.js +0 -3817
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import type { AP_FEEDBACK_TYPE, AP_TRACKING_STATUS } from './core/constants.js';
|
|
2
|
+
import type { UserBuilder } from './user/index.js';
|
|
3
|
+
import type { ApiTrackingBuilder, ApiTrackingConfig } from './engagement/api-rules.js';
|
|
4
|
+
import type { DefinedEvent } from './engagement/defined-events.js';
|
|
5
|
+
import type { AppticsLogger } from './remotelog/logger.js';
|
|
6
|
+
/** Loose record for legacy payloads and server JSON that are built and sent as-is. */
|
|
7
|
+
export type Dict = Record<string, any>;
|
|
8
|
+
/** An item in the engagement or error queue. */
|
|
9
|
+
export interface QueueItem {
|
|
10
|
+
id?: string;
|
|
11
|
+
type?: string;
|
|
12
|
+
starttime?: number;
|
|
13
|
+
endtime?: number;
|
|
14
|
+
[key: string]: any;
|
|
15
|
+
}
|
|
16
|
+
/** Device properties sent to and returned by `device/add`. */
|
|
17
|
+
export type DeviceInfo = Dict;
|
|
18
|
+
export interface UserInfo {
|
|
19
|
+
userid?: string;
|
|
20
|
+
groupid?: string;
|
|
21
|
+
status?: number;
|
|
22
|
+
[key: string]: any;
|
|
23
|
+
}
|
|
24
|
+
export interface ServerResult<T = Dict> {
|
|
25
|
+
result: string;
|
|
26
|
+
data?: T;
|
|
27
|
+
error_code?: unknown;
|
|
28
|
+
[key: string]: any;
|
|
29
|
+
}
|
|
30
|
+
export type TrackingStatus = (typeof AP_TRACKING_STATUS)[keyof typeof AP_TRACKING_STATUS];
|
|
31
|
+
export type FeedbackType = (typeof AP_FEEDBACK_TYPE)[keyof typeof AP_FEEDBACK_TYPE];
|
|
32
|
+
export type Properties = Record<string, unknown>;
|
|
33
|
+
/** The config init() requires. The console snippet provides the same shape as window.appticssettings._defaultoptions. */
|
|
34
|
+
export interface AppticsConfig {
|
|
35
|
+
/** Apptics host every request goes to, e.g. https://apptics.localzoho.com (a trailing slash is ignored). */
|
|
36
|
+
serviceUrl: string;
|
|
37
|
+
/** The app's token, sent as the `zak` header on app/addversion and device registration. */
|
|
38
|
+
zak: string;
|
|
39
|
+
/** App identifier, e.g. com.zoho.web.zylker. */
|
|
40
|
+
identifier: string;
|
|
41
|
+
/**
|
|
42
|
+
* Your app's version or build number, e.g. '2.4.0' or 512. Required: everything the SDK reports
|
|
43
|
+
* is only meaningful against the build it came from, so there is no default. Changing it
|
|
44
|
+
* registers the new version. Sent as text: a string is trimmed, and a number keeps only the
|
|
45
|
+
* digits JavaScript gives it (1.10 is '1.1'), so pass a dotted version as a string. A blank
|
|
46
|
+
* value, or a snippet placeholder such as 'YOUR_APP_VERSION', is refused.
|
|
47
|
+
*/
|
|
48
|
+
appversion: string | number;
|
|
49
|
+
/** @deprecated ignored: app/addversion answers with the aaid */
|
|
50
|
+
aaid?: string;
|
|
51
|
+
/** @deprecated ignored: app/addversion answers with the aaid */
|
|
52
|
+
aaID?: string;
|
|
53
|
+
/** @deprecated ignored: app/addversion answers with the portal id */
|
|
54
|
+
zsoid?: string;
|
|
55
|
+
/** @deprecated ignored: app/addversion answers with the project id */
|
|
56
|
+
projectID?: string;
|
|
57
|
+
/** @deprecated console-snippet name for serviceUrl */
|
|
58
|
+
base_domain?: string;
|
|
59
|
+
/** @deprecated console-snippet name for zak */
|
|
60
|
+
token?: string;
|
|
61
|
+
/** Data centre key for Quartz screen recording: US, EU, IN, AU, CN, CA, JP, SA, AE, Local, or '-' to disable. */
|
|
62
|
+
DC?: string;
|
|
63
|
+
/**
|
|
64
|
+
* Debug mode: send engagement, exception and log payloads to their `debug/` twins, which answer
|
|
65
|
+
* with a request id and a link to the server's own logs, for following in the Apptics web
|
|
66
|
+
* console. Off by default; it does not change what is sent. Same as calling enableDebug().
|
|
67
|
+
*/
|
|
68
|
+
debug?: boolean;
|
|
69
|
+
/** Log the SDK's own activity to the browser console. Off by default. */
|
|
70
|
+
console_log?: boolean;
|
|
71
|
+
ignore_do_not_track?: boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Send the SDK's own failures to console/addlog, so they can be read from the Apptics console.
|
|
74
|
+
* This carries no app data: one line per failure, tagged with the SDK module it happened in.
|
|
75
|
+
*/
|
|
76
|
+
remote_log?: boolean;
|
|
77
|
+
quartz_workspace_key?: string;
|
|
78
|
+
quartz_department_key?: string;
|
|
79
|
+
/**
|
|
80
|
+
* Record the app's API calls automatically, by wrapping XHR and fetch. Off by default. The SDK's
|
|
81
|
+
* own requests are never recorded. Which hosts and endpoints are recorded, and under what path,
|
|
82
|
+
* is set with configureApiTracking(new ApiTrackingBuilder()...build()).
|
|
83
|
+
*/
|
|
84
|
+
track_api?: boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Record screen views automatically: the page the SDK starts on, then every navigation —
|
|
87
|
+
* history.pushState / replaceState, back and forward, and `#/` hash routes. The screen is named
|
|
88
|
+
* by its path, without the query string. On by default. A inScreen() call within 300 ms of a
|
|
89
|
+
* navigation replaces its automatic view; set this false to track only the app's own calls.
|
|
90
|
+
*/
|
|
91
|
+
track_screen?: boolean;
|
|
92
|
+
/**
|
|
93
|
+
* Print each `logger` line to the browser console too, at its level, as Android's showLogs
|
|
94
|
+
* prints to Logcat. Off by default. `console_log` is the SDK's own activity; this is the app's lines.
|
|
95
|
+
*/
|
|
96
|
+
show_logs?: boolean;
|
|
97
|
+
/**
|
|
98
|
+
* Record sessions automatically. On by default; `false` records no sessions, while events,
|
|
99
|
+
* screens and the rest still are — Android's `automaticSessionsTrackingStatus = false`.
|
|
100
|
+
*/
|
|
101
|
+
track_session?: boolean;
|
|
102
|
+
/** How often queued data is sent, in milliseconds. Default 30000, at least 1000. */
|
|
103
|
+
batch_flush_interval?: number;
|
|
104
|
+
/** How often the server's tracking flags are fetched, in milliseconds. Default 120000, at least 10000. */
|
|
105
|
+
getupdates_interval?: number;
|
|
106
|
+
/** Most items in one batch. Default 50, between 1 and 500. */
|
|
107
|
+
batch_size?: number;
|
|
108
|
+
/** Days an unsent item is kept before it is dropped. Default 7, between 1 and 30. */
|
|
109
|
+
batch_request_timeout?: number;
|
|
110
|
+
/** Idle minutes that end a session. Default 30, between 1 and 1440. */
|
|
111
|
+
inactiveduration?: number;
|
|
112
|
+
/**
|
|
113
|
+
* How long a visit must last before its session is recorded, in milliseconds. Default 5000, at
|
|
114
|
+
* most 60000. A shorter visit with nothing tracked in it is not reported at all; anything tracked
|
|
115
|
+
* inside the window records the session at once, with its real start time. 0 turns the wait off.
|
|
116
|
+
*/
|
|
117
|
+
min_session_duration?: number;
|
|
118
|
+
/**
|
|
119
|
+
* Record where people click and how far they scroll. Off by default, and it does nothing unless
|
|
120
|
+
* the app also imports '@zoho_apptics/apptics-js-sdk/heatmap'.
|
|
121
|
+
*/
|
|
122
|
+
track_heatmap?: boolean;
|
|
123
|
+
/** Most heatmap records one visit may produce. Default 500; capture pauses past it. */
|
|
124
|
+
heatmap_max_per_session?: number;
|
|
125
|
+
/** @deprecated the earlier name for `debug` (debug mode); `debug` wins when both are given */
|
|
126
|
+
debug_api?: boolean;
|
|
127
|
+
/**
|
|
128
|
+
* What to call this device in the debug stream, e.g. 'QA iPad 3'. Sent on engagement,
|
|
129
|
+
* exception and log, the three endpoints that declare it. Unset, nothing is sent unless
|
|
130
|
+
* debug mode is on, where a label is derived from the browser and OS instead.
|
|
131
|
+
*/
|
|
132
|
+
device_name?: string;
|
|
133
|
+
[key: string]: unknown;
|
|
134
|
+
}
|
|
135
|
+
export interface UserValidationResult {
|
|
136
|
+
data: Record<string, string | number | boolean>;
|
|
137
|
+
datatype: Record<string, 'String' | 'Number' | 'Boolean'>;
|
|
138
|
+
message: Array<{
|
|
139
|
+
code: 101 | 102 | 103 | 104;
|
|
140
|
+
keys: string[];
|
|
141
|
+
}>;
|
|
142
|
+
}
|
|
143
|
+
export interface QuartzApi {
|
|
144
|
+
startRecording(details: {
|
|
145
|
+
workspaceLinkName: string;
|
|
146
|
+
departmentLinkName: string;
|
|
147
|
+
recordingDomain: string;
|
|
148
|
+
}): void;
|
|
149
|
+
previewVideo(): void;
|
|
150
|
+
editVideo(options: {
|
|
151
|
+
quartzBranding: boolean;
|
|
152
|
+
}): void;
|
|
153
|
+
clearFeedback(): void;
|
|
154
|
+
endRecording(): void;
|
|
155
|
+
setVideoContent(element: Element | null): void;
|
|
156
|
+
submitRecording(details: {
|
|
157
|
+
email: string;
|
|
158
|
+
subject: string;
|
|
159
|
+
}): Promise<{
|
|
160
|
+
feedbackLink?: string;
|
|
161
|
+
} | undefined>;
|
|
162
|
+
}
|
|
163
|
+
export interface QuartzConstantsApi {
|
|
164
|
+
ErrorType: Record<string, string>;
|
|
165
|
+
FeedbackState: Record<string, string>;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* One heatmap record: a click or a finished scroll gesture, as `heatmap/add` takes it.
|
|
169
|
+
*
|
|
170
|
+
* Web-shaped. The endpoint's mobile fields have no meaning in a browser and are not sent:
|
|
171
|
+
* `battery_in`/`battery_out` (the Battery Status API is gone from Firefox and never existed in
|
|
172
|
+
* Safari), `pressure` and `finger_count` (0 and 1 for any mouse), `service_provider` (a carrier
|
|
173
|
+
* name, which the web has no access to). Sending constants for them would put dead columns in
|
|
174
|
+
* every record.
|
|
175
|
+
*/
|
|
176
|
+
export interface HeatmapRecord {
|
|
177
|
+
/** Queue key; removed before the record is sent. */
|
|
178
|
+
id?: string;
|
|
179
|
+
session_start_time: number;
|
|
180
|
+
/** When this record happened. The only thing that orders records inside a session. */
|
|
181
|
+
triggered_time: number;
|
|
182
|
+
screen: string;
|
|
183
|
+
url_path: string;
|
|
184
|
+
/**
|
|
185
|
+
* 'buttonclick' for a click on something clickable, 'default' otherwise. The server accepts
|
|
186
|
+
* only `event|default|buttonclick`; the kind of movement goes in `gesture_type`.
|
|
187
|
+
*/
|
|
188
|
+
triggered_type: 'event' | 'default' | 'buttonclick';
|
|
189
|
+
/** 'click', or 'up-scroll' / 'down-scroll' / 'left-scroll' / 'right-scroll'. */
|
|
190
|
+
gesture_type: string;
|
|
191
|
+
/** Milliseconds the gesture took. 0 for a click. */
|
|
192
|
+
gesture_duration: number;
|
|
193
|
+
/** 'mouse', 'touch' or 'pen' from the pointer event. Absent for a scroll, which has none. */
|
|
194
|
+
input_type?: string;
|
|
195
|
+
/** A name for the element: an author's attribute where there is one, its text only with PII consent. */
|
|
196
|
+
element_label: string;
|
|
197
|
+
/** A stable number for the element's position in the tree, so clicks on one control group together. */
|
|
198
|
+
triggered_id: number;
|
|
199
|
+
coordinate_x: number;
|
|
200
|
+
coordinate_y: number;
|
|
201
|
+
/** 0-1 across the viewport width. */
|
|
202
|
+
normalized_x: number;
|
|
203
|
+
/** 0-1 down the full page height, which is what a scroll-depth map reads. */
|
|
204
|
+
normalized_y: number;
|
|
205
|
+
scroll_offset_x: number;
|
|
206
|
+
scroll_offset_y: number;
|
|
207
|
+
screen_width: number;
|
|
208
|
+
screen_height: number;
|
|
209
|
+
content_height: number;
|
|
210
|
+
orientation: number;
|
|
211
|
+
network_status: number;
|
|
212
|
+
edge_type: string;
|
|
213
|
+
/** Pixels per second, x1000. 0 for a click. */
|
|
214
|
+
velocity: number;
|
|
215
|
+
is_clickable: 0 | 1;
|
|
216
|
+
is_rage_click: 0 | 1;
|
|
217
|
+
is_dead_click: 0 | 1;
|
|
218
|
+
}
|
|
219
|
+
/** What `AppticsTrackError` accepts: a window `error` / `unhandledrejection` event or the same shape. */
|
|
220
|
+
export type ErrorLike = Event | {
|
|
221
|
+
type?: string;
|
|
222
|
+
error?: unknown;
|
|
223
|
+
reason?: unknown;
|
|
224
|
+
};
|
|
225
|
+
/** The optional feedback modal, from '@zoho_apptics/apptics-js-sdk/feedback'. */
|
|
226
|
+
export interface AppticsFeedbackApi {
|
|
227
|
+
/**
|
|
228
|
+
* Sends feedback without the form. Resolves once it is sent; rejects when it wasn't: the SDK
|
|
229
|
+
* has not started (no init()), the browser is offline, or the server refused it.
|
|
230
|
+
*/
|
|
231
|
+
sendFeedback(type?: FeedbackType, message?: string, attachments?: FileList | File[] | null, logFiles?: FileList | File[] | null,
|
|
232
|
+
/** dyninfo.txt (diagnostics entries + device info): unset sends it when diagnostics are waiting. */
|
|
233
|
+
includeDyninfo?: boolean,
|
|
234
|
+
/** Stored addFeedbackLog() lines: unset sends them when there are any, false never does. */
|
|
235
|
+
includeLog?: boolean): Promise<void>;
|
|
236
|
+
/**
|
|
237
|
+
* Opens the form. Every argument is optional: `type` and `message` pre-fill it, the include
|
|
238
|
+
* flags start the log and diagnostics toggles on, and `isAnonymous` starts the user picker on
|
|
239
|
+
* Anonymous even when a user is registered.
|
|
240
|
+
*/
|
|
241
|
+
feedbackOpen(type?: FeedbackType, message?: string, includeLog?: boolean, includeDyninfo?: boolean, attachments?: FileList | File[] | null, logFiles?: FileList | File[] | null, isAnonymous?: boolean): void;
|
|
242
|
+
feedbackClose(): void;
|
|
243
|
+
}
|
|
244
|
+
export interface AppticsApi {
|
|
245
|
+
/** Android's Apptics. */
|
|
246
|
+
Apptics: {
|
|
247
|
+
/** Starts the SDK. The config object is required; the console snippet supplies it via auto-init. */
|
|
248
|
+
init(config: AppticsConfig): boolean;
|
|
249
|
+
};
|
|
250
|
+
/** Android's AppticsEvents. */
|
|
251
|
+
AppticsEvents: {
|
|
252
|
+
/** An event. An invalid name or group is not logged; a group left out is `default`. */
|
|
253
|
+
addEvent(eventName: string, groupName?: string, properties?: Properties): void;
|
|
254
|
+
/** A defined event (DefinedEvents.AP_USER_LOGIN, …), which brings its own group. */
|
|
255
|
+
addEvent(definedEvent: DefinedEvent, properties?: Properties): void;
|
|
256
|
+
};
|
|
257
|
+
/** Apptics' defined events, as Android's DefinedEvents. */
|
|
258
|
+
DefinedEvents: Readonly<Record<string, DefinedEvent>>;
|
|
259
|
+
/** Android's AppticsScreenTracker. */
|
|
260
|
+
AppticsScreenTracker: {
|
|
261
|
+
/** Records a screen view and returns its id, for outScreen; '' for an invalid name. */
|
|
262
|
+
inScreen(screenName: string, properties?: Properties): string;
|
|
263
|
+
/** Ends the screen view inScreen began, before the next screen would. */
|
|
264
|
+
outScreen(id: string): void;
|
|
265
|
+
};
|
|
266
|
+
/** Android's AppticsApiTracker. */
|
|
267
|
+
AppticsApiTracker: {
|
|
268
|
+
/** Begins timing one call; returns the id endTrackApi takes. */
|
|
269
|
+
startTrackApi(url: string, method?: string): string;
|
|
270
|
+
/** Finishes the call startTrackApi began, and records it. */
|
|
271
|
+
endTrackApi(id: string, responseCode: number, responseMessage?: string): void;
|
|
272
|
+
/** The rules API tracking records by, from ApiTrackingBuilder. Works before Apptics.init(). */
|
|
273
|
+
configure(config: ApiTrackingConfig | ApiTrackingBuilder): void;
|
|
274
|
+
};
|
|
275
|
+
ApiTrackingBuilder: typeof ApiTrackingBuilder;
|
|
276
|
+
/** Android's AppticsLogger: off until enable(), then v / d / i / w / e(tag, message). */
|
|
277
|
+
AppticsLogger: AppticsLogger;
|
|
278
|
+
/** Resolves true once start-up (storage load, device, session) has finished; false if it can't start. */
|
|
279
|
+
ready(): Promise<boolean>;
|
|
280
|
+
/**
|
|
281
|
+
* Turns debug mode on, before or after Apptics.init(). Engagement, exception and log then go to
|
|
282
|
+
* their `debug/` twins, whose answers carry a request id and a link into the server's own logs. It
|
|
283
|
+
* switches itself off after an hour with nothing tracked.
|
|
284
|
+
*/
|
|
285
|
+
enableDebug(): void;
|
|
286
|
+
/** Turns debug mode off, before or after Apptics.init(); wins over `debug` in init(). */
|
|
287
|
+
disableDebug(): void;
|
|
288
|
+
/**
|
|
289
|
+
* Turns automatic API tracking on or off after Apptics.init(). Equivalent to the `track_api`
|
|
290
|
+
* config flag, which is the usual way to set it.
|
|
291
|
+
*/
|
|
292
|
+
enableApiTracking(enabled?: boolean): void;
|
|
293
|
+
/** Reports an error the app caught, or an `error` / `unhandledrejection` event. */
|
|
294
|
+
AppticsTrackError(error: ErrorLike, properties?: Properties): void;
|
|
295
|
+
enableGlobalErrorHandler(enabled?: boolean): void;
|
|
296
|
+
/** Properties may be a plain object, or the result of UserBuilder.build(). */
|
|
297
|
+
AppticsSetUser(userid: string, groupid?: string, properties?: Properties | UserValidationResult): void;
|
|
298
|
+
getUser(): UserInfo;
|
|
299
|
+
users: {
|
|
300
|
+
UserBuilder: typeof UserBuilder;
|
|
301
|
+
};
|
|
302
|
+
setTrackingStatus(status: TrackingStatus): void;
|
|
303
|
+
getTrackingStatus(): TrackingStatus;
|
|
304
|
+
flush(): void;
|
|
305
|
+
/** Records a timestamped line, sent as feedbacklog.txt with the next feedback submission. */
|
|
306
|
+
addFeedbackLog(message: string): void;
|
|
307
|
+
/** Records a diagnostics key/value under `heading`, sent inside dyninfo.txt with the next feedback. */
|
|
308
|
+
addDiagnosticsInfo(heading: string, key: string, value?: unknown): void;
|
|
309
|
+
reset(): void;
|
|
310
|
+
AP_TRACKING_STATUS: typeof AP_TRACKING_STATUS;
|
|
311
|
+
AP_FEEDBACK_TYPE: typeof AP_FEEDBACK_TYPE;
|
|
312
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Dict, Properties, UserInfo, UserValidationResult } from '../types.js';
|
|
2
|
+
export declare function getUser(): UserInfo;
|
|
3
|
+
export declare function setUser(userid?: string, groupid?: string, jsonObj?: Properties | UserValidationResult): void;
|
|
4
|
+
export declare function addOrUpdateUser(user_info: Dict): void;
|
|
5
|
+
export declare function getUserInfo(): void;
|
|
6
|
+
export declare function registerUserWithApptics(user_info: Dict): Promise<Dict>;
|
|
7
|
+
/** Builds validated user properties for setUser. */
|
|
8
|
+
export declare class UserBuilder {
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
setFirstName(first_name: string): this;
|
|
11
|
+
setLastName(last_name: string): this;
|
|
12
|
+
setCompanyName(company_name: string): this;
|
|
13
|
+
setEmailAddress(email_address: string): this;
|
|
14
|
+
setContactNumber(contact_number: string): this;
|
|
15
|
+
setCountry(country: string): this;
|
|
16
|
+
setRegion(region: string): this;
|
|
17
|
+
setCity(city: string): this;
|
|
18
|
+
setGeoLocation(geo_location: string): this;
|
|
19
|
+
setGender(gender: string): this;
|
|
20
|
+
setPlanType(plan_type: string): this;
|
|
21
|
+
setTimezone(timezone: string): this;
|
|
22
|
+
setLanguage(language: string): this;
|
|
23
|
+
setEngagementScore(engagement_score: number): this;
|
|
24
|
+
setDateOfBirth(date_of_birth: number): this;
|
|
25
|
+
addStringProperty(key: string, value: string): this;
|
|
26
|
+
addBooleanProperty(key: string, value: boolean): this;
|
|
27
|
+
addNumberProperty(key: string, value: number): this;
|
|
28
|
+
setCustomProperties(obj: Record<string, unknown>): this;
|
|
29
|
+
build(): UserValidationResult;
|
|
30
|
+
}
|
|
31
|
+
export declare const users: {
|
|
32
|
+
UserBuilder: typeof UserBuilder;
|
|
33
|
+
};
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/*! @zoho_apptics/apptics-js-sdk v2.0.0-beta | (c) Zoho Corporation Private Limited | see LICENSE */
|
|
2
|
+
import { AP_LOG_MODULE, AP_TRACKING_STATUS } from '../core/constants.js';
|
|
3
|
+
import { _ZAP } from '../core/state.js';
|
|
4
|
+
import { logFailure, Console } from '../core/logger.js';
|
|
5
|
+
import { isEmpty, nowMs, isEmptyObj, cloneMapExcludingKeys } from '../core/utils.js';
|
|
6
|
+
import { user_defaults } from '../core/storage.js';
|
|
7
|
+
import { canTrack, setTrackingStatus } from '../core/consent.js';
|
|
8
|
+
import { rejectIfDisabled, rejectIfOffline, rejectIfNoDeviceIds, postToApptics, apiHeaders } from '../core/transport.js';
|
|
9
|
+
import { userValidateJSON } from '../core/validate.js';
|
|
10
|
+
import { hooks } from '../core/hooks.js';
|
|
11
|
+
|
|
12
|
+
function getUser() {
|
|
13
|
+
return _ZAP._user_info || {}; // no i18n
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* user/register wants properties as the validated triple — the values, their types, and what
|
|
17
|
+
* was rejected — which is what UserBuilder.build() returns. A plain object passed to setUser
|
|
18
|
+
* is validated here, so both forms go up in the same shape.
|
|
19
|
+
*/
|
|
20
|
+
function asUserProperties(jsonObj) {
|
|
21
|
+
var maybeBuilt = jsonObj;
|
|
22
|
+
var built = maybeBuilt && typeof maybeBuilt === 'object' && maybeBuilt.data && maybeBuilt.datatype // no i18n
|
|
23
|
+
? maybeBuilt
|
|
24
|
+
: userValidateJSON(jsonObj);
|
|
25
|
+
built.message.forEach(function (problem) {
|
|
26
|
+
logFailure(AP_LOG_MODULE.PROPERTIES, 'AppticsSetUser: dropped ' + problem.keys.join(', ') + ' (error ' + problem.code + ')'); // no i18n
|
|
27
|
+
});
|
|
28
|
+
return built;
|
|
29
|
+
}
|
|
30
|
+
function setUser(userid, groupid, jsonObj) {
|
|
31
|
+
let _jsonObj = jsonObj || {};
|
|
32
|
+
userid = userid || ''; // no i18n
|
|
33
|
+
groupid = groupid || ''; // no i18n
|
|
34
|
+
if (!canTrack('setUser')) { // no i18n
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (isEmpty(userid)) {
|
|
38
|
+
logFailure(AP_LOG_MODULE.PROPERTIES, 'AppticsSetUser: Invalid userid'); // no i18n
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
var user_info = {
|
|
42
|
+
mam: userid,
|
|
43
|
+
customergroupid: groupid,
|
|
44
|
+
appversionid: _ZAP._device_info.appversionid || '', // no i18n
|
|
45
|
+
status: 1,
|
|
46
|
+
happendat: nowMs()
|
|
47
|
+
};
|
|
48
|
+
if (!isEmptyObj(_jsonObj)) { // no i18n
|
|
49
|
+
user_info.userproperties = asUserProperties(_jsonObj);
|
|
50
|
+
}
|
|
51
|
+
registerUserWithApptics(user_info).then(function (user_info) {
|
|
52
|
+
Console.log('setUser: ' + JSON.stringify(user_info)); // no i18n
|
|
53
|
+
}).catch(function (err) {
|
|
54
|
+
Console.log(err);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function addOrUpdateUser(user_info) {
|
|
58
|
+
user_info.status = 1;
|
|
59
|
+
var users = user_defaults.item('users') || []; // no i18n
|
|
60
|
+
users = users.map((item) => ({ ...item, status: 0 }));
|
|
61
|
+
var index = users.findIndex((userobj) => userobj.userid === user_info.userid);
|
|
62
|
+
if (index !== -1) {
|
|
63
|
+
users[index] = { ...users[index], ...user_info };
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
users.push(user_info);
|
|
67
|
+
}
|
|
68
|
+
user_defaults.add('users', users); // no i18n
|
|
69
|
+
}
|
|
70
|
+
function getUserInfo() {
|
|
71
|
+
var users = user_defaults.item('users') || []; // no i18n
|
|
72
|
+
var activeuser = {};
|
|
73
|
+
if (users.length > 0) {
|
|
74
|
+
activeuser = users.filter((item) => item.status === 1)[0] || {};
|
|
75
|
+
}
|
|
76
|
+
_ZAP._user_info = activeuser;
|
|
77
|
+
}
|
|
78
|
+
// Function to register the user
|
|
79
|
+
function registerUserWithApptics(user_info) {
|
|
80
|
+
var label = 'registerUserWithApptics'; // no i18n
|
|
81
|
+
var blocked = rejectIfDisabled(label) || rejectIfOffline(label);
|
|
82
|
+
if (blocked) {
|
|
83
|
+
return blocked;
|
|
84
|
+
}
|
|
85
|
+
if (isEmptyObj(user_info)) {
|
|
86
|
+
return Promise.reject(label + ': nothing to register'); // no i18n
|
|
87
|
+
}
|
|
88
|
+
var missing = rejectIfNoDeviceIds(label);
|
|
89
|
+
if (missing) {
|
|
90
|
+
return missing;
|
|
91
|
+
}
|
|
92
|
+
var payload = JSON.stringify(cloneMapExcludingKeys(user_info, ['userid', 'groupid', 'happendat'])); // no i18n
|
|
93
|
+
return postToApptics('reguser', payload, apiHeaders(), label).then(function (result) {
|
|
94
|
+
var data = result.data || {};
|
|
95
|
+
user_info.userid = data.userid;
|
|
96
|
+
user_info.groupid = data.customergroupid;
|
|
97
|
+
setTrackingStatus(AP_TRACKING_STATUS.USAGE_TRACKING_WITH_PII);
|
|
98
|
+
addOrUpdateUser(user_info);
|
|
99
|
+
getUserInfo();
|
|
100
|
+
// the user and their customer group are known now: remote config conditions on them re-apply
|
|
101
|
+
hooks.remoteConfigUserChanged();
|
|
102
|
+
return data;
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/** Builds validated user properties for setUser. */
|
|
106
|
+
class UserBuilder {
|
|
107
|
+
setFirstName(first_name) { this.first_name = first_name; return this; }
|
|
108
|
+
setLastName(last_name) { this.last_name = last_name; return this; }
|
|
109
|
+
setCompanyName(company_name) { this.company_name = company_name; return this; }
|
|
110
|
+
setEmailAddress(email_address) { this.email_address = email_address; return this; }
|
|
111
|
+
setContactNumber(contact_number) { this.contact_number = contact_number; return this; }
|
|
112
|
+
setCountry(country) { this.country = country; return this; }
|
|
113
|
+
setRegion(region) { this.region = region; return this; }
|
|
114
|
+
setCity(city) { this.city = city; return this; }
|
|
115
|
+
setGeoLocation(geo_location) { this.geo_location = geo_location; return this; }
|
|
116
|
+
setGender(gender) { this.gender = gender; return this; }
|
|
117
|
+
setPlanType(plan_type) { this.plan_type = plan_type; return this; }
|
|
118
|
+
setTimezone(timezone) { this.timezone = timezone; return this; }
|
|
119
|
+
setLanguage(language) { this.language = language; return this; }
|
|
120
|
+
setEngagementScore(engagement_score) { this.engagement_score = engagement_score; return this; }
|
|
121
|
+
setDateOfBirth(date_of_birth) { this.date_of_birth = date_of_birth; return this; }
|
|
122
|
+
addStringProperty(key, value) {
|
|
123
|
+
if (typeof value === 'string') { // no i18n
|
|
124
|
+
this[key] = value;
|
|
125
|
+
}
|
|
126
|
+
return this;
|
|
127
|
+
}
|
|
128
|
+
addBooleanProperty(key, value) {
|
|
129
|
+
if (typeof value === 'boolean') { // no i18n
|
|
130
|
+
this[key] = value;
|
|
131
|
+
}
|
|
132
|
+
return this;
|
|
133
|
+
}
|
|
134
|
+
addNumberProperty(key, value) {
|
|
135
|
+
if (typeof value === 'number' && Number.isFinite(value)) { // no i18n
|
|
136
|
+
this[key] = value;
|
|
137
|
+
}
|
|
138
|
+
return this;
|
|
139
|
+
}
|
|
140
|
+
setCustomProperties(obj) {
|
|
141
|
+
if (typeof obj === 'object' && obj !== null) { // no i18n
|
|
142
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
143
|
+
this[key] = value;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return this;
|
|
147
|
+
}
|
|
148
|
+
build() {
|
|
149
|
+
const user = {};
|
|
150
|
+
const knownFields = [
|
|
151
|
+
'first_name', 'last_name', 'company_name', 'email_address', 'contact_number',
|
|
152
|
+
'country', 'region', 'city', 'geo_location', 'gender', 'plan_type', 'timezone',
|
|
153
|
+
'language', 'engagement_score', 'date_of_birth'
|
|
154
|
+
]; // no i18n
|
|
155
|
+
knownFields.forEach((field) => {
|
|
156
|
+
if (this[field] !== undefined)
|
|
157
|
+
user[field] = this[field];
|
|
158
|
+
});
|
|
159
|
+
Object.entries(this).forEach(([key, value]) => {
|
|
160
|
+
if (knownFields.indexOf(key) === -1 && typeof value !== 'function') { // no i18n
|
|
161
|
+
user[key] = value;
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
return userValidateJSON(user);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Users module for user management
|
|
168
|
+
const users = { UserBuilder: UserBuilder };
|
|
169
|
+
|
|
170
|
+
export { UserBuilder, addOrUpdateUser, getUser, getUserInfo, registerUserWithApptics, setUser, users };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/*! @zoho_apptics/apptics-js-sdk v2.0.0-beta | (c) Zoho Corporation Private Limited | see LICENSE */
|
|
2
|
+
import{i as e,C as t,a as n,n as a,g as s,_ as i,b as d,c as l,d as o,e as r,f as c,r as u,h as p,s as k,p as v,j as f,u as m,k as z,o as g,A as h,l as y,m as b}from"./chunks/batch-BU_mTpm1.min.js";import{h as S,t as w,a as E,l as q,b as F,c as _,d as L,r as M}from"./chunks/logs-Bea5zUW_.min.js";const A="Feedback sent successfully",x="Something went wrong. Send feedback again",I=["deviceid","anonymousid","aaid","apid","mapid","devicetypeid","osversionid","platformid","appversionid","appreleaseversionid","modelid","timezoneid","frameworkid","projectid","portalid","donottrackenabled"];function C(c){if(e())return Promise.resolve(null);if(0==navigator.onLine)return t.warn("sendFeedbackData: No Network"),Promise.resolve(null);var m=n(c.attachment)?null:c.attachment,z=m?m.length:0,g=c&&c.logsFiles?c.logsFiles:null,h=g&&g.length?g.length:0,y=a();return Promise.all([B(c),s()]).then(function([e,a]){var s=new FormData,b={networkstatus:r(),orientation:l(),edge:d(),screenname:i._current_screen.screen||"",sessionstarttime:i._current_session.starttime||y,report:c.message,type:c.type,source:0,attachmentcount:z||0,logfilecount:h+(e.logFile?1:0),happendat:y};n(c.quartzid)||(b.quartzid=c.quartzid),null!==a&&(b.battery=a),s.append("feedinfo",JSON.stringify({feedinfo:b,meta:o()}));var S=Promise.resolve();return m&&z>0&&z<=5&&(S=function(e){var t=[];for(let n=0;n<e.length;n++){const a=e[n];t.push(new Promise(function(e,t){const s=new FileReader;s.onload=function(t){const s=t.target.result;e(new File([s],"image_"+(n+1),{type:a.type}))},s.onerror=function(){t(s.error)},s.readAsArrayBuffer(a)}))}return Promise.all(t)}(m).then(function(e){e.forEach(function(e){s.append("attachment",e)})})),S.then(function(){return function(e,t,n){if(t&&t.length>0)for(let n=0;n<t.length;n++)e.append("logfile",t[n]);n.logFile&&e.append("logfile",n.logFile);n.dyninfoFile&&e.append("dyninfo",n.dyninfoFile)}(s,g,e),l=s,o=e.ids,(n=l,a="requestToFeedback",d=u(a)||p(a),d||(t.log(a+": Feedback Payload size : "+k(n)/1024),v("feedback",n,f(),a))).then(function(){return i._sending=!1,o.length>0&&q(o),{ok:!0,message:A}}).catch(function(e){return i._sending=!1,t.log("sendFeedbackData:"+e),{ok:!1,message:x}});var n,a,d,l,o})}).catch(function(e){return t.error("sendFeedbackData: "+e),{ok:!1,message:x}})}function B(e){var n=!1!==e.includeLog,a=e.includeDyninfo,s=!0===a?Promise.resolve(!0):!1===a?Promise.resolve(!1):S();return Promise.all([n?w():Promise.resolve(null),s.then(function(e){return e?E(function(){try{return JSON.stringify(c(i._device_info,I)||{},null,2)}catch(e){return t.error("Failed to prepare dyninfo file",e),null}}()):null})]).then(function([e,t]){return{logFile:e?e.file:null,dyninfoFile:t?t.file:null,ids:(e?e.ids:[]).concat(t?t.ids:[])}})}const D="anonymous",T="Anonymous",Z={anonymous:!0,userid:"",groupid:""},R={};const V="http://www.w3.org/2000/svg";function P(e,t){var a=e.querySelector("#zasdkEmailTrigger"),s=e.querySelector("#zasdkEmailPanel"),i=e.querySelector("#zasdkEmailLabel"),d=e.querySelector("#zasdkEmailList"),l=e.querySelector("#zasdkEmailDropdown");if(a&&s&&i&&d&&l){var o=function(){var e=m.item("users");return Array.isArray(e)?e:[]}(),r=function(e){var t=[{value:D,label:T}],a={};return e.forEach(function(e){var s=e&&e.mam;n(s)||a[s]||(a[s]=!0,t.push({value:String(s),label:String(s)}))}),t}(o),c=D;if(Z.anonymous=!0,Z.userid="",Z.groupid="",!t){var u=null;o.forEach(function(e){u||!e||1!=e.status||n(e.mam)||(u=e)}),u&&p(String(u.mam))}a.addEventListener("click",function(e){e.stopPropagation();var t="none"!==s.style.display;s.style.display=t?"none":"block",t||k()}),d.addEventListener("click",function(e){var t=e.target.closest(".zasdk-select-option");t&&(p(String(t.getAttribute("data-value"))),s.style.display="none")}),l.setAttribute("tabindex","0"),l.addEventListener("focusout",function(e){l.contains(e.relatedTarget)||(s.style.display="none")}),k()}function p(e){c=e,Z.anonymous=e===D;var t=null;Z.anonymous||o.forEach(function(n){!t&&n&&n.mam===e&&(t=n)}),Z.userid=t?String(t.userid||""):"",Z.groupid=t?String(t.groupid||""):"",i.textContent=Z.anonymous?T:e,k()}function k(){if(d.innerHTML="",0===r.length){var e=document.createElement("div");return e.className="zasdk-select-empty",e.textContent="No users to choose from",void d.appendChild(e)}r.forEach(function(e){var t=e.value===c,n=document.createElement("li");n.className="zasdk-select-option"+(t?" zasdk-option-selected":""),n.setAttribute("data-value",e.value);var a=document.createElement("span");a.textContent=e.label,n.appendChild(a),t&&n.appendChild(function(){var e=document.createElementNS(V,"svg");e.setAttribute("viewBox","0 0 14 10"),e.setAttribute("width","14"),e.setAttribute("height","10"),e.setAttribute("fill","none");var t=document.createElementNS(V,"path");return t.setAttribute("d","M1 5l4 4 8-8"),t.setAttribute("stroke","#0078d4"),t.setAttribute("stroke-width","2"),t.setAttribute("stroke-linecap","round"),t.setAttribute("stroke-linejoin","round"),e.appendChild(t),e}()),d.appendChild(n)})}}function N(e,t,n){var a=e.querySelector("#zasdkDataViewer"),s=e.querySelector("#zasdkViewerTitle"),i=e.querySelector("#zasdkViewerContent");a&&s&&i&&(s.textContent=t,i.textContent=n||"(No data available)",a.style.display="flex")}z.feedbackUser=function(){return Z.anonymous||n(Z.userid)?null:Z};const H={startRecording(){},previewVideo(){},editVideo(){},clearFeedback(){},endRecording(){},setVideoContent(){},submitRecording:()=>Promise.resolve({})},O={ErrorType:{},FeedbackState:{}};function Q(){return"undefined"!=typeof Quartz&&!!Quartz}function j(){return"undefined"!=typeof Quartz&&Quartz?Quartz:H}function U(){return"undefined"!=typeof QuartzConstants&&QuartzConstants?QuartzConstants:O}function W(e){return C(e).then(function(e){return e?($.handleStatusmsg(e.ok,e.message),e.ok&&setTimeout(()=>{$.close()},2e3),e):null})}function G(e,t,a){var s=e.querySelector(".zasdk-selected").getAttribute("data-type"),i=e.querySelector("#zasdkFileInput").files;return{type:n(s)?1:$.typeObj[s],message:t,attachment:i&&i.length>0?i:$._opts.attachments||null,logsFiles:$._opts.logFiles||null,includeLog:R.includeLog,includeDyninfo:R.includeDyninfo,quartzid:a}}function K(){try{return"function"==typeof DataTransfer?new DataTransfer:null}catch(e){return t.warn("apptics.feedback: this browser cannot build a file list, attachments are off"),null}}const $={feedbackUIHtml:'<div id="zasdkFeedbackconatiner" class="zasdk-modal-content">\n <div class="zasdk-header">\n <h2 class="zasdk-title">Share feedback</h2>\n <span id="appticsfeedbackclose" class="zasdk-close"><svg viewBox="0 0 24 24" style=" width: 20px; "><path d="M19.92,19.08c.23.23.23.61,0,.85-.12.12-.27.18-.42.18s-.31-.06-.42-.18l-7.08-7.08-7.08,7.08c-.12.12-.27.18-.42.18s-.31-.06-.42-.18c-.23-.23-.23-.61,0-.85l7.08-7.08-7.08-7.08c-.23-.23-.23-.61,0-.85s.61-.23.85,0l7.08,7.08,7.08-7.08c.23-.23.61-.23.85,0s.23.61,0,.85l-7.08,7.08,7.08,7.08Z"/></svg></span>\n </div>\n <div class="zasdk-feedback-types" data-type="">\n <div class="zasdk-feedback-type zasdk-selected" data-type="bug">\n <div class="zasdk-iconcnt zasdkfeedback__icon-report">\n <i class="zasdkfeedback__icon"><svg viewBox="0 0 24 24"><path d="M15.6,6.58c-.13-.37-.3-.7-.5-.97l1.23-1.18c.24-.23.25-.61.02-.85-.23-.24-.61-.25-.85-.02l-1.26,1.21c-.66-.45-1.37-.62-1.79-.68-.25-.04-.51-.04-.76-.02-.83.08-1.45.35-1.93.7l-1.22-1.2c-.24-.23-.62-.23-.85,0-.23.24-.23.62,0,.85l1.21,1.19c-.24.34-.41.68-.51.96-2.02,1.37-3.27,3.82-3.27,6.44,0,4.18,3.08,7.58,6.87,7.58s6.87-3.4,6.87-7.58c0-2.62-1.25-5.06-3.26-6.44ZM11.82,5.27c.15-.02.31-.01.47.01.69.1,1.86.48,2.26,1.9-.17.17-.51.44-1.14.65-1.08.36-2.31.28-3.36-.23-.24-.11-.44-.23-.6-.36,0-.01,0-.03.01-.04.18-.65.73-1.77,2.36-1.93ZM12,19.4c-3.12,0-5.67-2.86-5.67-6.38,0-1.98.82-3.82,2.19-5.02.26.25.59.48,1.01.68.78.38,1.65.57,2.5.57.6,0,1.19-.09,1.76-.28.88-.29,1.39-.7,1.67-1,1.38,1.2,2.21,3.06,2.21,5.05,0,3.52-2.54,6.38-5.67,6.38ZM9.12,9.86c-.92,0-1.67.75-1.67,1.67s.75,1.67,1.67,1.67,1.67-.75,1.67-1.67-.75-1.67-1.67-1.67ZM9.12,11.99c-.26,0-.47-.21-.47-.47s.21-.47.47-.47.47.21.47.47-.21.47-.47.47ZM14.88,9.86c-.92,0-1.67.75-1.67,1.67s.75,1.67,1.67,1.67,1.67-.75,1.67-1.67-.75-1.67-1.67-1.67ZM14.88,11.99c-.26,0-.47-.21-.47-.47s.21-.47.47-.47.47.21.47.47-.21.47-.47.47ZM12,14.49c-.92,0-1.67.75-1.67,1.67s.75,1.67,1.67,1.67,1.67-.75,1.67-1.67-.75-1.67-1.67-1.67ZM12,16.62c-.26,0-.47-.21-.47-.47s.21-.47.47-.47.47.21.47.47-.21.47-.47.47Z"/></svg></i>\n </div>\n <div>Bug</div>\n </div>\n <div class="zasdk-feedback-type" data-type="feedback">\n <div class="zasdk-iconcnt zasdkfeedback__icon-reqest">\n <i class="zasdkfeedback__icon"><svg viewBox="0 0 24 24"><path d="M6.69,9.25h10.81c.41,0,.75-.34.75-.75s-.34-.75-.75-.75H6.69c-.41,0-.75.34-.75.75s.34.75.75.75Z"/><path d="M6.69,13.07h8.11c.41,0,.75-.34.75-.75s-.34-.75-.75-.75H6.69c-.41,0-.75.34-.75.75s.34.75.75.75Z"/><path d="M20.72,5.17c0-.68-.55-1.23-1.23-1.23H4.48c-.68,0-1.23.55-1.23,1.23v11.84c0,.68.55,1.23,1.23,1.23h13.49l1.25,1.51c.17.2.41.31.67.31.1,0,.2-.02.3-.05.34-.13.57-.46.56-.83l-.03-14.01ZM19.22,17.39l-.17-.2c-.24-.29-.58-.45-.95-.45H4.75V5.44h14.47v11.95Z"/></svg></i>\n </div>\n <div>Feedback</div>\n </div>\n <div class="zasdk-feedback-type" data-type="help">\n <div class="zasdk-iconcnt zasdkfeedback__icon-help">\n <i class="zasdkfeedback__icon"><svg viewBox="0 0 24 24"><path d="M12.45,16.47c-.33,0-.6-.27-.6-.6v-2.7c0-.43.25-.82.64-.99.95-.42,3.15-1.62,3.15-3.51,0-1.6-1.01-3.03-2.51-3.55-.95-.33-1.97-.28-2.87.16-.91.43-1.59,1.2-1.92,2.14-.11.31-.45.48-.77.37-.31-.11-.48-.45-.37-.77.44-1.25,1.34-2.25,2.54-2.83,1.2-.57,2.54-.65,3.79-.21,1.99.7,3.32,2.58,3.31,4.69,0,2.46-2.34,3.91-3.79,4.57v2.63c0,.33-.27.6-.6.6ZM13.21,19.1c0-.66-.54-1.2-1.2-1.2h-.03c-.66,0-1.19.54-1.19,1.2s.55,1.2,1.21,1.2,1.2-.54,1.2-1.2Z"/></svg></i>\n </div>\n <div>Help</div>\n </div>\n <div class="zasdk-feedback-type" data-type="report">\n <div class="zasdk-iconcnt zasdkfeedback__icon-appreciate">\n <i class="zasdkfeedback__icon"><svg viewBox="0 0 24 24"><path d="M20.47,16.72l-6.66-11.53c-.37-.65-1.07-1.05-1.81-1.05s-1.44.4-1.81,1.05l-6.66,11.53c-.37.65-.37,1.45,0,2.09.37.65,1.07,1.05,1.81,1.05h13.32c.75,0,1.44-.4,1.81-1.05.37-.64.37-1.45,0-2.09ZM19.17,18.06c-.11.18-.3.3-.51.3H5.34c-.21,0-.41-.11-.51-.3-.1-.18-.1-.41,0-.59l6.66-11.53h0c.11-.18.3-.3.51-.3s.41.11.51.3l6.66,11.53c.11.18.11.41,0,.59Z"/><path d="M12.35,13.9s.37-4.72.37-4.72c.05-1.08-1.58-1.06-1.5.02l.48,4.71c.03.38.62.37.64,0Z"/><path d="M11.97,15.06c-.52,0-.94.42-.94.94s.42.94.94.94.94-.42.94-.94-.42-.94-.94-.94Z"/></svg></i>\n </div>\n <div>Report</div>\n </div>\n </div>\n <div id="zasdkFeedbackForm" class="zasdk-form">\n <label class="zasdkdesclbl">User<span class="zasdkmadfeld">*</span></label>\n <div id="zasdkEmailDropdown" class="zasdk-custom-select">\n <div id="zasdkEmailTrigger" class="zasdk-select-trigger">\n <span id="zasdkEmailLabel" class="zasdk-select-label">Anonymous</span>\n <svg class="zasdk-select-arrow" viewBox="0 0 12 8" width="12" height="8"><path d="M1 1l5 5 5-5" stroke="#999" stroke-width="1.5" fill="none" stroke-linecap="round"/></svg>\n </div>\n <div id="zasdkEmailPanel" class="zasdk-select-panel" style="display:none">\n <ul id="zasdkEmailList" class="zasdk-select-list"></ul>\n </div>\n </div>\n <label class="zasdkdesclbl" for="zasdkDescription">Add details here<span class="zasdkmadfeld">*</span> <span class="zaleftcharspan"><span class="zaleftcharcnt">5000</span><span class="zaleftchartxt">character left</span></span></label>\n <textarea id="zasdkDescription" name="description" placeholder="Please provide more details for us to help you better." reqname="name" maxlength="5000"></textarea>\n <div id="zasdkreccheckcnt" class="zasdkqz-container">\n <div class="zasdkqz-checkbox-wrapper">\n <input type="checkbox" id="zasdkqz-consent" class="zasdkqz-checkbox">\n <label for="zasdkqz-consent">By agreeing to record screen, I allow the collection of the required information for further analysis.</label>\n </div>\n <div id="zasdkqz-content" class="zasdkqz-content">\n <div class="zasdkqz-prop-content">Data collected while screen recording.\n <div class="zasdk_rec_hdr_icon zasdk-tooltip-container zasdk_rec_hdr">\n <i><svg viewBox="0 0 24 24"><path d="M12,20.6c-4.74,0-8.6-3.86-8.6-8.6S7.26,3.4,12,3.4s8.6,3.86,8.6,8.6-3.86,8.6-8.6,8.6ZM12,4.6c-4.08,0-7.4,3.32-7.4,7.4s3.32,7.4,7.4,7.4,7.4-3.32,7.4-7.4-3.32-7.4-7.4-7.4ZM12.6,15.97v-4.91c0-.33-.27-.6-.6-.6s-.6.27-.6.6v4.91c0,.33.27.6.6.6s.6-.27.6-.6ZM12.61,9.03c0-.33-.27-.6-.6-.6h-.01c-.33,0-.59.27-.59.6s.28.6.61.6.6-.27.6-.6Z"/></svg></i>\n <div class="zasdk-tooltip-top zasdk-prop-info">\n <ul>\n <li>- A recording of the window or region specified.</li>\n <li>- Audio captured during recording. (You can mute or re-record)</li>\n <li>- IP address.</li>\n <li>- Browser console logs generated while recording.</li>\n <li>- Device details (screen resolution, OS, and browser version).</li>\n <li>- Client-side performance metrics (DNS lookup time, TCP connection time, etc.).</li>\n </ul>\n </div>\n </div>\n </div>\n <div id="zasdkqz_rec_button" class="zasdkqz-button">Start screen recording</div>\n </div>\n </div>\n <div id="editRecordedVideo" class="zasdk_recordedClipArea" style="">\n <div id="recordScreenDesc" class="zasdk_rec_hdr"> Recorded Clip\n <div class="zasdk_rec_hdr_icon zasdk-tooltip-container">\n <i><svg viewBox="0 0 24 24"><path d="M12,20.6c-4.74,0-8.6-3.86-8.6-8.6S7.26,3.4,12,3.4s8.6,3.86,8.6,8.6-3.86,8.6-8.6,8.6ZM12,4.6c-4.08,0-7.4,3.32-7.4,7.4s3.32,7.4,7.4,7.4,7.4-3.32,7.4-7.4-3.32-7.4-7.4-7.4ZM12.6,15.97v-4.91c0-.33-.27-.6-.6-.6s-.6.27-.6.6v4.91c0,.33.27.6.6.6s.6-.27.6-.6ZM12.61,9.03c0-.33-.27-.6-.6-.6h-.01c-.33,0-.59.27-.59.6s.28.6.61.6.6-.27.6-.6Z"/></svg></i>\n <div class="zasdk-tooltip">This recording will be sent along with your feedback for further analysis.</div>\n </div>\n </div>\n <div class="zasdk_playEdit">\n <div class="zasdk_clipAreaButtonCnt zasdk-tooltip-container">\n <div id="preivewPlayButton" class="zasdk_clipAreaButton" title="Preview">\n <svg viewBox="0 0 24 24"><path d="M6.24,20.6c-.2,0-.39-.05-.57-.15-.38-.21-.62-.61-.62-1.05V4.59c0-.44.24-.84.62-1.05.38-.21.85-.19,1.22.04l11.52,7.41c.34.22.55.6.55,1,0,.41-.2.78-.55,1l-11.52,7.41c-.2.13-.42.19-.64.19ZM6.56,4.1l-.33.5v14.81s11.52-7.41,11.52-7.41L6.23,4.6l.33-.5Z"/></svg>\n </div>\n <div class="zasdk-tooltip">Preview</div>\n </div>\n <div class="zasdk_clipAreaButtonCnt zasdk-tooltip-container">\n <div id="videoEditButton" class="zasdk_clipAreaButton">\n <svg id="Layer_2" viewBox="0 0 24 24"><path d="M20.6,7.18c0-.58-.23-1.13-.65-1.54l-1.53-1.51c-.83-.83-2.29-.83-3.12,0l-1.31,1.3h0S4.88,14.41,4.88,14.41c-.12.12-.21.27-.26.44l-1.19,4.4c-.09.34,0,.7.26.95.19.18.44.29.7.29.09,0,.17-.01.26-.04l4.44-1.2c.16-.05.31-.13.44-.25l8.54-8.43h0s1.88-1.86,1.88-1.86c.06-.06.12-.12.17-.19h0c.31-.39.48-.86.48-1.36ZM8.72,18.12l-4.03,1.09,1.08-3.98L13.97,7.12l2.88,2.97-8.13,8.03ZM17.71,9.25l-2.88-2.97,1.32-1.3c.38-.38,1.04-.38,1.43,0l1.53,1.51c.19.18.29.43.29.69,0,.22-.08.43-.21.6h0s-.04.05-.08.08l-1.4,1.39Z"/></svg>\n </div>\n <div class="zasdk-tooltip">Edit</div>\n </div>\n <div class="zasdk_clipAreaButtonCnt zasdk-tooltip-container">\n <div id="videoDelButton" class="zasdk_clipAreaButton">\n <svg id="Layer_2" viewBox="0 0 24 24"><path d="M19.2,6.6h-3.4v-1c0-1.21-.99-2.2-2.2-2.2h-3.2c-1.21,0-2.2.99-2.2,2.2v1h-3.4c-.33,0-.6.27-.6.6s.27.6.6.6h1v10.6c0,1.21.99,2.2,2.2,2.2h8c1.21,0,2.2-.99,2.2-2.2V7.8h1c.33,0,.6-.27.6-.6s-.27-.6-.6-.6ZM9.4,5.6c0-.55.45-1,1-1h3.2c.55,0,1,.45,1,1v1h-5.2v-1ZM17,18.4c0,.55-.45,1-1,1h-8c-.55,0-1-.45-1-1V7.8h10v10.6ZM11,11.2v4.8c0,.33-.27.6-.6.6s-.6-.27-.6-.6v-4.8c0-.33.27-.6.6-.6s.6.27.6.6ZM14.2,11.2v4.8c0,.33-.27.6-.6.6s-.6-.27-.6-.6v-4.8c0-.33.27-.6.6-.6s.6.27.6.6Z"/></svg>\n </div>\n <div class="zasdk-tooltip">Delete</div>\n </div>\n </div>\n <div class="zasdk_videoPrev">\n <video id="previewVideoElemId" width="320" height="240" src=""></video>\n </div>\n </div>\n\n <div class="zasdk-buttons">\n <div class="zasdk-btncnt">\n <div id="zasdkattachinfo" class="zasdkattachinf">Maximum 5 attachments with a total file size of 10MB is allowed</div>\n <input type="file" id="zasdkFileInput" class="zasdk-file-input" multiple accept=".png, .jpg, .txt">\n <label id="zasdkAttachBtn" class="zasdk-btn zasdk-attach-btn" for="zasdkFileInput">\n <svg id="Layer_2" viewBox="0 0 24 24" style=" width: 25px; "><path d="M12,20.6c-2.63,0-4.78-2.14-4.78-4.78V6.78c0-1.87,1.52-3.38,3.38-3.38s3.38,1.52,3.38,3.38v9.04c0,1.1-.9,1.99-2,1.99s-1.99-.89-1.99-1.99V7.48c0-.33.27-.6.6-.6h0c.33,0,.6.27.6.6v8.35c0,.44.35.79.79.79s.79-.36.79-.79V6.78c0-1.2-.98-2.18-2.18-2.18s-2.18.98-2.18,2.18v9.04c0,1.97,1.6,3.58,3.58,3.58s3.58-1.6,3.58-3.58V6.78c0-.33.27-.6.6-.6s.6.27.6.6v9.04c0,2.63-2.14,4.78-4.78,4.78Z"/></svg>\n <span>Attachments</span>\n </label>\n <div id="zasdkfilesizeinfo" class="zasdkfilesizeinf"></div>\n <ul id="zasakfileList" class="zasakfilelstcnt"></ul>\n </div>\n </div>\n </div>\n <div class="zasdk-toggles-section">\n <div class="zasdk-toggle-row">\n <div class="zasdk-toggle-info">\n <span class="zasdk-toggle-label">Include System Logs</span>\n <span class="zasdk-view-link" id="zasdkViewLogsBtn">View</span>\n </div>\n <label class="zasdk-switch">\n <input type="checkbox" id="zasdkIncludeLogToggle">\n <span class="zasdk-slider"></span>\n </label>\n </div>\n <div class="zasdk-toggle-separator"></div>\n <div class="zasdk-toggle-row">\n <div class="zasdk-toggle-info">\n <span class="zasdk-toggle-label">Include Diagnostic Information</span>\n <span class="zasdk-view-link" id="zasdkViewDiagBtn">View</span>\n </div>\n <label class="zasdk-switch">\n <input type="checkbox" id="zasdkIncludeDiagToggle">\n <span class="zasdk-slider"></span>\n </label>\n </div>\n </div>\n <div class="zasdk_submit_btncnt">\n <div id="zasdksubmitstatus" class="zasdkstsmsg" style="display:none;" ></div>\n <div id="zasdk_submit_btnsubcnt" class="zasdk_submit_btnsubcnt">\n <input type="button" id="zasdk_submit_btn" class="zasdk-btn zasdk-send-btn zasdkbtndisableclr" value="Send">\n </div>\n </div>\n <div id="zasdkDataViewer" class="zasdk-data-viewer" style="display:none">\n <div class="zasdk-viewer-hdr">\n <span id="zasdkViewerClose" class="zasdk-viewer-back"><svg viewBox="0 0 24 24" width="20" height="20" fill="none"><path d="M15 19l-7-7 7-7" stroke="#333" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></span>\n <span id="zasdkViewerTitle" class="zasdk-viewer-title"></span>\n </div>\n <pre id="zasdkViewerContent" class="zasdk-viewer-content"></pre>\n </div>\n </div>',timerHtml:'<div id="zasdkrectimer" class="zasdk-timer-container zasdk-tooltip-container">\n <div class="zasdk-timer-control" id="zasdkRecordButton"><div class="zasdk-timer-stopcricle"></div></div>\n <span class="zasdk-timer-display" id="zasdkTimerDisplay">05:00</span>\n <div class="zasdk-tooltip-top">Stop Recording</div>\n </div>',uploadFileAry:[],fileInput:null,selectedFiles:null,isScaled:!1,isHidden:!1,timerDisplay:null,recordButton:null,TOTAL_TIME:300,remainingTime:300,isRecording:!1,timerInterval:null,uploadTotalSize:0,MaxFileSize:10485760,_opts:{},typeObj:{bug:0,feedback:1,help:2,report:3},init:function(e){$._opts=e||{};var a=document.getElementById("zasdkFeedbackModal");if(!n(a))return;const s=document.createElement("div");$.uploadFileAry=[],s.id="zasdkFeedbackModal",s.className="zasdk-modal",s.innerHTML=$.feedbackUIHtml,document.body.appendChild(s);a=document.getElementById("zasdkFeedbackModal");var d=i._defaultoptions,l=d.quartz_workspace_key,o=d.quartz_department_key,r=n(d.DC)||"-"===d.DC?"":{Local:"https://quartz.localzoho.com",US:"https://quartz.zoho.com",EU:"https://quartz.zoho.eu",IN:"https://quartz.zoho.in",AU:"https://quartz.zoho.com.au",CN:"https://quartz.zoho.com.cn",CA:"https://quartz.zohocloud.ca",JP:"https://quartz.zoho.jp",SA:"https://quartz.zoho.sa",AE:"https://quartz.zoho.ae"}[d.DC]||"",c=a.querySelector("#appticsfeedbackclose"),u=a.querySelectorAll(".zasdk-feedback-type");$.fileInput=a.querySelector("#zasdkFileInput");var p=a.querySelector("#zasdkqz_rec_button"),k=a.querySelector("#zasdk_submit_btn"),v=a.querySelector("#zasdk_submit_btnsubcnt");const f=a.querySelector("#zasdkqz-consent"),m=a.querySelector("#zasdkqz-content"),z=a.querySelector("#preivewPlayButton"),g=a.querySelector("#videoEditButton"),h=a.querySelector("#videoDelButton"),y=a.querySelector("#zasdkFeedbackconatiner"),b=a.querySelector("#zasdkDescription");!function(e){var t=e.querySelector(".zasdk-header");if(t){var n=0,a=0,s=0,i=0,d=!1;t.addEventListener("mousedown",function(l){if(!l.target.closest(".zasdk-close")){if(!e.style.left||"auto"===e.style.left){var o=e.getBoundingClientRect();e.style.right="auto",e.style.bottom="auto",e.style.left=o.left+"px",e.style.top=o.top+"px"}d=!0,n=l.clientX,a=l.clientY,s=parseInt(e.style.left,10),i=parseInt(e.style.top,10),t.style.cursor="grabbing",l.preventDefault()}}),document.addEventListener("mousemove",function(t){if(d){var l=s+(t.clientX-n),o=i+(t.clientY-a);e.style.left=Math.max(0,Math.min(l,window.innerWidth-e.offsetWidth))+"px",e.style.top=Math.max(0,Math.min(o,window.innerHeight-e.offsetHeight))+"px"}}),document.addEventListener("mouseup",function(){d&&(d=!1,t.style.cursor="grab")})}}(y),P(a,!0===$._opts.isAnonymous),function(e,n){var a=e.querySelector("#zasdkIncludeLogToggle"),s=e.querySelector("#zasdkIncludeDiagToggle"),i=e.querySelector(".zasdk-toggles-section"),d=e.querySelector(".zasdk-toggle-separator"),l=e.querySelector("#zasdkViewLogsBtn"),o=e.querySelector("#zasdkViewDiagBtn"),r=e.querySelector("#zasdkViewerClose"),c=e.querySelector("#zasdkDataViewer");if(a&&s&&i){var u=a.closest(".zasdk-toggle-row"),p=s.closest(".zasdk-toggle-row");R.includeLog=!0===n.includeLog||void 0,R.includeDyninfo=!0===n.includeDyninfo||void 0,i.style.display="none",Promise.all([F(),S()]).then(function([e,t]){u&&(u.style.display=e?"":"none"),p&&(p.style.display=t?"":"none"),d&&(d.style.display=e&&t?"":"none"),i.style.display=e||t?"":"none",a.checked=!0===n.includeLog||e,s.checked=!0===n.includeDyninfo||t,R.includeLog=a.checked,R.includeDyninfo=s.checked}).catch(function(e){t.warn("apptics: could not read the stored logs: "+String(e))}),a.addEventListener("change",function(){R.includeLog=a.checked}),s.addEventListener("change",function(){R.includeDyninfo=s.checked}),l&&l.addEventListener("click",function(){_().then(function(t){N(e,"System Logs",t)})}),o&&o.addEventListener("click",function(){L().then(function(t){N(e,"Diagnostic Information",t)})}),r&&c&&r.addEventListener("click",function(){c.style.display="none"})}}(a,$._opts),$.isScaled=!1,$.isHidden=!1,document.removeEventListener("quartz-feedback-state",$.bindQuartzEvent),document.addEventListener("quartz-feedback-state",$.bindQuartzEvent),document.removeEventListener("quartz-feedback-error",$.handleErrorQuartzEvent),document.addEventListener("quartz-feedback-error",$.handleErrorQuartzEvent);var w=Q()&&!n(r)&&!n(l)&&"-"!==l&&!n(o)&&"-"!==o;if(a.querySelector("#zasdkreccheckcnt").style.display=w?"block":"none",y.addEventListener("transitionend",function(e){"transform"===e.propertyName&&$.isScaled&&$.toggleWindowAnimation()}),p.onclick=function(e){e.stopImmediatePropagation();let t={workspaceLinkName:l,departmentLinkName:o,recordingDomain:r};$.handleStatusmsg(),Q()?n(l)||n(o)||n(r)?$.handleStatusmsg(!1,"Screen recording is not configured for this app."):j().startRecording(t):$.handleStatusmsg(!1,"Screen recording is unavailable on this page.")},c.onclick=function(){$.close()},z.addEventListener("click",function(){j().previewVideo()}),g.addEventListener("click",function(){j().editVideo({quartzBranding:!1})}),h.addEventListener("click",function(){var e=document.getElementById("zasdkFeedbackModal");j().clearFeedback(),f.checked=!1,m.classList.remove("zasdkqz-show"),e.querySelector("#editRecordedVideo").style.display="none",e.querySelector("#zasdkreccheckcnt").style.display="block",$.validateFeedbackField()}),k.addEventListener("click",async()=>{$.validateFeedbackField(),k.disabled=!0,v.classList.add("zasdkbtndisabled"),k.value="";try{let e=a.querySelector("#previewVideoElemId");if(e&&null!==e.offsetParent)$.submitRecording();else{let e=a.querySelector("#zasdkDescription").value.trim();e.length>0?W(G(a,e,"")):$.handleStatusmsg(!1,"Please provide more details for us to help you better.")}}catch(e){t.error("sendFeedbackData : "+e)}}),f.addEventListener("change",function(){this.checked?m.classList.add("zasdkqz-show"):m.classList.remove("zasdkqz-show")}),b.addEventListener("input",$.validateFeedbackField),u.forEach(function(e){e.addEventListener("click",function(){u.forEach(function(e){e.classList.remove("zasdk-selected")}),this.classList.add("zasdk-selected")})}),"number"==typeof $._opts.type){var E=Object.keys($.typeObj).filter(function(e){return $.typeObj[e]===$._opts.type})[0],q=E?a.querySelector('.zasdk-feedback-type[data-type="'+E+'"]'):null;q&&(u.forEach(function(e){e.classList.remove("zasdk-selected")}),q.classList.add("zasdk-selected"))}n($._opts.message)||(b.value=String($._opts.message),$.updateLeftCount(),$.validateFeedbackField()),$.selectedFiles=K(),$.fileInput.onchange=function(){const e=this;var t=$.selectedFiles;if(null!==t){if(t.files.length+e.files.length>5)return $.handleStatusmsg(!1,"Maximum 5 attachments is allowed"),$.fileInput.files=t.files,void(e.files=t.files);if(e.files.length>0){let n=0;for(let a of e.files){if(n+=a.size,n>10485760)return $.handleStatusmsg(!1,"Maximum limit reached. The total file size cannot exceed 10MB."),void(e.files=t.files);t.items.add(a)}e.files=t.files,$.fileAttachment()}else t.files.length>0&&(e.files=t.files)}},$.handleStatusmsg(),$.updateLeftCount()},updateLeftCount:function(){document.querySelectorAll("[reqname]").forEach(function(e){let t=e.value,n=parseInt(e.getAttribute("maxlength")||"",10),a=e.parentElement?e.parentElement.querySelector(".zaleftcharcnt"):null;a&&(a.textContent=String(n-t.length))})},handleStatusmsg:function(e,t){var a=document.getElementById("zasdkFeedbackModal");if(!n(a)){var s=a.querySelector("#zasdksubmitstatus"),i=a.querySelector("#zasdk_submit_btn"),d=a.querySelector("#zasdk_submit_btnsubcnt"),l="",o="";s.style.display="none",n(e)||(l=e?"zasdkstssucs":"zasdkstserror",o=n(t)?"":t,s.textContent=o,s.classList.add(l),s.style.display="block",d.classList.remove("zasdkbtndisabled"),i.disabled=!1,i.value="Send")}},handleErrorQuartzEvent:function(e){let t=e.detail.error.name,n=e.detail.error.message;t!=U().ErrorType.RECORDING_INTERRUPTED&&t!=U().ErrorType.FEEDBACK_TIMEOUT||$.stopRecording(),$.handleStatusmsg(!1,n)},bindQuartzEvent:function(e){if(e.detail.feedbackState==U().FeedbackState.RECORDING_IN_PROGRESS){var t=document.getElementById("zasdkrectimer");n(t)||t.remove();const e=document.createElement("div");e.innerHTML=$.timerHtml;const a=e.firstElementChild;document.body.appendChild(a);t=document.getElementById("zasdkrectimer");$.timerDisplay=t.querySelector("#zasdkTimerDisplay"),$.recordButton=t,$.TOTAL_TIME=300,$.remainingTime=$.TOTAL_TIME,$.isRecording=!0,$.recordButton.addEventListener("click",$.toggleRecording),$.startRecording(),$.toggleWindowAnimation()}},close:function(){var e=document.getElementById("zasdkFeedbackModal");document.removeEventListener("quartz-feedback-state",$.bindQuartzEvent),j().clearFeedback(),n(e)||e.remove()},toggleWindowAnimation:function(){var e=document.getElementById("zasdkFeedbackModal");const t=e.querySelector("#zasdkFeedbackconatiner");$.isHidden?(e.style.display="block",setTimeout(()=>{t.style.transform="scale(1)",$.validateFeedbackField()},10),$.isHidden=!1,$.isScaled=!1):$.isScaled?(e.style.display="none",$.isHidden=!0):(t.style.transform="scale(0)",$.isScaled=!0)},fileAttachment:function(){var e=$.fileInput.files;$.uploadTotalSize=0,$.MaxFileSize=10485760;var t=document.getElementById("zasdkFeedbackModal"),n=t.querySelector("#zasdkfilesizeinfo"),a=t.querySelector("#zasakfileList");if(n.textContent="",e.length>5)return $.fileLimitExceeded(!1,!0),void $.validateFeedbackField();if(a.innerHTML="",e.length>0){for(var s=0,i=0;i<e.length;i++){var d=e[i].name,l=d.substring(0,d.lastIndexOf(".")),o=d.substring(d.lastIndexOf(".")+1);s+=e[i].size;var r=$.elementCreator("li");r.title=d;var c=$.elementCreator("span");c.className="zaskFdBckFlName",c.innerText=l.length>10?l.slice(0,3)+"..."+l.slice(-3):l;var u=$.elementCreator("span");u.innerText="."+o;var p=$.elementCreator("span");p.className="zasdkFdBckFlCls",p.setAttribute("data-name",d),p.innerHTML="×",r.appendChild(c),r.appendChild(u),r.appendChild(p),a.appendChild(r)}var k=s>$.MaxFileSize;$.fileLimitExceeded(k),n.textContent=`${$.formatFileSize(s)} Used / 10 MB`;const v=t.querySelectorAll(".zasdkFdBckFlCls");Array.from(v).forEach(function(e){e.addEventListener("click",function(){$.handleStatusmsg(),$.removeFileFromList(this),$.fileAttachment()})})}$.validateFeedbackField()},elementCreator:function(e){return document.createElement(e)},fileLimitExceeded:function(e,t){var n="";(t||e)&&(n=t?"Maximum 5 attachments is allowed":"Maximum limit reached. The total file size cannot exceed 10MB."),$.handleStatusmsg(!1,n)},removeFileFromList:function(e){e.getAttribute("data-name");const t=e.parentElement,n=Array.from(t.parentElement.children).indexOf(t);t.remove();let a=K();if($.selectedFiles=K(),null!==a&&null!==$.selectedFiles){for(let e=0;e<$.fileInput.files.length;e++)e!==n&&(a.items.add($.fileInput.files[e]),$.selectedFiles.items.add($.fileInput.files[e]));$.fileInput.files=a.files}},formatFileSize:function(e){if(0===e)return"0 KB";const t=1024,n=e/t,a=e/(t*t),s=e/(t*t*t);return s>=1?s.toFixed(2)+" GB":a>=1?a.toFixed(2)+" MB":n.toFixed(2)+" KB"},toggleRecording:function(){$.isRecording=!$.isRecording,$.isRecording?$.startRecording():$.stopRecording()},startRecording:function(){$.timerInterval||($.timerInterval=setInterval($.updateTimer,1e3))},stopRecording:function(){var e=document.getElementById("zasdkFeedbackModal");clearInterval($.timerInterval||void 0),$.timerInterval=null,document.querySelector("#zasdkrectimer").remove(),$.toggleWindowAnimation(),e.querySelector("#editRecordedVideo").style.display="block",e.querySelector("#zasdkreccheckcnt").style.display="none";let t=e.querySelector("#previewVideoElemId");j().endRecording(),j().setVideoContent(t)},submitRecording:function(){var e=document.getElementById("zasdkFeedbackModal");let a=Z.anonymous?"":String(Z.userid||""),s=n(i._user_info.userid)?"":String(i._user_info.userid),d=n(a)?s:a,l=e.querySelector("#zasdkDescription").value.trim()||"-";d=/^[\w]([\w\-\.\+\'=]*)@([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,22}$/.test(d)&&g()==h.USAGE_TRACKING_WITH_PII?d:"user@example.com",j().submitRecording({email:d,subject:l}).then(t=>{var n=!y(t)&&t&&t.hasOwnProperty("feedbackLink")&&t.feedbackLink||"";W(G(e,l,n))}).catch(e=>{t.error("submitRecording : "+e),$.handleStatusmsg(!1,"Could not upload the recording. Please try again.")})},updateTimer:function(){$.remainingTime>0?($.remainingTime--,$.updateDisplay()):$.stopRecording()},updateDisplay:function(){const e=Math.floor($.remainingTime/60),t=$.remainingTime%60;$.timerDisplay.textContent=`${e.toString().padStart(2,"0")}:${t.toString().padStart(2,"0")}`},validateFeedbackField:function(){$.updateLeftCount();var e=document.getElementById("zasdkFeedbackModal");const t=e.querySelector("#zasdkDescription"),n=e.querySelector("#zasdkFileInput"),a=e.querySelector("#previewVideoElemId"),s=e.querySelector("#zasdk_submit_btn"),i=t&&""!==t.value.trim()&&t.value.trim().length>0;n&&n.files&&n.files.length,a&&a.offsetParent;const d=e.querySelectorAll(".zasdkmaxerror");!($.getVisibleErrorCount(d)>0)&&i?(s.classList.remove("zasdkbtndisableclr"),$.handleStatusmsg()):s.classList.add("zasdkbtndisableclr")},getVisibleErrorCount:function(e){return Array.from(e).filter(e=>null!==e.offsetParent).length}},J=b("feedbackOpen",function(e,t,n,a,s,i,d){const l={includeLog:!0===n,includeDyninfo:!0===a,isAnonymous:!0===d};"number"==typeof e&&(l.type=e),"string"==typeof t&&t.length>0&&(l.message=t),s&&s.length>0&&(l.attachments=s),i&&i.length>0&&(l.logFiles=i),$.init(l)}),Y=b("feedbackClose",function(){$.close()}),X=b("sendFeedback",function(...e){return M().then(function(t){if(!t)throw new Error("apptics.sendFeedback: not sent, the SDK has not started; call init() first");return function(e,t,a,s,i,d){return W({type:n(e)?1:e,message:t||"",attachment:a||null,logsFiles:s||null,includeDyninfo:i,includeLog:d,quartzid:""}).then(function(e){if(!e)throw new Error("apptics.sendFeedback: not sent, the browser is offline or Apptics is disabled for this client");if(!e.ok)throw new Error("apptics.sendFeedback: not sent, "+e.message)})}(...e)}).catch(function(e){throw t.error("apptics.sendFeedback failed:",e),e})}),ee={feedbackOpen:J,feedbackClose:Y,sendFeedback:X};!function(e){try{if(!e||"undefined"==typeof document)return;for(var t=new URL("style.css",e).href,n=document.querySelectorAll('link[rel="stylesheet"]'),a=0;a<n.length;a++)if(n[a].href===t)return;var s=document.createElement("link");s.rel="stylesheet",s.href=t,s.setAttribute("data-apptics","style"),(document.head||document.documentElement).appendChild(s)}catch(e){}}(import.meta.url);export{ee as default,Y as feedbackClose,J as feedbackOpen,X as sendFeedback};
|
|
3
|
+
//# sourceMappingURL=feedback.esm.min.js.map
|