2
2
< html xmlns:th ="http://www.thymeleaf.org ">
3
3
< head >
4
4
< meta charset ="UTF-8 ">
5
+ < meta name ="viewport " content ="width=device-width, initial-scale=1.0 ">
6
+ < link rel ="stylesheet " href ="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css ">
5
7
< link rel ="stylesheet " type ="text/css " href ="css/styles.css ">
8
+ < style >
9
+ body {
10
+ font-family : 'Inter' , 'Segoe UI' , 'Fira Code' , Arial, sans-serif;
11
+ background : linear-gradient (120deg , # e0eafc 0% , # cfdef3 100% );
12
+ margin : 0 ;
13
+ padding : 0 ;
14
+ }
15
+ .modern-container {
16
+ max-width : 900px ;
17
+ margin : 40px auto;
18
+ background : rgba (255 , 255 , 255 , 0.95 );
19
+ border-radius : 24px ;
20
+ box-shadow : 0 8px 32px rgba (44 , 62 , 80 , 0.12 );
21
+ padding : 40px 32px ;
22
+ position : relative;
23
+ }
24
+ h1 {
25
+ font-size : 2.5rem ;
26
+ color : # 22223b ;
27
+ margin-bottom : 28px ;
28
+ letter-spacing : 1px ;
29
+ font-weight : 700 ;
30
+ }
31
+ .modern-button {
32
+ display : inline-flex;
33
+ align-items : center;
34
+ gap : 8px ;
35
+ background : linear-gradient (90deg , # 43cea2 0% , # 185a9d 100% );
36
+ color : # fff ;
37
+ border : none;
38
+ border-radius : 12px ;
39
+ padding : 12px 26px ;
40
+ margin : 8px 6px ;
41
+ font-size : 1.08rem ;
42
+ font-weight : 500 ;
43
+ cursor : pointer;
44
+ text-decoration : none;
45
+ transition : background 0.2s , box-shadow 0.2s , transform 0.1s ;
46
+ box-shadow : 0 2px 12px rgba (67 , 206 , 162 , 0.10 );
47
+ }
48
+ .modern-button : hover {
49
+ background : linear-gradient (90deg , # 185a9d 0% , # 43cea2 100% );
50
+ box-shadow : 0 6px 24px rgba (67 , 206 , 162 , 0.18 );
51
+ transform : translateY (-2px ) scale (1.04 );
52
+ }
53
+ .main-table {
54
+ overflow-x : auto;
55
+ margin-top : 28px ;
56
+ }
57
+ table {
58
+ width : 100% ;
59
+ border-collapse : separate;
60
+ border-spacing : 0 ;
61
+ background : # f7fafc ;
62
+ border-radius : 16px ;
63
+ box-shadow : 0 2px 12px rgba (44 , 62 , 80 , 0.06 );
64
+ overflow : hidden;
65
+ }
66
+ th , td {
67
+ padding : 16px 18px ;
68
+ text-align : left;
69
+ }
70
+ th {
71
+ background : linear-gradient (90deg , # 43cea2 0% , # 185a9d 100% );
72
+ color : # fff ;
73
+ font-weight : 700 ;
74
+ border : none;
75
+ }
76
+ tr {
77
+ transition : background 0.2s ;
78
+ }
79
+ tr : nth-child (even) {
80
+ background : # e9f5ff ;
81
+ }
82
+ tr : hover {
83
+ background : # d1e7f7 ;
84
+ }
85
+ .actions .button {
86
+ margin-right : 8px ;
87
+ padding : 8px 18px ;
88
+ border-radius : 8px ;
89
+ font-size : 1rem ;
90
+ border : none;
91
+ color : # fff ;
92
+ background : # 43cea2 ;
93
+ text-decoration : none;
94
+ transition : background 0.2s , transform 0.1s ;
95
+ }
96
+ .actions .button : hover {
97
+ background : # 185a9d ;
98
+ transform : scale (1.05 );
99
+ }
100
+ .actions .button [style *= "color: red" ] {
101
+ background : # e53e3e ;
102
+ color : # fff !important ;
103
+ font-weight : bold;
104
+ }
105
+ .actions .button [style *= "color: #ff7f7f" ] {
106
+ background : # f6ad55 ;
107
+ color : # fff !important ;
108
+ font-weight : bold;
109
+ }
110
+ # searchFeature {
111
+ margin : 32px 0 ;
112
+ display : flex;
113
+ justify-content : center;
114
+ }
115
+ # searchForm {
116
+ display : flex;
117
+ gap : 14px ;
118
+ align-items : center;
119
+ background : # fff ;
120
+ border-radius : 32px ;
121
+ box-shadow : 0 2px 8px rgba (44 , 62 , 80 , 0.08 );
122
+ padding : 10px 24px ;
123
+ }
124
+ # searchForm label {
125
+ font-weight : 600 ;
126
+ color : # 185a9d ;
127
+ }
128
+ # searchForm input [type = "text" ] {
129
+ flex : 1 ;
130
+ padding : 10px 16px ;
131
+ border-radius : 24px ;
132
+ border : 1px solid # 43cea2 ;
133
+ font-size : 1rem ;
134
+ background : # f7fafc ;
135
+ transition : border 0.2s ;
136
+ }
137
+ # searchForm input [type = "text" ]: focus {
138
+ border : 1.5px solid # 185a9d ;
139
+ outline : none;
140
+ }
141
+ .fab {
142
+ position : fixed;
143
+ right : 32px ;
144
+ bottom : 32px ;
145
+ background : linear-gradient (90deg , # 43cea2 0% , # 185a9d 100% );
146
+ color : # fff ;
147
+ border-radius : 50% ;
148
+ width : 64px ;
149
+ height : 64px ;
150
+ display : flex;
151
+ align-items : center;
152
+ justify-content : center;
153
+ font-size : 2rem ;
154
+ box-shadow : 0 4px 24px rgba (44 , 62 , 80 , 0.18 );
155
+ cursor : pointer;
156
+ z-index : 100 ;
157
+ transition : background 0.2s , transform 0.1s ;
158
+ }
159
+ .fab : hover {
160
+ background : linear-gradient (90deg , # 185a9d 0% , # 43cea2 100% );
161
+ transform : scale (1.08 );
162
+ }
163
+ @media (max-width : 600px ) {
164
+ .modern-container {
165
+ padding : 12px 4px ;
166
+ }
167
+ table , th , td {
168
+ font-size : 0.92rem ;
169
+ }
170
+ # searchForm {
171
+ flex-direction : column;
172
+ gap : 8px ;
173
+ padding : 10px 8px ;
174
+ }
175
+ .fab {
176
+ right : 12px ;
177
+ bottom : 12px ;
178
+ width : 48px ;
179
+ height : 48px ;
180
+ font-size : 1.4rem ;
181
+ }
182
+ }
183
+ </ style >
6
184
< script th:inline ="javascript ">
7
185
/*<![CDATA[*/
8
186
window . enableSearchFeature = /*[[${enableSearchFeature}]]*/ 'default' ;
17
195
</ script >
18
196
< script src ="js/styles.js "> </ script >
19
197
</ head >
20
- < body >
21
- < div align ="center " th:if ="${listSale} ">
22
- < h1 > Inventory Records</ h1 >
23
- < a href ="/new " class ="modern-button "> Enter New Product</ a >
24
- < a href ="/export " class ="modern-button "> Export to CSV</ a >
198
+ </ body >
199
+ < div class ="modern-container " th:if ="${listSale} ">
200
+ < h1 > < i class ="fas fa-boxes "> </ i > Inventory Records</ h1 >
201
+ < div style ="margin-bottom: 22px; display: flex; gap: 12px; flex-wrap: wrap; ">
202
+ < a href ="/new " class ="modern-button "> < i class ="fas fa-plus "> </ i > Enter New Product</ a >
203
+ < a href ="/export " class ="modern-button "> < i class ="fas fa-file-export "> </ i > Export to CSV</ a >
204
+ < label for ="csvFile " class ="modern-button "> < i class ="fas fa-file-import "> </ i > Import from CSV</ label >
205
+ </ div >
25
206
< form id ="uploadForm " style ="display: none; ">
26
207
< input type ="file " id ="csvFile " name ="file " accept =".csv ">
27
- < button type ="submit " id ="submitBtn "> Submit</ button >
208
+ < button type ="submit " id ="submitBtn " class =" modern-button " > < i class =" fas fa-upload " > </ i > Submit</ button >
28
209
</ form >
29
- < label for ="csvFile " class ="modern-button "> Import from CSV</ label >
30
- < div id ="errorMessage " style ="color: red; "> </ div >
210
+ < div id ="errorMessage " style ="color: #e53e3e; font-weight: 500; "> </ div >
31
211
< script src ="js/upload_csv.js "> </ script >
32
212
< script src ="js/search.js "> </ script >
33
- < br > < br >
34
213
< div id ="searchFeature ">
35
214
< form id ="searchForm " action ="/search " method ="get ">
36
215
< label for ="search "> Search for item:</ label >
37
216
< input type ="text " id ="search " name ="q " />
38
- < button type ="submit "> Search</ button >
217
+ < button type ="submit " class =" modern-button " > < i class =" fas fa-search " > </ i > Search</ button >
39
218
</ form >
40
219
</ div >
41
220
< div id ="searchResults "> </ div >
42
- < br />
43
- < div >
44
- < a th:if ="${currentPage > 0} " th:href ="@{/?(page=${currentPage - 1})} "> Previous</ a >
45
- < span th:text ="${currentPage + 1} "> </ span > / < span th:text ="${totalPages} "> </ span >
46
- < a th:if ="${currentPage < totalPages - 1} " th:href ="@{/?(page=${currentPage + 1})} "> Next</ a >
221
+ < div style ="margin: 22px 0; display: flex; justify-content: center; align-items: center; gap: 22px; ">
222
+ < a th:if ="${currentPage > 0} " th:href ="@{/?(page=${currentPage - 1})} " class ="modern-button " style ="background: #43cea2; "> < i class ="fas fa-arrow-left "> </ i > Previous</ a >
223
+ < span style ="font-weight: 600; color: #185a9d; " th:text ="${currentPage + 1} "> </ span > / < span style ="font-weight: 600; color: #185a9d; " th:text ="${totalPages} "> </ span >
224
+ < a th:if ="${currentPage < totalPages - 1} " th:href ="@{/?(page=${currentPage + 1})} " class ="modern-button " style ="background: #43cea2; "> Next < i class ="fas fa-arrow-right "> </ i > </ a >
47
225
</ div >
48
- < br />
49
- < form th:action ="@{/logout} " method ="post ">
50
- <!-- <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" /> -->
51
- < input type ="submit " value ="Logout " />
226
+ < form th:action ="@{/logout} " method ="post " style ="margin-bottom: 22px; ">
227
+ < input type ="submit " value ="Logout " class ="modern-button " style ="background: #e53e3e; " />
52
228
</ form >
53
- < br />
54
229
< div class ="main-table ">
55
- < table style =" width: 35% " border =" 1 " cellpadding =" 10 " class =" main-table " >
230
+ < table >
56
231
< thead >
57
232
< tr >
58
- < th > Serial Number</ th >
59
- < th > Item Name</ th >
60
- < th > Quantity</ th >
61
- < th > Amount</ th >
62
- < th > Actions</ th >
233
+ < th > < i class =" fas fa-hashtag " > </ i > Serial Number</ th >
234
+ < th > < i class =" fas fa-tag " > </ i > Item Name</ th >
235
+ < th > < i class =" fas fa-cubes " > </ i > Quantity</ th >
236
+ < th > < i class =" fas fa-dollar-sign " > </ i > Amount</ th >
237
+ < th > < i class =" fas fa-tools " > </ i > Actions</ th >
63
238
</ tr >
64
239
</ thead >
65
240
< tbody >
66
241
< tr th:each ="sale : ${listSale} ">
67
- < td th:text ="${sale.serialNumber} "> serial Number </ td >
68
- < td th:text ="${sale.item} "> Item Name </ td >
69
- < td th:text ="${sale.quantity} "> Quantity </ td >
70
- < td th:text ="${sale.amount} "> Amount </ td >
242
+ < td th:text ="${sale.serialNumber} "> </ td >
243
+ < td th:text ="${sale.item} "> </ td >
244
+ < td th:text ="${sale.quantity} "> </ td >
245
+ < td th:text ="${sale.amount} "> </ td >
71
246
< td class ="actions ">
72
- < a class ="button " th:href ="@{'/edit/' + ${sale.serialNumber}} "> Edit</ a >
73
- < a class ="button " th:href ="@{'/delete/' + ${sale.serialNumber}} " onclick ="return confirm('Delete: This action is irreversible. Are you sure you want to delete the sale record?') " style ="color: red; "> Delete</ a >
74
- < a class ="button " th:href ="@{'/clear/' + ${sale.serialNumber}} " onclick ="return confirm('Clear: This action is irreversible. Are you sure you want to clear the sale record?') " style ="color: #ff7f7f; "> Clear</ a >
247
+ < a class ="button " th:href ="@{'/edit/' + ${sale.serialNumber}} "> < i class =" fas fa-edit " > </ i > Edit</ a >
248
+ < a class ="button " th:href ="@{'/delete/' + ${sale.serialNumber}} " onclick ="return confirm('Delete: This action is irreversible. Are you sure you want to delete the sale record?') " style ="color: red; "> < i class =" fas fa-trash " > </ i > Delete</ a >
249
+ < a class ="button " th:href ="@{'/clear/' + ${sale.serialNumber}} " onclick ="return confirm('Clear: This action is irreversible. Are you sure you want to clear the sale record?') " style ="color: #ff7f7f; "> < i class =" fas fa-eraser " > </ i > Clear</ a >
75
250
</ td >
76
251
</ tr >
77
252
</ tbody >
78
253
</ table >
79
254
</ div >
255
+ < div class ="fab " title ="Add New Product " onclick ="window.location.href='/new' ">
256
+ < i class ="fas fa-plus "> </ i >
257
+ </ div >
80
258
</ div >
81
259
</ body >
82
260
</ html >
0 commit comments