@duyanhdev/mvp-ifs-ui-kit 21.0.0

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.
Files changed (170) hide show
  1. package/.editorconfig +16 -0
  2. package/.gitmodules +3 -0
  3. package/.postcssrc.json +5 -0
  4. package/.prettierignore +14 -0
  5. package/.prettierrc.json +29 -0
  6. package/LICENSE.md +21 -0
  7. package/README.md +59 -0
  8. package/angular.json +98 -0
  9. package/eslint.config.js +89 -0
  10. package/package.json +59 -0
  11. package/public/demo/images/flag/flag_placeholder.png +0 -0
  12. package/public/demo/images/footer-image.gif +0 -0
  13. package/public/demo/images/galleria/galleria1.jpg +0 -0
  14. package/public/demo/images/galleria/galleria10.jpg +0 -0
  15. package/public/demo/images/galleria/galleria10s.jpg +0 -0
  16. package/public/demo/images/galleria/galleria11.jpg +0 -0
  17. package/public/demo/images/galleria/galleria11s.jpg +0 -0
  18. package/public/demo/images/galleria/galleria12.jpg +0 -0
  19. package/public/demo/images/galleria/galleria12s.jpg +0 -0
  20. package/public/demo/images/galleria/galleria13.jpg +0 -0
  21. package/public/demo/images/galleria/galleria13s.jpg +0 -0
  22. package/public/demo/images/galleria/galleria14.jpg +0 -0
  23. package/public/demo/images/galleria/galleria14s.jpg +0 -0
  24. package/public/demo/images/galleria/galleria15.jpg +0 -0
  25. package/public/demo/images/galleria/galleria15s.jpg +0 -0
  26. package/public/demo/images/galleria/galleria1s.jpg +0 -0
  27. package/public/demo/images/galleria/galleria2.jpg +0 -0
  28. package/public/demo/images/galleria/galleria2s.jpg +0 -0
  29. package/public/demo/images/galleria/galleria3.jpg +0 -0
  30. package/public/demo/images/galleria/galleria3s.jpg +0 -0
  31. package/public/demo/images/galleria/galleria4.jpg +0 -0
  32. package/public/demo/images/galleria/galleria4s.jpg +0 -0
  33. package/public/demo/images/galleria/galleria5.jpg +0 -0
  34. package/public/demo/images/galleria/galleria5s.jpg +0 -0
  35. package/public/demo/images/galleria/galleria6.jpg +0 -0
  36. package/public/demo/images/galleria/galleria6s.jpg +0 -0
  37. package/public/demo/images/galleria/galleria7.jpg +0 -0
  38. package/public/demo/images/galleria/galleria7s.jpg +0 -0
  39. package/public/demo/images/galleria/galleria8.jpg +0 -0
  40. package/public/demo/images/galleria/galleria8s.jpg +0 -0
  41. package/public/demo/images/galleria/galleria9.jpg +0 -0
  42. package/public/demo/images/galleria/galleria9s.jpg +0 -0
  43. package/public/demo/images/product/bamboo-watch.jpg +0 -0
  44. package/public/demo/images/product/black-watch.jpg +0 -0
  45. package/public/demo/images/product/blue-band.jpg +0 -0
  46. package/public/demo/images/product/blue-t-shirt.jpg +0 -0
  47. package/public/demo/images/product/bracelet.jpg +0 -0
  48. package/public/demo/images/product/brown-purse.jpg +0 -0
  49. package/public/demo/images/product/chakra-bracelet.jpg +0 -0
  50. package/public/demo/images/product/galaxy-earrings.jpg +0 -0
  51. package/public/demo/images/product/game-controller.jpg +0 -0
  52. package/public/demo/images/product/gaming-set.jpg +0 -0
  53. package/public/demo/images/product/gold-phone-case.jpg +0 -0
  54. package/public/demo/images/product/green-earbuds.jpg +0 -0
  55. package/public/demo/images/product/green-t-shirt.jpg +0 -0
  56. package/public/demo/images/product/grey-t-shirt.jpg +0 -0
  57. package/public/demo/images/product/headphones.jpg +0 -0
  58. package/public/demo/images/product/light-green-t-shirt.jpg +0 -0
  59. package/public/demo/images/product/lime-band.jpg +0 -0
  60. package/public/demo/images/product/mini-speakers.jpg +0 -0
  61. package/public/demo/images/product/painted-phone-case.jpg +0 -0
  62. package/public/demo/images/product/pink-band.jpg +0 -0
  63. package/public/demo/images/product/pink-purse.jpg +0 -0
  64. package/public/demo/images/product/product-placeholder.svg +10 -0
  65. package/public/demo/images/product/purple-band.jpg +0 -0
  66. package/public/demo/images/product/purple-gemstone-necklace.jpg +0 -0
  67. package/public/demo/images/product/purple-t-shirt.jpg +0 -0
  68. package/public/demo/images/product/shoes.jpg +0 -0
  69. package/public/demo/images/product/sneakers.jpg +0 -0
  70. package/public/demo/images/product/teal-t-shirt.jpg +0 -0
  71. package/public/demo/images/product/yellow-earbuds.jpg +0 -0
  72. package/public/demo/images/product/yoga-mat.jpg +0 -0
  73. package/public/demo/images/product/yoga-set.jpg +0 -0
  74. package/src/app/layout/component/configurator/app.configurator.html +48 -0
  75. package/src/app/layout/component/configurator/app.configurator.ts +396 -0
  76. package/src/app/layout/component/floatingconfigurator/app.floatingconfigurator.ts +31 -0
  77. package/src/app/layout/component/footer/app.footer.scss +52 -0
  78. package/src/app/layout/component/footer/app.footer.ts +26 -0
  79. package/src/app/layout/component/layout/app.layout.ts +50 -0
  80. package/src/app/layout/component/menu/app.menu.html +7 -0
  81. package/src/app/layout/component/menu/app.menu.scss +13 -0
  82. package/src/app/layout/component/menu/app.menu.ts +90 -0
  83. package/src/app/layout/component/menuitem/app.menuitem.html +56 -0
  84. package/src/app/layout/component/menuitem/app.menuitem.scss +218 -0
  85. package/src/app/layout/component/menuitem/app.menuitem.ts +126 -0
  86. package/src/app/layout/component/sidebar/app.sidebar.html +3 -0
  87. package/src/app/layout/component/sidebar/app.sidebar.scss +0 -0
  88. package/src/app/layout/component/sidebar/app.sidebar.ts +106 -0
  89. package/src/app/layout/component/topbar/app.topbar.html +190 -0
  90. package/src/app/layout/component/topbar/app.topbar.scss +8 -0
  91. package/src/app/layout/component/topbar/app.topbar.ts +68 -0
  92. package/src/app/layout/service/layout.service.ts +117 -0
  93. package/src/app/pages/auth/access.ts +32 -0
  94. package/src/app/pages/auth/auth.routes.ts +10 -0
  95. package/src/app/pages/auth/error.ts +32 -0
  96. package/src/app/pages/auth/login.ts +71 -0
  97. package/src/app/pages/crud/crud.ts +387 -0
  98. package/src/app/pages/dashboard/dashboard.css +778 -0
  99. package/src/app/pages/dashboard/dashboard.html +191 -0
  100. package/src/app/pages/dashboard/dashboard.ts +348 -0
  101. package/src/app/pages/documentation/documentation.ts +73 -0
  102. package/src/app/pages/empty/empty.ts +11 -0
  103. package/src/app/pages/landing/components/featureswidget.ts +139 -0
  104. package/src/app/pages/landing/components/footerwidget.ts +73 -0
  105. package/src/app/pages/landing/components/herowidget.ts +25 -0
  106. package/src/app/pages/landing/components/highlightswidget.ts +46 -0
  107. package/src/app/pages/landing/components/pricingwidget.ts +119 -0
  108. package/src/app/pages/landing/components/topbarwidget.component.ts +68 -0
  109. package/src/app/pages/landing/landing.ts +31 -0
  110. package/src/app/pages/notfound/notfound.ts +68 -0
  111. package/src/app/pages/pages.routes.ts +17 -0
  112. package/src/app/pages/profile/profile.html +57 -0
  113. package/src/app/pages/profile/profile.scss +145 -0
  114. package/src/app/pages/profile/profile.ts +19 -0
  115. package/src/app/pages/service/country.service.ts +255 -0
  116. package/src/app/pages/service/customer.service.ts +9057 -0
  117. package/src/app/pages/service/icon.service.ts +23 -0
  118. package/src/app/pages/service/node.service.ts +816 -0
  119. package/src/app/pages/service/photo.service.ts +103 -0
  120. package/src/app/pages/service/product.service.ts +1322 -0
  121. package/src/app/pages/tickets/tickets-create/tickets-create.html +140 -0
  122. package/src/app/pages/tickets/tickets-create/tickets-create.scss +617 -0
  123. package/src/app/pages/tickets/tickets-create/tickets-create.ts +104 -0
  124. package/src/app/pages/tickets/tickets-list/ticket-list.html +150 -0
  125. package/src/app/pages/tickets/tickets-list/ticket-list.scss +392 -0
  126. package/src/app/pages/tickets/tickets-list/ticket-list.ts +178 -0
  127. package/src/app/pages/uikit/buttondemo.ts +254 -0
  128. package/src/app/pages/uikit/chartdemo.ts +290 -0
  129. package/src/app/pages/uikit/filedemo.ts +52 -0
  130. package/src/app/pages/uikit/formlayoutdemo.ts +129 -0
  131. package/src/app/pages/uikit/inputdemo.ts +339 -0
  132. package/src/app/pages/uikit/listdemo.ts +217 -0
  133. package/src/app/pages/uikit/mediademo.ts +1021 -0
  134. package/src/app/pages/uikit/menudemo.ts +540 -0
  135. package/src/app/pages/uikit/messagesdemo.ts +101 -0
  136. package/src/app/pages/uikit/miscdemo.ts +192 -0
  137. package/src/app/pages/uikit/overlaydemo.ts +235 -0
  138. package/src/app/pages/uikit/panelsdemo.ts +235 -0
  139. package/src/app/pages/uikit/tabledemo.ts +568 -0
  140. package/src/app/pages/uikit/timelinedemo.ts +141 -0
  141. package/src/app/pages/uikit/treedemo.ts +75 -0
  142. package/src/app/pages/uikit/uikit.routes.ts +35 -0
  143. package/src/app.component.ts +22 -0
  144. package/src/app.config.ts +23 -0
  145. package/src/app.routes.ts +23 -0
  146. package/src/assets/demo/code.scss +17 -0
  147. package/src/assets/demo/demo.scss +2 -0
  148. package/src/assets/demo/flags/flags.css +984 -0
  149. package/src/assets/layout/_core.scss +24 -0
  150. package/src/assets/layout/_footer.scss +8 -0
  151. package/src/assets/layout/_main.scss +21 -0
  152. package/src/assets/layout/_menu.scss +159 -0
  153. package/src/assets/layout/_mixins.scss +15 -0
  154. package/src/assets/layout/_preloading.scss +47 -0
  155. package/src/assets/layout/_responsive.scss +111 -0
  156. package/src/assets/layout/_topbar.scss +201 -0
  157. package/src/assets/layout/_typography.scss +68 -0
  158. package/src/assets/layout/_utils.scss +25 -0
  159. package/src/assets/layout/layout.scss +13 -0
  160. package/src/assets/layout/variables/_common.scss +21 -0
  161. package/src/assets/layout/variables/_dark.scss +5 -0
  162. package/src/assets/layout/variables/_light.scss +5 -0
  163. package/src/assets/styles.scss +4 -0
  164. package/src/assets/tailwind.css +32 -0
  165. package/src/index.html +15 -0
  166. package/src/main.ts +5 -0
  167. package/tsconfig.app.json +15 -0
  168. package/tsconfig.json +33 -0
  169. package/tsconfig.spec.json +15 -0
  170. package/vercel.json +9 -0
