@tagsamurai/gsts-api-services 2.0.1-alpha.1 → 2.0.1-alpha.3

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.
@@ -1,34 +1,34 @@
1
1
  import _ from "axios";
2
- const E = { BASE_URL: "/", DEV: !1, MODE: "production", PROD: !0, SSR: !1, VITE_APP_GLOBAL_SETTINGS_API: "https://dev-api.global-settings.tagsamurai.com", VITE_APP_IMAGE_BASE_URL: "https://dev-api.tagsamurai.com/fam/utility/v2/files", VITE_APP_LOGS_NOTIFICATION_API: "https://dev-api-logs-notification.tagsamurai.com", VITE_APP_TAGSAMURAI_API: "https://dev-api.tagsamurai.com" }, T = (t = "APP_TAGSAMURAI_API") => E["VITE_" + t], a = (t = {}, e = !1) => {
2
+ const E = { BASE_URL: "/", DEV: !1, MODE: "production", PROD: !0, SSR: !1, VITE_APP_GLOBAL_SETTINGS_API: "https://dev-api.global-settings.tagsamurai.com", VITE_APP_IMAGE_BASE_URL: "https://dev-api.tagsamurai.com/fam/utility/v2/files", VITE_APP_LOGS_NOTIFICATION_API: "https://dev-api-logs-notification.tagsamurai.com", VITE_APP_TAGSAMURAI_API: "https://dev-api.tagsamurai.com" }, b = (t = "APP_TAGSAMURAI_API") => E["VITE_" + t], i = (t = {}, e = !1) => {
3
3
  const {
4
4
  env: r = "APP_GLOBAL_SETTINGS_API",
5
5
  prefix: s = "",
6
- headers: i = {},
6
+ headers: a = {},
7
7
  ...p
8
- } = t, y = "".concat(T(r)).concat(s), A = _.create({
8
+ } = t, y = "".concat(b(r)).concat(s), f = _.create({
9
9
  ...p,
10
10
  baseURL: y,
11
- headers: e ? i : {
11
+ headers: e ? a : {
12
12
  "Content-Type": "application/json",
13
- ...i
13
+ ...a
14
14
  }
15
15
  });
16
- return A.interceptors.request.use((v) => {
17
- var f, $, S;
18
- const P = JSON.parse((f = localStorage.getItem("user")) != null ? f : "{}"), O = (S = ($ = P.jwt) != null ? $ : P.token) != null ? S : "";
16
+ return f.interceptors.request.use((v) => {
17
+ var h, S, $;
18
+ const P = JSON.parse((h = localStorage.getItem("user")) != null ? h : "{}"), O = ($ = (S = P.jwt) != null ? S : P.token) != null ? $ : "";
19
19
  return v.headers.Authorization = "Bearer ".concat(O), v;
20
- }), A;
21
- }, u = a({
20
+ }), f;
21
+ }, u = i({
22
22
  prefix: "/v1/global-settings/auth"
23
- }), b = (t) => {
24
- var e, r, s, i;
25
- return ((e = t.response) == null ? void 0 : e.status) === 401 || ((r = t.response) == null ? void 0 : r.status) === 500 || ((i = (s = t.response) == null ? void 0 : s.data) == null ? void 0 : i.message) === "jwt malformed" ? (window.onblur = null, window.onfocus = null, window.sessionExpired = !0, window.dispatchEvent(new CustomEvent("user:expired"))) : Promise.reject(t);
26
- }, x = {
23
+ }), w = (t) => {
24
+ var e, r, s, a;
25
+ return ((e = t.response) == null ? void 0 : e.status) === 401 || ((r = t.response) == null ? void 0 : r.status) === 500 || ((a = (s = t.response) == null ? void 0 : s.data) == null ? void 0 : a.message) === "jwt malformed" ? (window.onblur = null, window.onfocus = null, window.sessionExpired = !0, window.dispatchEvent(new CustomEvent("user:expired"))) : Promise.reject(t);
26
+ }, B = {
27
27
  login: (t) => {
28
28
  const e = { ...t, isMobile: !1 };
29
29
  return u.post("/login", e);
30
30
  },
31
- reLogin: (t) => (u.interceptors.response.use((e) => e, b), u.post("/login", t)),
31
+ reLogin: (t) => (u.interceptors.response.use((e) => e, w), u.post("/login", t)),
32
32
  requestOTP: (t) => {
33
33
  const e = { email: t };
34
34
  return u.post("/request-otp", e);
@@ -49,19 +49,19 @@ const E = { BASE_URL: "/", DEV: !1, MODE: "production", PROD: !0, SSR: !1, VITE_
49
49
  * @deprecated use postLogout instead
50
50
  */
51
51
  logout: () => u.post("/logout")
52
- }, h = (t, e, r) => {
53
- const s = new URL(T("APP_TAGSAMURAI_API") || "").origin;
54
- let i = t.startsWith("http") ? t : "".concat(s, "/file-storage/api/file/").concat(t.replace(/^\/+/, ""));
52
+ }, L = (t, e, r) => {
53
+ const s = new URL(b("APP_TAGSAMURAI_API") || "").origin;
54
+ let a = t.startsWith("http") ? t : "".concat(s, "/file-storage/api/file/").concat(t.replace(/^\/+/, ""));
55
55
  if (e || r) {
56
56
  const p = new URLSearchParams();
57
- e && (p.set("width", e.toString()), p.set("height", (r == null ? void 0 : r.toString()) || e.toString())), i += "?".concat(p.toString());
57
+ e && (p.set("width", e.toString()), p.set("height", (r == null ? void 0 : r.toString()) || e.toString())), a += "?".concat(p.toString());
58
58
  }
59
- return i;
60
- }, L = () => {
59
+ return a;
60
+ }, R = () => {
61
61
  var e, r, s;
62
62
  const t = JSON.parse((e = localStorage.getItem("user")) != null ? e : "{}");
63
63
  return (s = (r = t.jwt) != null ? r : t.token) != null ? s : "";
64
- }, R = async (t, e) => {
64
+ }, G = async (t, e) => {
65
65
  const r = await fetch(t, {
66
66
  headers: {
67
67
  Authorization: "Bearer ".concat(e)
@@ -73,18 +73,18 @@ const E = { BASE_URL: "/", DEV: !1, MODE: "production", PROD: !0, SSR: !1, VITE_
73
73
  return new Blob([s], {
74
74
  type: r.headers.get("Content-Type") || "image/webp"
75
75
  });
76
- }, w = async (t) => {
76
+ }, U = async (t) => {
77
77
  try {
78
- const e = L(), r = await R(t, e);
78
+ const e = R(), r = await G(t, e);
79
79
  return URL.createObjectURL(r);
80
80
  } catch (e) {
81
81
  return;
82
82
  }
83
- }, C = async (t, e, r, s) => {
83
+ }, k = async (t, e, r, s) => {
84
84
  if (!t) return;
85
- const i = h(t, e, r);
86
- return s ? i : w(i);
87
- }, N = (t) => {
85
+ const a = L(t, e, r);
86
+ return s ? a : U(a);
87
+ }, j = (t) => {
88
88
  if (!t || typeof t == "string")
89
89
  return;
90
90
  const e = {};
@@ -95,25 +95,42 @@ const E = { BASE_URL: "/", DEV: !1, MODE: "production", PROD: !0, SSR: !1, VITE_
95
95
  [r]: t[r]
96
96
  });
97
97
  }), e;
98
- }, I = a({
98
+ }, x = (t) => {
99
+ if (typeof t != "string") return !1;
100
+ const e = t.trim();
101
+ if (!e) return !1;
102
+ try {
103
+ return JSON.parse(e), !0;
104
+ } catch (r) {
105
+ return !1;
106
+ }
107
+ }, T = (t) => {
108
+ if (!t)
109
+ return {};
110
+ const e = {};
111
+ return Object.keys(t).forEach((r) => {
112
+ const s = t[r];
113
+ e[r] = x(s) ? JSON.parse(s.trim()) : s;
114
+ }), e;
115
+ }, m = i({
99
116
  prefix: "/v1/global-settings/change-log"
100
- }), k = {
101
- getChangelogs: (t) => I.get("", { params: t }),
102
- getChangelogOptions: (t) => I.get("/options", { params: t })
103
- }, c = a({
117
+ }), J = {
118
+ getChangelogs: (t) => m.get("", { params: t }),
119
+ getChangelogOptions: (t) => m.get("/options", { params: t })
120
+ }, l = i({
104
121
  prefix: "/v1/global-settings/division"
105
- }), B = {
106
- getDivisions: (t) => c.get("", { params: t }),
107
- getDivisionDetail: (t) => c.get("/".concat(t)),
108
- postCreateDivision: (t) => c.post("/", t),
109
- putEditDivision: (t, e) => c.put("/".concat(t), e),
122
+ }), M = {
123
+ getDivisions: (t) => l.get("", { params: t }),
124
+ getDivisionDetail: (t) => l.get("/".concat(t)),
125
+ postCreateDivision: (t) => l.post("/", t),
126
+ putEditDivision: (t, e) => l.put("/".concat(t), e),
110
127
  deleteDivisions: (t) => {
111
128
  const e = { id: JSON.stringify(t) };
112
- return c.delete("", { params: e });
129
+ return l.delete("", { params: e });
113
130
  }
114
- }, g = a({
131
+ }, g = i({
115
132
  prefix: "/v1/global-settings"
116
- }), j = {
133
+ }), H = {
117
134
  getTAGAllPaired: (t, e) => g.get("/".concat(t), { params: e }),
118
135
  getTAGAllPairedOptions: (t, e) => g.get("/".concat(t, "/options"), { params: e }),
119
136
  getTAGNotPaired: (t, e) => g.get("/".concat(t, "/not-paired"), { params: e }),
@@ -123,25 +140,38 @@ const E = { BASE_URL: "/", DEV: !1, MODE: "production", PROD: !0, SSR: !1, VITE_
123
140
  putAuditTAG: (t, e) => g.put("/".concat(t, "/audit"), e),
124
141
  putAllocateTAG: (t, e) => g.put("/".concat(t, "/allocate"), e),
125
142
  putCombineTAG: (t) => g.put("/combine", t)
126
- }, n = a({
127
- prefix: "/v1/global-settings"
128
- }), M = {
129
- getHandheldReader: (t) => n.get("/reader", { params: t }),
130
- getHandheldReaderDetail: (t) => n.get("/reader/".concat(t)),
131
- getHandheldReaderOptions: (t) => n.get("/reader/options", { params: t }),
132
- putMarkHandheldStatus: (t) => n.put("/reader/mark-status", t),
143
+ }, n = i({
144
+ prefix: "/v2/hardware-tagging"
145
+ }), V = {
146
+ getHandheldReader: (t) => {
147
+ const e = T(t);
148
+ return n.post("/handheld-reader/list", e);
149
+ },
150
+ getHandheldReaderDetail: (t) => n.get("/handheld-reader/".concat(t)),
151
+ getHandheldReaderOptions: (t) => {
152
+ const e = T(t);
153
+ return n.post("/handheld-reader/options", e);
154
+ },
155
+ putMarkHandheldStatus: (t) => n.patch("/handheld-reader/status", t),
133
156
  putPingReaders: (t) => n.put("/iot-reader/ping", t),
134
157
  putMarkIOTStatus: (t, e) => n.put("/".concat(e, "/mark-status"), t),
135
- putEditReaderGroup: (t, e, r) => n.put(
136
- "/".concat(t === "iot" ? "iot-" : "", "reader/").concat(r, "/set-group"),
158
+ putEditReaderGroup: (t, e, r) => n.patch(
159
+ "/".concat(t === "iot" ? "iot-" : "handheld-", "reader/").concat(r, "/group"),
137
160
  e
138
161
  ),
139
162
  putEditAntennaGroup: (t, e) => n.put("/iot-reader/".concat(e, "/set-port-group"), t),
140
163
  putEditPortStatus: (t, e) => n.put("/iot-reader/".concat(e, "/set-port-status"), t),
141
- putEditAliasName: (t, e, r) => n.put(
142
- "/".concat(t === "iot" ? "iot-" : "", "reader/").concat(r, "/set-alias-name"),
164
+ putEditAliasName: (t, e, r) => n.patch(
165
+ "/".concat(t === "iot" ? "iot-" : "handheld-", "reader/").concat(r, "/alias-name"),
166
+ e
167
+ ),
168
+ postActivateHardware: (t, e) => n.post(
169
+ "/".concat(t === "iot" ? "iot-" : "handheld-", "reader/activate"),
143
170
  e
144
171
  ),
172
+ deleteHardware: (t, e) => n.delete("/".concat(t === "iot" ? "iot-" : "handheld-", "-reader"), {
173
+ params: e
174
+ }),
145
175
  putAntennaPower: (t, e) => n.put("/iot-reader/".concat(e, "/set-antenna-power"), t),
146
176
  getIOTReaderOrAntenna: (t, e) => n.get("/".concat(t), { params: e }),
147
177
  getIOTReaderDetail: (t) => n.get("/iot-reader/".concat(t)),
@@ -152,41 +182,41 @@ const E = { BASE_URL: "/", DEV: !1, MODE: "production", PROD: !0, SSR: !1, VITE_
152
182
  getDetailActivityLogOptions: (t) => n.get("/activity-log/options", { params: t }),
153
183
  getExistingAliasNames: () => n.get("/reader/alias-names"),
154
184
  getIotReaderPort: (t, e) => n.get("/iot-reader/".concat(t, "/ports"), { params: e })
155
- }, G = a({
185
+ }, D = i({
156
186
  env: "APP_LOGS_NOTIFICATION_API",
157
187
  prefix: "/v2"
158
188
  }), q = {
159
- getSessionLogList: (t) => G.get("/session-log", { params: t })
160
- }, m = a({
189
+ getSessionLogList: (t) => D.get("/session-log", { params: t })
190
+ }, I = i({
161
191
  prefix: "/v1/global-settings/option"
162
- }), J = {
163
- getPositions: () => m.get("/position"),
164
- getDivisions: () => m.get("/division")
165
- }, l = a({
192
+ }), F = {
193
+ getPositions: () => I.get("/position"),
194
+ getDivisions: () => I.get("/division")
195
+ }, c = i({
166
196
  prefix: "/v1/global-settings/position"
167
- }), V = {
168
- getPositions: (t) => l.get("", { params: t }),
169
- getPositionDetail: (t) => l.get("/".concat(t)),
170
- postCreatePosition: (t) => l.post("/", t),
171
- putEditPosition: (t, e) => l.put("/".concat(t), e),
197
+ }), z = {
198
+ getPositions: (t) => c.get("", { params: t }),
199
+ getPositionDetail: (t) => c.get("/".concat(t)),
200
+ postCreatePosition: (t) => c.post("/", t),
201
+ putEditPosition: (t, e) => c.put("/".concat(t), e),
172
202
  deletePositions: (t) => {
173
203
  const e = { id: JSON.stringify(t) };
174
- return l.delete("", { params: e });
204
+ return c.delete("", { params: e });
175
205
  }
176
- }, U = a({
206
+ }, C = i({
177
207
  env: "APP_TAGSAMURAI_API",
178
208
  prefix: "/tag/v2"
179
- }), H = {
180
- getTagInfo: (t) => U.get("/rfid-qr/scan", { params: t })
181
- }, d = a({
209
+ }), W = {
210
+ getTagInfo: (t) => C.get("/rfid-qr/scan", { params: t })
211
+ }, A = i({
182
212
  prefix: "/v1/global-settings/change-log"
183
- }), F = {
184
- getTAGEventlog: (t) => d.get("/tag-event-log", { params: t }),
185
- getTAGEventlogOptions: (t) => d.get("/tag-event-log/options", { params: t }),
186
- getDetailTAGEventlog: (t) => d.get("/tag-event-log/".concat(t))
187
- }, o = a({
213
+ }), K = {
214
+ getTAGEventlog: (t) => A.get("/tag-event-log", { params: t }),
215
+ getTAGEventlogOptions: (t) => A.get("/tag-event-log/options", { params: t }),
216
+ getDetailTAGEventlog: (t) => A.get("/tag-event-log/".concat(t))
217
+ }, o = i({
188
218
  prefix: "/v1/global-settings/user"
189
- }), z = {
219
+ }), Q = {
190
220
  getUsers: (t) => o.get("", { params: t }),
191
221
  getUserDetail: (t) => o.get("/".concat(t)),
192
222
  getUserSystemLogs: (t, e) => o.get("/".concat(t, "/system-logs"), { params: e }),
@@ -214,20 +244,29 @@ const E = { BASE_URL: "/", DEV: !1, MODE: "production", PROD: !0, SSR: !1, VITE_
214
244
  deleteCancelEmailChange: (t) => o.delete("/cancel-email-change/".concat(t)),
215
245
  postResendEmail: (t) => o.post("/resend-email", t),
216
246
  putChangePassword: (t, e) => o.put("/change-password/".concat(t), e)
247
+ }, d = i({
248
+ prefix: "/v2/hardware-tagging"
249
+ }), X = {
250
+ getTabletList: (t) => d.post("/tablet/list", t),
251
+ getTabletOption: (t) => d.post("/tablet/options", t),
252
+ updateTabletStatus: (t, e) => d.patch("/tablet/status", e, { params: { ids: t } }),
253
+ disconnectTablet: (t) => d.patch("/tablet/disconnect-reader", { params: { ids: t } }),
254
+ deleteTablet: (t) => d.delete("/tablet", { params: { ids: t } })
217
255
  };
218
256
  export {
219
- x as AuthServices,
220
- k as ChangelogServices,
221
- B as DivisionServices,
222
- j as GlobalTagServices,
223
- M as HardwareServices,
257
+ B as AuthServices,
258
+ J as ChangelogServices,
259
+ M as DivisionServices,
260
+ H as GlobalTagServices,
261
+ V as HardwareServices,
224
262
  q as LogServices,
225
- J as OptionServices,
226
- V as PositionServices,
227
- F as TagEventlogServices,
228
- H as TagServices,
229
- z as UserServices,
230
- T as getBaseURL,
231
- C as getImageURL,
232
- N as queryParamsStringfy
263
+ F as OptionServices,
264
+ z as PositionServices,
265
+ X as TabletServices,
266
+ K as TagEventlogServices,
267
+ W as TagServices,
268
+ Q as UserServices,
269
+ b as getBaseURL,
270
+ k as getImageURL,
271
+ j as queryParamsStringfy
233
272
  };
package/main.d.ts CHANGED
@@ -9,4 +9,5 @@ export { default as PositionServices } from './src/services/position.service';
9
9
  export { default as TagServices } from './src/services/tag.service';
10
10
  export { default as TagEventlogServices } from './src/services/tagEventlog.service';
11
11
  export { default as UserServices } from './src/services/user.service';
12
+ export { default as TabletServices } from './src/services/tablet.service';
12
13
  export { getBaseURL, getImageURL, queryParamsStringfy } from './src/utils';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tagsamurai/gsts-api-services",
3
- "version": "2.0.1-alpha.1",
3
+ "version": "2.0.1-alpha.3",
4
4
  "author": "developer.tagsamurai",
5
5
  "description": "Global Settings Tag Samurai Services Library",
6
6
  "module": "./api-services.es.js",
@@ -71,6 +71,14 @@ export type DetailTableFilteredParams = Partial<Record<keyof DetailTableFilterPa
71
71
  export interface PutEditAliasName {
72
72
  aliasName: string;
73
73
  }
74
+ export interface PostActivateHardware {
75
+ serialNumber: string;
76
+ licenseKey: string;
77
+ hardwareId: string;
78
+ }
79
+ export interface DeleteHardware {
80
+ ids: string[];
81
+ }
74
82
  export interface PutEditReaderGroup {
75
83
  fixedAssetGroup?: string;
76
84
  supplyAssetGroup?: string;
@@ -0,0 +1,38 @@
1
+ import { FetchDetailResponse, FetchResponse } from '../types/fetchResponse.type';
2
+ import { MultiSelectOption } from '../types/options.type';
3
+ import { Tab, Tablet } from '../types/tablet.type';
4
+ export interface GetTabletListQuery {
5
+ tab?: Tab;
6
+ page?: number;
7
+ limit?: number;
8
+ sortBy?: string;
9
+ sortOrder?: number;
10
+ search?: string;
11
+ column?: string[];
12
+ deviceName?: string[];
13
+ status?: string[];
14
+ group?: string[];
15
+ reader?: string[];
16
+ registeredAt?: number[];
17
+ reportedBy?: string[];
18
+ reportedAt?: number[];
19
+ }
20
+ export type GetTabletListResponse = FetchDetailResponse<Tablet>;
21
+ export interface GetTabletOptionsQuery {
22
+ tab?: Tab;
23
+ statusOptions?: boolean;
24
+ deviceNameOptions?: boolean;
25
+ readerOptions?: boolean;
26
+ reportedByOptions?: boolean;
27
+ }
28
+ export type GetTabletOptionsResponse = FetchResponse & {
29
+ data: {
30
+ deviceNameOptions: MultiSelectOption[];
31
+ readerOptions: MultiSelectOption[];
32
+ statusOptions: MultiSelectOption[];
33
+ reportedByOptions: MultiSelectOption[];
34
+ };
35
+ };
36
+ export interface UpdateTabletStatusBody {
37
+ status?: Tab;
38
+ }
@@ -1,6 +1,6 @@
1
1
  import { AxiosResponse } from 'axios';
2
2
  import { BooleanOptions } from '../dto/dataTable.dto';
3
- import { HardwareDetailFilterQuery, HardwareFetchDetailResponse, HardwareFetchOptionResponse, HardwareFetchResponse, HardwareFilterQuery, PutEditAliasName, PutEditAntennaGroup, PutEditAntennaPower, PutEditPortStatus, PutEditReaderGroup, PutHardwareStatusBody, PutPingReadersBody } from '../dto/hardware.dto';
3
+ import { DeleteHardware, HardwareDetailFilterQuery, HardwareFetchDetailResponse, HardwareFetchOptionResponse, HardwareFetchResponse, HardwareFilterQuery, PostActivateHardware, PutEditAliasName, PutEditAntennaGroup, PutEditAntennaPower, PutEditPortStatus, PutEditReaderGroup, PutHardwareStatusBody, PutPingReadersBody } from '../dto/hardware.dto';
4
4
  import { AntennaPortDetail, HardwareDataType, HardwareDetailUserActivity } from '../types/hardware.type';
5
5
  declare const HardwareServices: {
6
6
  getHandheldReader: (params?: HardwareFilterQuery) => Promise<AxiosResponse<HardwareFetchResponse>>;
@@ -15,6 +15,8 @@ declare const HardwareServices: {
15
15
  putEditAntennaGroup: (body: PutEditAntennaGroup, hardwareId?: string) => Promise<AxiosResponse>;
16
16
  putEditPortStatus: (body: PutEditPortStatus, hardwareId?: string) => Promise<AxiosResponse>;
17
17
  putEditAliasName: (moduleTab: "iot" | "handheld", body: PutEditAliasName, hardwareId?: string) => Promise<AxiosResponse>;
18
+ postActivateHardware: (moduleTab: "iot" | "handheld", body: PostActivateHardware) => Promise<AxiosResponse>;
19
+ deleteHardware: (moduleTab: "iot" | "handheld", params?: DeleteHardware) => Promise<AxiosResponse>;
18
20
  putAntennaPower: (body: PutEditAntennaPower, iotId?: string) => Promise<AxiosResponse>;
19
21
  getIOTReaderOrAntenna: (subTab: "iot-reader" | "antenna", params?: HardwareFilterQuery) => Promise<AxiosResponse<HardwareFetchResponse>>;
20
22
  getIOTReaderDetail: (iotId?: string) => Promise<AxiosResponse<HardwareFetchDetailResponse>>;
@@ -0,0 +1,10 @@
1
+ import { GetTabletListQuery, GetTabletListResponse, GetTabletOptionsQuery, GetTabletOptionsResponse, UpdateTabletStatusBody } from '../dto/tablet.dto';
2
+ import { AxiosResponse } from 'axios';
3
+ declare const TabletServices: {
4
+ getTabletList: (body: GetTabletListQuery) => Promise<AxiosResponse<GetTabletListResponse>>;
5
+ getTabletOption: (body: GetTabletOptionsQuery) => Promise<AxiosResponse<GetTabletOptionsResponse>>;
6
+ updateTabletStatus: (ids: string, body: UpdateTabletStatusBody) => Promise<AxiosResponse>;
7
+ disconnectTablet: (ids: string) => Promise<AxiosResponse>;
8
+ deleteTablet: (ids: string) => Promise<AxiosResponse>;
9
+ };
10
+ export default TabletServices;
@@ -0,0 +1,16 @@
1
+ export type Tab = 'Available' | 'Damaged/Missing';
2
+ export interface Tablet {
3
+ _id: string;
4
+ deviceName: string;
5
+ deviceId: string;
6
+ status: string;
7
+ group: {
8
+ fixedAsset: string | null;
9
+ supplyAsset: string | null;
10
+ };
11
+ reader: string | null;
12
+ aliasName: string | null;
13
+ registeredAt: string;
14
+ reportedBy: string | null;
15
+ reportedAt: string | null;
16
+ }