@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,339 @@
1
+ import { Component, inject, OnInit } from '@angular/core';
2
+ import { InputTextModule } from 'primeng/inputtext';
3
+ import { ButtonModule } from 'primeng/button';
4
+ import { CommonModule } from '@angular/common';
5
+ import { FormsModule } from '@angular/forms';
6
+ import { CheckboxModule } from 'primeng/checkbox';
7
+ import { RadioButtonModule } from 'primeng/radiobutton';
8
+ import { SelectButtonModule } from 'primeng/selectbutton';
9
+ import { InputGroupModule } from 'primeng/inputgroup';
10
+ import { FluidModule } from 'primeng/fluid';
11
+ import { IconFieldModule } from 'primeng/iconfield';
12
+ import { InputIconModule } from 'primeng/inputicon';
13
+ import { FloatLabelModule } from 'primeng/floatlabel';
14
+ import { AutoCompleteCompleteEvent, AutoCompleteModule } from 'primeng/autocomplete';
15
+ import { InputNumberModule } from 'primeng/inputnumber';
16
+ import { SliderModule } from 'primeng/slider';
17
+ import { RatingModule } from 'primeng/rating';
18
+ import { ColorPickerModule } from 'primeng/colorpicker';
19
+ import { KnobModule } from 'primeng/knob';
20
+ import { SelectModule } from 'primeng/select';
21
+ import { DatePickerModule } from 'primeng/datepicker';
22
+ import { ToggleSwitchModule } from 'primeng/toggleswitch';
23
+ import { TreeSelectModule } from 'primeng/treeselect';
24
+ import { MultiSelectModule } from 'primeng/multiselect';
25
+ import { ListboxModule } from 'primeng/listbox';
26
+ import { InputGroupAddonModule } from 'primeng/inputgroupaddon';
27
+ import { TextareaModule } from 'primeng/textarea';
28
+ import { ToggleButtonModule } from 'primeng/togglebutton';
29
+ import { CountryService } from '@/app/pages/service/country.service';
30
+ import { NodeService } from '@/app/pages/service/node.service';
31
+ import { TreeNode } from 'primeng/api';
32
+ import { Country } from '@/app/pages/service/customer.service';
33
+
34
+ @Component({
35
+ selector: 'app-input-demo',
36
+ standalone: true,
37
+ imports: [
38
+ CommonModule,
39
+ FormsModule,
40
+ InputTextModule,
41
+ ButtonModule,
42
+ CheckboxModule,
43
+ RadioButtonModule,
44
+ SelectButtonModule,
45
+ InputGroupModule,
46
+ FluidModule,
47
+ IconFieldModule,
48
+ InputIconModule,
49
+ FloatLabelModule,
50
+ AutoCompleteModule,
51
+ InputNumberModule,
52
+ SliderModule,
53
+ RatingModule,
54
+ ColorPickerModule,
55
+ KnobModule,
56
+ SelectModule,
57
+ DatePickerModule,
58
+ ToggleButtonModule,
59
+ ToggleSwitchModule,
60
+ TreeSelectModule,
61
+ MultiSelectModule,
62
+ ListboxModule,
63
+ InputGroupAddonModule,
64
+ TextareaModule
65
+ ],
66
+ template: ` <p-fluid class="flex flex-col md:flex-row gap-8">
67
+ <div class="md:w-1/2">
68
+ <div class="card flex flex-col gap-4">
69
+ <div class="font-semibold text-xl">InputText</div>
70
+ <div class="flex flex-col md:flex-row gap-4">
71
+ <input pInputText type="text" placeholder="Default" />
72
+ <input pInputText type="text" placeholder="Disabled" [disabled]="true" />
73
+ <input pInputText type="text" placeholder="Invalid" class="ng-dirty ng-invalid" />
74
+ </div>
75
+
76
+ <div class="font-semibold text-xl">Icons</div>
77
+ <p-iconfield>
78
+ <p-inputicon class="pi pi-user" />
79
+ <input pInputText type="text" placeholder="Username" />
80
+ </p-iconfield>
81
+ <p-iconfield iconPosition="left">
82
+ <input pInputText type="text" placeholder="Search" />
83
+ <p-inputicon class="pi pi-search" />
84
+ </p-iconfield>
85
+
86
+ <div class="font-semibold text-xl">Float Label</div>
87
+ <p-floatlabel>
88
+ <input pInputText id="username" type="text" [(ngModel)]="floatValue" />
89
+ <label for="username">Username</label>
90
+ </p-floatlabel>
91
+
92
+ <div class="font-semibold text-xl">Textarea</div>
93
+ <textarea pTextarea placeholder="Your Message" [autoResize]="true" rows="3" cols="30"></textarea>
94
+
95
+ <div class="font-semibold text-xl">AutoComplete</div>
96
+ <p-autocomplete [(ngModel)]="selectedAutoValue" [suggestions]="autoFilteredValue" optionLabel="name" placeholder="Search" dropdown multiple display="chip" (completeMethod)="filterCountry($event)" />
97
+
98
+ <div class="font-semibold text-xl">DatePicker</div>
99
+ <p-datepicker [showIcon]="true" [showButtonBar]="true" [(ngModel)]="calendarValue"></p-datepicker>
100
+
101
+ <div class="font-semibold text-xl">InputNumber</div>
102
+ <p-inputnumber [(ngModel)]="inputNumberValue" showButtons mode="decimal"></p-inputnumber>
103
+ </div>
104
+
105
+ <div class="card flex flex-col gap-4">
106
+ <div class="font-semibold text-xl">Slider</div>
107
+ <input pInputText [(ngModel)]="sliderValue" type="number" />
108
+ <p-slider [(ngModel)]="sliderValue" />
109
+
110
+ <div class="flex flex-row mt-6">
111
+ <div class="flex flex-col gap-4 w-1/2">
112
+ <div class="font-semibold text-xl">Rating</div>
113
+ <p-rating [(ngModel)]="ratingValue" />
114
+ </div>
115
+ <div class="flex flex-col gap-4 w-1/2">
116
+ <div class="font-semibold text-xl">ColorPicker</div>
117
+ <p-colorpicker [style]="{ width: '2rem' }" [(ngModel)]="colorValue" />
118
+ </div>
119
+ </div>
120
+
121
+ <div class="font-semibold text-xl">Knob</div>
122
+ <p-knob [(ngModel)]="knobValue" [step]="10" [min]="-50" [max]="50" valueTemplate="{value}%" />
123
+ </div>
124
+ </div>
125
+ <div class="md:w-1/2">
126
+ <div class="card flex flex-col gap-4">
127
+ <div class="font-semibold text-xl">RadioButton</div>
128
+ <div class="flex flex-col md:flex-row gap-4">
129
+ <div class="flex items-center">
130
+ <p-radiobutton id="option1" name="option" value="Chicago" [(ngModel)]="radioValue" />
131
+ <label for="option1" class="leading-none ml-2">Chicago</label>
132
+ </div>
133
+ <div class="flex items-center">
134
+ <p-radiobutton id="option2" name="option" value="Los Angeles" [(ngModel)]="radioValue" />
135
+ <label for="option2" class="leading-none ml-2">Los Angeles</label>
136
+ </div>
137
+ <div class="flex items-center">
138
+ <p-radiobutton id="option3" name="option" value="New York" [(ngModel)]="radioValue" />
139
+ <label for="option3" class="leading-none ml-2">New York</label>
140
+ </div>
141
+ </div>
142
+
143
+ <div class="font-semibold text-xl">Checkbox</div>
144
+ <div class="flex flex-col md:flex-row gap-4">
145
+ <div class="flex items-center">
146
+ <p-checkbox id="checkOption1" name="option" value="Chicago" [(ngModel)]="checkboxValue" />
147
+ <label for="checkOption1" class="ml-2">Chicago</label>
148
+ </div>
149
+ <div class="flex items-center">
150
+ <p-checkbox id="checkOption2" name="option" value="Los Angeles" [(ngModel)]="checkboxValue" />
151
+ <label for="checkOption2" class="ml-2">Los Angeles</label>
152
+ </div>
153
+ <div class="flex items-center">
154
+ <p-checkbox id="checkOption3" name="option" value="New York" [(ngModel)]="checkboxValue" />
155
+ <label for="checkOption3" class="ml-2">New York</label>
156
+ </div>
157
+ </div>
158
+
159
+ <div class="font-semibold text-xl">ToggleSwitch</div>
160
+ <p-toggleswitch [(ngModel)]="switchValue" />
161
+ </div>
162
+
163
+ <div class="card flex flex-col gap-4">
164
+ <div class="font-semibold text-xl">Listbox</div>
165
+ <p-listbox [(ngModel)]="listboxValue" [options]="listboxValues" optionLabel="name" [filter]="true" />
166
+
167
+ <div class="font-semibold text-xl">Select</div>
168
+ <p-select [(ngModel)]="dropdownValue" [options]="dropdownValues" optionLabel="name" placeholder="Select" />
169
+
170
+ <div class="font-semibold text-xl">MultiSelect</div>
171
+ <p-multiselect [options]="multiselectCountries" [(ngModel)]="multiselectSelectedCountries" placeholder="Select Countries" optionLabel="name" display="chip" [filter]="true">
172
+ <ng-template #selecteditems let-countries>
173
+ @for (country of countries; track country.code) {
174
+ <div class="inline-flex items-center py-1 px-2 bg-primary text-primary-contrast rounded-border mr-2">
175
+ <span [class]="'mr-2 flag flag-' + country.code.toLowerCase()" style="width: 18px; height: 12px"></span>
176
+ <div>{{ country.name }}</div>
177
+ </div>
178
+ }
179
+ </ng-template>
180
+ <ng-template #item let-country>
181
+ <div class="flex items-center">
182
+ <span [class]="'mr-2 flag flag-' + country.code.toLowerCase()" style="width: 18px; height: 12px"></span>
183
+ <div>{{ country.name }}</div>
184
+ </div>
185
+ </ng-template>
186
+ </p-multiselect>
187
+
188
+ <div class="font-semibold text-xl">TreeSelect</div>
189
+ <p-treeselect [(ngModel)]="selectedNode" [options]="treeSelectNodes" placeholder="Select Item"></p-treeselect>
190
+ </div>
191
+
192
+ <div class="card flex flex-col gap-4">
193
+ <div class="font-semibold text-xl">ToggleButton</div>
194
+ <p-togglebutton [(ngModel)]="toggleValue" onLabel="Yes" offLabel="No" [style]="{ width: '10em' }" />
195
+
196
+ <div class="font-semibold text-xl">SelectButton</div>
197
+ <p-selectbutton [(ngModel)]="selectButtonValue" [options]="selectButtonValues" optionLabel="name" />
198
+ </div>
199
+ </div>
200
+ </p-fluid>
201
+
202
+ <p-fluid class="flex mt-8">
203
+ <div class="card flex flex-col gap-6 w-full">
204
+ <div class="font-semibold text-xl">InputGroup</div>
205
+ <div class="flex flex-col md:flex-row gap-6">
206
+ <p-inputgroup>
207
+ <p-inputgroup-addon>
208
+ <i class="pi pi-user"></i>
209
+ </p-inputgroup-addon>
210
+ <input pInputText placeholder="Username" />
211
+ </p-inputgroup>
212
+ <p-inputgroup>
213
+ <p-inputgroup-addon>
214
+ <i class="pi pi-clock"></i>
215
+ </p-inputgroup-addon>
216
+ <p-inputgroup-addon>
217
+ <i class="pi pi-star-fill"></i>
218
+ </p-inputgroup-addon>
219
+ <p-inputnumber placeholder="Price" />
220
+ <p-inputgroup-addon>$</p-inputgroup-addon>
221
+ <p-inputgroup-addon>.00</p-inputgroup-addon>
222
+ </p-inputgroup>
223
+ </div>
224
+ <div class="flex flex-col md:flex-row gap-6">
225
+ <p-inputgroup>
226
+ <p-button label="Search" />
227
+ <input pInputText placeholder="Keyword" />
228
+ </p-inputgroup>
229
+ <p-inputgroup>
230
+ <p-inputgroup-addon>
231
+ <p-checkbox [(ngModel)]="inputGroupValue" [binary]="true" />
232
+ </p-inputgroup-addon>
233
+ <input pInputText placeholder="Confirm" />
234
+ </p-inputgroup>
235
+ </div>
236
+ </div>
237
+ </p-fluid>`,
238
+ providers: [CountryService, NodeService]
239
+ })
240
+ export class InputDemo implements OnInit {
241
+ floatValue: any = null;
242
+
243
+ autoValue: any[] | undefined;
244
+
245
+ autoFilteredValue: any[] = [];
246
+
247
+ selectedAutoValue: any = null;
248
+
249
+ calendarValue: any = null;
250
+
251
+ inputNumberValue: any = null;
252
+
253
+ sliderValue: number = 50;
254
+
255
+ ratingValue: any = null;
256
+
257
+ colorValue: string = '#1976D2';
258
+
259
+ radioValue: any = null;
260
+
261
+ checkboxValue: any[] = [];
262
+
263
+ switchValue: boolean = false;
264
+
265
+ listboxValues: any[] = [
266
+ { name: 'New York', code: 'NY' },
267
+ { name: 'Rome', code: 'RM' },
268
+ { name: 'London', code: 'LDN' },
269
+ { name: 'Istanbul', code: 'IST' },
270
+ { name: 'Paris', code: 'PRS' }
271
+ ];
272
+
273
+ listboxValue: any = null;
274
+
275
+ dropdownValues = [
276
+ { name: 'New York', code: 'NY' },
277
+ { name: 'Rome', code: 'RM' },
278
+ { name: 'London', code: 'LDN' },
279
+ { name: 'Istanbul', code: 'IST' },
280
+ { name: 'Paris', code: 'PRS' }
281
+ ];
282
+
283
+ dropdownValue: any = null;
284
+
285
+ multiselectCountries: Country[] = [
286
+ { name: 'Australia', code: 'AU' },
287
+ { name: 'Brazil', code: 'BR' },
288
+ { name: 'China', code: 'CN' },
289
+ { name: 'Egypt', code: 'EG' },
290
+ { name: 'France', code: 'FR' },
291
+ { name: 'Germany', code: 'DE' },
292
+ { name: 'India', code: 'IN' },
293
+ { name: 'Japan', code: 'JP' },
294
+ { name: 'Spain', code: 'ES' },
295
+ { name: 'United States', code: 'US' }
296
+ ];
297
+
298
+ multiselectSelectedCountries!: Country[];
299
+
300
+ toggleValue: boolean = false;
301
+
302
+ selectButtonValue: any = null;
303
+
304
+ selectButtonValues: any = [{ name: 'Option 1' }, { name: 'Option 2' }, { name: 'Option 3' }];
305
+
306
+ knobValue: number = 50;
307
+
308
+ inputGroupValue: boolean = false;
309
+
310
+ treeSelectNodes!: TreeNode[];
311
+
312
+ selectedNode: any = null;
313
+
314
+ countryService = inject(CountryService);
315
+
316
+ nodeService = inject(NodeService);
317
+
318
+ ngOnInit() {
319
+ this.countryService.getCountries().then((countries) => {
320
+ this.autoValue = countries;
321
+ });
322
+
323
+ this.nodeService.getFiles().then((data) => (this.treeSelectNodes = data));
324
+ }
325
+
326
+ filterCountry(event: AutoCompleteCompleteEvent) {
327
+ const filtered: any[] = [];
328
+ const query = event.query;
329
+
330
+ for (let i = 0; i < (this.autoValue as any[]).length; i++) {
331
+ const country = (this.autoValue as any[])[i];
332
+ if (country.name.toLowerCase().indexOf(query.toLowerCase()) == 0) {
333
+ filtered.push(country);
334
+ }
335
+ }
336
+
337
+ this.autoFilteredValue = filtered;
338
+ }
339
+ }
@@ -0,0 +1,217 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component } from '@angular/core';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { ButtonModule } from 'primeng/button';
5
+ import { DataViewModule } from 'primeng/dataview';
6
+ import { OrderListModule } from 'primeng/orderlist';
7
+ import { PickListModule } from 'primeng/picklist';
8
+ import { SelectButtonModule } from 'primeng/selectbutton';
9
+ import { TagModule } from 'primeng/tag';
10
+ import { Product, ProductService } from '@/app/pages/service/product.service';
11
+
12
+ @Component({
13
+ selector: 'app-list-demo',
14
+ standalone: true,
15
+ imports: [CommonModule, DataViewModule, FormsModule, SelectButtonModule, PickListModule, OrderListModule, TagModule, ButtonModule],
16
+ template: ` <div class="flex flex-col">
17
+ <div class="card">
18
+ <div class="font-semibold text-xl">DataView</div>
19
+ <p-dataview [value]="products" [layout]="layout">
20
+ <ng-template #header>
21
+ <div class="flex justify-end">
22
+ <p-select-button [(ngModel)]="layout" [options]="options" [allowEmpty]="false">
23
+ <ng-template #item let-option>
24
+ <i class="pi " [ngClass]="{ 'pi-bars': option === 'list', 'pi-table': option === 'grid' }"></i>
25
+ </ng-template>
26
+ </p-select-button>
27
+ </div>
28
+ </ng-template>
29
+
30
+ <ng-template #list let-items>
31
+ <div class="flex flex-col">
32
+ <div *ngFor="let item of items; let i = index">
33
+ <div class="flex flex-col sm:flex-row sm:items-center p-6 gap-4" [ngClass]="{ 'border-t border-surface': i !== 0 }">
34
+ <div class="md:w-40 relative">
35
+ <img class="block xl:block mx-auto rounded w-full" src="https://primefaces.org/cdn/primevue/images/product/{{ item.image }}" [alt]="item.name" />
36
+ <div class="absolute bg-black/70 rounded-border" [style]="{ left: '4px', top: '4px' }">
37
+ <p-tag [value]="item.inventoryStatus" [severity]="getSeverity(item)"></p-tag>
38
+ </div>
39
+ </div>
40
+ <div class="flex flex-col md:flex-row justify-between md:items-center flex-1 gap-6">
41
+ <div class="flex flex-row md:flex-col justify-between items-start gap-2">
42
+ <div>
43
+ <span class="font-medium text-surface-500 dark:text-surface-400 text-sm">{{ item.category }}</span>
44
+ <div class="text-lg font-medium mt-2">{{ item.name }}</div>
45
+ </div>
46
+ <div class="bg-surface-100 p-1" style="border-radius: 30px">
47
+ <div
48
+ class="bg-surface-0 flex items-center gap-2 justify-center py-1 px-2"
49
+ style="
50
+ border-radius: 30px;
51
+ box-shadow:
52
+ 0px 1px 2px 0px rgba(0, 0, 0, 0.04),
53
+ 0px 1px 2px 0px rgba(0, 0, 0, 0.06);
54
+ "
55
+ >
56
+ <span class="text-surface-900 font-medium text-sm">{{ item.rating }}</span>
57
+ <i class="pi pi-star-fill text-yellow-500"></i>
58
+ </div>
59
+ </div>
60
+ </div>
61
+ <div class="flex flex-col md:items-end gap-8">
62
+ <span class="text-xl font-semibold">$ {{ item.price }}</span>
63
+ <div class="flex flex-row-reverse md:flex-row gap-2">
64
+ <p-button icon="pi pi-heart" styleClass="h-full" [outlined]="true"></p-button>
65
+ <p-button icon="pi pi-shopping-cart" label="Buy Now" [disabled]="item.inventoryStatus === 'OUTOFSTOCK'" styleClass="flex-auto md:flex-initial whitespace-nowrap"></p-button>
66
+ </div>
67
+ </div>
68
+ </div>
69
+ </div>
70
+ </div>
71
+ </div>
72
+ </ng-template>
73
+
74
+ <ng-template #grid let-items>
75
+ <div class="grid grid-cols-12 gap-4">
76
+ <div *ngFor="let item of items; let i = index" class="col-span-12 sm:col-span-6 lg:col-span-4 p-2">
77
+ <div class="p-6 border border-surface-200 dark:border-surface-700 bg-surface-0 dark:bg-surface-900 rounded flex flex-col">
78
+ <div class="relative w-full shadow-sm">
79
+ <img class="rounded w-full" src="https://primefaces.org/cdn/primevue/images/product/{{ item.image }}" [alt]="item.name" />
80
+ <div
81
+ class="absolute bg-black/70 rounded-border"
82
+ [style]="{
83
+ left: '4px',
84
+ top: '4px'
85
+ }"
86
+ >
87
+ <p-tag [value]="item.inventoryStatus" [severity]="getSeverity(item)"></p-tag>
88
+ </div>
89
+ </div>
90
+ <div class="pt-12">
91
+ <div class="flex flex-row justify-between items-start gap-2">
92
+ <div>
93
+ <span class="font-medium text-surface-500 dark:text-surface-400 text-sm">{{ item.category }}</span>
94
+ <div class="text-lg font-medium mt-1">
95
+ {{ item.name }}
96
+ </div>
97
+ </div>
98
+ <div class="bg-surface-100 p-1" style="border-radius: 30px">
99
+ <div
100
+ class="bg-surface-0 flex items-center gap-2 justify-center py-1 px-2"
101
+ style="
102
+ border-radius: 30px;
103
+ box-shadow:
104
+ 0px 1px 2px 0px rgba(0, 0, 0, 0.04),
105
+ 0px 1px 2px 0px rgba(0, 0, 0, 0.06);
106
+ "
107
+ >
108
+ <span class="text-surface-900 font-medium text-xs">{{ item.rating }}</span>
109
+ <i class="pi pi-star-fill text-yellow-500"></i>
110
+ </div>
111
+ </div>
112
+ </div>
113
+ <div class="flex flex-col gap-6 mt-6">
114
+ <span class="text-2xl font-semibold">$ {{ item.price }}</span>
115
+ <div class="flex gap-2">
116
+ <p-button icon="pi pi-shopping-cart" label="Buy Now" [disabled]="item.inventoryStatus === 'OUTOFSTOCK'" class="flex-auto whitespace-nowrap" styleClass="w-full"></p-button>
117
+ <p-button icon="pi pi-heart" styleClass="h-full" [outlined]="true"></p-button>
118
+ </div>
119
+ </div>
120
+ </div>
121
+ </div>
122
+ </div>
123
+ </div>
124
+ </ng-template>
125
+ </p-dataview>
126
+ </div>
127
+
128
+ <div class="flex flex-col lg:flex-row gap-20">
129
+ <div class="lg:w-2/3">
130
+ <div class="card">
131
+ <div class="font-semibold text-xl mb-4">PickList</div>
132
+ <p-pick-list [source]="sourceCities" [target]="targetCities" breakpoint="1400px">
133
+ <ng-template #item let-item>
134
+ {{ item.name }}
135
+ </ng-template>
136
+ </p-pick-list>
137
+ </div>
138
+ </div>
139
+
140
+ <div class="lg:w-1/3">
141
+ <div class="card">
142
+ <div class="font-semibold text-xl mb-4">OrderList</div>
143
+ <p-orderlist [value]="orderCities" dataKey="id" breakpoint="575px">
144
+ <ng-template #option let-option>
145
+ {{ option.name }}
146
+ </ng-template>
147
+ </p-orderlist>
148
+ </div>
149
+ </div>
150
+ </div>
151
+ </div>`,
152
+ styles: `
153
+ ::ng-deep {
154
+ .p-orderlist-list-container {
155
+ width: 100%;
156
+ }
157
+ }
158
+ `,
159
+ providers: [ProductService]
160
+ })
161
+ export class ListDemo {
162
+ layout: 'list' | 'grid' = 'list';
163
+
164
+ options = ['list', 'grid'];
165
+
166
+ products: Product[] = [];
167
+
168
+ sourceCities: any[] = [];
169
+
170
+ targetCities: any[] = [];
171
+
172
+ orderCities: any[] = [];
173
+
174
+ constructor(private productService: ProductService) {}
175
+
176
+ ngOnInit() {
177
+ this.productService.getProductsSmall().then((data) => (this.products = data.slice(0, 6)));
178
+
179
+ this.sourceCities = [
180
+ { name: 'San Francisco', code: 'SF' },
181
+ { name: 'London', code: 'LDN' },
182
+ { name: 'Paris', code: 'PRS' },
183
+ { name: 'Istanbul', code: 'IST' },
184
+ { name: 'Berlin', code: 'BRL' },
185
+ { name: 'Barcelona', code: 'BRC' },
186
+ { name: 'Rome', code: 'RM' }
187
+ ];
188
+
189
+ this.targetCities = [];
190
+
191
+ this.orderCities = [
192
+ { name: 'San Francisco', code: 'SF' },
193
+ { name: 'London', code: 'LDN' },
194
+ { name: 'Paris', code: 'PRS' },
195
+ { name: 'Istanbul', code: 'IST' },
196
+ { name: 'Berlin', code: 'BRL' },
197
+ { name: 'Barcelona', code: 'BRC' },
198
+ { name: 'Rome', code: 'RM' }
199
+ ];
200
+ }
201
+
202
+ getSeverity(product: Product) {
203
+ switch (product.inventoryStatus) {
204
+ case 'INSTOCK':
205
+ return 'success';
206
+
207
+ case 'LOWSTOCK':
208
+ return 'warn';
209
+
210
+ case 'OUTOFSTOCK':
211
+ return 'danger';
212
+
213
+ default:
214
+ return 'info';
215
+ }
216
+ }
217
+ }