itsm-widget 1.0.1 → 1.0.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.
- package/API-SERVICE.md +42 -21
- package/README.md +58 -25
- package/dist/itsm-widget-config.json +4 -0
- package/dist/itsm-widget.min.js +1 -1
- package/package.json +1 -1
package/API-SERVICE.md
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
# ITSM API Service
|
|
2
2
|
|
|
3
|
-
Service JavaScript để gọi các API của
|
|
3
|
+
Service JavaScript để gọi các API của Backend. Backend sẽ gọi tiếp đến ITSM API.
|
|
4
4
|
|
|
5
5
|
## Tổng quan
|
|
6
6
|
|
|
7
|
-
`ITSMAPIService` cung cấp các method để tương tác với
|
|
7
|
+
`ITSMAPIService` cung cấp các method để tương tác với Backend API:
|
|
8
8
|
- Tạo yêu cầu mới (ticket)
|
|
9
9
|
- Upload file đính kèm
|
|
10
10
|
- Lấy thông tin request
|
|
11
11
|
- Helper methods để map và build data
|
|
12
12
|
|
|
13
|
+
**Kiến trúc:** Frontend → Backend API → ITSM API
|
|
14
|
+
|
|
15
|
+
- **Frontend**: Chỉ truyền `Authorization Bearer Token` (JWT) đến Backend
|
|
16
|
+
- **Backend**: Xử lý `apiKey` (authtoken) và `tenant` (đã config trong `application.properties`)
|
|
17
|
+
|
|
13
18
|
## Cài đặt
|
|
14
19
|
|
|
15
20
|
### Import trong module:
|
|
@@ -26,9 +31,8 @@ const ITSMAPIService = window.ITSMAPIService;
|
|
|
26
31
|
|
|
27
32
|
```javascript
|
|
28
33
|
const apiService = new ITSMAPIService({
|
|
29
|
-
baseUrl: '
|
|
30
|
-
|
|
31
|
-
tenant: 'your-tenant-name'
|
|
34
|
+
baseUrl: 'http://localhost:9998', // URL của Backend API
|
|
35
|
+
authToken: 'your-jwt-token-here' // JWT token từ đăng nhập thành công
|
|
32
36
|
});
|
|
33
37
|
```
|
|
34
38
|
|
|
@@ -36,9 +40,8 @@ const apiService = new ITSMAPIService({
|
|
|
36
40
|
|
|
37
41
|
| Option | Type | Default | Mô tả |
|
|
38
42
|
|--------|------|---------|-------|
|
|
39
|
-
| `baseUrl` | string | `''` | Base URL của API
|
|
40
|
-
| `
|
|
41
|
-
| `tenant` | string | `''` | Tenant name (pn header) (bắt buộc) |
|
|
43
|
+
| `baseUrl` | string | `''` | Base URL của Backend API (bắt buộc). Ví dụ: `http://localhost:9998` |
|
|
44
|
+
| `authToken` | string | `''` | Authorization Bearer token (JWT token từ đăng nhập thành công) (bắt buộc). Đây KHÔNG phải là apiKey. |
|
|
42
45
|
|
|
43
46
|
## Methods
|
|
44
47
|
|
|
@@ -302,30 +305,48 @@ try {
|
|
|
302
305
|
}
|
|
303
306
|
```
|
|
304
307
|
|
|
305
|
-
## API Endpoints
|
|
308
|
+
## API Endpoints (FE → BE)
|
|
306
309
|
|
|
307
310
|
### 1. Tạo Request
|
|
308
|
-
- **URL:** `POST {baseUrl}/
|
|
311
|
+
- **URL:** `POST {baseUrl}/spcit/send`
|
|
309
312
|
- **Headers:**
|
|
310
|
-
- `
|
|
311
|
-
- `
|
|
312
|
-
|
|
313
|
-
|
|
313
|
+
- `Authorization`: `Bearer {authToken}`
|
|
314
|
+
- `Content-Type`: `application/json`
|
|
315
|
+
- **Body:** JSON với structure:
|
|
316
|
+
```json
|
|
317
|
+
{
|
|
318
|
+
"request": {
|
|
319
|
+
"requester": { "name": "..." },
|
|
320
|
+
"category": { "name": "..." },
|
|
321
|
+
"priority": { "name": "..." },
|
|
322
|
+
"subject": "...",
|
|
323
|
+
"description": "...",
|
|
324
|
+
...
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
```
|
|
314
328
|
|
|
315
329
|
### 2. Upload Attachment
|
|
316
|
-
- **URL:** `PUT {baseUrl}/
|
|
330
|
+
- **URL:** `PUT {baseUrl}/spcit/{requestId}/upload`
|
|
317
331
|
- **Headers:**
|
|
318
|
-
- `
|
|
319
|
-
- `pn`: Tenant name
|
|
332
|
+
- `Authorization`: `Bearer {authToken}`
|
|
320
333
|
- `Content-Type`: `multipart/form-data` (auto)
|
|
321
|
-
- **Body:** FormData với
|
|
334
|
+
- **Body:** FormData với parameter name `files` (array)
|
|
322
335
|
|
|
323
336
|
### 3. Get Request
|
|
324
|
-
- **URL:** `
|
|
337
|
+
- **URL:** `POST {baseUrl}/spcit/ticket/{requestId}`
|
|
325
338
|
- **Headers:**
|
|
326
|
-
- `
|
|
327
|
-
- `
|
|
339
|
+
- `Authorization`: `Bearer {authToken}`
|
|
340
|
+
- `Content-Type`: `application/json`
|
|
328
341
|
- `Accept`: `application/json`
|
|
342
|
+
- **Body:** JSON với `request_id`:
|
|
343
|
+
```json
|
|
344
|
+
{
|
|
345
|
+
"request_id": "18391"
|
|
346
|
+
}
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
**Lưu ý:** `apiKey` (authtoken) và `tenant` được xử lý ở Backend, không cần truyền từ Frontend.
|
|
329
350
|
|
|
330
351
|
## Xem thêm
|
|
331
352
|
|
package/README.md
CHANGED
|
@@ -87,9 +87,8 @@ import 'itsm-widget/dist/itsm-widget.min.js';
|
|
|
87
87
|
<script>
|
|
88
88
|
// Cấu hình widget
|
|
89
89
|
const itsmWidget = new ITSMWidget({
|
|
90
|
-
apiBaseUrl: '
|
|
91
|
-
|
|
92
|
-
tenant: 'your-tenant-name',
|
|
90
|
+
apiBaseUrl: 'http://localhost:9998', // URL của Backend API (hoặc load từ itsm-widget-config.json)
|
|
91
|
+
authToken: 'your-jwt-token-here', // JWT token từ đăng nhập thành công
|
|
93
92
|
position: 'bottom-right',
|
|
94
93
|
iconText: '📝',
|
|
95
94
|
iconColor: '#007bff',
|
|
@@ -153,8 +152,8 @@ export class AppComponent implements OnInit {
|
|
|
153
152
|
ngOnInit() {
|
|
154
153
|
// Khởi tạo ITSM Widget
|
|
155
154
|
const itsmWidget = new ITSMWidget({
|
|
156
|
-
apiBaseUrl: '
|
|
157
|
-
|
|
155
|
+
apiBaseUrl: 'http://localhost:9998', // URL của Backend API (hoặc load từ itsm-widget-config.json)
|
|
156
|
+
authToken: 'your-jwt-token-here', // JWT token từ đăng nhập thành công
|
|
158
157
|
position: 'bottom-right',
|
|
159
158
|
iconText: '📝',
|
|
160
159
|
iconColor: '#007bff',
|
|
@@ -176,10 +175,24 @@ export class AppComponent implements OnInit {
|
|
|
176
175
|
```html
|
|
177
176
|
<script
|
|
178
177
|
src="path/to/itsm-widget.min.js"
|
|
179
|
-
data-itsm-config='{"apiBaseUrl":"
|
|
178
|
+
data-itsm-config='{"apiBaseUrl":"http://localhost:9998","authToken":"your-jwt-token","iconColor":"#007bff"}'>
|
|
180
179
|
</script>
|
|
181
180
|
```
|
|
182
181
|
|
|
182
|
+
## Cấu hình `apiBaseUrl` qua file external
|
|
183
|
+
|
|
184
|
+
> **📖 Xem chi tiết**: [CONFIG.md](./CONFIG.md) - Hướng dẫn cấu hình `apiBaseUrl` qua file external
|
|
185
|
+
|
|
186
|
+
Widget hỗ trợ load `apiBaseUrl` từ file `itsm-widget-config.json` để có thể thay đổi sau khi build mà không cần sửa code. Đặt file config cùng thư mục với `itsm-widget.min.js`:
|
|
187
|
+
|
|
188
|
+
```json
|
|
189
|
+
{
|
|
190
|
+
"apiBaseUrl": "http://localhost:9998"
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Widget sẽ tự động load config từ file này nếu không truyền `apiBaseUrl` trong constructor.
|
|
195
|
+
|
|
183
196
|
## Build từ source
|
|
184
197
|
|
|
185
198
|
1. Cài đặt dependencies:
|
|
@@ -227,50 +240,66 @@ Rebuild tự động khi có thay đổi (không có dev server)
|
|
|
227
240
|
|
|
228
241
|
| Option | Type | Default | Mô tả |
|
|
229
242
|
|--------|------|---------|-------|
|
|
230
|
-
| `apiBaseUrl` | string | `''` | Base URL của API
|
|
231
|
-
| `
|
|
232
|
-
| `tenant` | string | `''` | Tenant name (pn header) (bắt buộc) |
|
|
233
|
-
| `apiToken` | string | `''` | Backward compatibility - sẽ dùng làm apiKey nếu apiKey không có |
|
|
243
|
+
| `apiBaseUrl` | string | `''` | Base URL của Backend API (bắt buộc). Có thể load từ `itsm-widget-config.json` hoặc truyền trực tiếp. Default: `http://localhost:9998` |
|
|
244
|
+
| `authToken` | string | `''` | Authorization Bearer token (JWT token từ đăng nhập thành công) (bắt buộc). Đây KHÔNG phải là apiKey. |
|
|
234
245
|
| `position` | string | `'bottom-right'` | Vị trí icon: `'bottom-right'` hoặc `'bottom-left'` |
|
|
235
246
|
| `iconText` | string | `'📝'` | Text/emoji hiển thị trên icon (mặc định: 📝) |
|
|
236
|
-
| `iconColor` | string | `'#
|
|
247
|
+
| `iconColor` | string | `'#335fb3'` | Màu icon và border |
|
|
237
248
|
| `title` | string | `'Tạo phiếu yêu cầu ITSM'` | Tiêu đề modal |
|
|
238
249
|
| `requesterName` | string | `''` | Tên người yêu cầu (nếu không có sẽ dùng contact từ form) |
|
|
239
250
|
| `site` | string | `''` | Tên site/địa điểm |
|
|
240
251
|
| `udf_fields` | object | `{}` | Custom fields (udf_fields) cho request |
|
|
241
252
|
| `onSuccess` | function | `null` | Callback khi gửi thành công |
|
|
242
253
|
|
|
243
|
-
###
|
|
254
|
+
### Kiến trúc
|
|
255
|
+
|
|
256
|
+
**Frontend (Widget)** → **Backend API** → **ITSM API**
|
|
257
|
+
|
|
258
|
+
- **FE (Widget)**: Chỉ truyền `Authorization Bearer Token` (JWT) và gọi đến Backend API
|
|
259
|
+
- **BE**: Xử lý `apiKey` (authtoken) và `tenant` (đã được config trong `application.properties`)
|
|
260
|
+
- **ITSM API**: Nhận request từ BE với `apiKey` và `tenant` trong headers
|
|
244
261
|
|
|
245
|
-
|
|
262
|
+
### API Endpoints (FE → BE)
|
|
246
263
|
|
|
247
264
|
**1. Tạo yêu cầu mới:**
|
|
248
265
|
```
|
|
249
|
-
POST {apiBaseUrl}/
|
|
266
|
+
POST {apiBaseUrl}/spcit/send
|
|
250
267
|
```
|
|
251
268
|
|
|
252
269
|
**Headers:**
|
|
253
270
|
```
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
Content-Type: multipart/form-data
|
|
271
|
+
Authorization: Bearer {authToken}
|
|
272
|
+
Content-Type: application/json
|
|
257
273
|
```
|
|
258
274
|
|
|
259
|
-
**Body (
|
|
260
|
-
|
|
275
|
+
**Body (JSON):**
|
|
276
|
+
```json
|
|
277
|
+
{
|
|
278
|
+
"request": {
|
|
279
|
+
"requester": { "name": "..." },
|
|
280
|
+
"category": { "name": "..." },
|
|
281
|
+
"priority": { "name": "..." },
|
|
282
|
+
"subject": "...",
|
|
283
|
+
"description": "...",
|
|
284
|
+
...
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
```
|
|
261
288
|
|
|
262
289
|
**2. Upload file đính kèm:**
|
|
263
290
|
```
|
|
264
|
-
PUT {apiBaseUrl}/
|
|
291
|
+
PUT {apiBaseUrl}/spcit/{requestId}/upload
|
|
265
292
|
```
|
|
266
293
|
|
|
267
294
|
**Headers:**
|
|
268
295
|
```
|
|
269
|
-
|
|
270
|
-
pn: {tenant}
|
|
296
|
+
Authorization: Bearer {authToken}
|
|
271
297
|
Content-Type: multipart/form-data
|
|
272
298
|
```
|
|
273
299
|
|
|
300
|
+
**Body (FormData):**
|
|
301
|
+
- `files`: File hoặc mảng các file
|
|
302
|
+
|
|
274
303
|
**Response mẫu (tạo request thành công):**
|
|
275
304
|
```json
|
|
276
305
|
{
|
|
@@ -306,9 +335,8 @@ Xem chi tiết API tại file tài liệu trong `src/assets/13082025 API v2 SDP
|
|
|
306
335
|
|
|
307
336
|
```javascript
|
|
308
337
|
const widget = new ITSMWidget({
|
|
309
|
-
apiBaseUrl: '
|
|
310
|
-
|
|
311
|
-
tenant: 'your-tenant-name',
|
|
338
|
+
apiBaseUrl: 'http://localhost:9998', // URL của Backend API (hoặc load từ itsm-widget-config.json)
|
|
339
|
+
authToken: 'your-jwt-token-here', // JWT token từ đăng nhập thành công
|
|
312
340
|
iconColor: '#28a745',
|
|
313
341
|
requesterName: 'Nguyễn Văn A', // Optional
|
|
314
342
|
site: 'Your Site Name', // Optional
|
|
@@ -319,6 +347,11 @@ const widget = new ITSMWidget({
|
|
|
319
347
|
});
|
|
320
348
|
```
|
|
321
349
|
|
|
350
|
+
**Lưu ý:**
|
|
351
|
+
- `apiKey` và `tenant` đã được config ở Backend (không cần truyền từ FE)
|
|
352
|
+
- `authToken` là JWT token từ đăng nhập, không phải `apiKey`
|
|
353
|
+
- `apiBaseUrl` có thể được load từ file `itsm-widget-config.json` (xem [CONFIG.md](./CONFIG.md))
|
|
354
|
+
|
|
322
355
|
### Custom styling
|
|
323
356
|
|
|
324
357
|
Bạn có thể override CSS để phù hợp với theme của project:
|
package/dist/itsm-widget.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! For license information please see itsm-widget.min.js.LICENSE.txt */
|
|
2
|
-
!function(n,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ITSMWidget=e():n.ITSMWidget=e()}(window,()=>(()=>{"use strict";var n={72:(n,e,t)=>{var r,o=function(){return void 0===r&&(r=Boolean(window&&document&&document.all&&!window.atob)),r},i=function(){var n={};return function(e){if(void 0===n[e]){var t=document.querySelector(e);if(window.HTMLIFrameElement&&t instanceof window.HTMLIFrameElement)try{t=t.contentDocument.head}catch(n){t=null}n[e]=t}return n[e]}}(),a=[];function s(n){for(var e=-1,t=0;t<a.length;t++)if(a[t].identifier===n){e=t;break}return e}function c(n,e){for(var t={},r=[],o=0;o<n.length;o++){var i=n[o],c=e.base?i[0]+e.base:i[0],l=t[c]||0,d="".concat(c," ").concat(l);t[c]=l+1;var u=s(d),m={css:i[1],media:i[2],sourceMap:i[3]};-1!==u?(a[u].references++,a[u].updater(m)):a.push({identifier:d,updater:b(m,e),references:1}),r.push(d)}return r}function l(n){var e=document.createElement("style"),r=n.attributes||{};if(void 0===r.nonce){var o=t.nc;o&&(r.nonce=o)}if(Object.keys(r).forEach(function(n){e.setAttribute(n,r[n])}),"function"==typeof n.insert)n.insert(e);else{var a=i(n.insert||"head");if(!a)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");a.appendChild(e)}return e}var d,u=(d=[],function(n,e){return d[n]=e,d.filter(Boolean).join("\n")});function m(n,e,t,r){var o=t?"":r.media?"@media ".concat(r.media," {").concat(r.css,"}"):r.css;if(n.styleSheet)n.styleSheet.cssText=u(e,o);else{var i=document.createTextNode(o),a=n.childNodes;a[e]&&n.removeChild(a[e]),a.length?n.insertBefore(i,a[e]):n.appendChild(i)}}function f(n,e,t){var r=t.css,o=t.media,i=t.sourceMap;if(o?n.setAttribute("media",o):n.removeAttribute("media"),i&&"undefined"!=typeof btoa&&(r+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(i))))," */")),n.styleSheet)n.styleSheet.cssText=r;else{for(;n.firstChild;)n.removeChild(n.firstChild);n.appendChild(document.createTextNode(r))}}var p=null,h=0;function b(n,e){var t,r,o;if(e.singleton){var i=h++;t=p||(p=l(e)),r=m.bind(null,t,i,!1),o=m.bind(null,t,i,!0)}else t=l(e),r=f.bind(null,t,e),o=function(){!function(n){if(null===n.parentNode)return!1;n.parentNode.removeChild(n)}(t)};return r(n),function(e){if(e){if(e.css===n.css&&e.media===n.media&&e.sourceMap===n.sourceMap)return;r(n=e)}else o()}}n.exports=function(n,e){(e=e||{}).singleton||"boolean"==typeof e.singleton||(e.singleton=o());var t=c(n=n||[],e);return function(n){if(n=n||[],"[object Array]"===Object.prototype.toString.call(n)){for(var r=0;r<t.length;r++){var o=s(t[r]);a[o].references--}for(var i=c(n,e),l=0;l<t.length;l++){var d=s(t[l]);0===a[d].references&&(a[d].updater(),a.splice(d,1))}t=i}}}},314:n=>{n.exports=function(n){var e=[];return e.toString=function(){return this.map(function(e){var t=n(e);return e[2]?"@media ".concat(e[2]," {").concat(t,"}"):t}).join("")},e.i=function(n,t,r){"string"==typeof n&&(n=[[null,n,""]]);var o={};if(r)for(var i=0;i<this.length;i++){var a=this[i][0];null!=a&&(o[a]=!0)}for(var s=0;s<n.length;s++){var c=[].concat(n[s]);r&&o[c[0]]||(t&&(c[2]?c[2]="".concat(t," and ").concat(c[2]):c[2]=t),e.push(c))}},e}},322:(n,e,t)=>{t.r(e),t.d(e,{default:()=>A});var r=t(72),o=t.n(r),i=t(555),a={insert:"head",singleton:!1};o()(i.A,a);i.A.locals;var s=t(890),c=[{category:"A01A00 - Quản lý an toàn điện",subcategories:[{subcategory:"A01A01 - Hệ thống",items:["Danh sách chức năng","Danh sách đơn vị","Danh sách người dùng","Danh sách nhóm","Phân quyền"]},{subcategory:"A01A02 - Giám sát an toàn",items:["Báo cáo","Khởi tạo số phiếu","Lệnh công tác","Phiếu công tác"]},{subcategory:"A01A03 - Quản lý công tác an toàn",items:["An toàn điện","Báo cáo CT ATVSLĐ","BC tháng hành động","Biên bản sinh hoạt AT","Công tác HLuyện ATLĐ","Công tác kiểm tra ATLĐ","Công tác PCCC & CNCH","Danh mục","Dụng cụ An toàn","Kế hoạch công tác AT","Kiến nghị","Lịch công tác tuần","Mạng lưới ATVSV","PCTT-TKCN","Quy trình quy định","Tai nạn lao động","Thi đua - khen thưởng","Thiết bị Hotline","Thiết bị Hotline YCNN","Thiết bị YCNN"]},{subcategory:"A01A04 - Đánh giá rủi ro",items:["Bổ sung","Danh mục DGRR","Định kỳ","Lực lượng làm công tác ATVSLĐ","QĐ thành lập nhóm"]}]}],l=["Bổ sung chương trình","Dữ liệu","Hiệu chỉnh chương trình","Nghiệp vụ","Phần mềm"],d="EVNSPC",u="A - An toàn điện",m="A1 - Phần mềm ứng dụng",f="C - The Business/Customer Service Catalog",p="Máy tính";function h(n){return h="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},h(n)}function b(){var n,e,t="function"==typeof Symbol?Symbol:{},r=t.iterator||"@@iterator",o=t.toStringTag||"@@toStringTag";function i(t,r,o,i){var c=r&&r.prototype instanceof s?r:s,l=Object.create(c.prototype);return g(l,"_invoke",function(t,r,o){var i,s,c,l=0,d=o||[],u=!1,m={p:0,n:0,v:n,a:f,f:f.bind(n,4),d:function(e,t){return i=e,s=0,c=n,m.n=t,a}};function f(t,r){for(s=t,c=r,e=0;!u&&l&&!o&&e<d.length;e++){var o,i=d[e],f=m.p,p=i[2];t>3?(o=p===r)&&(c=i[(s=i[4])?5:(s=3,3)],i[4]=i[5]=n):i[0]<=f&&((o=t<2&&f<i[1])?(s=0,m.v=r,m.n=i[1]):f<p&&(o=t<3||i[0]>r||r>p)&&(i[4]=t,i[5]=r,m.n=p,s=0))}if(o||t>1)return a;throw u=!0,r}return function(o,d,p){if(l>1)throw TypeError("Generator is already running");for(u&&1===d&&f(d,p),s=d,c=p;(e=s<2?n:c)||!u;){i||(s?s<3?(s>1&&(m.n=-1),f(s,c)):m.n=c:m.v=c);try{if(l=2,i){if(s||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,s<2&&(s=0)}else 1===s&&(e=i.return)&&e.call(i),s<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),s=1);i=n}else if((e=(u=m.n<0)?c:t.call(r,m))!==a)break}catch(e){i=n,s=1,c=e}finally{l=1}}return{value:e,done:u}}}(t,o,i),!0),l}var a={};function s(){}function c(){}function l(){}e=Object.getPrototypeOf;var d=[][r]?e(e([][r]())):(g(e={},r,function(){return this}),e),u=l.prototype=s.prototype=Object.create(d);function m(n){return Object.setPrototypeOf?Object.setPrototypeOf(n,l):(n.__proto__=l,g(n,o,"GeneratorFunction")),n.prototype=Object.create(u),n}return c.prototype=l,g(u,"constructor",l),g(l,"constructor",c),c.displayName="GeneratorFunction",g(l,o,"GeneratorFunction"),g(u),g(u,o,"Generator"),g(u,r,function(){return this}),g(u,"toString",function(){return"[object Generator]"}),(b=function(){return{w:i,m}})()}function g(n,e,t,r){var o=Object.defineProperty;try{o({},"",{})}catch(n){o=0}g=function(n,e,t,r){function i(e,t){g(n,e,function(n){return this._invoke(e,t,n)})}e?o?o(n,e,{value:t,enumerable:!r,configurable:!r,writable:!r}):n[e]=t:(i("next",0),i("throw",1),i("return",2))},g(n,e,t,r)}function y(n,e,t,r,o,i,a){try{var s=n[i](a),c=s.value}catch(n){return void t(n)}s.done?e(c):Promise.resolve(c).then(r,o)}function v(n){return function(){var e=this,t=arguments;return new Promise(function(r,o){var i=n.apply(e,t);function a(n){y(i,r,o,a,s,"next",n)}function s(n){y(i,r,o,a,s,"throw",n)}a(void 0)})}}function w(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(n);e&&(r=r.filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable})),t.push.apply(t,r)}return t}function x(n,e,t){return(e=C(e))in n?Object.defineProperty(n,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):n[e]=t,n}function k(n,e){for(var t=0;t<e.length;t++){var r=e[t];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(n,C(r.key),r)}}function C(n){var e=function(n,e){if("object"!=h(n)||!n)return n;var t=n[Symbol.toPrimitive];if(void 0!==t){var r=t.call(n,e||"default");if("object"!=h(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(n)}(n,"string");return"symbol"==h(e)?e:e+""}n=t.hmd(n);var S=function(){return n=function n(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};!function(n,e){if(!(n instanceof e))throw new TypeError("Cannot call a class as a function")}(this,n),this.config=function(n){for(var e=1;e<arguments.length;e++){var t=null!=arguments[e]?arguments[e]:{};e%2?w(Object(t),!0).forEach(function(e){x(n,e,t[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(t)):w(Object(t)).forEach(function(e){Object.defineProperty(n,e,Object.getOwnPropertyDescriptor(t,e))})}return n}({apiBaseUrl:e.apiBaseUrl||"https://itsm.evnspc.vn:8812",apiKey:e.apiKey||"sdpi.14e69f98-7be5-477c-aa01-af022e46afcq",tenant:e.tenant||"spcit",apiToken:e.apiToken||"",position:e.position||"bottom-right",iconText:e.iconText||"📝",iconImage:void 0!==e.iconImage?e.iconImage:"data:image/png;base64,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",iconColor:e.iconColor||"#335fb3",title:e.title||"Tạo phiếu yêu cầu ITSM",requesterName:e.requesterName||"",site:e.site||"",udf_fields:e.udf_fields||{}},e),this.apiService=new s.A({baseUrl:this.config.apiBaseUrl,apiKey:this.config.apiKey||this.config.apiToken,tenant:this.config.tenant}),this.isOpen=!1,this.widgetContainer=null,this.modalContainer=null,this.init()},e=[{key:"init",value:function(){this.createWidgetButton(),this.createModal(),this.attachEvents()}},{key:"createWidgetButton",value:function(){var n=document.createElement("div");n.id="itsm-widget-button",n.className="itsm-widget-button itsm-position-".concat(this.config.position);var e="";e=this.config.iconImage&&null!==this.config.iconImage?'<img src="'.concat(this.config.iconImage,'" alt="ITSM Widget" class="itsm-widget-icon-img" />'):this.config.iconText||"📝";var t=this.config.iconImage&&null!==this.config.iconImage?"":"background-color: ".concat(this.config.iconColor,";");n.style.borderColor=this.config.iconColor,n.innerHTML='\n <div class="itsm-widget-icon" style="'.concat(t,'">\n ').concat(e,"\n </div>\n "),document.body.appendChild(n),this.widgetContainer=n}},{key:"createModal",value:function(){var n=document.createElement("div");n.id="itsm-widget-modal",n.className="itsm-modal-overlay",n.innerHTML='\n <div class="itsm-modal-container" style="width: 50vw; max-width: 90vw;">\n <div class="itsm-modal-header">\n <span class="itsm-modal-title">'.concat(this.config.title,'</span>\n <div class="itsm-modal-header-icons">\n <button class="itsm-modal-close" aria-label="Đóng">\n <span>×</span>\n </button>\n </div>\n </div>\n <div class="itsm-modal-content">\n <form id="itsm-request-form" class="itsm-form">\n \n\n <div class="itsm-form-group">\n <label for="itsm-requester">\n Người yêu cầu <span class="itsm-required">*</span>\n </label>\n <input \n type="text" \n id="itsm-requester" \n name="requester" \n class="itsm-input" \n disabled\n placeholder=""\n value="').concat(this.config.requesterName||"",'"\n />\n </div>\n <div class="itsm-form-group">\n <label for="itsm-site">Đơn vị</label>\n <input \n type="text" \n id="itsm-site" \n name="site" \n class="itsm-input" \n disabled\n placeholder=""\n value="').concat(this.config.site||"",'"\n />\n </div>\n\n <div class="itsm-form-group">\n <label for="itsm-category">\n Danh mục dịch vụ <span class="itsm-required">*</span>\n </label>\n <select id="itsm-category" name="category" class="itsm-select" required>\n <option value="">-- Chọn danh mục --</option>\n </select>\n </div>\n\n <div class="itsm-form-group">\n <label for="itsm-subcategory">\n Dịch vụ con <span class="itsm-required">*</span>\n </label>\n <select id="itsm-subcategory" name="subcategory" class="itsm-select" required disabled>\n <option value="">Chưa lựa chọn</option>\n </select>\n </div>\n\n <div class="itsm-form-group">\n <label for="itsm-item">\n Chi tiết dịch vụ <span class="itsm-required">*</span>\n </label>\n <select id="itsm-item" name="item" class="itsm-select" required disabled>\n <option value="">Chưa lựa chọn</option>\n </select>\n </div>\n\n <div class="itsm-form-row">\n <div class="itsm-form-group itsm-form-group-half">\n <label for="itsm-priority">\n Mức độ ưu tiên <span class="itsm-required">*</span>\n </label>\n <select id="itsm-priority" name="priority" class="itsm-select" required>\n <option value="" selected>Chưa lựa chọn</option>\n <option value="low">Thấp</option>\n <option value="medium">Trung bình</option>\n <option value="high">Cao</option>\n </select>\n </div>\n\n <div class="itsm-form-group itsm-form-group-half">\n <label for="itsm-udf-pick-305">Loại hỗ trợ</label>\n <select id="itsm-udf-pick-305" name="udf_pick_305" class="itsm-select">\n <option value="">Chưa lựa chọn</option>\n </select>\n </div>\n </div>\n \n <div class="itsm-form-group">\n <label for="itsm-udf-pick-306">\n Loại thiết bị sử dụng <span class="itsm-required">*</span>\n </label>\n <select id="itsm-udf-pick-306" name="udf_pick_306" class="itsm-select" required>\n <option value="">Chưa lựa chọn</option>\n <option value="Máy tính">Máy tính</option>\n <option value="Máy tính bảng">Máy tính bảng</option>\n <option value="Điện thoại">Điện thoại</option>\n <option value="Laptop">Laptop</option>\n </select>\n </div>\n\n <div class="itsm-form-group">\n <label for="itsm-title">\n Tiêu đề <span class="itsm-required">*</span>\n </label>\n <input \n type="text" \n id="itsm-title" \n name="title" \n class="itsm-input" \n required \n placeholder="Nhập tiêu đề phiếu yêu cầu"\n />\n </div>\n\n <div class="itsm-form-group">\n <label for="itsm-description-editor">\n Mô tả <span class="itsm-required">*</span>\n </label>\n <div class="itsm-editor-container">\n <div class="itsm-editor-toolbar">\n <button type="button" class="itsm-editor-btn" data-command="bold" title="Bold">\n <strong>B</strong>\n </button>\n <button type="button" class="itsm-editor-btn" data-command="italic" title="Italic">\n <em>I</em>\n </button>\n <button type="button" class="itsm-editor-btn" data-command="underline" title="Underline">\n <u>U</u>\n </button>\n <div class="itsm-editor-separator"></div>\n <button type="button" class="itsm-editor-btn" data-command="insertUnorderedList" title="Bullet List">• List</button>\n <button type="button" class="itsm-editor-btn" data-command="insertOrderedList" title="Numbered List">1. List</button>\n <div class="itsm-editor-separator"></div>\n <label class="itsm-editor-file-btn">\n 📎 Đính kèm file\n <input \n type="file" \n id="itsm-attachment" \n name="attachment" \n multiple\n style="display: none;"\n />\n </label>\n </div>\n <div \n id="itsm-description-editor" \n class="itsm-editor-content"\n contenteditable="true"\n data-placeholder="Nhập mô tả chi tiết yêu cầu..."\n ></div>\n <textarea \n id="itsm-description" \n name="description" \n style="display: none;"\n required\n ></textarea>\n <div id="itsm-file-list" class="itsm-file-list"></div>\n </div>\n </div>\n\n <div class="itsm-modal-footer">\n <button type="button" class="itsm-btn itsm-btn-secondary" id="itsm-cancel-btn">\n Hủy\n </button>\n <button type="submit" class="itsm-btn itsm-btn-primary" id="itsm-submit-btn">\n <span class="itsm-btn-text">Gửi Yêu Cầu</span>\n <span class="itsm-btn-loading" style="display: none;">Đang gửi...</span>\n </button>\n </div>\n </form>\n </div>\n </div>\n '),document.body.appendChild(n),this.modalContainer=n}},{key:"attachEvents",value:function(){var n=this;this.widgetContainer.addEventListener("click",function(){n.toggleModal()});var e=this.modalContainer.querySelector(".itsm-modal-close"),t=this.modalContainer.querySelector("#itsm-cancel-btn"),r=this.modalContainer;e&&e.addEventListener("click",function(){return n.closeModal()}),t&&t.addEventListener("click",function(){return n.closeModal()}),r.addEventListener("click",function(e){e.target===r&&n.closeModal()}),this.modalContainer.querySelector("#itsm-request-form").addEventListener("submit",function(e){return n.handleSubmit(e)}),this.modalContainer.querySelector("#itsm-attachment").addEventListener("change",function(e){return n.handleFileSelect(e)}),this.initEditor(),this.initCategoryDropdowns()}},{key:"initEditor",value:function(){var n=this.modalContainer.querySelector("#itsm-description-editor"),e=this.modalContainer.querySelector("#itsm-description"),t=this.modalContainer.querySelector(".itsm-editor-toolbar");n.addEventListener("input",function(){e.value=n.innerHTML,n.textContent.trim()?e.setCustomValidity(""):e.setCustomValidity("Mô tả là bắt buộc")}),n.addEventListener("focus",function(){""===n.textContent.trim()&&(n.innerHTML="")}),n.addEventListener("blur",function(){""===n.textContent.trim()&&(n.innerHTML="")}),t.querySelectorAll(".itsm-editor-btn[data-command]").forEach(function(t){t.addEventListener("click",function(r){r.preventDefault();var o=t.getAttribute("data-command");n.focus(),document.execCommand(o,!1,null),e.value=n.innerHTML})})}},{key:"initCategoryDropdowns",value:function(){var n=this.modalContainer.querySelector("#itsm-category"),e=this.modalContainer.querySelector("#itsm-subcategory"),t=this.modalContainer.querySelector("#itsm-item"),r=this.modalContainer.querySelector("#itsm-udf-pick-305");c.map(function(n){return n.category}).forEach(function(e){var t=document.createElement("option");t.value=e,t.textContent=e,n.appendChild(t)}),l.forEach(function(n){var e=document.createElement("option");e.value=n,e.textContent=n,r.appendChild(e)}),n&&n.addEventListener("change",function(n){var r,o,i=n.target.value;e&&(e.innerHTML='<option value="">Chưa lựa chọn</option>',e.disabled=!i),t&&(t.innerHTML='<option value="">Chưa lựa chọn</option>',t.disabled=!0),i&&((r=i,(o=c.find(function(n){return n.category===r}))?o.subcategories.map(function(n){return n.subcategory}):[]).forEach(function(n){var t=document.createElement("option");t.value=n,t.textContent=n,e&&e.appendChild(t)}),e&&(e.disabled=!1))}),e&&e.addEventListener("change",function(e){var r=null==n?void 0:n.value,o=e.target.value;t&&(t.innerHTML='<option value="">Chưa lựa chọn</option>',t.disabled=!o),r&&o&&(function(n,e){var t=c.find(function(e){return e.category===n});if(!t)return[];var r=t.subcategories.find(function(n){return n.subcategory===e});return r?r.items:[]}(r,o).forEach(function(n){var e=document.createElement("option");e.value=n,e.textContent=n,t&&t.appendChild(e)}),t&&(t.disabled=!1))})}},{key:"toggleModal",value:function(){this.isOpen?this.closeModal():this.openModal()}},{key:"openModal",value:function(){this.modalContainer.classList.add("itsm-modal-active"),this.modalContainer.style.display="flex",this.isOpen=!0,document.body.style.overflow="hidden"}},{key:"closeModal",value:function(){this.modalContainer.classList.remove("itsm-modal-active"),this.modalContainer.style.display="none",this.isOpen=!1,document.body.style.overflow=""}},{key:"handleFileSelect",value:function(n){var e=this,t=Array.from(n.target.files),r=this.modalContainer.querySelector("#itsm-file-list");0!==t.length?r.innerHTML=t.map(function(n){return'\n <div class="itsm-file-item">\n <span class="itsm-file-name">'.concat(n.name,'</span>\n <span class="itsm-file-size">').concat(e.formatFileSize(n.size),"</span>\n </div>\n ")}).join(""):r.innerHTML=""}},{key:"formatFileSize",value:function(n){if(0===n)return"0 Bytes";var e=Math.floor(Math.log(n)/Math.log(1024));return Math.round(n/Math.pow(1024,e)*100)/100+" "+["Bytes","KB","MB","GB"][e]}},{key:"handleSubmit",value:(o=v(b().m(function n(e){var t,r,o,i,a,s,c,l,d,u,m,f,p,h,g=this;return b().w(function(n){for(;;)switch(n.p=n.n){case 0:if(e.preventDefault(),t=e.target,r=new FormData(t),o={title:r.get("title"),description:r.get("description"),requester:this.config.requesterName||r.get("requester")||"",category:r.get("category"),subcategory:r.get("subcategory"),item:r.get("item"),priority:r.get("priority"),site:this.config.site||r.get("site")||"",udf_pick_305:r.get("udf_pick_305"),udf_pick_306:r.get("udf_pick_306"),contact:r.get("contact"),attachments:[]},i=this.modalContainer.querySelector("#itsm-description-editor"),o.description=i?i.innerHTML.trim():o.description,o.title&&o.description&&o.category&&o.subcategory&&o.item&&o.priority&&o.udf_pick_306&&o.requester){n.n=1;break}return this.showMessage("Vui lòng điền đầy đủ thông tin bắt buộc!","error"),n.a(2);case 1:if(i&&i.textContent.trim()){n.n=2;break}return this.showMessage("Mô tả không được để trống!","error"),null==i||i.focus(),n.a(2);case 2:return a=t.querySelector("#itsm-attachment"),s=Array.from(a.files),c=t.querySelector("#itsm-submit-btn"),l=c.querySelector(".itsm-btn-text"),d=c.querySelector(".itsm-btn-loading"),l.style.display="none",d.style.display="inline",c.disabled=!0,n.p=3,n.n=4,this.submitRequest(o,s);case 4:u=n.v,this.showMessage("Phiếu yêu cầu đã được gửi thành công!","success"),t.reset(),(m=this.modalContainer.querySelector("#itsm-description-editor"))&&(m.innerHTML=""),this.modalContainer.querySelector("#itsm-file-list").innerHTML="",f=this.modalContainer.querySelector("#itsm-subcategory"),p=this.modalContainer.querySelector("#itsm-item"),f&&(f.innerHTML='<option value="">Chưa lựa chọn</option>',f.disabled=!0),p&&(p.innerHTML='<option value="">Chưa lựa chọn</option>',p.disabled=!0),setTimeout(function(){g.closeModal()},1500),this.config.onSuccess&&this.config.onSuccess(u),n.n=6;break;case 5:n.p=5,h=n.v,console.error("Error submitting ITSM request:",h),this.showMessage(h.message||"Có lỗi xảy ra khi gửi yêu cầu. Vui lòng thử lại!","error");case 6:return n.p=6,l.style.display="inline",d.style.display="none",c.disabled=!1,n.f(6);case 7:return n.a(2)}},n,this,[[3,5,6,7]])})),function(n){return o.apply(this,arguments)})},{key:"submitRequest",value:(r=v(b().m(function n(e,t){var r,o,i;return b().w(function(n){for(;;)switch(n.n){case 0:if(r={udf_pick_301:d||"EVNSPC",udf_pick_302:u||"A - An toàn điện",udf_pick_303:m||"A1 - Phần mềm ứng dụng",udf_pick_304:f||"C - The Business/Customer Service Catalog",udf_pick_305:e.udf_pick_305||null,udf_pick_306:e.udf_pick_306||p||null,udf_pick_602:null,udf_mline_603:""},Object.assign(r,this.config.udf_fields||{}),o=this.apiService.buildRequestData(e,{requesterName:this.config.requesterName||e.requester||e.contact||"",site:this.config.site||e.site||null,category:e.category,subcategory:e.subcategory,item:e.item,template:e.category,udf_fields:r,zia_properties:this.config.zia_properties||{}}),!((i=t&&t.length>0?Array.from(t):[]).length>0)){n.n=2;break}return n.n=1,this.apiService.createRequestWithAttachments(o,i);case 1:case 3:return n.a(2,n.v);case 2:return n.n=3,this.apiService.createRequest(o);case 4:return n.a(2)}},n,this)})),function(n,e){return r.apply(this,arguments)})},{key:"showMessage",value:function(n){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"info",t=document.querySelector(".itsm-message");t&&t.remove();var r=document.createElement("div");r.className="itsm-message itsm-message-".concat(e),r.textContent=n,document.body.appendChild(r),setTimeout(function(){r.classList.add("itsm-message-show")},10),setTimeout(function(){r.classList.remove("itsm-message-show"),setTimeout(function(){return r.remove()},300)},3e3)}},{key:"destroy",value:function(){this.widgetContainer&&this.widgetContainer.remove(),this.modalContainer&&this.modalContainer.remove(),document.body.style.overflow=""}}],e&&k(n.prototype,e),t&&k(n,t),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,e,t,r,o}();n.exports&&(n.exports=S,n.exports.default=S);const A=S;"undefined"!=typeof window&&(window.ITSMWidget=S,window.ITSMWidget.default||(window.ITSMWidget.default=S),document.addEventListener("DOMContentLoaded",function(){var n=document.querySelector("script[data-itsm-config]");if(n)try{var e=JSON.parse(n.getAttribute("data-itsm-config"));window.itsmWidgetInstance=new S(e)}catch(n){console.error("Error parsing ITSM widget config:",n)}}))},555:(n,e,t)=>{t.d(e,{A:()=>i});var r=t(314),o=t.n(r)()(function(n){return n[1]});o.push([n.id,'/**\r\n * ITSM Widget Styles\r\n * Native HTML/CSS - No external libraries required\r\n */\r\n\r\n/* Floating Button */\r\n.itsm-widget-button {\r\n position: fixed;\r\n z-index: 9998;\r\n cursor: pointer;\r\n transition: transform 0.3s ease, box-shadow 0.3s ease;\r\n border-radius: 50%;\r\n overflow: visible;\r\n padding: 4px;\r\n border: 3px solid transparent;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background-color: #ffffff;\r\n}\r\n\r\n.itsm-widget-button:hover {\r\n transform: scale(1.1);\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\r\n}\r\n\r\n.itsm-position-bottom-right {\r\n bottom: 24px;\r\n right: 24px;\r\n}\r\n\r\n.itsm-position-bottom-left {\r\n bottom: 24px;\r\n left: 24px;\r\n}\r\n\r\n.itsm-widget-icon {\r\n width: 48px;\r\n height: 48px;\r\n padding: 8px;\r\n border-radius: 50%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n color: white;\r\n font-size: 18px;\r\n font-weight: bold;\r\n /* box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); */\r\n user-select: none;\r\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;\r\n overflow: hidden;\r\n background-color: #ffffff;\r\n}\r\n\r\n.itsm-widget-icon-img {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: contain;\r\n filter: brightness(0) saturate(100%) invert(27%) sepia(78%) saturate(1250%) hue-rotate(197deg) brightness(96%) contrast(95%);\r\n /* border-radius: 50%; */\r\n}\r\n\r\n/* Modal Overlay */\r\n.itsm-modal-overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background-color: rgba(0, 0, 0, 0.5);\r\n z-index: 9999;\r\n display: none;\r\n align-items: center;\r\n justify-content: center;\r\n opacity: 0;\r\n transition: opacity 0.3s ease;\r\n padding: 16px;\r\n}\r\n\r\n.itsm-modal-overlay.itsm-modal-active {\r\n display: flex;\r\n opacity: 1;\r\n}\r\n\r\n/* Modal Container */\r\n.itsm-modal-container {\r\n background: #ffffff;\r\n border-radius: 6px;\r\n box-shadow: 0 11px 15px -7px rgba(0, 0, 0, 0.2), 0 24px 38px 3px rgba(0, 0, 0, 0.14), 0 9px 46px 8px rgba(0, 0, 0, 0.12);\r\n width: 100%;\r\n max-width: 50vw;\r\n max-height: 90vh;\r\n display: flex;\r\n flex-direction: column;\r\n transform: scale(0.9);\r\n transition: transform 0.3s ease;\r\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;\r\n}\r\n\r\n.itsm-modal-overlay.itsm-modal-active .itsm-modal-container {\r\n transform: scale(1);\r\n}\r\n\r\n/* Modal Header */\r\n.itsm-modal-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 1.5rem;\r\n border-bottom: 1px solid #e9ecef;\r\n background-color: #ffffff;\r\n border-radius: 6px 6px 0 0;\r\n flex-shrink: 0;\r\n}\r\n\r\n.itsm-modal-title {\r\n margin: 0;\r\n font-size: 1.5rem;\r\n font-weight: 600;\r\n color: #212529;\r\n flex: 1;\r\n}\r\n\r\n.itsm-modal-header-icons {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n}\r\n\r\n.itsm-modal-close {\r\n background: transparent;\r\n border: none;\r\n color: #6c757d;\r\n cursor: pointer;\r\n padding: 0.5rem;\r\n width: 2rem;\r\n height: 2rem;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: 50%;\r\n transition: background-color 0.2s ease, color 0.2s ease;\r\n font-size: 1.5rem;\r\n line-height: 1;\r\n}\r\n\r\n.itsm-modal-close:hover {\r\n background-color: #e9ecef;\r\n color: #212529;\r\n}\r\n\r\n.itsm-modal-close span {\r\n font-size: 1.5rem;\r\n line-height: 1;\r\n}\r\n\r\n/* Modal Content */\r\n.itsm-modal-content {\r\n padding: 1.5rem;\r\n overflow-y: auto;\r\n flex: 1;\r\n}\r\n\r\n/* Modal Footer */\r\n.itsm-modal-footer {\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: 0.5rem;\r\n padding: 1rem 1.5rem;\r\n border-top: 1px solid #e9ecef;\r\n background-color: #ffffff;\r\n border-radius: 0 0 6px 6px;\r\n flex-shrink: 0;\r\n}\r\n\r\n/* Form Styles */\r\n.itsm-form {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 1rem;\r\n}\r\n\r\n.itsm-form-row {\r\n display: flex;\r\n gap: 1rem;\r\n}\r\n\r\n.itsm-form-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0.5rem;\r\n}\r\n\r\n.itsm-form-group-half {\r\n flex: 1;\r\n}\r\n\r\n/* Label */\r\n.itsm-form-group label {\r\n font-weight: 500;\r\n color: #495057;\r\n font-size: 0.875rem;\r\n display: block;\r\n margin-bottom: 0.25rem;\r\n}\r\n\r\n.itsm-required {\r\n color: #dc3545;\r\n margin-left: 2px;\r\n}\r\n\r\n/* Input */\r\n.itsm-input {\r\n width: 100%;\r\n padding: 0.5rem 0.75rem;\r\n font-size: 1rem;\r\n line-height: 1.5;\r\n color: #495057;\r\n background-color: #ffffff;\r\n border: 1px solid #ced4da;\r\n border-radius: 4px;\r\n transition: background-color 0.2s, border-color 0.2s, box-shadow 0.2s;\r\n font-family: inherit;\r\n box-sizing: border-box;\r\n}\r\n\r\n.itsm-input:hover {\r\n border-color: #adb5bd;\r\n}\r\n\r\n.itsm-input:focus {\r\n outline: 0 none;\r\n outline-offset: 0;\r\n border-color: #007bff;\r\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\r\n}\r\n\r\n.itsm-input:disabled {\r\n background-color: #e9ecef;\r\n opacity: 1;\r\n cursor: not-allowed;\r\n}\r\n\r\n/* Textarea */\r\n.itsm-textarea {\r\n width: 100%;\r\n padding: 0.5rem 0.75rem;\r\n font-size: 1rem;\r\n line-height: 1.5;\r\n color: #495057;\r\n background-color: #ffffff;\r\n border: 1px solid #ced4da;\r\n border-radius: 4px;\r\n transition: background-color 0.2s, border-color 0.2s, box-shadow 0.2s;\r\n font-family: inherit;\r\n box-sizing: border-box;\r\n resize: vertical;\r\n min-height: 100px;\r\n}\r\n\r\n.itsm-textarea:hover {\r\n border-color: #adb5bd;\r\n}\r\n\r\n.itsm-textarea:focus {\r\n outline: 0 none;\r\n outline-offset: 0;\r\n border-color: #007bff;\r\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\r\n}\r\n\r\n.itsm-textarea:disabled {\r\n background-color: #e9ecef;\r\n opacity: 1;\r\n cursor: not-allowed;\r\n}\r\n\r\n/* Rich Text Editor */\r\n.itsm-editor-container {\r\n border: 1px solid #ced4da;\r\n border-radius: 4px;\r\n background-color: #ffffff;\r\n transition: border-color 0.2s, box-shadow 0.2s;\r\n}\r\n\r\n.itsm-editor-container:focus-within {\r\n border-color: #007bff;\r\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\r\n}\r\n\r\n.itsm-editor-toolbar {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.25rem;\r\n padding: 0.5rem;\r\n border-bottom: 1px solid #e9ecef;\r\n background-color: #f8f9fa;\r\n flex-wrap: wrap;\r\n}\r\n\r\n.itsm-editor-btn {\r\n padding: 0.25rem 0.5rem;\r\n font-size: 0.875rem;\r\n border: 1px solid #ced4da;\r\n border-radius: 3px;\r\n background-color: #ffffff;\r\n color: #495057;\r\n cursor: pointer;\r\n transition: background-color 0.2s, border-color 0.2s;\r\n font-family: inherit;\r\n min-width: 2rem;\r\n height: 2rem;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.itsm-editor-btn:hover {\r\n background-color: #e9ecef;\r\n border-color: #adb5bd;\r\n}\r\n\r\n.itsm-editor-btn:active {\r\n background-color: #dee2e6;\r\n}\r\n\r\n.itsm-editor-separator {\r\n width: 1px;\r\n height: 1.5rem;\r\n background-color: #ced4da;\r\n margin: 0 0.25rem;\r\n}\r\n\r\n.itsm-editor-file-btn {\r\n padding: 0.25rem 0.5rem;\r\n font-size: 0.875rem;\r\n border: 1px solid #ced4da;\r\n border-radius: 3px;\r\n background-color: #ffffff;\r\n color: #495057;\r\n cursor: pointer;\r\n transition: background-color 0.2s, border-color 0.2s;\r\n font-family: inherit;\r\n margin-left: auto;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.itsm-editor-file-btn:hover {\r\n background-color: #e9ecef;\r\n border-color: #adb5bd;\r\n}\r\n\r\n.itsm-editor-content {\r\n min-height: 150px;\r\n max-height: 400px;\r\n overflow-y: auto;\r\n padding: 0.75rem;\r\n font-size: 1rem;\r\n line-height: 1.5;\r\n color: #495057;\r\n font-family: inherit;\r\n outline: none;\r\n}\r\n\r\n.itsm-editor-content:empty:before {\r\n content: attr(data-placeholder);\r\n color: #6c757d;\r\n pointer-events: none;\r\n}\r\n\r\n.itsm-editor-content:focus:empty:before {\r\n content: \'\';\r\n}\r\n\r\n.itsm-editor-content img {\r\n max-width: 100%;\r\n height: auto;\r\n margin: 0.5rem 0;\r\n}\r\n\r\n.itsm-editor-content ul,\r\n.itsm-editor-content ol {\r\n margin: 0.5rem 0;\r\n padding-left: 1.5rem;\r\n}\r\n\r\n.itsm-editor-content p {\r\n margin: 0.5rem 0;\r\n}\r\n\r\n.itsm-editor-content p:first-child {\r\n margin-top: 0;\r\n}\r\n\r\n.itsm-editor-content p:last-child {\r\n margin-bottom: 0;\r\n}\r\n\r\n/* Select */\r\n.itsm-select {\r\n width: 100%;\r\n padding: 0.5rem 0.75rem;\r\n font-size: 1rem;\r\n line-height: 1.5;\r\n color: #495057;\r\n background-color: #ffffff;\r\n border: 1px solid #ced4da;\r\n border-radius: 4px;\r\n transition: background-color 0.2s, border-color 0.2s, box-shadow 0.2s;\r\n font-family: inherit;\r\n box-sizing: border-box;\r\n cursor: pointer;\r\n}\r\n\r\n.itsm-select:hover {\r\n border-color: #adb5bd;\r\n}\r\n\r\n.itsm-select:focus {\r\n outline: 0 none;\r\n outline-offset: 0;\r\n border-color: #007bff;\r\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\r\n}\r\n\r\n.itsm-select:disabled {\r\n background-color: #e9ecef;\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n}\r\n\r\n/* Button */\r\n.itsm-btn {\r\n padding: 0.5rem 1rem;\r\n font-size: 1rem;\r\n font-weight: 400;\r\n line-height: 1.5;\r\n border-radius: 4px;\r\n border: 1px solid transparent;\r\n cursor: pointer;\r\n transition: background-color 0.2s, border-color 0.2s, box-shadow 0.2s;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n text-align: center;\r\n user-select: none;\r\n font-family: inherit;\r\n position: relative;\r\n overflow: hidden;\r\n}\r\n\r\n.itsm-btn:disabled {\r\n opacity: 0.6;\r\n cursor: default;\r\n}\r\n\r\n.itsm-btn-text {\r\n line-height: inherit;\r\n}\r\n\r\n/* Primary Button */\r\n.itsm-btn-primary {\r\n color: #ffffff;\r\n background-color: #007bff;\r\n border-color: #007bff;\r\n}\r\n\r\n.itsm-btn-primary:hover:not(:disabled) {\r\n background-color: #0056b3;\r\n border-color: #0056b3;\r\n}\r\n\r\n.itsm-btn-primary:focus {\r\n outline: 0 none;\r\n outline-offset: 0;\r\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\r\n}\r\n\r\n.itsm-btn-primary:active:not(:disabled) {\r\n background-color: #004085;\r\n border-color: #004085;\r\n}\r\n\r\n/* Secondary Button */\r\n.itsm-btn-secondary {\r\n color: #ffffff;\r\n background-color: #6c757d;\r\n border-color: #6c757d;\r\n}\r\n\r\n.itsm-btn-secondary:hover:not(:disabled) {\r\n background-color: #5a6268;\r\n border-color: #545b62;\r\n}\r\n\r\n.itsm-btn-secondary:focus {\r\n outline: 0 none;\r\n outline-offset: 0;\r\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\r\n}\r\n\r\n.itsm-btn-secondary:active:not(:disabled) {\r\n background-color: #545b62;\r\n border-color: #4e555b;\r\n}\r\n\r\n/* File Input */\r\n.itsm-file-list {\r\n margin-top: 0.5rem;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0.5rem;\r\n}\r\n\r\n.itsm-file-item {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 0.5rem;\r\n background-color: #f8f9fa;\r\n border-radius: 4px;\r\n font-size: 0.875rem;\r\n}\r\n\r\n.itsm-file-name {\r\n color: #495057;\r\n flex: 1;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.itsm-file-size {\r\n color: #6c757d;\r\n margin-left: 0.5rem;\r\n}\r\n\r\n/* Message/Toast Styles */\r\n.itsm-message {\r\n position: fixed;\r\n top: 20px;\r\n right: 20px;\r\n z-index: 10000;\r\n padding: 1rem 1.5rem;\r\n border-radius: 4px;\r\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\r\n min-width: 300px;\r\n max-width: 500px;\r\n transform: translateX(400px);\r\n transition: transform 0.3s ease;\r\n font-family: inherit;\r\n font-size: 0.875rem;\r\n}\r\n\r\n.itsm-message.itsm-message-show {\r\n transform: translateX(0);\r\n}\r\n\r\n.itsm-message-success {\r\n background-color: #d4edda;\r\n color: #155724;\r\n border: 1px solid #c3e6cb;\r\n}\r\n\r\n.itsm-message-error {\r\n background-color: #f8d7da;\r\n color: #721c24;\r\n border: 1px solid #f5c6cb;\r\n}\r\n\r\n.itsm-message-info {\r\n background-color: #d1ecf1;\r\n color: #0c5460;\r\n border: 1px solid #bee5eb;\r\n}\r\n\r\n/* Responsive */\r\n@media (max-width: 768px) {\r\n .itsm-modal-container {\r\n max-width: 95%;\r\n max-height: 95vh;\r\n }\r\n\r\n .itsm-form-row {\r\n flex-direction: column;\r\n }\r\n\r\n .itsm-form-group-half {\r\n flex: none;\r\n }\r\n\r\n .itsm-modal-header,\r\n .itsm-modal-content,\r\n .itsm-modal-footer {\r\n padding: 1rem;\r\n }\r\n}',""]);const i=o},890:(n,e,t)=>{function r(n){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},r(n)}function o(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(n);e&&(r=r.filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable})),t.push.apply(t,r)}return t}function i(n){for(var e=1;e<arguments.length;e++){var t=null!=arguments[e]?arguments[e]:{};e%2?o(Object(t),!0).forEach(function(e){a(n,e,t[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(t)):o(Object(t)).forEach(function(e){Object.defineProperty(n,e,Object.getOwnPropertyDescriptor(t,e))})}return n}function a(n,e,t){return(e=m(e))in n?Object.defineProperty(n,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):n[e]=t,n}function s(){var n,e,t="function"==typeof Symbol?Symbol:{},r=t.iterator||"@@iterator",o=t.toStringTag||"@@toStringTag";function i(t,r,o,i){var s=r&&r.prototype instanceof l?r:l,d=Object.create(s.prototype);return c(d,"_invoke",function(t,r,o){var i,s,c,l=0,d=o||[],u=!1,m={p:0,n:0,v:n,a:f,f:f.bind(n,4),d:function(e,t){return i=e,s=0,c=n,m.n=t,a}};function f(t,r){for(s=t,c=r,e=0;!u&&l&&!o&&e<d.length;e++){var o,i=d[e],f=m.p,p=i[2];t>3?(o=p===r)&&(c=i[(s=i[4])?5:(s=3,3)],i[4]=i[5]=n):i[0]<=f&&((o=t<2&&f<i[1])?(s=0,m.v=r,m.n=i[1]):f<p&&(o=t<3||i[0]>r||r>p)&&(i[4]=t,i[5]=r,m.n=p,s=0))}if(o||t>1)return a;throw u=!0,r}return function(o,d,p){if(l>1)throw TypeError("Generator is already running");for(u&&1===d&&f(d,p),s=d,c=p;(e=s<2?n:c)||!u;){i||(s?s<3?(s>1&&(m.n=-1),f(s,c)):m.n=c:m.v=c);try{if(l=2,i){if(s||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,s<2&&(s=0)}else 1===s&&(e=i.return)&&e.call(i),s<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),s=1);i=n}else if((e=(u=m.n<0)?c:t.call(r,m))!==a)break}catch(e){i=n,s=1,c=e}finally{l=1}}return{value:e,done:u}}}(t,o,i),!0),d}var a={};function l(){}function d(){}function u(){}e=Object.getPrototypeOf;var m=[][r]?e(e([][r]())):(c(e={},r,function(){return this}),e),f=u.prototype=l.prototype=Object.create(m);function p(n){return Object.setPrototypeOf?Object.setPrototypeOf(n,u):(n.__proto__=u,c(n,o,"GeneratorFunction")),n.prototype=Object.create(f),n}return d.prototype=u,c(f,"constructor",u),c(u,"constructor",d),d.displayName="GeneratorFunction",c(u,o,"GeneratorFunction"),c(f),c(f,o,"Generator"),c(f,r,function(){return this}),c(f,"toString",function(){return"[object Generator]"}),(s=function(){return{w:i,m:p}})()}function c(n,e,t,r){var o=Object.defineProperty;try{o({},"",{})}catch(n){o=0}c=function(n,e,t,r){function i(e,t){c(n,e,function(n){return this._invoke(e,t,n)})}e?o?o(n,e,{value:t,enumerable:!r,configurable:!r,writable:!r}):n[e]=t:(i("next",0),i("throw",1),i("return",2))},c(n,e,t,r)}function l(n,e,t,r,o,i,a){try{var s=n[i](a),c=s.value}catch(n){return void t(n)}s.done?e(c):Promise.resolve(c).then(r,o)}function d(n){return function(){var e=this,t=arguments;return new Promise(function(r,o){var i=n.apply(e,t);function a(n){l(i,r,o,a,s,"next",n)}function s(n){l(i,r,o,a,s,"throw",n)}a(void 0)})}}function u(n,e){for(var t=0;t<e.length;t++){var r=e[t];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(n,m(r.key),r)}}function m(n){var e=function(n,e){if("object"!=r(n)||!n)return n;var t=n[Symbol.toPrimitive];if(void 0!==t){var o=t.call(n,e||"default");if("object"!=r(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(n)}(n,"string");return"symbol"==r(e)?e:e+""}t.d(e,{A:()=>p}),n=t.hmd(n);var f=function(){return n=function n(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};!function(n,e){if(!(n instanceof e))throw new TypeError("Cannot call a class as a function")}(this,n),this.baseUrl=e.baseUrl||"https://itsm.evnspc.vn:8812",this.apiKey=e.apiKey||"sdpi.14e69f98-7be5-477c-aa01-af022e46afcq",this.tenant=e.tenant||"spcit"},e=[{key:"createRequest",value:(c=d(s().m(function n(e){var t,r,o,i,a,c;return s().w(function(n){for(;;)switch(n.p=n.n){case 0:return t="".concat(this.baseUrl,"/spcit/send"),r=JSON.stringify({request:{requester:e.requester||{name:""},assets:e.assets||[],category:e.category||null,group:e.group||null,subcategory:e.subcategory||null,technician:e.technician||null,item:e.item||null,priority:e.priority||null,subject:e.subject||"",description:e.description||"",site:e.site||null,attachments:e.attachments||[],udf_fields:e.udf_fields||{},template:e.template||null,zia_properties:e.zia_properties||{}}}),(o=new FormData).append("input_data",r),n.p=1,n.n=2,fetch(t,{method:"POST",headers:{authtoken:this.apiKey,pn:this.tenant},body:o});case 2:return i=n.v,n.n=3,i.json();case 3:if(a=n.v,i.ok){n.n=4;break}throw new Error(a.error||"HTTP error! status: ".concat(i.status));case 4:return n.a(2,a);case 5:throw n.p=5,c=n.v,console.error("Error creating request:",c),c;case 6:return n.a(2)}},n,this,[[1,5]])})),function(n){return c.apply(this,arguments)})},{key:"uploadAttachment",value:(a=d(s().m(function n(e,t){var r,o,i,a,c;return s().w(function(n){for(;;)switch(n.p=n.n){case 0:return r="".concat(this.baseUrl,"/spcit/").concat(e,"/upload"),o=new FormData,(Array.isArray(t)?t:[t]).forEach(function(n,e){n instanceof File&&o.append("attachment_".concat(e),n)}),n.p=1,n.n=2,fetch(r,{method:"PUT",headers:{authtoken:this.apiKey,pn:this.tenant},body:o});case 2:return i=n.v,n.n=3,i.json();case 3:if(a=n.v,i.ok){n.n=4;break}throw new Error(a.error||"HTTP error! status: ".concat(i.status));case 4:return n.a(2,a);case 5:throw n.p=5,c=n.v,console.error("Error uploading attachment:",c),c;case 6:return n.a(2)}},n,this,[[1,5]])})),function(n,e){return a.apply(this,arguments)})},{key:"createRequestWithAttachments",value:(o=d(s().m(function n(e){var t,r,o,a,c,l,d=arguments;return s().w(function(n){for(;;)switch(n.p=n.n){case 0:return t=d.length>1&&void 0!==d[1]?d[1]:[],n.p=1,n.n=2,this.createRequest(e);case 2:if(o=n.v,!(t&&t.length>0&&null!==(r=o.request)&&void 0!==r&&r.id)){n.n=6;break}return n.p=3,n.n=4,this.uploadAttachment(o.request.id,t);case 4:return a=n.v,n.a(2,i(i({},o),{},{uploadResponse:a}));case 5:return n.p=5,c=n.v,console.warn("Request created but file upload failed:",c),n.a(2,i(i({},o),{},{uploadError:c.message}));case 6:return n.a(2,o);case 7:throw n.p=7,l=n.v,console.error("Error creating request with attachments:",l),l;case 8:return n.a(2)}},n,this,[[3,5],[1,7]])})),function(n){return o.apply(this,arguments)})},{key:"getRequest",value:(r=d(s().m(function n(e){var t,r,o,i;return s().w(function(n){for(;;)switch(n.p=n.n){case 0:return t="".concat(this.baseUrl,"/spcit/").concat(e),n.p=1,n.n=2,fetch(t,{method:"GET",headers:{authtoken:this.apiKey,pn:this.tenant,Accept:"application/json"}});case 2:return r=n.v,n.n=3,r.json();case 3:if(o=n.v,r.ok){n.n=4;break}throw new Error(o.error||"HTTP error! status: ".concat(r.status));case 4:return n.a(2,o);case 5:throw n.p=5,i=n.v,console.error("Error getting request:",i),i;case 6:return n.a(2)}},n,this,[[1,5]])})),function(n){return r.apply(this,arguments)})},{key:"mapPriority",value:function(n){return{low:"Thấp",medium:"Trung bình",high:"Cao",none:"Chưa lựa chọn"}[n]||"Chưa lựa chọn"}},{key:"mapCategory",value:function(n){return{hardware:"A01A00 - Quản lý an toàn thông tin",software:"Software Category",network:"Network Category",account:"Account Category",other:"Other Category"}[n]||null}},{key:"buildRequestData",value:function(n){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=e.category||this.mapCategory(n.category),r=e.subcategory||n.subcategory||null,o=e.item||n.item||null,i=e.template||t||null,a=e.requesterName||n.requester||n.contact||"",s=e.site||n.site||"";return{requester:{name:a},category:t?{name:t}:null,subcategory:r?{name:r}:null,priority:{name:this.mapPriority(n.priority||"none")},subject:n.title||"",description:n.description||"",site:s?{name:s}:null,item:o?{name:o}:null,template:i?{name:i}:null,udf_fields:e.udf_fields||{},zia_properties:e.zia_properties||{},assets:[],attachments:[],group:null,technician:null}}}],e&&u(n.prototype,e),t&&u(n,t),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,e,t,r,o,a,c}();n.exports&&(n.exports=f),"undefined"!=typeof window&&(window.ITSMAPIService=f);const p=f}},e={};function t(r){var o=e[r];if(void 0!==o)return o.exports;var i=e[r]={id:r,loaded:!1,exports:{}};return n[r](i,i.exports,t),i.loaded=!0,i.exports}return t.n=n=>{var e=n&&n.__esModule?()=>n.default:()=>n;return t.d(e,{a:e}),e},t.d=(n,e)=>{for(var r in e)t.o(e,r)&&!t.o(n,r)&&Object.defineProperty(n,r,{enumerable:!0,get:e[r]})},t.hmd=n=>((n=Object.create(n)).children||(n.children=[]),Object.defineProperty(n,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+n.id)}}),n),t.o=(n,e)=>Object.prototype.hasOwnProperty.call(n,e),t.r=n=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.nc=void 0,t(322)})());
|
|
2
|
+
!function(n,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ITSMWidget=e():n.ITSMWidget=e()}(window,()=>(()=>{"use strict";var n={72:(n,e,r)=>{var t,o=function(){return void 0===t&&(t=Boolean(window&&document&&document.all&&!window.atob)),t},i=function(){var n={};return function(e){if(void 0===n[e]){var r=document.querySelector(e);if(window.HTMLIFrameElement&&r instanceof window.HTMLIFrameElement)try{r=r.contentDocument.head}catch(n){r=null}n[e]=r}return n[e]}}(),a=[];function s(n){for(var e=-1,r=0;r<a.length;r++)if(a[r].identifier===n){e=r;break}return e}function c(n,e){for(var r={},t=[],o=0;o<n.length;o++){var i=n[o],c=e.base?i[0]+e.base:i[0],l=r[c]||0,u="".concat(c," ").concat(l);r[c]=l+1;var d=s(u),f={css:i[1],media:i[2],sourceMap:i[3]};-1!==d?(a[d].references++,a[d].updater(f)):a.push({identifier:u,updater:g(f,e),references:1}),t.push(u)}return t}function l(n){var e=document.createElement("style"),t=n.attributes||{};if(void 0===t.nonce){var o=r.nc;o&&(t.nonce=o)}if(Object.keys(t).forEach(function(n){e.setAttribute(n,t[n])}),"function"==typeof n.insert)n.insert(e);else{var a=i(n.insert||"head");if(!a)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");a.appendChild(e)}return e}var u,d=(u=[],function(n,e){return u[n]=e,u.filter(Boolean).join("\n")});function f(n,e,r,t){var o=r?"":t.media?"@media ".concat(t.media," {").concat(t.css,"}"):t.css;if(n.styleSheet)n.styleSheet.cssText=d(e,o);else{var i=document.createTextNode(o),a=n.childNodes;a[e]&&n.removeChild(a[e]),a.length?n.insertBefore(i,a[e]):n.appendChild(i)}}function m(n,e,r){var t=r.css,o=r.media,i=r.sourceMap;if(o?n.setAttribute("media",o):n.removeAttribute("media"),i&&"undefined"!=typeof btoa&&(t+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(i))))," */")),n.styleSheet)n.styleSheet.cssText=t;else{for(;n.firstChild;)n.removeChild(n.firstChild);n.appendChild(document.createTextNode(t))}}var p=null,h=0;function g(n,e){var r,t,o;if(e.singleton){var i=h++;r=p||(p=l(e)),t=f.bind(null,r,i,!1),o=f.bind(null,r,i,!0)}else r=l(e),t=m.bind(null,r,e),o=function(){!function(n){if(null===n.parentNode)return!1;n.parentNode.removeChild(n)}(r)};return t(n),function(e){if(e){if(e.css===n.css&&e.media===n.media&&e.sourceMap===n.sourceMap)return;t(n=e)}else o()}}n.exports=function(n,e){(e=e||{}).singleton||"boolean"==typeof e.singleton||(e.singleton=o());var r=c(n=n||[],e);return function(n){if(n=n||[],"[object Array]"===Object.prototype.toString.call(n)){for(var t=0;t<r.length;t++){var o=s(r[t]);a[o].references--}for(var i=c(n,e),l=0;l<r.length;l++){var u=s(r[l]);0===a[u].references&&(a[u].updater(),a.splice(u,1))}r=i}}}},314:n=>{n.exports=function(n){var e=[];return e.toString=function(){return this.map(function(e){var r=n(e);return e[2]?"@media ".concat(e[2]," {").concat(r,"}"):r}).join("")},e.i=function(n,r,t){"string"==typeof n&&(n=[[null,n,""]]);var o={};if(t)for(var i=0;i<this.length;i++){var a=this[i][0];null!=a&&(o[a]=!0)}for(var s=0;s<n.length;s++){var c=[].concat(n[s]);t&&o[c[0]]||(r&&(c[2]?c[2]="".concat(r," and ").concat(c[2]):c[2]=r),e.push(c))}},e}},322:(n,e,r)=>{r.r(e),r.d(e,{default:()=>B});var t=r(72),o=r.n(t),i=r(555),a={insert:"head",singleton:!1};o()(i.A,a);i.A.locals;var s=r(890),c=[{category:"A01A00 - Quản lý an toàn điện",subcategories:[{subcategory:"A01A01 - Hệ thống",items:["Danh sách chức năng","Danh sách đơn vị","Danh sách người dùng","Danh sách nhóm","Phân quyền"]},{subcategory:"A01A02 - Giám sát an toàn",items:["Báo cáo","Khởi tạo số phiếu","Lệnh công tác","Phiếu công tác"]},{subcategory:"A01A03 - Quản lý công tác an toàn",items:["An toàn điện","Báo cáo CT ATVSLĐ","BC tháng hành động","Biên bản sinh hoạt AT","Công tác HLuyện ATLĐ","Công tác kiểm tra ATLĐ","Công tác PCCC & CNCH","Danh mục","Dụng cụ An toàn","Kế hoạch công tác AT","Kiến nghị","Lịch công tác tuần","Mạng lưới ATVSV","PCTT-TKCN","Quy trình quy định","Tai nạn lao động","Thi đua - khen thưởng","Thiết bị Hotline","Thiết bị Hotline YCNN","Thiết bị YCNN"]},{subcategory:"A01A04 - Đánh giá rủi ro",items:["Bổ sung","Danh mục DGRR","Định kỳ","Lực lượng làm công tác ATVSLĐ","QĐ thành lập nhóm"]}]}],l=["Bổ sung chương trình","Dữ liệu","Hiệu chỉnh chương trình","Nghiệp vụ","Phần mềm"],u="EVNSPC",d="A - An toàn điện",f="A1 - Phần mềm ứng dụng",m="C - The Business/Customer Service Catalog",p="Máy tính";function h(n){return h="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},h(n)}n=r.hmd(n);var g=["apiBaseUrl"];function b(){var n,e,r="function"==typeof Symbol?Symbol:{},t=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function i(r,t,o,i){var c=t&&t.prototype instanceof s?t:s,l=Object.create(c.prototype);return y(l,"_invoke",function(r,t,o){var i,s,c,l=0,u=o||[],d=!1,f={p:0,n:0,v:n,a:m,f:m.bind(n,4),d:function(e,r){return i=e,s=0,c=n,f.n=r,a}};function m(r,t){for(s=r,c=t,e=0;!d&&l&&!o&&e<u.length;e++){var o,i=u[e],m=f.p,p=i[2];r>3?(o=p===t)&&(c=i[(s=i[4])?5:(s=3,3)],i[4]=i[5]=n):i[0]<=m&&((o=r<2&&m<i[1])?(s=0,f.v=t,f.n=i[1]):m<p&&(o=r<3||i[0]>t||t>p)&&(i[4]=r,i[5]=t,f.n=p,s=0))}if(o||r>1)return a;throw d=!0,t}return function(o,u,p){if(l>1)throw TypeError("Generator is already running");for(d&&1===u&&m(u,p),s=u,c=p;(e=s<2?n:c)||!d;){i||(s?s<3?(s>1&&(f.n=-1),m(s,c)):f.n=c:f.v=c);try{if(l=2,i){if(s||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,s<2&&(s=0)}else 1===s&&(e=i.return)&&e.call(i),s<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),s=1);i=n}else if((e=(d=f.n<0)?c:r.call(t,f))!==a)break}catch(e){i=n,s=1,c=e}finally{l=1}}return{value:e,done:d}}}(r,o,i),!0),l}var a={};function s(){}function c(){}function l(){}e=Object.getPrototypeOf;var u=[][t]?e(e([][t]())):(y(e={},t,function(){return this}),e),d=l.prototype=s.prototype=Object.create(u);function f(n){return Object.setPrototypeOf?Object.setPrototypeOf(n,l):(n.__proto__=l,y(n,o,"GeneratorFunction")),n.prototype=Object.create(d),n}return c.prototype=l,y(d,"constructor",l),y(l,"constructor",c),c.displayName="GeneratorFunction",y(l,o,"GeneratorFunction"),y(d),y(d,o,"Generator"),y(d,t,function(){return this}),y(d,"toString",function(){return"[object Generator]"}),(b=function(){return{w:i,m:f}})()}function y(n,e,r,t){var o=Object.defineProperty;try{o({},"",{})}catch(n){o=0}y=function(n,e,r,t){function i(e,r){y(n,e,function(n){return this._invoke(e,r,n)})}e?o?o(n,e,{value:r,enumerable:!t,configurable:!t,writable:!t}):n[e]=r:(i("next",0),i("throw",1),i("return",2))},y(n,e,r,t)}function v(n,e){var r=Object.keys(n);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(n);e&&(t=t.filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable})),r.push.apply(r,t)}return r}function w(n){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?v(Object(r),!0).forEach(function(e){x(n,e,r[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(r)):v(Object(r)).forEach(function(e){Object.defineProperty(n,e,Object.getOwnPropertyDescriptor(r,e))})}return n}function x(n,e,r){return(e=C(e))in n?Object.defineProperty(n,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):n[e]=r,n}function k(n,e){if(null==n)return{};var r,t,o=function(n,e){if(null==n)return{};var r={};for(var t in n)if({}.hasOwnProperty.call(n,t)){if(-1!==e.indexOf(t))continue;r[t]=n[t]}return r}(n,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(n);for(t=0;t<i.length;t++)r=i[t],-1===e.indexOf(r)&&{}.propertyIsEnumerable.call(n,r)&&(o[r]=n[r])}return o}function S(n,e){for(var r=0;r<e.length;r++){var t=e[r];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(n,C(t.key),t)}}function C(n){var e=function(n,e){if("object"!=h(n)||!n)return n;var r=n[Symbol.toPrimitive];if(void 0!==r){var t=r.call(n,e||"default");if("object"!=h(t))return t;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(n)}(n,"string");return"symbol"==h(e)?e:e+""}function T(n,e,r,t,o,i,a){try{var s=n[i](a),c=s.value}catch(n){return void r(n)}s.done?e(c):Promise.resolve(c).then(t,o)}function A(n){return function(){var e=this,r=arguments;return new Promise(function(t,o){var i=n.apply(e,r);function a(n){T(i,t,o,a,s,"next",n)}function s(n){T(i,t,o,a,s,"throw",n)}a(void 0)})}}var M=null,j=null;function q(){return O.apply(this,arguments)}function O(){return(O=A(b().m(function n(){return b().w(function(n){for(;;)switch(n.n){case 0:if(null===M){n.n=1;break}return n.a(2,M);case 1:if(null===j){n.n=2;break}return n.a(2,j);case 2:return j=A(b().m(function n(){var e,r,t,o,i,a,s,c;return b().w(function(n){for(;;)switch(n.p=n.n){case 0:return n.p=0,e=document.querySelectorAll('script[src*="itsm-widget"]'),r="./itsm-widget-config.json",e.length>0&&(t=e[e.length-1].src,o=t.substring(0,t.lastIndexOf("/")),r="".concat(o,"/itsm-widget-config.json")),n.n=1,fetch(r);case 1:if(!(i=n.v).ok){n.n=3;break}return n.n=2,i.json();case 2:return a=n.v,M=a,console.log("[ITSMWidget] ✅ Loaded config from file:",r,"→",a),n.a(2,a);case 3:throw s=new Error("File itsm-widget-config.json not found at: ".concat(r)),console.error("[ITSMWidget] ❌ Cannot load itsm-widget-config.json from:",r),s;case 4:n.n=6;break;case 5:throw n.p=5,c=n.v,console.error("[ITSMWidget] ❌ Error loading itsm-widget-config.json from:",configUrl,"Error:",c.message),c;case 6:return n.p=6,j=null,n.f(6);case 7:return n.a(2)}},n,null,[[0,5,6,7]])}))(),n.a(2,j)}},n)}))).apply(this,arguments)}var I=function(){return n=function n(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};!function(n,e){if(!(n instanceof e))throw new TypeError("Cannot call a class as a function")}(this,n),this._configPromise=this._initializeConfig(e)},e=[{key:"_initializeConfig",value:(i=A(b().m(function n(e){var r,t,o;return b().w(function(n){for(;;)switch(n.p=n.n){case 0:return console.log("[ITSMWidget] Đang load apiBaseUrl từ file itsm-widget-config.json..."),n.p=1,n.n=2,q();case 2:if((r=n.v)&&r.apiBaseUrl){n.n=3;break}throw new Error("File itsm-widget-config.json không có apiBaseUrl");case 3:console.log("[ITSMWidget] ✅ Loaded apiBaseUrl từ file:",r.apiBaseUrl),e.apiBaseUrl&&console.warn("[ITSMWidget] ⚠️ apiBaseUrl trong constructor bị bỏ qua. Chỉ sử dụng apiBaseUrl từ file itsm-widget-config.json"),e.apiBaseUrl,t=k(e,g),this.config=this._buildConfig(w(w({},r),t)),this._initWidget(),n.n=5;break;case 4:throw n.p=4,o=n.v,console.error("[ITSMWidget] ❌ Lỗi: Không thể load apiBaseUrl từ file itsm-widget-config.json:",o),console.error("[ITSMWidget] Vui lòng đảm bảo file itsm-widget-config.json tồn tại và có apiBaseUrl"),new Error("Không thể load config: ".concat(o.message));case 5:return n.a(2)}},n,this,[[1,4]])})),function(n){return i.apply(this,arguments)})},{key:"_buildConfig",value:function(n){if(!n.apiBaseUrl)throw new Error("apiBaseUrl is required in itsm-widget-config.json");var e=n.apiBaseUrl;return console.log("[ITSMWidget] Building config with apiBaseUrl:",e,"(từ file itsm-widget-config.json)"),w({apiBaseUrl:e,authToken:n.authToken||n.apiToken||"",position:n.position||"bottom-right",iconText:n.iconText||"📝",iconImage:void 0!==n.iconImage?n.iconImage:"data:image/png;base64,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",iconColor:n.iconColor||"#335fb3",title:n.title||"Tạo phiếu yêu cầu ITSM",requesterName:n.requesterName||"",site:n.site||"",udf_fields:n.udf_fields||{}},n)}},{key:"_initWidget",value:function(){console.log("[ITSMWidget] Initializing widget with config:",{apiBaseUrl:this.config.apiBaseUrl,hasAuthToken:!!this.config.authToken,position:this.config.position}),this.apiService=new s.A({baseUrl:this.config.apiBaseUrl,authToken:this.config.authToken}),this.isOpen=!1,this.widgetContainer=null,this.modalContainer=null,this.init()}},{key:"init",value:function(){this.createWidgetButton(),this.createModal(),this.attachEvents()}},{key:"createWidgetButton",value:function(){var n=document.createElement("div");n.id="itsm-widget-button",n.className="itsm-widget-button itsm-position-".concat(this.config.position);var e="";e=this.config.iconImage&&null!==this.config.iconImage?'<img src="'.concat(this.config.iconImage,'" alt="ITSM Widget" class="itsm-widget-icon-img" />'):this.config.iconText||"📝";var r=this.config.iconImage&&null!==this.config.iconImage?"":"background-color: ".concat(this.config.iconColor,";");n.style.borderColor=this.config.iconColor,n.innerHTML='\n <div class="itsm-widget-icon" style="'.concat(r,'">\n ').concat(e,"\n </div>\n "),document.body.appendChild(n),this.widgetContainer=n}},{key:"createModal",value:function(){var n=document.createElement("div");n.id="itsm-widget-modal",n.className="itsm-modal-overlay",n.innerHTML='\n <div class="itsm-modal-container" style="width: 50vw; max-width: 90vw;">\n <div class="itsm-modal-header">\n <span class="itsm-modal-title">'.concat(this.config.title,'</span>\n <div class="itsm-modal-header-icons">\n <button class="itsm-modal-close" aria-label="Đóng">\n <span>×</span>\n </button>\n </div>\n </div>\n <div class="itsm-modal-content">\n <form id="itsm-request-form" class="itsm-form">\n \n\n <div class="itsm-form-group">\n <label for="itsm-requester">\n Người yêu cầu <span class="itsm-required">*</span>\n </label>\n <input \n type="text" \n id="itsm-requester" \n name="requester" \n class="itsm-input" \n disabled\n placeholder=""\n value="').concat(this.config.requesterName||"",'"\n />\n </div>\n <div class="itsm-form-group">\n <label for="itsm-site">Đơn vị</label>\n <input \n type="text" \n id="itsm-site" \n name="site" \n class="itsm-input" \n disabled\n placeholder=""\n value="').concat(this.config.site||"",'"\n />\n </div>\n\n <div class="itsm-form-group">\n <label for="itsm-category">\n Danh mục dịch vụ <span class="itsm-required">*</span>\n </label>\n <select id="itsm-category" name="category" class="itsm-select" required>\n <option value="">-- Chọn danh mục --</option>\n </select>\n </div>\n\n <div class="itsm-form-group">\n <label for="itsm-subcategory">\n Dịch vụ con <span class="itsm-required">*</span>\n </label>\n <select id="itsm-subcategory" name="subcategory" class="itsm-select" required disabled>\n <option value="">Chưa lựa chọn</option>\n </select>\n </div>\n\n <div class="itsm-form-group">\n <label for="itsm-item">\n Chi tiết dịch vụ <span class="itsm-required">*</span>\n </label>\n <select id="itsm-item" name="item" class="itsm-select" required disabled>\n <option value="">Chưa lựa chọn</option>\n </select>\n </div>\n\n <div class="itsm-form-row">\n <div class="itsm-form-group itsm-form-group-half">\n <label for="itsm-priority">\n Mức độ ưu tiên <span class="itsm-required">*</span>\n </label>\n <select id="itsm-priority" name="priority" class="itsm-select" required>\n <option value="" selected>Chưa lựa chọn</option>\n <option value="low">Thấp</option>\n <option value="medium">Trung bình</option>\n <option value="high">Cao</option>\n </select>\n </div>\n\n <div class="itsm-form-group itsm-form-group-half">\n <label for="itsm-udf-pick-305">Loại hỗ trợ</label>\n <select id="itsm-udf-pick-305" name="udf_pick_305" class="itsm-select">\n <option value="">Chưa lựa chọn</option>\n </select>\n </div>\n </div>\n \n <div class="itsm-form-group">\n <label for="itsm-udf-pick-306">\n Loại thiết bị sử dụng <span class="itsm-required">*</span>\n </label>\n <select id="itsm-udf-pick-306" name="udf_pick_306" class="itsm-select" required>\n <option value="">Chưa lựa chọn</option>\n <option value="Máy tính">Máy tính</option>\n <option value="Máy tính bảng">Máy tính bảng</option>\n <option value="Điện thoại">Điện thoại</option>\n <option value="Laptop">Laptop</option>\n </select>\n </div>\n\n <div class="itsm-form-group">\n <label for="itsm-title">\n Tiêu đề <span class="itsm-required">*</span>\n </label>\n <input \n type="text" \n id="itsm-title" \n name="title" \n class="itsm-input" \n required \n placeholder="Nhập tiêu đề phiếu yêu cầu"\n />\n </div>\n\n <div class="itsm-form-group">\n <label for="itsm-description-editor">\n Mô tả <span class="itsm-required">*</span>\n </label>\n <div class="itsm-editor-container">\n <div class="itsm-editor-toolbar">\n <button type="button" class="itsm-editor-btn" data-command="bold" title="Bold">\n <strong>B</strong>\n </button>\n <button type="button" class="itsm-editor-btn" data-command="italic" title="Italic">\n <em>I</em>\n </button>\n <button type="button" class="itsm-editor-btn" data-command="underline" title="Underline">\n <u>U</u>\n </button>\n <div class="itsm-editor-separator"></div>\n <button type="button" class="itsm-editor-btn" data-command="insertUnorderedList" title="Bullet List">• List</button>\n <button type="button" class="itsm-editor-btn" data-command="insertOrderedList" title="Numbered List">1. List</button>\n <div class="itsm-editor-separator"></div>\n <label class="itsm-editor-file-btn">\n 📎 Đính kèm file\n <input \n type="file" \n id="itsm-attachment" \n name="attachment" \n multiple\n style="display: none;"\n />\n </label>\n </div>\n <div \n id="itsm-description-editor" \n class="itsm-editor-content"\n contenteditable="true"\n data-placeholder="Nhập mô tả chi tiết yêu cầu..."\n ></div>\n <textarea \n id="itsm-description" \n name="description" \n style="display: none;"\n required\n ></textarea>\n <div id="itsm-file-list" class="itsm-file-list"></div>\n </div>\n </div>\n\n <div class="itsm-modal-footer">\n <button type="button" class="itsm-btn itsm-btn-secondary" id="itsm-cancel-btn">\n Hủy\n </button>\n <button type="submit" class="itsm-btn itsm-btn-primary" id="itsm-submit-btn">\n <span class="itsm-btn-text">Gửi Yêu Cầu</span>\n <span class="itsm-btn-loading" style="display: none;">Đang gửi...</span>\n </button>\n </div>\n </form>\n </div>\n </div>\n '),document.body.appendChild(n),this.modalContainer=n}},{key:"attachEvents",value:function(){var n=this;this.widgetContainer.addEventListener("click",function(){n.toggleModal()});var e=this.modalContainer.querySelector(".itsm-modal-close"),r=this.modalContainer.querySelector("#itsm-cancel-btn"),t=this.modalContainer;e&&e.addEventListener("click",function(){return n.closeModal()}),r&&r.addEventListener("click",function(){return n.closeModal()}),t.addEventListener("click",function(e){e.target===t&&n.closeModal()}),this.modalContainer.querySelector("#itsm-request-form").addEventListener("submit",function(e){return n.handleSubmit(e)}),this.modalContainer.querySelector("#itsm-attachment").addEventListener("change",function(e){return n.handleFileSelect(e)}),this.initEditor(),this.initCategoryDropdowns()}},{key:"initEditor",value:function(){var n=this.modalContainer.querySelector("#itsm-description-editor"),e=this.modalContainer.querySelector("#itsm-description"),r=this.modalContainer.querySelector(".itsm-editor-toolbar");n.addEventListener("input",function(){e.value=n.innerHTML,n.textContent.trim()?e.setCustomValidity(""):e.setCustomValidity("Mô tả là bắt buộc")}),n.addEventListener("focus",function(){""===n.textContent.trim()&&(n.innerHTML="")}),n.addEventListener("blur",function(){""===n.textContent.trim()&&(n.innerHTML="")}),r.querySelectorAll(".itsm-editor-btn[data-command]").forEach(function(r){r.addEventListener("click",function(t){t.preventDefault();var o=r.getAttribute("data-command");n.focus(),document.execCommand(o,!1,null),e.value=n.innerHTML})})}},{key:"initCategoryDropdowns",value:function(){var n=this.modalContainer.querySelector("#itsm-category"),e=this.modalContainer.querySelector("#itsm-subcategory"),r=this.modalContainer.querySelector("#itsm-item"),t=this.modalContainer.querySelector("#itsm-udf-pick-305");c.map(function(n){return n.category}).forEach(function(e){var r=document.createElement("option");r.value=e,r.textContent=e,n.appendChild(r)}),l.forEach(function(n){var e=document.createElement("option");e.value=n,e.textContent=n,t.appendChild(e)}),n&&n.addEventListener("change",function(n){var t,o,i=n.target.value;e&&(e.innerHTML='<option value="">Chưa lựa chọn</option>',e.disabled=!i),r&&(r.innerHTML='<option value="">Chưa lựa chọn</option>',r.disabled=!0),i&&((t=i,(o=c.find(function(n){return n.category===t}))?o.subcategories.map(function(n){return n.subcategory}):[]).forEach(function(n){var r=document.createElement("option");r.value=n,r.textContent=n,e&&e.appendChild(r)}),e&&(e.disabled=!1))}),e&&e.addEventListener("change",function(e){var t=null==n?void 0:n.value,o=e.target.value;r&&(r.innerHTML='<option value="">Chưa lựa chọn</option>',r.disabled=!o),t&&o&&(function(n,e){var r=c.find(function(e){return e.category===n});if(!r)return[];var t=r.subcategories.find(function(n){return n.subcategory===e});return t?t.items:[]}(t,o).forEach(function(n){var e=document.createElement("option");e.value=n,e.textContent=n,r&&r.appendChild(e)}),r&&(r.disabled=!1))})}},{key:"toggleModal",value:function(){this.isOpen?this.closeModal():this.openModal()}},{key:"openModal",value:function(){this.modalContainer.classList.add("itsm-modal-active"),this.modalContainer.style.display="flex",this.isOpen=!0,document.body.style.overflow="hidden"}},{key:"closeModal",value:function(){this.modalContainer.classList.remove("itsm-modal-active"),this.modalContainer.style.display="none",this.isOpen=!1,document.body.style.overflow=""}},{key:"handleFileSelect",value:function(n){var e=this,r=Array.from(n.target.files),t=this.modalContainer.querySelector("#itsm-file-list");0!==r.length?t.innerHTML=r.map(function(n){return'\n <div class="itsm-file-item">\n <span class="itsm-file-name">'.concat(n.name,'</span>\n <span class="itsm-file-size">').concat(e.formatFileSize(n.size),"</span>\n </div>\n ")}).join(""):t.innerHTML=""}},{key:"formatFileSize",value:function(n){if(0===n)return"0 Bytes";var e=Math.floor(Math.log(n)/Math.log(1024));return Math.round(n/Math.pow(1024,e)*100)/100+" "+["Bytes","KB","MB","GB"][e]}},{key:"handleSubmit",value:(o=A(b().m(function n(e){var r,t,o,i,a,s,c,l,u,d,f,m,p,h,g=this;return b().w(function(n){for(;;)switch(n.p=n.n){case 0:if(e.preventDefault(),r=e.target,t=new FormData(r),o={title:t.get("title"),description:t.get("description"),requester:this.config.requesterName||t.get("requester")||"",category:t.get("category"),subcategory:t.get("subcategory"),item:t.get("item"),priority:t.get("priority"),site:this.config.site||t.get("site")||"",udf_pick_305:t.get("udf_pick_305"),udf_pick_306:t.get("udf_pick_306"),contact:t.get("contact"),attachments:[]},i=this.modalContainer.querySelector("#itsm-description-editor"),o.description=i?i.innerHTML.trim():o.description,o.title&&o.description&&o.category&&o.subcategory&&o.item&&o.priority&&o.udf_pick_306&&o.requester){n.n=1;break}return this.showMessage("Vui lòng điền đầy đủ thông tin bắt buộc!","error"),n.a(2);case 1:if(i&&i.textContent.trim()){n.n=2;break}return this.showMessage("Mô tả không được để trống!","error"),null==i||i.focus(),n.a(2);case 2:return a=r.querySelector("#itsm-attachment"),s=Array.from(a.files),c=r.querySelector("#itsm-submit-btn"),l=c.querySelector(".itsm-btn-text"),u=c.querySelector(".itsm-btn-loading"),l.style.display="none",u.style.display="inline",c.disabled=!0,n.p=3,n.n=4,this.submitRequest(o,s);case 4:d=n.v,this.showMessage("Phiếu yêu cầu đã được gửi thành công!","success"),r.reset(),(f=this.modalContainer.querySelector("#itsm-description-editor"))&&(f.innerHTML=""),this.modalContainer.querySelector("#itsm-file-list").innerHTML="",m=this.modalContainer.querySelector("#itsm-subcategory"),p=this.modalContainer.querySelector("#itsm-item"),m&&(m.innerHTML='<option value="">Chưa lựa chọn</option>',m.disabled=!0),p&&(p.innerHTML='<option value="">Chưa lựa chọn</option>',p.disabled=!0),setTimeout(function(){g.closeModal()},1500),this.config.onSuccess&&this.config.onSuccess(d),n.n=6;break;case 5:n.p=5,h=n.v,console.error("Error submitting ITSM request:",h),this.showMessage(h.message||"Có lỗi xảy ra khi gửi yêu cầu. Vui lòng thử lại!","error");case 6:return n.p=6,l.style.display="inline",u.style.display="none",c.disabled=!1,n.f(6);case 7:return n.a(2)}},n,this,[[3,5,6,7]])})),function(n){return o.apply(this,arguments)})},{key:"submitRequest",value:(t=A(b().m(function n(e,r){var t,o,i;return b().w(function(n){for(;;)switch(n.n){case 0:if(t={udf_pick_301:u||"EVNSPC",udf_pick_302:d||"A - An toàn điện",udf_pick_303:f||"A1 - Phần mềm ứng dụng",udf_pick_304:m||"C - The Business/Customer Service Catalog",udf_pick_305:e.udf_pick_305||null,udf_pick_306:e.udf_pick_306||p||null,udf_pick_602:null,udf_mline_603:""},Object.assign(t,this.config.udf_fields||{}),o=this.apiService.buildRequestData(e,{requesterName:this.config.requesterName||e.requester||e.contact||"",site:this.config.site||e.site||null,category:e.category,subcategory:e.subcategory,item:e.item,template:e.category,udf_fields:t,zia_properties:this.config.zia_properties||{}}),!((i=r&&r.length>0?Array.from(r):[]).length>0)){n.n=2;break}return n.n=1,this.apiService.createRequestWithAttachments(o,i);case 1:case 3:return n.a(2,n.v);case 2:return n.n=3,this.apiService.createRequest(o);case 4:return n.a(2)}},n,this)})),function(n,e){return t.apply(this,arguments)})},{key:"showMessage",value:function(n){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"info",r=document.querySelector(".itsm-message");r&&r.remove();var t=document.createElement("div");t.className="itsm-message itsm-message-".concat(e),t.textContent=n,document.body.appendChild(t),setTimeout(function(){t.classList.add("itsm-message-show")},10),setTimeout(function(){t.classList.remove("itsm-message-show"),setTimeout(function(){return t.remove()},300)},3e3)}},{key:"destroy",value:function(){this.widgetContainer&&this.widgetContainer.remove(),this.modalContainer&&this.modalContainer.remove(),document.body.style.overflow=""}}],e&&S(n.prototype,e),r&&S(n,r),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,e,r,t,o,i}();n.exports&&(n.exports=I,n.exports.default=I);const B=I;"undefined"!=typeof window&&(window.ITSMWidget=I,window.ITSMWidget.default||(window.ITSMWidget.default=I),document.addEventListener("DOMContentLoaded",function(){var n=document.querySelector("script[data-itsm-config]");if(n)try{var e=JSON.parse(n.getAttribute("data-itsm-config"));window.itsmWidgetInstance=new I(e)}catch(n){console.error("Error parsing ITSM widget config:",n)}}))},555:(n,e,r)=>{r.d(e,{A:()=>i});var t=r(314),o=r.n(t)()(function(n){return n[1]});o.push([n.id,'/**\r\n * ITSM Widget Styles\r\n * Native HTML/CSS - No external libraries required\r\n */\r\n\r\n/* Floating Button */\r\n.itsm-widget-button {\r\n position: fixed;\r\n z-index: 9998;\r\n cursor: pointer;\r\n transition: transform 0.3s ease, box-shadow 0.3s ease;\r\n border-radius: 50%;\r\n overflow: visible;\r\n padding: 4px;\r\n border: 3px solid transparent;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background-color: #ffffff;\r\n}\r\n\r\n.itsm-widget-button:hover {\r\n transform: scale(1.1);\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\r\n}\r\n\r\n.itsm-position-bottom-right {\r\n bottom: 24px;\r\n right: 24px;\r\n}\r\n\r\n.itsm-position-bottom-left {\r\n bottom: 24px;\r\n left: 24px;\r\n}\r\n\r\n.itsm-widget-icon {\r\n width: 48px;\r\n height: 48px;\r\n padding: 8px;\r\n border-radius: 50%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n color: white;\r\n font-size: 18px;\r\n font-weight: bold;\r\n /* box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); */\r\n user-select: none;\r\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;\r\n overflow: hidden;\r\n background-color: #ffffff;\r\n}\r\n\r\n.itsm-widget-icon-img {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: contain;\r\n filter: brightness(0) saturate(100%) invert(27%) sepia(78%) saturate(1250%) hue-rotate(197deg) brightness(96%) contrast(95%);\r\n /* border-radius: 50%; */\r\n}\r\n\r\n/* Modal Overlay */\r\n.itsm-modal-overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background-color: rgba(0, 0, 0, 0.5);\r\n z-index: 9999;\r\n display: none;\r\n align-items: center;\r\n justify-content: center;\r\n opacity: 0;\r\n transition: opacity 0.3s ease;\r\n padding: 16px;\r\n}\r\n\r\n.itsm-modal-overlay.itsm-modal-active {\r\n display: flex;\r\n opacity: 1;\r\n}\r\n\r\n/* Modal Container */\r\n.itsm-modal-container {\r\n background: #ffffff;\r\n border-radius: 6px;\r\n box-shadow: 0 11px 15px -7px rgba(0, 0, 0, 0.2), 0 24px 38px 3px rgba(0, 0, 0, 0.14), 0 9px 46px 8px rgba(0, 0, 0, 0.12);\r\n width: 100%;\r\n max-width: 50vw;\r\n max-height: 90vh;\r\n display: flex;\r\n flex-direction: column;\r\n transform: scale(0.9);\r\n transition: transform 0.3s ease;\r\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;\r\n}\r\n\r\n.itsm-modal-overlay.itsm-modal-active .itsm-modal-container {\r\n transform: scale(1);\r\n}\r\n\r\n/* Modal Header */\r\n.itsm-modal-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 1.5rem;\r\n border-bottom: 1px solid #e9ecef;\r\n background-color: #ffffff;\r\n border-radius: 6px 6px 0 0;\r\n flex-shrink: 0;\r\n}\r\n\r\n.itsm-modal-title {\r\n margin: 0;\r\n font-size: 1.5rem;\r\n font-weight: 600;\r\n color: #212529;\r\n flex: 1;\r\n}\r\n\r\n.itsm-modal-header-icons {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n}\r\n\r\n.itsm-modal-close {\r\n background: transparent;\r\n border: none;\r\n color: #6c757d;\r\n cursor: pointer;\r\n padding: 0.5rem;\r\n width: 2rem;\r\n height: 2rem;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: 50%;\r\n transition: background-color 0.2s ease, color 0.2s ease;\r\n font-size: 1.5rem;\r\n line-height: 1;\r\n}\r\n\r\n.itsm-modal-close:hover {\r\n background-color: #e9ecef;\r\n color: #212529;\r\n}\r\n\r\n.itsm-modal-close span {\r\n font-size: 1.5rem;\r\n line-height: 1;\r\n}\r\n\r\n/* Modal Content */\r\n.itsm-modal-content {\r\n padding: 1.5rem;\r\n overflow-y: auto;\r\n flex: 1;\r\n}\r\n\r\n/* Modal Footer */\r\n.itsm-modal-footer {\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: 0.5rem;\r\n padding: 1rem 1.5rem;\r\n border-top: 1px solid #e9ecef;\r\n background-color: #ffffff;\r\n border-radius: 0 0 6px 6px;\r\n flex-shrink: 0;\r\n}\r\n\r\n/* Form Styles */\r\n.itsm-form {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 1rem;\r\n}\r\n\r\n.itsm-form-row {\r\n display: flex;\r\n gap: 1rem;\r\n}\r\n\r\n.itsm-form-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0.5rem;\r\n}\r\n\r\n.itsm-form-group-half {\r\n flex: 1;\r\n}\r\n\r\n/* Label */\r\n.itsm-form-group label {\r\n font-weight: 500;\r\n color: #495057;\r\n font-size: 0.875rem;\r\n display: block;\r\n margin-bottom: 0.25rem;\r\n}\r\n\r\n.itsm-required {\r\n color: #dc3545;\r\n margin-left: 2px;\r\n}\r\n\r\n/* Input */\r\n.itsm-input {\r\n width: 100%;\r\n padding: 0.5rem 0.75rem;\r\n font-size: 1rem;\r\n line-height: 1.5;\r\n color: #495057;\r\n background-color: #ffffff;\r\n border: 1px solid #ced4da;\r\n border-radius: 4px;\r\n transition: background-color 0.2s, border-color 0.2s, box-shadow 0.2s;\r\n font-family: inherit;\r\n box-sizing: border-box;\r\n}\r\n\r\n.itsm-input:hover {\r\n border-color: #adb5bd;\r\n}\r\n\r\n.itsm-input:focus {\r\n outline: 0 none;\r\n outline-offset: 0;\r\n border-color: #007bff;\r\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\r\n}\r\n\r\n.itsm-input:disabled {\r\n background-color: #e9ecef;\r\n opacity: 1;\r\n cursor: not-allowed;\r\n}\r\n\r\n/* Textarea */\r\n.itsm-textarea {\r\n width: 100%;\r\n padding: 0.5rem 0.75rem;\r\n font-size: 1rem;\r\n line-height: 1.5;\r\n color: #495057;\r\n background-color: #ffffff;\r\n border: 1px solid #ced4da;\r\n border-radius: 4px;\r\n transition: background-color 0.2s, border-color 0.2s, box-shadow 0.2s;\r\n font-family: inherit;\r\n box-sizing: border-box;\r\n resize: vertical;\r\n min-height: 100px;\r\n}\r\n\r\n.itsm-textarea:hover {\r\n border-color: #adb5bd;\r\n}\r\n\r\n.itsm-textarea:focus {\r\n outline: 0 none;\r\n outline-offset: 0;\r\n border-color: #007bff;\r\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\r\n}\r\n\r\n.itsm-textarea:disabled {\r\n background-color: #e9ecef;\r\n opacity: 1;\r\n cursor: not-allowed;\r\n}\r\n\r\n/* Rich Text Editor */\r\n.itsm-editor-container {\r\n border: 1px solid #ced4da;\r\n border-radius: 4px;\r\n background-color: #ffffff;\r\n transition: border-color 0.2s, box-shadow 0.2s;\r\n}\r\n\r\n.itsm-editor-container:focus-within {\r\n border-color: #007bff;\r\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\r\n}\r\n\r\n.itsm-editor-toolbar {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.25rem;\r\n padding: 0.5rem;\r\n border-bottom: 1px solid #e9ecef;\r\n background-color: #f8f9fa;\r\n flex-wrap: wrap;\r\n}\r\n\r\n.itsm-editor-btn {\r\n padding: 0.25rem 0.5rem;\r\n font-size: 0.875rem;\r\n border: 1px solid #ced4da;\r\n border-radius: 3px;\r\n background-color: #ffffff;\r\n color: #495057;\r\n cursor: pointer;\r\n transition: background-color 0.2s, border-color 0.2s;\r\n font-family: inherit;\r\n min-width: 2rem;\r\n height: 2rem;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.itsm-editor-btn:hover {\r\n background-color: #e9ecef;\r\n border-color: #adb5bd;\r\n}\r\n\r\n.itsm-editor-btn:active {\r\n background-color: #dee2e6;\r\n}\r\n\r\n.itsm-editor-separator {\r\n width: 1px;\r\n height: 1.5rem;\r\n background-color: #ced4da;\r\n margin: 0 0.25rem;\r\n}\r\n\r\n.itsm-editor-file-btn {\r\n padding: 0.25rem 0.5rem;\r\n font-size: 0.875rem;\r\n border: 1px solid #ced4da;\r\n border-radius: 3px;\r\n background-color: #ffffff;\r\n color: #495057;\r\n cursor: pointer;\r\n transition: background-color 0.2s, border-color 0.2s;\r\n font-family: inherit;\r\n margin-left: auto;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.itsm-editor-file-btn:hover {\r\n background-color: #e9ecef;\r\n border-color: #adb5bd;\r\n}\r\n\r\n.itsm-editor-content {\r\n min-height: 150px;\r\n max-height: 400px;\r\n overflow-y: auto;\r\n padding: 0.75rem;\r\n font-size: 1rem;\r\n line-height: 1.5;\r\n color: #495057;\r\n font-family: inherit;\r\n outline: none;\r\n}\r\n\r\n.itsm-editor-content:empty:before {\r\n content: attr(data-placeholder);\r\n color: #6c757d;\r\n pointer-events: none;\r\n}\r\n\r\n.itsm-editor-content:focus:empty:before {\r\n content: \'\';\r\n}\r\n\r\n.itsm-editor-content img {\r\n max-width: 100%;\r\n height: auto;\r\n margin: 0.5rem 0;\r\n}\r\n\r\n.itsm-editor-content ul,\r\n.itsm-editor-content ol {\r\n margin: 0.5rem 0;\r\n padding-left: 1.5rem;\r\n}\r\n\r\n.itsm-editor-content p {\r\n margin: 0.5rem 0;\r\n}\r\n\r\n.itsm-editor-content p:first-child {\r\n margin-top: 0;\r\n}\r\n\r\n.itsm-editor-content p:last-child {\r\n margin-bottom: 0;\r\n}\r\n\r\n/* Select */\r\n.itsm-select {\r\n width: 100%;\r\n padding: 0.5rem 0.75rem;\r\n font-size: 1rem;\r\n line-height: 1.5;\r\n color: #495057;\r\n background-color: #ffffff;\r\n border: 1px solid #ced4da;\r\n border-radius: 4px;\r\n transition: background-color 0.2s, border-color 0.2s, box-shadow 0.2s;\r\n font-family: inherit;\r\n box-sizing: border-box;\r\n cursor: pointer;\r\n}\r\n\r\n.itsm-select:hover {\r\n border-color: #adb5bd;\r\n}\r\n\r\n.itsm-select:focus {\r\n outline: 0 none;\r\n outline-offset: 0;\r\n border-color: #007bff;\r\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\r\n}\r\n\r\n.itsm-select:disabled {\r\n background-color: #e9ecef;\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n}\r\n\r\n/* Button */\r\n.itsm-btn {\r\n padding: 0.5rem 1rem;\r\n font-size: 1rem;\r\n font-weight: 400;\r\n line-height: 1.5;\r\n border-radius: 4px;\r\n border: 1px solid transparent;\r\n cursor: pointer;\r\n transition: background-color 0.2s, border-color 0.2s, box-shadow 0.2s;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n text-align: center;\r\n user-select: none;\r\n font-family: inherit;\r\n position: relative;\r\n overflow: hidden;\r\n}\r\n\r\n.itsm-btn:disabled {\r\n opacity: 0.6;\r\n cursor: default;\r\n}\r\n\r\n.itsm-btn-text {\r\n line-height: inherit;\r\n}\r\n\r\n/* Primary Button */\r\n.itsm-btn-primary {\r\n color: #ffffff;\r\n background-color: #007bff;\r\n border-color: #007bff;\r\n}\r\n\r\n.itsm-btn-primary:hover:not(:disabled) {\r\n background-color: #0056b3;\r\n border-color: #0056b3;\r\n}\r\n\r\n.itsm-btn-primary:focus {\r\n outline: 0 none;\r\n outline-offset: 0;\r\n box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\r\n}\r\n\r\n.itsm-btn-primary:active:not(:disabled) {\r\n background-color: #004085;\r\n border-color: #004085;\r\n}\r\n\r\n/* Secondary Button */\r\n.itsm-btn-secondary {\r\n color: #ffffff;\r\n background-color: #6c757d;\r\n border-color: #6c757d;\r\n}\r\n\r\n.itsm-btn-secondary:hover:not(:disabled) {\r\n background-color: #5a6268;\r\n border-color: #545b62;\r\n}\r\n\r\n.itsm-btn-secondary:focus {\r\n outline: 0 none;\r\n outline-offset: 0;\r\n box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\r\n}\r\n\r\n.itsm-btn-secondary:active:not(:disabled) {\r\n background-color: #545b62;\r\n border-color: #4e555b;\r\n}\r\n\r\n/* File Input */\r\n.itsm-file-list {\r\n margin-top: 0.5rem;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0.5rem;\r\n}\r\n\r\n.itsm-file-item {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 0.5rem;\r\n background-color: #f8f9fa;\r\n border-radius: 4px;\r\n font-size: 0.875rem;\r\n}\r\n\r\n.itsm-file-name {\r\n color: #495057;\r\n flex: 1;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.itsm-file-size {\r\n color: #6c757d;\r\n margin-left: 0.5rem;\r\n}\r\n\r\n/* Message/Toast Styles */\r\n.itsm-message {\r\n position: fixed;\r\n top: 20px;\r\n right: 20px;\r\n z-index: 10000;\r\n padding: 1rem 1.5rem;\r\n border-radius: 4px;\r\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\r\n min-width: 300px;\r\n max-width: 500px;\r\n transform: translateX(400px);\r\n transition: transform 0.3s ease;\r\n font-family: inherit;\r\n font-size: 0.875rem;\r\n}\r\n\r\n.itsm-message.itsm-message-show {\r\n transform: translateX(0);\r\n}\r\n\r\n.itsm-message-success {\r\n background-color: #d4edda;\r\n color: #155724;\r\n border: 1px solid #c3e6cb;\r\n}\r\n\r\n.itsm-message-error {\r\n background-color: #f8d7da;\r\n color: #721c24;\r\n border: 1px solid #f5c6cb;\r\n}\r\n\r\n.itsm-message-info {\r\n background-color: #d1ecf1;\r\n color: #0c5460;\r\n border: 1px solid #bee5eb;\r\n}\r\n\r\n/* Responsive */\r\n@media (max-width: 768px) {\r\n .itsm-modal-container {\r\n max-width: 95%;\r\n max-height: 95vh;\r\n }\r\n\r\n .itsm-form-row {\r\n flex-direction: column;\r\n }\r\n\r\n .itsm-form-group-half {\r\n flex: none;\r\n }\r\n\r\n .itsm-modal-header,\r\n .itsm-modal-content,\r\n .itsm-modal-footer {\r\n padding: 1rem;\r\n }\r\n}',""]);const i=o},890:(n,e,r)=>{function t(n){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},t(n)}function o(n,e){var r=Object.keys(n);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(n);e&&(t=t.filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable})),r.push.apply(r,t)}return r}function i(n){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?o(Object(r),!0).forEach(function(e){a(n,e,r[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach(function(e){Object.defineProperty(n,e,Object.getOwnPropertyDescriptor(r,e))})}return n}function a(n,e,r){return(e=u(e))in n?Object.defineProperty(n,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):n[e]=r,n}function s(){var n,e,r="function"==typeof Symbol?Symbol:{},t=r.iterator||"@@iterator",o=r.toStringTag||"@@toStringTag";function i(r,t,o,i){var s=t&&t.prototype instanceof l?t:l,u=Object.create(s.prototype);return c(u,"_invoke",function(r,t,o){var i,s,c,l=0,u=o||[],d=!1,f={p:0,n:0,v:n,a:m,f:m.bind(n,4),d:function(e,r){return i=e,s=0,c=n,f.n=r,a}};function m(r,t){for(s=r,c=t,e=0;!d&&l&&!o&&e<u.length;e++){var o,i=u[e],m=f.p,p=i[2];r>3?(o=p===t)&&(c=i[(s=i[4])?5:(s=3,3)],i[4]=i[5]=n):i[0]<=m&&((o=r<2&&m<i[1])?(s=0,f.v=t,f.n=i[1]):m<p&&(o=r<3||i[0]>t||t>p)&&(i[4]=r,i[5]=t,f.n=p,s=0))}if(o||r>1)return a;throw d=!0,t}return function(o,u,p){if(l>1)throw TypeError("Generator is already running");for(d&&1===u&&m(u,p),s=u,c=p;(e=s<2?n:c)||!d;){i||(s?s<3?(s>1&&(f.n=-1),m(s,c)):f.n=c:f.v=c);try{if(l=2,i){if(s||(o="next"),e=i[o]){if(!(e=e.call(i,c)))throw TypeError("iterator result is not an object");if(!e.done)return e;c=e.value,s<2&&(s=0)}else 1===s&&(e=i.return)&&e.call(i),s<2&&(c=TypeError("The iterator does not provide a '"+o+"' method"),s=1);i=n}else if((e=(d=f.n<0)?c:r.call(t,f))!==a)break}catch(e){i=n,s=1,c=e}finally{l=1}}return{value:e,done:d}}}(r,o,i),!0),u}var a={};function l(){}function u(){}function d(){}e=Object.getPrototypeOf;var f=[][t]?e(e([][t]())):(c(e={},t,function(){return this}),e),m=d.prototype=l.prototype=Object.create(f);function p(n){return Object.setPrototypeOf?Object.setPrototypeOf(n,d):(n.__proto__=d,c(n,o,"GeneratorFunction")),n.prototype=Object.create(m),n}return u.prototype=d,c(m,"constructor",d),c(d,"constructor",u),u.displayName="GeneratorFunction",c(d,o,"GeneratorFunction"),c(m),c(m,o,"Generator"),c(m,t,function(){return this}),c(m,"toString",function(){return"[object Generator]"}),(s=function(){return{w:i,m:p}})()}function c(n,e,r,t){var o=Object.defineProperty;try{o({},"",{})}catch(n){o=0}c=function(n,e,r,t){function i(e,r){c(n,e,function(n){return this._invoke(e,r,n)})}e?o?o(n,e,{value:r,enumerable:!t,configurable:!t,writable:!t}):n[e]=r:(i("next",0),i("throw",1),i("return",2))},c(n,e,r,t)}function l(n,e){for(var r=0;r<e.length;r++){var t=e[r];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(n,u(t.key),t)}}function u(n){var e=function(n,e){if("object"!=t(n)||!n)return n;var r=n[Symbol.toPrimitive];if(void 0!==r){var o=r.call(n,e||"default");if("object"!=t(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(n)}(n,"string");return"symbol"==t(e)?e:e+""}function d(n,e,r,t,o,i,a){try{var s=n[i](a),c=s.value}catch(n){return void r(n)}s.done?e(c):Promise.resolve(c).then(t,o)}function f(n){return function(){var e=this,r=arguments;return new Promise(function(t,o){var i=n.apply(e,r);function a(n){d(i,t,o,a,s,"next",n)}function s(n){d(i,t,o,a,s,"throw",n)}a(void 0)})}}r.d(e,{A:()=>y}),n=r.hmd(n);var m=null,p=null;function h(){return g.apply(this,arguments)}function g(){return(g=f(s().m(function n(){return s().w(function(n){for(;;)switch(n.n){case 0:if(null===m){n.n=1;break}return n.a(2,m);case 1:if(null===p){n.n=2;break}return n.a(2,p);case 2:return p=f(s().m(function n(){var e,r,t,o,i,a,c,l;return s().w(function(n){for(;;)switch(n.p=n.n){case 0:return n.p=0,e=document.querySelectorAll('script[src*="itsm-widget"]'),r="./itsm-widget-config.json",e.length>0&&(t=e[e.length-1].src,o=t.substring(0,t.lastIndexOf("/")),r="".concat(o,"/itsm-widget-config.json")),console.log("[ITSMAPIService] Đang load apiBaseUrl từ file itsm-widget-config.json..."),n.n=1,fetch(r);case 1:if(!(i=n.v).ok){n.n=3;break}return n.n=2,i.json();case 2:return a=n.v,m=a,console.log("[ITSMAPIService] ✅ Loaded config from file:",r,"→",a),n.a(2,a);case 3:throw c=new Error("File itsm-widget-config.json not found at: ".concat(r)),console.error("[ITSMAPIService] ❌ Cannot load itsm-widget-config.json from:",r),c;case 4:n.n=6;break;case 5:throw n.p=5,l=n.v,console.error("[ITSMAPIService] ❌ Error loading itsm-widget-config.json:",l.message),l;case 6:return n.p=6,p=null,n.f(6);case 7:return n.a(2)}},n,null,[[0,5,6,7]])}))(),n.a(2,p)}},n)}))).apply(this,arguments)}var b=function(){return n=function n(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};!function(n,e){if(!(n instanceof e))throw new TypeError("Cannot call a class as a function")}(this,n),this.authToken=e.authToken||e.apiToken||"",e.baseUrl&&console.warn("[ITSMAPIService] ⚠️ baseUrl trong constructor bị bỏ qua. Chỉ sử dụng apiBaseUrl từ file itsm-widget-config.json"),this.baseUrl="",this._baseUrlPromise=this._initializeBaseUrl()},e=[{key:"_initializeBaseUrl",value:(d=f(s().m(function n(){var e,r;return s().w(function(n){for(;;)switch(n.p=n.n){case 0:return n.p=0,n.n=1,h();case 1:if((e=n.v)&&e.apiBaseUrl){n.n=2;break}throw new Error("File itsm-widget-config.json không có apiBaseUrl");case 2:return this.baseUrl=e.apiBaseUrl,console.log("[ITSMAPIService] ✅ baseUrl đã được load từ file:",this.baseUrl),n.a(2,this.baseUrl);case 3:throw n.p=3,r=n.v,console.error("[ITSMAPIService] ❌ Lỗi: Không thể load apiBaseUrl từ file itsm-widget-config.json:",r),new Error("Không thể load apiBaseUrl: ".concat(r.message));case 4:return n.a(2)}},n,this,[[0,3]])})),function(){return d.apply(this,arguments)})},{key:"_ensureBaseUrl",value:(u=f(s().m(function n(){return s().w(function(n){for(;;)switch(n.n){case 0:if(this.baseUrl||!this._baseUrlPromise){n.n=1;break}return n.n=1,this._baseUrlPromise;case 1:if(this.baseUrl){n.n=2;break}throw new Error("baseUrl is required. Please ensure itsm-widget-config.json exists and contains apiBaseUrl.");case 2:return n.a(2)}},n,this)})),function(){return u.apply(this,arguments)})},{key:"buildHeaders",value:function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"application/json",e={};return this.authToken&&(e.Authorization="Bearer ".concat(this.authToken)),"multipart/form-data"!==n&&(e["Content-Type"]=n),e}},{key:"createRequest",value:(c=f(s().m(function n(e){var r,t,o,i,a;return s().w(function(n){for(;;)switch(n.p=n.n){case 0:return n.n=1,this._ensureBaseUrl();case 1:return r="".concat(this.baseUrl,"/spcit/send"),t={request:{requester:e.requester||{name:""},assets:e.assets||[],category:e.category||null,group:e.group||null,subcategory:e.subcategory||null,technician:e.technician||null,item:e.item||null,priority:e.priority||null,subject:e.subject||"",description:e.description||"",site:e.site||null,attachments:e.attachments||[],udf_fields:e.udf_fields||{},template:e.template||null,zia_properties:e.zia_properties||{}}},n.p=2,n.n=3,fetch(r,{method:"POST",headers:this.buildHeaders("application/json"),body:JSON.stringify(t)});case 3:return o=n.v,n.n=4,o.json();case 4:if(i=n.v,o.ok){n.n=5;break}throw new Error(i.error||i.message||"HTTP error! status: ".concat(o.status));case 5:return n.a(2,i);case 6:throw n.p=6,a=n.v,console.error("Error creating request:",a),a;case 7:return n.a(2)}},n,this,[[2,6]])})),function(n){return c.apply(this,arguments)})},{key:"uploadAttachment",value:(a=f(s().m(function n(e,r){var t,o,i,a,c;return s().w(function(n){for(;;)switch(n.p=n.n){case 0:return n.n=1,this._ensureBaseUrl();case 1:return t="".concat(this.baseUrl,"/spcit/").concat(e,"/upload"),o=new FormData,(Array.isArray(r)?r:[r]).forEach(function(n){n instanceof File&&o.append("files",n)}),n.p=2,n.n=3,fetch(t,{method:"PUT",headers:this.buildHeaders("multipart/form-data"),body:o});case 3:return i=n.v,n.n=4,i.json();case 4:if(a=n.v,i.ok){n.n=5;break}throw new Error(a.error||a.message||"HTTP error! status: ".concat(i.status));case 5:return n.a(2,a);case 6:throw n.p=6,c=n.v,console.error("Error uploading attachment:",c),c;case 7:return n.a(2)}},n,this,[[2,6]])})),function(n,e){return a.apply(this,arguments)})},{key:"createRequestWithAttachments",value:(o=f(s().m(function n(e){var r,t,o,a,c,l,u=arguments;return s().w(function(n){for(;;)switch(n.p=n.n){case 0:return r=u.length>1&&void 0!==u[1]?u[1]:[],n.p=1,n.n=2,this.createRequest(e);case 2:if(o=n.v,!(r&&r.length>0&&null!==(t=o.request)&&void 0!==t&&t.id)){n.n=6;break}return n.p=3,n.n=4,this.uploadAttachment(o.request.id,r);case 4:return a=n.v,n.a(2,i(i({},o),{},{uploadResponse:a}));case 5:return n.p=5,c=n.v,console.warn("Request created but file upload failed:",c),n.a(2,i(i({},o),{},{uploadError:c.message}));case 6:return n.a(2,o);case 7:throw n.p=7,l=n.v,console.error("Error creating request with attachments:",l),l;case 8:return n.a(2)}},n,this,[[3,5],[1,7]])})),function(n){return o.apply(this,arguments)})},{key:"getRequest",value:(t=f(s().m(function n(e){var r,t,o,i,a;return s().w(function(n){for(;;)switch(n.p=n.n){case 0:return n.n=1,this._ensureBaseUrl();case 1:return r="".concat(this.baseUrl,"/spcit/ticket/").concat(e),n.p=2,(t=this.buildHeaders("application/json")).Accept="application/json",n.n=3,fetch(r,{method:"POST",headers:t,body:JSON.stringify({request_id:e})});case 3:return o=n.v,n.n=4,o.json();case 4:if(i=n.v,o.ok){n.n=5;break}throw new Error(i.error||i.message||"HTTP error! status: ".concat(o.status));case 5:return n.a(2,i);case 6:throw n.p=6,a=n.v,console.error("Error getting request:",a),a;case 7:return n.a(2)}},n,this,[[2,6]])})),function(n){return t.apply(this,arguments)})},{key:"mapPriority",value:function(n){return{low:"Thấp",medium:"Trung bình",high:"Cao",none:"Chưa lựa chọn"}[n]||"Chưa lựa chọn"}},{key:"mapCategory",value:function(n){return{hardware:"A01A00 - Quản lý an toàn thông tin",software:"Software Category",network:"Network Category",account:"Account Category",other:"Other Category"}[n]||null}},{key:"buildRequestData",value:function(n){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=e.category||this.mapCategory(n.category),t=e.subcategory||n.subcategory||null,o=e.item||n.item||null,i=e.template||r||null,a=e.requesterName||n.requester||n.contact||"",s=e.site||n.site||"";return{requester:{name:a},category:r?{name:r}:null,subcategory:t?{name:t}:null,priority:{name:this.mapPriority(n.priority||"none")},subject:n.title||"",description:n.description||"",site:s?{name:s}:null,item:o?{name:o}:null,template:i?{name:i}:null,udf_fields:e.udf_fields||{},zia_properties:e.zia_properties||{},assets:[],attachments:[],group:null,technician:null}}}],e&&l(n.prototype,e),r&&l(n,r),Object.defineProperty(n,"prototype",{writable:!1}),n;var n,e,r,t,o,a,c,u,d}();n.exports&&(n.exports=b),"undefined"!=typeof window&&(window.ITSMAPIService=b);const y=b}},e={};function r(t){var o=e[t];if(void 0!==o)return o.exports;var i=e[t]={id:t,loaded:!1,exports:{}};return n[t](i,i.exports,r),i.loaded=!0,i.exports}return r.n=n=>{var e=n&&n.__esModule?()=>n.default:()=>n;return r.d(e,{a:e}),e},r.d=(n,e)=>{for(var t in e)r.o(e,t)&&!r.o(n,t)&&Object.defineProperty(n,t,{enumerable:!0,get:e[t]})},r.hmd=n=>((n=Object.create(n)).children||(n.children=[]),Object.defineProperty(n,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+n.id)}}),n),r.o=(n,e)=>Object.prototype.hasOwnProperty.call(n,e),r.r=n=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},r.nc=void 0,r(322)})());
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "itsm-widget",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "ITSM Request Widget - Standalone HTML plugin với native HTML/CSS, tích hợp vào MVC, Angular, React, Vue, PHP, Java và bất kỳ web project nào",
|
|
5
5
|
"main": "dist/itsm-widget.min.js",
|
|
6
6
|
"style": "dist/itsm-widget.min.css",
|