@auxilium/datalynk-client 1.3.3 → 1.3.5

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/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # Datalynk Client Library
2
2
 
3
- [![pipeline status](https://gitlab.auxiliumgroup.com/auxilium/datalynk/datalynk-client/badges/master/pipeline.svg)](https://gitlab.auxiliumgroup.com/ztimson/datalynk-client/pipelines)
3
+ [![pipeline status](https://gitlab.auxiliumgroup.com/auxilium/datalynk/datalynk-client/badges/master/pipeline.svg)](https://gitlab.auxiliumgroup.com/auxilium/datalynk/datalynk-client/-/commits/master)
4
+ [![Latest Release](https://gitlab.auxiliumgroup.com/auxilium/datalynk/datalynk-client/-/badges/release.svg)](https://gitlab.auxiliumgroup.com/auxilium/datalynk/datalynk-client/-/releases)
4
5
 
5
6
  ---
6
7
 
@@ -8,18 +9,22 @@ Datalynk client library to integrate JavaScript clients with the Datalynk API.
8
9
 
9
10
  ## Table of Contents
10
11
  - [Datalynk Client Library](#datalynk-client-library)
11
- - [Table of Contents](#Table-of-Contents)
12
+ - [Table of Contents](#table-of-contents)
12
13
  - [Quick Start](#quick-start)
13
- - [Documentation](#documentation)
14
- - [API Documentation](https://datalynk-client.scarborough.auxilium.world)
14
+ - [API Documentation](https://datalynk-client.scarborough.auxilium.world)
15
+ - [Cheatsheet](#cheatsheet)
15
16
  - [Integration](#integration)
16
- - [Angular](#integration)
17
- - [Node / Vue](#integration)
18
- - [Vanalia JS](#integration)
17
+ - [Angular](#angular)
18
+ - [Node / Vue](#node--vue)
19
+ - [Vanilla JS](#vanilla-js)
19
20
  - [Build Models](#build-models)
21
+ - [Api Requests](#api-requests)
20
22
  - [Authentication](#authentication)
21
- - [Slice Engine](#slice-engine)
23
+ - [Offline / PWA](#)
24
+ - [Slice Engine](#slices)
22
25
  - [Sockets](#sockets)
26
+ - [Uploads](#uploads)
27
+ - [WebRTC](#webrtc)
23
28
 
24
29
  ## Quick Start
25
30
  1. Install the client library
@@ -44,9 +49,9 @@ const api = new API('https://spoke.auxiliumgroup.com');
44
49
  const resp = await api.request({'$/auth/current':{}});
45
50
  ```
46
51
 
47
- ## Documentation
52
+ ## [API Documentation](https://datalynk-client.scarborough.auxilium.world)
48
53
 
49
- [Full API Documentation](https://datalynk-client.scarborough.auxilium.world)
54
+ ## Cheatsheet
50
55
 
51
56
  <details>
52
57
  <summary>
@@ -110,7 +115,7 @@ api.auth.handleLogin('spoke', {/* login UI options */});
110
115
  export const contacts = api.slice<Contact>(Slices.Contact);
111
116
  ```
112
117
 
113
- #### Vanilia JS
118
+ #### Vanilla JS
114
119
 
115
120
  **File:** `/index.html`
116
121
 
@@ -127,7 +132,6 @@ export const contacts = api.slice<Contact>(Slices.Contact);
127
132
  // Create store to cache slice data
128
133
  var contacts = api.slice(12345);
129
134
  </script>
130
-
131
135
  ```
132
136
 
133
137
  </details>
@@ -164,49 +168,90 @@ const contacts: Contact[] = await api.slice<Contact>(Slices.Contact)
164
168
 
165
169
  <details>
166
170
  <summary>
167
- <h3 id="authentication" style="display: inline">Authentication</h3>
171
+ <h3 id="api-requests" style="display: inline">Api Requests</h3>
168
172
  </summary>
169
173
 
170
- #### Guest
174
+ #### Api Request
171
175
 
172
- Login as the guest account
176
+ Raw requests can be made using request
173
177
 
174
178
  ```js
175
- const guest = await api.auth.loginGuest();
176
- console.log(api.auth.isGuest()) // True
179
+ const response = await api.request({...});
180
+ ```
181
+
182
+ #### Chain Map
183
+
184
+ Multiple results can be returned together as dictionary
185
+
186
+ ```js
187
+ const {user, report} = await api.chainMap({
188
+ user: {'$/auth/current': {}},
189
+ report: api.slice(52131).select().rows()
190
+ });
191
+ ```
192
+
193
+ #### Chain Requests
194
+
195
+ Multiple requests can be chained together to run them in order. The last request's response will be returned
196
+
197
+ ```js
198
+ const report = await api.chain({'$/auth/current': {}}, api.slice(12345).select().rows());
177
199
  ```
200
+ </details>
178
201
 
179
- #### Login flow
202
+ <details>
203
+ <summary>
204
+ <h3 id="authentication" style="display: inline">Authentication</h3>
205
+ </summary>
180
206
 
181
- This library comes with some logic to automatically handle the login flow & should be called at the startup of your application:
207
+ #### Default Flow
208
+
209
+ 99% of the time you will want to let the library handle the login flow:
182
210
 
183
211
  1. It will check the URL for a token param: `?datalynkToken=...`
184
212
  2. It will check the localStorage for a saved token
185
213
  3. It will prompt the user to login via UI
186
- 4. Reload page if token changed
214
+ 4. Lastly it will, reload page if the token changed
187
215
 
188
216
  ```js
189
- await api.auth.handleLogin('spoke', {
190
- background: 'url("...")', // CSS URL or hex color
191
- color: '#ff0000', // hex color
192
- title: '<img alt="logo" src="..." />', // text or HTML
193
- textColor: '#ffffff' // Color of title text
194
- });
217
+ await api.auth.handleLogin('spoke', {/* Login UI Options */});
218
+ ```
219
+
220
+ #### Fetch User
221
+
222
+ ```js
223
+ api.auth.user
224
+ ```
225
+
226
+ #### Guest Login
227
+
228
+ Login as the guest account:
229
+
230
+ ```js
231
+ const guest = await api.auth.loginGuest();
232
+ console.log(api.auth.isGuest()) // True
195
233
  ```
196
234
 
197
235
  #### Login UI
198
236
 
199
- Alternatively you can manage the login prompt manually:
237
+ Prompt the user to login with the login page, defaults come from the clients [theme.json](https://sintmaarten.auxiliumgroup.com/static/js/auxilium/dijits/templates/login/sandbox/theme.json) file:
200
238
 
201
239
  ```js
202
- const prompt = api.auth.loginPrompt('spoke', options);
240
+ const prompt = api.auth.loginPrompt('spoke', {
241
+ // Overrides theme.json
242
+ title: "Title of App",
243
+ logoPosition: "aboveTitle",
244
+ subtitle: "Subtitle of App",
245
+ });
203
246
  await prompt.wait; // Wait for the user to login/close the prompt
204
247
  prompt.close(); // Close prompt manually
205
248
  ```
206
249
 
207
- #### Programatically
250
+ [Full list of options](https://datalynk-client.scarborough.auxilium.world/types/login-prompt.LoginPromptOptions.html)
208
251
 
209
- Manually login programmatically:
252
+ #### Manual Login
253
+
254
+ Login programmatically:
210
255
 
211
256
  ```js
212
257
  const user = await api.auth.login('spoke', 'username', 'password', '2faCode');
@@ -216,24 +261,35 @@ const user = await api.auth.login('spoke', 'username', 'password', '2faCode');
216
261
 
217
262
  <details>
218
263
  <summary>
219
- <h3 id="chain" style="display: inline">Chain Requests</h3>
264
+ <h3 id="pwa" style="display: inline">Offline / PWA</h3>
220
265
  </summary>
221
266
 
222
- Multiple requests can be chained together to run them in order. The last request's response will be returned
267
+ Webpages can be made availible offline using Progressive Web Apps + Service Workers.
223
268
 
224
- ```js
225
- const report = await api.chain({'$/auth/current': {}}, api.slice(12345).select().rows());
226
- ```
269
+ You must fetch user information from `api.auth.user` & use the slice engine to fetch data `api.slice(...)`; custom `api.requests({...})` calls wont work.
227
270
 
228
- All results can be returned together by using the `chainMap`
271
+ #### Setup
229
272
 
230
- ```js
231
- const {user, report} = await api.chainMap({
232
- user: {'$/auth/current': {}},
233
- report: api.slice(52131).select().rows()
273
+ 1. Upload the [service worker](https://datalynk-client.scarborough.auxilium.world/dist/service.worker.mjs) `dist/service.worker.mjs` to the *root* directory of the server
274
+
275
+ 2. Configure the API:
276
+ ```ts
277
+ const api = new Api(`https://${spoke}.auxiliumgroup.com`, {
278
+ name: "Workplace Occupational Health & Safety Inspection", // REQUIRED: App name
279
+ offline: [51306, 51531, 51563], // REQUIRED: Specify slices that must be stored offline
280
+ manifest: { scope: 'https://lynk-forms.scarborough.auxilium.world/OshawaCL/ohsinspection.html' }, // Any manifest overrides suck as PWA "scope"
281
+ pwaSettings: { // PWA install prompt settings
282
+ timeout: 45, // seconds before prompt shows (default: 30)
283
+ dismissExpiry: 3, // days before prompt shows again (0 = every refresh, default: 7)
284
+ loginLink: true // Show install link in login screen
285
+ },
286
+ serviceWorker: 'https://.../service.worker.mjs', // Override service worker URL, must be on same domain (Step 1)
287
+ socket: true // Make sure sockets are enabled
234
288
  });
235
- ```
236
289
 
290
+ // Manually trigger prompt
291
+ api.pwa.prompt();
292
+ ```
237
293
  </details>
238
294
 
239
295
  <details>
@@ -241,7 +297,7 @@ const {user, report} = await api.chainMap({
241
297
  <h3 id="slices" style="display: inline">Slice Engine</h3>
242
298
  </summary>
243
299
 
244
- This library comes with LINQ style query language to help make interacting with Slices easier by providing types & intelisense.
300
+ This library comes with LINQ style query language to help make interacting with slices easier by providing types & intellisense.
245
301
 
246
302
  #### Select
247
303
 
@@ -331,14 +387,12 @@ await api.slice(12345)
331
387
  <h3 id="sockets" style="display: inline">Sockets</h3>
332
388
  </summary>
333
389
 
334
-
335
- #### Options
336
-
337
- The socket can have it's endpoint override or be turned off by setting it to false:
390
+ Sockets (enabled by default) can be turned off or configured to point to a custom URL
338
391
  ```ts
339
392
  const api = new Api('https://spoke.auxiliumgroup.com', {
340
- socket: false, // Disable
341
- // socket: 'http://localhost:3000', // Override
393
+ socket: true, // Enable - Use default URL
394
+ // socket: false, // Disable
395
+ // socket: 'http://localhost:3000', // Enable - Custom socket server URL
342
396
  });
343
397
  ```
344
398
 
@@ -378,11 +432,14 @@ api.socket.addListener(callbackFn(event)); // listen to all socket events
378
432
  <h3 id="uploads" style="display: inline">Uploads</h3>
379
433
  </summary>
380
434
 
381
- A file URL can be created from the file ID
435
+ #### Fetch File
436
+
382
437
  ```js
383
438
  const url = api.files.get(12345);
384
439
  ```
385
440
 
441
+ #### Upload File
442
+
386
443
  Uploading files to datalynk is done by first uploading the file as form-data & then creating a reference to the upload ID in a slice.
387
444
 
388
445
  ```js
package/dist/api.d.ts CHANGED
@@ -35,6 +35,8 @@ export type ApiOptions = {
35
35
  name?: string;
36
36
  /** List of slices to use offline */
37
37
  offline?: number[];
38
+ /** Display an offline banner */
39
+ offlineBanner?: boolean | 'top' | 'bottom';
38
40
  /** Website hostname */
39
41
  origin?: string;
40
42
  /** Save session token to localStorage to persist logins */
@@ -97,6 +99,8 @@ export declare class Api {
97
99
  private bundle;
98
100
  /** Bundle lifecycle tracking */
99
101
  private bundleOngoing;
102
+ /** Track online state */
103
+ private heartbeat;
100
104
  /** LocalStorage key for persisting logins */
101
105
  private localStorageKey;
102
106
  /** Pending requests cache */
@@ -126,10 +130,17 @@ export declare class Api {
126
130
  url: string;
127
131
  /** Client library version */
128
132
  version: string;
129
- /** Get session info from JWT payload */
130
- get jwtPayload(): JwtPayload | null;
131
133
  /** Is token expired */
132
134
  get expired(): boolean;
135
+ /** Get session info from JWT payload */
136
+ get jwtPayload(): JwtPayload | null;
137
+ private onlineOverride;
138
+ private _online;
139
+ /** Check if we are connected */
140
+ get online(): boolean | null;
141
+ get offline(): boolean;
142
+ /** Override connection status */
143
+ set online(value: boolean | null);
133
144
  /** Logged in spoke */
134
145
  get spoke(): string;
135
146
  /** API Session token */
@@ -149,6 +160,10 @@ export declare class Api {
149
160
  */
150
161
  constructor(origin: string, options?: ApiOptions);
151
162
  private _request;
163
+ private checkConnection;
164
+ private offlineBanner;
165
+ private startHeartbeat;
166
+ private stopHeartbeat;
152
167
  /**
153
168
  * Get list of slices
154
169
  * @return {Promise<number[]>}
package/dist/api.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}