@@ -0,0 +1,140 @@
1
+ <div class="wrapper">
2
+ <div class="container">
3
+ <div class="hero">
4
+ <div class="hero-left">
5
+ <div class="badge-live">
6
+ <span class="live-dot"></span>
7
+ Hệ thống IT Helpdesk
8
+ </div>
9
+ <p class="page-title">Tạo ticket hỗ trợ mới</p>
10
+ <p class="page-sub">Điền đầy đủ thông tin để được hỗ trợ nhanh nhất có thể</p>
11
+ </div>
12
+ <div class="stats-row">
13
+ <div class="stat-pill">
14
+ <span class="stat-num">12</span>
15
+ <span class="stat-lbl">Đang mở</span>
16
+ </div>
17
+ <div class="stat-pill">
18
+ <span class="stat-num">3</span>
19
+ <span class="stat-lbl">Hôm nay</span>
20
+ </div>
21
+ </div>
22
+ </div>
23
+
24
+ <div class="card">
25
+ <div class="card-progress-bar"></div>
26
+ <div class="card-header">
27
+ <div class="card-header-left">
28
+ <div class="header-icon">
29
+ <i class="pi pi-ticket"></i>
30
+ </div>
31
+ <span class="card-title">Thông tin ticket</span>
32
+ </div>
33
+ <span class="req-badge"><span class="req">*</span> Bắt buộc điền</span>
34
+ </div>
35
+
36
+ <div class="card-body">
37
+ <p class="section-label">Thông tin cơ bản</p>
38
+
39
+ <div class="form-grid">
40
+ <div class="form-group full">
41
+ <label class="form-label">Tiêu đề <span class="req">*</span></label>
42
+ <input class="form-input" [(ngModel)]="form.title" placeholder="Mô tả ngắn gọn vấn đề cần hỗ trợ..." />
43
+ </div>
44
+
45
+ <div class="form-group">
46
+ <label class="form-label">Loại yêu cầu <span class="req">*</span></label>
47
+ <select class="form-input" [(ngModel)]="form.type">
48
+ <option value="">-- Chọn loại yêu cầu --</option>
49
+ <option>Hardware</option>
50
+ <option>Software</option>
51
+ <option>Mạng</option>
52
+ <option>Tài khoản</option>
53
+ <option>Máy in</option>
54
+ <option>Email</option>
55
+ <option>Bảo mật</option>
56
+ <option>Khác</option>
57
+ </select>
58
+ </div>
59
+
60
+ <div class="form-group">
61
+ <label class="form-label">Mức ưu tiên</label>
62
+ <div class="pri-row">
63
+ <button class="pri-btn" [class.active-high]="form.priority === 'high'" (click)="setPri('high')">🔴 Cao</button>
64
+ <button class="pri-btn" [class.active-medium]="form.priority === 'medium'" (click)="setPri('medium')">🟡 Trung bình</button>
65
+ <button class="pri-btn" [class.active-low]="form.priority === 'low'" (click)="setPri('low')">🟢 Thấp</button>
66
+ </div>
67
+ </div>
68
+
69
+ <div class="form-group">
70
+ <label class="form-label">Người yêu cầu <span class="req">*</span></label>
71
+ <input class="form-input" [(ngModel)]="form.requester" placeholder="Họ và tên đầy đủ" />
72
+ </div>
73
+
74
+ <div class="form-group">
75
+ <label class="form-label">Phòng ban</label>
76
+ <select class="form-input" [(ngModel)]="form.department">
77
+ <option value="">-- Chọn phòng ban --</option>
78
+ <option>Kế toán</option>
79
+ <option>Nhân sự</option>
80
+ <option>Kinh doanh</option>
81
+ <option>Marketing</option>
82
+ <option>IT</option>
83
+ <option>Vận hành</option>
84
+ <option>Ban giám đốc</option>
85
+ </select>
86
+ </div>
87
+
88
+ <div class="form-group">
89
+ <label class="form-label">Thiết bị liên quan</label>
90
+ <input class="form-input" [(ngModel)]="form.device" placeholder="Tên máy, model, số serial..." />
91
+ </div>
92
+
93
+ <div class="form-group full">
94
+ <label class="form-label">Mô tả chi tiết</label>
95
+ <textarea class="form-input" [(ngModel)]="form.description" placeholder="Mô tả chi tiết vấn đề, các bước tái hiện lỗi..."></textarea>
96
+ </div>
97
+
98
+ <div class="form-group full">
99
+ <label class="form-label">Ảnh đính kèm</label>
100
+ <input type="file" #fileInput accept="image/*" multiple style="display: none" (change)="handleFiles($event)" />
101
+ <div class="upload-zone" [class.drag-over]="isDragging" (click)="fileInput.click()" (dragover)="onDragOver($event)" (dragleave)="onDragLeave()" (drop)="onDrop($event)">
102
+ <div class="upload-icon-wrap">
103
+ <svg width="22" height="22" fill="none" stroke="white" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" viewBox="0 0 24 24">
104
+ <path
105
+ d="M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586
106
+ a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6
107
+ a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"
108
+ />
109
+ </svg>
110
+ </div>
111
+ <span class="upload-label">Kéo thả ảnh vào đây hoặc nhấn để chọn</span>
112
+ <span class="upload-hint">Hỗ trợ PNG, JPG, GIF — tối đa 5 ảnh</span>
113
+ </div>
114
+
115
+ <div class="preview-grid" *ngIf="previews.length > 0">
116
+ <div class="preview-item" *ngFor="let p of previews; let i = index">
117
+ <img [src]="p.url" [alt]="p.name" />
118
+ <button class="preview-remove" (click)="removeFile(i)" title="Xóa">✕</button>
119
+ </div>
120
+ </div>
121
+ </div>
122
+ </div>
123
+
124
+ <div class="actions">
125
+ <button class="btn-primary" (click)="submitTicket()">
126
+ <i class="pi pi-check-circle"></i>
127
+ Tạo ticket
128
+ </button>
129
+ <button class="btn-ghost" (click)="clearForm()">
130
+ <i class="pi pi-refresh"></i>
131
+ Xóa form
132
+ </button>
133
+ </div>
134
+
135
+ <div class="toast toast-success" *ngIf="toast.show && toast.type === 'success'"><i class="pi pi-check-circle"></i> {{ toast.message }}</div>
136
+ <div class="toast toast-error" *ngIf="toast.show && toast.type === 'error'"><i class="pi pi-times-circle"></i> {{ toast.message }}</div>
137
+ </div>
138
+ </div>
139
+ </div>
140
+ </div>