itsm-widget 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,361 @@
1
+ # ITSM Widget
2
+
3
+ Plugin HTML **standalone** để Tạo phiếu yêu cầu ITSM. Widget sử dụng **native HTML/CSS**, **không phụ thuộc vào bất kỳ framework hay thư viện nào**, có thể tích hợp vào:
4
+
5
+ - ✅ **MVC/ASP.NET** (.NET Framework, .NET Core)
6
+ - ✅ **Angular** (bất kỳ version nào)
7
+ - ✅ **React**
8
+ - ✅ **Vue.js**
9
+ - ✅ **Vanilla HTML/JavaScript**
10
+ - ✅ **Blazor** (.NET)
11
+ - ✅ **PHP, Java, JSP**
12
+ - ✅ **Bất kỳ web project nào**
13
+
14
+ > **Lưu ý**: Widget là **standalone JavaScript** với **native HTML/CSS**, không cần bất kỳ thư viện hay framework nào.
15
+
16
+ ## Tính năng
17
+
18
+ - 🎯 Icon nổi ở góc dưới bên phải màn hình
19
+ - 📝 Form nhập phiếu yêu cầu ITSM với các trường:
20
+ - Tiêu đề (bắt buộc)
21
+ - Mô tả (bắt buộc)
22
+ - Danh mục (Phần cứng, Phần mềm, Mạng, Tài khoản, Khác)
23
+ - Mức độ ưu tiên (Thấp, Trung bình, Cao, Khẩn cấp)
24
+ - Thông tin liên hệ
25
+ - Tệp đính kèm (nhiều file)
26
+ - 🎨 Giao diện native HTML/CSS đẹp mắt
27
+ - 📱 Responsive, hỗ trợ mobile
28
+ - 🔌 Dễ dàng tích hợp vào bất kỳ project nào
29
+
30
+ ## Cài đặt
31
+
32
+ > **📖 Xem chi tiết**: [INSTALLATION.md](./INSTALLATION.md) - Hướng dẫn cài đặt cho từng platform (MVC, Angular, React, Vue, v.v.)
33
+
34
+ ### Cách 1: Cài đặt qua npm (Khuyến nghị)
35
+
36
+ ```bash
37
+ npm install itsm-widget
38
+ ```
39
+
40
+ Sau khi cài đặt, files sẽ nằm trong `node_modules/itsm-widget/dist/`:
41
+
42
+ **Với Angular:**
43
+ ```json
44
+ // angular.json
45
+ {
46
+ "scripts": [
47
+ "node_modules/itsm-widget/dist/itsm-widget.min.js"
48
+ ],
49
+ "styles": [
50
+ "node_modules/itsm-widget/dist/itsm-widget.min.css"
51
+ ]
52
+ }
53
+ ```
54
+
55
+ **Với React/Vue:**
56
+ ```javascript
57
+ // Import trong code
58
+ import 'itsm-widget/dist/itsm-widget.min.css';
59
+ import 'itsm-widget/dist/itsm-widget.min.js';
60
+ ```
61
+
62
+ **Với HTML/JavaScript:**
63
+ ```html
64
+ <link rel="stylesheet" href="node_modules/itsm-widget/dist/itsm-widget.min.css">
65
+ <script src="node_modules/itsm-widget/dist/itsm-widget.min.js"></script>
66
+ ```
67
+
68
+ ### Cách 2: Sử dụng file đã build (Manual)
69
+
70
+ 1. Copy 2 file sau vào project của bạn:
71
+ - `dist/itsm-widget.min.js`
72
+ - `dist/itsm-widget.min.css`
73
+
74
+ 2. Thêm vào `index.html`:
75
+
76
+ ```html
77
+ <!DOCTYPE html>
78
+ <html>
79
+ <head>
80
+ <!-- ITSM Widget CSS -->
81
+ <link rel="stylesheet" href="path/to/itsm-widget.min.css">
82
+ </head>
83
+ <body>
84
+ <!-- Your content -->
85
+
86
+ <script src="path/to/itsm-widget.min.js"></script>
87
+ <script>
88
+ // Cấu hình widget
89
+ const itsmWidget = new ITSMWidget({
90
+ apiBaseUrl: 'https://your-api-domain.com',
91
+ apiKey: 'your-api-key',
92
+ tenant: 'your-tenant-name',
93
+ position: 'bottom-right',
94
+ iconText: '📝',
95
+ iconColor: '#007bff',
96
+ title: 'Tạo phiếu yêu cầu ITSM',
97
+ onSuccess: function(response) {
98
+ console.log('Request submitted:', response);
99
+ }
100
+ });
101
+ </script>
102
+ </body>
103
+ </html>
104
+ ```
105
+
106
+ ### Cách 2: Sử dụng với Angular 10
107
+
108
+ 1. Copy các file vào `assets` folder:
109
+ ```
110
+ src/assets/
111
+ ├── itsm-widget.min.js
112
+ └── itsm-widget.min.css
113
+ ```
114
+
115
+ 2. Thêm vào `angular.json`:
116
+
117
+ ```json
118
+ {
119
+ "projects": {
120
+ "your-project": {
121
+ "architect": {
122
+ "build": {
123
+ "options": {
124
+ "scripts": [
125
+ "src/assets/itsm-widget.min.js"
126
+ ],
127
+ "styles": [
128
+ "src/assets/itsm-widget.min.css"
129
+ ]
130
+ }
131
+ }
132
+ }
133
+ }
134
+ }
135
+ }
136
+ ```
137
+
138
+ 3. Khởi tạo trong `app.component.ts`:
139
+
140
+ ```typescript
141
+ import { Component, OnInit } from '@angular/core';
142
+
143
+ declare var ITSMWidget: any;
144
+
145
+ @Component({
146
+ selector: 'app-root',
147
+ templateUrl: './app.component.html',
148
+ styleUrls: ['./app.component.css']
149
+ })
150
+ export class AppComponent implements OnInit {
151
+ title = 'your-app';
152
+
153
+ ngOnInit() {
154
+ // Khởi tạo ITSM Widget
155
+ const itsmWidget = new ITSMWidget({
156
+ apiBaseUrl: 'https://your-api-domain.com',
157
+ apiToken: 'your-api-token', // Optional
158
+ position: 'bottom-right',
159
+ iconText: '📝',
160
+ iconColor: '#007bff',
161
+ title: 'Tạo phiếu yêu cầu ITSM',
162
+ onSuccess: (response) => {
163
+ console.log('Request submitted:', response);
164
+ // Có thể hiển thị thông báo tại đây
165
+ }
166
+ });
167
+
168
+ // Lưu instance để có thể destroy sau này
169
+ (window as any).itsmWidgetInstance = itsmWidget;
170
+ }
171
+ }
172
+ ```
173
+
174
+ ### Cách 4: Auto-initialize với data attributes
175
+
176
+ ```html
177
+ <script
178
+ src="path/to/itsm-widget.min.js"
179
+ data-itsm-config='{"apiBaseUrl":"https://your-api-domain.com","iconColor":"#007bff"}'>
180
+ </script>
181
+ ```
182
+
183
+ ## Build từ source
184
+
185
+ 1. Cài đặt dependencies:
186
+ ```bash
187
+ npm install
188
+ ```
189
+
190
+ 2. Test widget (development mode):
191
+ ```bash
192
+ npm run test
193
+ ```
194
+ Lệnh này sẽ:
195
+ - Khởi động webpack dev server
196
+ - Mở browser tự động tại `http://localhost:9000`
197
+ - Hot reload khi có thay đổi code
198
+ - Source map để debug dễ dàng
199
+
200
+ 3. Test với file đã build:
201
+ ```bash
202
+ npm run test:build
203
+ ```
204
+ Lệnh này sẽ:
205
+ - Build widget trước
206
+ - Khởi động HTTP server tại `http://localhost:8080`
207
+ - Mở file `example.html`
208
+
209
+ 4. Build production:
210
+ ```bash
211
+ npm run build
212
+ ```
213
+
214
+ Files sẽ được tạo trong thư mục `dist/`:
215
+ - `itsm-widget.min.js` (production, minified)
216
+ - `itsm-widget.min.css` (production, minified)
217
+
218
+ 5. Development watch mode:
219
+ ```bash
220
+ npm run dev
221
+ ```
222
+ Rebuild tự động khi có thay đổi (không có dev server)
223
+
224
+ ## Cấu hình
225
+
226
+ ### Options
227
+
228
+ | Option | Type | Default | Mô tả |
229
+ |--------|------|---------|-------|
230
+ | `apiBaseUrl` | string | `''` | Base URL của API ITSM (bắt buộc) |
231
+ | `apiKey` | string | `''` | API Key để xác thực (bắt buộc) |
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ó |
234
+ | `position` | string | `'bottom-right'` | Vị trí icon: `'bottom-right'` hoặc `'bottom-left'` |
235
+ | `iconText` | string | `'📝'` | Text/emoji hiển thị trên icon (mặc định: 📝) |
236
+ | `iconColor` | string | `'#007bff'` | Màu nền của icon |
237
+ | `title` | string | `'Tạo phiếu yêu cầu ITSM'` | Tiêu đề modal |
238
+ | `requesterName` | string | `''` | Tên người yêu cầu (nếu không có sẽ dùng contact từ form) |
239
+ | `site` | string | `''` | Tên site/địa điểm |
240
+ | `udf_fields` | object | `{}` | Custom fields (udf_fields) cho request |
241
+ | `onSuccess` | function | `null` | Callback khi gửi thành công |
242
+
243
+ ### API Endpoints
244
+
245
+ Widget sử dụng ITSM API Service để gọi các API sau:
246
+
247
+ **1. Tạo yêu cầu mới:**
248
+ ```
249
+ POST {apiBaseUrl}/{tenant}/send
250
+ ```
251
+
252
+ **Headers:**
253
+ ```
254
+ authtoken: {apiKey}
255
+ pn: {tenant}
256
+ Content-Type: multipart/form-data
257
+ ```
258
+
259
+ **Body (FormData):**
260
+ - `input_data`: JSON string chứa thông tin request
261
+
262
+ **2. Upload file đính kèm:**
263
+ ```
264
+ PUT {apiBaseUrl}/{tenant}/{id}/upload
265
+ ```
266
+
267
+ **Headers:**
268
+ ```
269
+ authtoken: {apiKey}
270
+ pn: {tenant}
271
+ Content-Type: multipart/form-data
272
+ ```
273
+
274
+ **Response mẫu (tạo request thành công):**
275
+ ```json
276
+ {
277
+ "response_status": {
278
+ "status_code": 2000,
279
+ "status": "success"
280
+ },
281
+ "request": {
282
+ "id": "18391",
283
+ "ola_due_by_time": null,
284
+ "resolution": {
285
+ "resolution_attachments": [],
286
+ "content": null
287
+ },
288
+ "onhold_time": null,
289
+ "is_trashed": false
290
+ }
291
+ }
292
+ ```
293
+
294
+ **Response mẫu (lỗi):**
295
+ ```json
296
+ {
297
+ "error": "API Key không hợp lệ."
298
+ }
299
+ ```
300
+
301
+ Xem chi tiết API tại file tài liệu trong `src/assets/13082025 API v2 SDP ITSM SPC.doc`
302
+
303
+ ## Ví dụ sử dụng
304
+
305
+ ### Basic usage
306
+
307
+ ```javascript
308
+ const widget = new ITSMWidget({
309
+ apiBaseUrl: 'https://your-api-domain.com',
310
+ apiKey: 'your-api-key',
311
+ tenant: 'your-tenant-name',
312
+ iconColor: '#28a745',
313
+ requesterName: 'Nguyễn Văn A', // Optional
314
+ site: 'Your Site Name', // Optional
315
+ udf_fields: { // Optional
316
+ udf_pick_301: 'Value 1',
317
+ udf_pick_302: 'Value 2'
318
+ }
319
+ });
320
+ ```
321
+
322
+ ### Custom styling
323
+
324
+ Bạn có thể override CSS để phù hợp với theme của project:
325
+
326
+ ```css
327
+ /* Override icon color */
328
+ .itsm-widget-icon {
329
+ background-color: #your-color !important;
330
+ }
331
+
332
+ /* Override modal width */
333
+ .itsm-modal-container {
334
+ max-width: 800px !important;
335
+ }
336
+ ```
337
+
338
+ ## Cleanup
339
+
340
+ Để xóa widget khỏi page:
341
+
342
+ ```javascript
343
+ if (window.itsmWidgetInstance) {
344
+ window.itsmWidgetInstance.destroy();
345
+ }
346
+ ```
347
+
348
+ ## Yêu cầu
349
+
350
+ - Modern browser (ES6+)
351
+ - Không phụ thuộc vào framework (có thể dùng với Angular, React, Vue, hoặc vanilla JS)
352
+
353
+ ## Tương thích
354
+
355
+ - Tất cả modern browsers (ES6+)
356
+ - Không phụ thuộc vào framework hay thư viện nào
357
+
358
+ ## License
359
+
360
+ MIT
361
+
@@ -0,0 +1 @@
1
+ .itsm-widget-button{align-items:center;background-color:#fff;border:3px solid transparent;border-radius:50%;cursor:pointer;display:flex;justify-content:center;overflow:visible;padding:4px;position:fixed;transition:transform .3s ease,box-shadow .3s ease;z-index:9998}.itsm-widget-button:hover{box-shadow:0 4px 12px rgba(0,0,0,.15);transform:scale(1.1)}.itsm-position-bottom-right{bottom:24px;right:24px}.itsm-position-bottom-left{bottom:24px;left:24px}.itsm-widget-icon{align-items:center;background-color:#fff;border-radius:50%;color:#fff;display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:18px;font-weight:700;height:48px;justify-content:center;overflow:hidden;padding:8px;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:48px}.itsm-widget-icon-img{filter:brightness(0) saturate(100%) invert(27%) sepia(78%) saturate(1250%) hue-rotate(197deg) brightness(96%) contrast(95%);height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.itsm-modal-overlay{align-items:center;background-color:rgba(0,0,0,.5);bottom:0;display:none;justify-content:center;left:0;opacity:0;padding:16px;position:fixed;right:0;top:0;transition:opacity .3s ease;z-index:9999}.itsm-modal-overlay.itsm-modal-active{display:flex;opacity:1}.itsm-modal-container{background:#fff;border-radius:6px;box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;max-height:90vh;max-width:50vw;transform:scale(.9);transition:transform .3s ease;width:100%}.itsm-modal-overlay.itsm-modal-active .itsm-modal-container{transform:scale(1)}.itsm-modal-header{align-items:center;background-color:#fff;border-bottom:1px solid #e9ecef;border-radius:6px 6px 0 0;display:flex;flex-shrink:0;justify-content:space-between;padding:1.5rem}.itsm-modal-title{color:#212529;flex:1;font-size:1.5rem;font-weight:600;margin:0}.itsm-modal-header-icons{align-items:center;display:flex;gap:.5rem}.itsm-modal-close{align-items:center;background:transparent;border:none;border-radius:50%;color:#6c757d;cursor:pointer;display:flex;font-size:1.5rem;height:2rem;justify-content:center;line-height:1;padding:.5rem;transition:background-color .2s ease,color .2s ease;width:2rem}.itsm-modal-close:hover{background-color:#e9ecef;color:#212529}.itsm-modal-close span{font-size:1.5rem;line-height:1}.itsm-modal-content{flex:1;overflow-y:auto;padding:1.5rem}.itsm-modal-footer{background-color:#fff;border-radius:0 0 6px 6px;border-top:1px solid #e9ecef;display:flex;flex-shrink:0;gap:.5rem;justify-content:flex-end;padding:1rem 1.5rem}.itsm-form{flex-direction:column}.itsm-form,.itsm-form-row{display:flex;gap:1rem}.itsm-form-group{display:flex;flex-direction:column;gap:.5rem}.itsm-form-group-half{flex:1}.itsm-form-group label{color:#495057;display:block;font-size:.875rem;font-weight:500;margin-bottom:.25rem}.itsm-required{color:#dc3545;margin-left:2px}.itsm-input{background-color:#fff;border:1px solid #ced4da;border-radius:4px;box-sizing:border-box;color:#495057;font-family:inherit;font-size:1rem;line-height:1.5;padding:.5rem .75rem;transition:background-color .2s,border-color .2s,box-shadow .2s;width:100%}.itsm-input:hover{border-color:#adb5bd}.itsm-input:focus{border-color:#007bff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25);outline:0 none;outline-offset:0}.itsm-input:disabled{background-color:#e9ecef;cursor:not-allowed;opacity:1}.itsm-textarea{background-color:#fff;border:1px solid #ced4da;border-radius:4px;box-sizing:border-box;color:#495057;font-family:inherit;font-size:1rem;line-height:1.5;min-height:100px;padding:.5rem .75rem;resize:vertical;transition:background-color .2s,border-color .2s,box-shadow .2s;width:100%}.itsm-textarea:hover{border-color:#adb5bd}.itsm-textarea:focus{border-color:#007bff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25);outline:0 none;outline-offset:0}.itsm-textarea:disabled{background-color:#e9ecef;cursor:not-allowed;opacity:1}.itsm-editor-container{background-color:#fff;border:1px solid #ced4da;border-radius:4px;transition:border-color .2s,box-shadow .2s}.itsm-editor-container:focus-within{border-color:#007bff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.itsm-editor-toolbar{align-items:center;background-color:#f8f9fa;border-bottom:1px solid #e9ecef;display:flex;flex-wrap:wrap;gap:.25rem;padding:.5rem}.itsm-editor-btn{align-items:center;background-color:#fff;border:1px solid #ced4da;border-radius:3px;color:#495057;cursor:pointer;display:inline-flex;font-family:inherit;font-size:.875rem;height:2rem;justify-content:center;min-width:2rem;padding:.25rem .5rem;transition:background-color .2s,border-color .2s}.itsm-editor-btn:hover{background-color:#e9ecef;border-color:#adb5bd}.itsm-editor-btn:active{background-color:#dee2e6}.itsm-editor-separator{background-color:#ced4da;height:1.5rem;margin:0 .25rem;width:1px}.itsm-editor-file-btn{align-items:center;background-color:#fff;border:1px solid #ced4da;border-radius:3px;color:#495057;cursor:pointer;display:inline-flex;font-family:inherit;font-size:.875rem;justify-content:center;margin-left:auto;padding:.25rem .5rem;transition:background-color .2s,border-color .2s}.itsm-editor-file-btn:hover{background-color:#e9ecef;border-color:#adb5bd}.itsm-editor-content{color:#495057;font-family:inherit;font-size:1rem;line-height:1.5;max-height:400px;min-height:150px;outline:none;overflow-y:auto;padding:.75rem}.itsm-editor-content:empty:before{color:#6c757d;content:attr(data-placeholder);pointer-events:none}.itsm-editor-content:focus:empty:before{content:""}.itsm-editor-content img{height:auto;margin:.5rem 0;max-width:100%}.itsm-editor-content ol,.itsm-editor-content ul{margin:.5rem 0;padding-left:1.5rem}.itsm-editor-content p{margin:.5rem 0}.itsm-editor-content p:first-child{margin-top:0}.itsm-editor-content p:last-child{margin-bottom:0}.itsm-select{background-color:#fff;border:1px solid #ced4da;border-radius:4px;box-sizing:border-box;color:#495057;cursor:pointer;font-family:inherit;font-size:1rem;line-height:1.5;padding:.5rem .75rem;transition:background-color .2s,border-color .2s,box-shadow .2s;width:100%}.itsm-select:hover{border-color:#adb5bd}.itsm-select:focus{border-color:#007bff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25);outline:0 none;outline-offset:0}.itsm-select:disabled{background-color:#e9ecef;cursor:not-allowed;opacity:.6}.itsm-btn{align-items:center;border:1px solid transparent;border-radius:4px;cursor:pointer;display:inline-flex;font-family:inherit;font-size:1rem;font-weight:400;justify-content:center;line-height:1.5;overflow:hidden;padding:.5rem 1rem;position:relative;text-align:center;transition:background-color .2s,border-color .2s,box-shadow .2s;-webkit-user-select:none;-moz-user-select:none;user-select:none}.itsm-btn:disabled{cursor:default;opacity:.6}.itsm-btn-text{line-height:inherit}.itsm-btn-primary{background-color:#007bff;border-color:#007bff;color:#fff}.itsm-btn-primary:hover:not(:disabled){background-color:#0056b3;border-color:#0056b3}.itsm-btn-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5);outline:0 none;outline-offset:0}.itsm-btn-primary:active:not(:disabled){background-color:#004085;border-color:#004085}.itsm-btn-secondary{background-color:#6c757d;border-color:#6c757d;color:#fff}.itsm-btn-secondary:hover:not(:disabled){background-color:#5a6268;border-color:#545b62}.itsm-btn-secondary:focus{box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5);outline:0 none;outline-offset:0}.itsm-btn-secondary:active:not(:disabled){background-color:#545b62;border-color:#4e555b}.itsm-file-list{display:flex;flex-direction:column;gap:.5rem;margin-top:.5rem}.itsm-file-item{align-items:center;background-color:#f8f9fa;border-radius:4px;display:flex;font-size:.875rem;justify-content:space-between;padding:.5rem}.itsm-file-name{color:#495057;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.itsm-file-size{color:#6c757d;margin-left:.5rem}.itsm-message{border-radius:4px;box-shadow:0 4px 6px rgba(0,0,0,.1);font-family:inherit;font-size:.875rem;max-width:500px;min-width:300px;padding:1rem 1.5rem;position:fixed;right:20px;top:20px;transform:translateX(400px);transition:transform .3s ease;z-index:10000}.itsm-message.itsm-message-show{transform:translateX(0)}.itsm-message-success{background-color:#d4edda;border:1px solid #c3e6cb;color:#155724}.itsm-message-error{background-color:#f8d7da;border:1px solid #f5c6cb;color:#721c24}.itsm-message-info{background-color:#d1ecf1;border:1px solid #bee5eb;color:#0c5460}@media (max-width:768px){.itsm-modal-container{max-height:95vh;max-width:95%}.itsm-form-row{flex-direction:column}.itsm-form-group-half{flex:none}.itsm-modal-content,.itsm-modal-footer,.itsm-modal-header{padding:1rem}}
@@ -0,0 +1,2 @@
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)})());
@@ -0,0 +1 @@
1
+ /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */
package/package.json ADDED
@@ -0,0 +1,68 @@
1
+ {
2
+ "name": "itsm-widget",
3
+ "version": "1.0.1",
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
+ "main": "dist/itsm-widget.min.js",
6
+ "style": "dist/itsm-widget.min.css",
7
+ "files": [
8
+ "dist",
9
+ "README.md",
10
+ "INSTALLATION.md",
11
+ "ANGULAR-INSTALLATION.md",
12
+ "API-SERVICE.md"
13
+ ],
14
+ "scripts": {
15
+ "build": "npm run build:js && npm run build:css",
16
+ "build:js": "webpack --mode production",
17
+ "build:css": "postcss src/itsm-widget.css -o dist/itsm-widget.min.css",
18
+ "dev": "webpack --mode development --watch",
19
+ "test": "webpack serve --config webpack.dev.config.js",
20
+ "test:build": "npm run build:js && npm run build:css && npm run test:server",
21
+ "test:server": "http-server -p 8080 -o example.html",
22
+ "minify-css": "postcss src/itsm-widget.css -o dist/itsm-widget.min.css",
23
+ "prepublishOnly": "npm run build"
24
+ },
25
+ "keywords": [
26
+ "itsm",
27
+ "widget",
28
+ "angular",
29
+ "react",
30
+ "vue",
31
+ "mvc",
32
+ "aspnet",
33
+ "standalone",
34
+ "native",
35
+ "ticket",
36
+ "request",
37
+ "helpdesk",
38
+ "support"
39
+ ],
40
+ "author": "tuanth.it",
41
+ "license": "MIT",
42
+ "repository": {
43
+ "type": "git",
44
+ "url": ""
45
+ },
46
+ "bugs": {
47
+ "url": ""
48
+ },
49
+ "homepage": "",
50
+ "devDependencies": {
51
+ "@babel/core": "^7.0.0",
52
+ "@babel/preset-env": "^7.0.0",
53
+ "autoprefixer": "^10.0.0",
54
+ "babel-loader": "^8.0.0",
55
+ "copy-webpack-plugin": "^13.0.1",
56
+ "css-loader": "^5.0.0",
57
+ "cssnano": "^5.0.0",
58
+ "html-webpack-plugin": "^5.0.0",
59
+ "http-server": "^14.0.0",
60
+ "postcss": "^8.0.0",
61
+ "postcss-cli": "^8.0.0",
62
+ "style-loader": "^2.0.0",
63
+ "terser-webpack-plugin": "^5.0.0",
64
+ "webpack": "^5.0.0",
65
+ "webpack-cli": "^4.0.0",
66
+ "webpack-dev-server": "^4.0.0"
67
+ }
68
+ }