Package not found. Please check the package name and try again.

@gnar-engine/cli 1.0.3 → 1.0.4

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 (160) hide show
  1. package/bootstrap/deploy.localdev.yml +18 -31
  2. package/bootstrap/secrets.localdev.yml +7 -12
  3. package/bootstrap/services/user/Dockerfile +1 -1
  4. package/package.json +1 -1
  5. package/src/config.js +2 -1
  6. package/src/dev/dev.service.js +44 -16
  7. package/src/scaffolder/commands.js +11 -4
  8. package/src/scaffolder/scaffolder.handler.js +228 -55
  9. package/templates/service/Dockerfile.hbs +4 -1
  10. package/templates/service/package.json.hbs +14 -16
  11. package/templates/service/{app.js.hbs → src/app.js.hbs} +8 -4
  12. package/templates/service/{commands → src/commands}/{{serviceName}}.handler.js.hbs +1 -2
  13. package/{bootstrap/services/agent/src/config.js → templates/service/src/mongodb.config.js.hbs} +11 -18
  14. package/templates/service/{config.js.hbs → src/mysql.config.js.hbs} +6 -0
  15. package/{bootstrap/services/agent/src/schema/Agent.schema.js → templates/service/src/schema/{{serviceName}}.schema.js.hbs} +3 -3
  16. package/templates/service/src/services/mongodb.{{serviceName}}.service.js.hbs +70 -0
  17. package/bootstrap/services/agent/Dockerfile +0 -23
  18. package/bootstrap/services/agent/notes.md +0 -28
  19. package/bootstrap/services/agent/package.json +0 -16
  20. package/bootstrap/services/agent/src/app.js +0 -52
  21. package/bootstrap/services/agent/src/commands/agent.handler.js +0 -104
  22. package/bootstrap/services/agent/src/controllers/http.controller.js +0 -44
  23. package/bootstrap/services/agent/src/controllers/message.controller.js +0 -51
  24. package/bootstrap/services/agent/src/db/migrations/01-init.js +0 -50
  25. package/bootstrap/services/agent/src/db/migrations/02-agent-service-init.js +0 -36
  26. package/bootstrap/services/agent/src/policies/agent.policy.js +0 -13
  27. package/bootstrap/services/agent/src/services/agent.service.js +0 -259
  28. package/bootstrap/services/agent/src/services/chatgpt.service.js +0 -46
  29. package/bootstrap/services/agent/src/services/manifest.service.js +0 -21
  30. package/bootstrap/services/portal/Dockerfile +0 -23
  31. package/bootstrap/services/portal/Dockerfile.remote +0 -40
  32. package/bootstrap/services/portal/README.md +0 -22
  33. package/bootstrap/services/portal/nginx.conf +0 -12
  34. package/bootstrap/services/portal/package.json +0 -59
  35. package/bootstrap/services/portal/public/favicon.ico +0 -0
  36. package/bootstrap/services/portal/public/gnar-white.png +0 -0
  37. package/bootstrap/services/portal/public/gnarengine-logo-black.png +0 -0
  38. package/bootstrap/services/portal/public/index.html +0 -43
  39. package/bootstrap/services/portal/public/logo192.png +0 -0
  40. package/bootstrap/services/portal/public/logo512.png +0 -0
  41. package/bootstrap/services/portal/public/manifest.json +0 -25
  42. package/bootstrap/services/portal/public/robots.txt +0 -3
  43. package/bootstrap/services/portal/src/App.js +0 -56
  44. package/bootstrap/services/portal/src/assets/Logo_Anchord_Black.svg +0 -1
  45. package/bootstrap/services/portal/src/assets/Logo_Anchord_Black_Green.svg +0 -1
  46. package/bootstrap/services/portal/src/assets/Logo_Anchord_White_Green.svg +0 -1
  47. package/bootstrap/services/portal/src/assets/activity.svg +0 -3
  48. package/bootstrap/services/portal/src/assets/arrow.svg +0 -3
  49. package/bootstrap/services/portal/src/assets/bin-white.svg +0 -3
  50. package/bootstrap/services/portal/src/assets/bin.svg +0 -3
  51. package/bootstrap/services/portal/src/assets/check.svg +0 -3
  52. package/bootstrap/services/portal/src/assets/chevron.svg +0 -3
  53. package/bootstrap/services/portal/src/assets/contact.svg +0 -3
  54. package/bootstrap/services/portal/src/assets/dots-vertical.svg +0 -5
  55. package/bootstrap/services/portal/src/assets/eye-off.svg +0 -3
  56. package/bootstrap/services/portal/src/assets/eye.svg +0 -4
  57. package/bootstrap/services/portal/src/assets/gnar-engine-black.svg +0 -47
  58. package/bootstrap/services/portal/src/assets/gnar-engine-white.svg +0 -47
  59. package/bootstrap/services/portal/src/assets/gnar_engine.svg +0 -3
  60. package/bootstrap/services/portal/src/assets/gnarengine-logo-black.png +0 -0
  61. package/bootstrap/services/portal/src/assets/home.svg +0 -3
  62. package/bootstrap/services/portal/src/assets/link.svg +0 -3
  63. package/bootstrap/services/portal/src/assets/lock.svg +0 -3
  64. package/bootstrap/services/portal/src/assets/package.svg +0 -4
  65. package/bootstrap/services/portal/src/assets/raffle.svg +0 -3
  66. package/bootstrap/services/portal/src/assets/settings.svg +0 -4
  67. package/bootstrap/services/portal/src/assets/shopping-bag.svg +0 -3
  68. package/bootstrap/services/portal/src/assets/user-black.svg +0 -3
  69. package/bootstrap/services/portal/src/assets/user.svg +0 -3
  70. package/bootstrap/services/portal/src/assets/users.svg +0 -3
  71. package/bootstrap/services/portal/src/assets/wallet.svg +0 -3
  72. package/bootstrap/services/portal/src/css/style.css +0 -1007
  73. package/bootstrap/services/portal/src/data/data.js +0 -70
  74. package/bootstrap/services/portal/src/features/attributeFormRow/AttributeFormRow.jsx +0 -32
  75. package/bootstrap/services/portal/src/features/billingShipping/BillingShipping.jsx +0 -160
  76. package/bootstrap/services/portal/src/features/crud/crudEdit.less +0 -230
  77. package/bootstrap/services/portal/src/features/crud/crudList.less +0 -134
  78. package/bootstrap/services/portal/src/features/crud/crudPage.less +0 -31
  79. package/bootstrap/services/portal/src/features/crudContact/CrudContactList.jsx +0 -108
  80. package/bootstrap/services/portal/src/features/crudContact/CrudContactSingle.jsx +0 -243
  81. package/bootstrap/services/portal/src/features/crudOrder/CrudOrderList.jsx +0 -109
  82. package/bootstrap/services/portal/src/features/crudOrder/CrudOrderSingle.jsx +0 -315
  83. package/bootstrap/services/portal/src/features/crudProducts/CrudProductList.jsx +0 -104
  84. package/bootstrap/services/portal/src/features/crudProducts/CrudProductSingle.jsx +0 -388
  85. package/bootstrap/services/portal/src/features/crudRaffles/CrudRafflesList.jsx +0 -104
  86. package/bootstrap/services/portal/src/features/crudRaffles/CrudRafflesSingle.jsx +0 -208
  87. package/bootstrap/services/portal/src/features/crudSubscription/CrudSubscriptionList.jsx +0 -110
  88. package/bootstrap/services/portal/src/features/crudSubscription/CrudSubscriptionSingle.jsx +0 -261
  89. package/bootstrap/services/portal/src/features/crudUser/CrudUserList.jsx +0 -107
  90. package/bootstrap/services/portal/src/features/crudUser/CrudUserSingle.jsx +0 -402
  91. package/bootstrap/services/portal/src/features/inventoryFormRow/InventoryFormRow.jsx +0 -30
  92. package/bootstrap/services/portal/src/features/lineItems/LineItems.jsx +0 -113
  93. package/bootstrap/services/portal/src/features/loginForm/LoginForm.jsx +0 -56
  94. package/bootstrap/services/portal/src/features/loginForm/loginForm.less +0 -56
  95. package/bootstrap/services/portal/src/features/notes/Notes.jsx +0 -18
  96. package/bootstrap/services/portal/src/features/passwordReset/PasswordResetForm.jsx +0 -96
  97. package/bootstrap/services/portal/src/features/passwordReset/PasswordResetRequestForm.jsx +0 -74
  98. package/bootstrap/services/portal/src/features/priceFormRow/PriceFormRow.jsx +0 -102
  99. package/bootstrap/services/portal/src/features/priceFormRow/priceFormRow.less +0 -24
  100. package/bootstrap/services/portal/src/features/raffleEntriesList/RaffleEntriesList.jsx +0 -99
  101. package/bootstrap/services/portal/src/features/raffleProductFormRow/RaffleProductFormRow.jsx +0 -46
  102. package/bootstrap/services/portal/src/features/sidebar/Sidebar.jsx +0 -64
  103. package/bootstrap/services/portal/src/features/sidebar/sidebar.less +0 -49
  104. package/bootstrap/services/portal/src/features/skus/Skus.jsx +0 -109
  105. package/bootstrap/services/portal/src/features/subscriptionSchedule/SubscriptionSchedule.jsx +0 -44
  106. package/bootstrap/services/portal/src/features/taxonomyFormRow/TaxonomyFormRow.jsx +0 -32
  107. package/bootstrap/services/portal/src/features/user/User.jsx +0 -54
  108. package/bootstrap/services/portal/src/features/user/user.less +0 -57
  109. package/bootstrap/services/portal/src/includes/utilities.js +0 -259
  110. package/bootstrap/services/portal/src/index.js +0 -14
  111. package/bootstrap/services/portal/src/layouts/CrudLayout.jsx +0 -50
  112. package/bootstrap/services/portal/src/layouts/LoginLayout.jsx +0 -17
  113. package/bootstrap/services/portal/src/layouts/PortalLayout.jsx +0 -48
  114. package/bootstrap/services/portal/src/layouts/loginLayout.less +0 -33
  115. package/bootstrap/services/portal/src/layouts/portalLayout.less +0 -67
  116. package/bootstrap/services/portal/src/pages/contacts/Contacts.jsx +0 -199
  117. package/bootstrap/services/portal/src/pages/dashboard/Dashboard.jsx +0 -17
  118. package/bootstrap/services/portal/src/pages/integrations/Integrations.jsx +0 -10
  119. package/bootstrap/services/portal/src/pages/login/Login.jsx +0 -15
  120. package/bootstrap/services/portal/src/pages/login/login.less +0 -10
  121. package/bootstrap/services/portal/src/pages/orders/Orders.jsx +0 -199
  122. package/bootstrap/services/portal/src/pages/passwordReset/PasswordResetPage.jsx +0 -15
  123. package/bootstrap/services/portal/src/pages/passwordResetRequest/PasswordResetRequestPage.jsx +0 -15
  124. package/bootstrap/services/portal/src/pages/payments/Payments.jsx +0 -10
  125. package/bootstrap/services/portal/src/pages/portal/Portal.jsx +0 -43
  126. package/bootstrap/services/portal/src/pages/products/Products.jsx +0 -212
  127. package/bootstrap/services/portal/src/pages/raffleEntries/RaffleEntries.jsx +0 -124
  128. package/bootstrap/services/portal/src/pages/raffles/Raffles.jsx +0 -186
  129. package/bootstrap/services/portal/src/pages/reports/Reports.jsx +0 -10
  130. package/bootstrap/services/portal/src/pages/settings/Settings.jsx +0 -10
  131. package/bootstrap/services/portal/src/pages/subscriptions/Subscriptions.jsx +0 -199
  132. package/bootstrap/services/portal/src/pages/users/Users.jsx +0 -193
  133. package/bootstrap/services/portal/src/pages/users/users.less +0 -25
  134. package/bootstrap/services/portal/src/slices/authSlice.js +0 -71
  135. package/bootstrap/services/portal/src/store/configureStore.js +0 -12
  136. package/bootstrap/services/portal/src/styles/global.less +0 -159
  137. package/bootstrap/services/portal/src/styles/inputs.less +0 -157
  138. package/bootstrap/services/portal/src/styles/main.less +0 -26
  139. package/bootstrap/services/portal/src/ui/collapsible/Collapsible.jsx +0 -97
  140. package/bootstrap/services/portal/src/ui/collapsible/collapsible.less +0 -23
  141. package/bootstrap/services/portal/src/ui/customCheckbox/CustomCheckbox.jsx +0 -17
  142. package/bootstrap/services/portal/src/ui/customCheckbox/customCheckbox.less +0 -42
  143. package/bootstrap/services/portal/src/ui/customMultiSelect/CustomMultiSelect.jsx +0 -63
  144. package/bootstrap/services/portal/src/ui/customMultiSelect/CustomMultiSelectPeriod.jsx +0 -63
  145. package/bootstrap/services/portal/src/ui/customSelect/CustomSelect.jsx +0 -63
  146. package/bootstrap/services/portal/src/ui/customSelect/customSelect.less +0 -92
  147. package/bootstrap/services/portal/src/ui/goBack/GoBack.jsx +0 -19
  148. package/bootstrap/services/portal/src/ui/loader/Loader.jsx +0 -12
  149. package/bootstrap/services/portal/src/ui/pagination/Pagination.jsx +0 -23
  150. package/bootstrap/services/portal/src/ui/repeater/Repeater.jsx +0 -29
  151. package/bootstrap/services/portal/src/ui/saveButton/SaveButton.jsx +0 -69
  152. package/bootstrap/services/portal/src/ui/saveButton/saveButton.less +0 -0
  153. package/bootstrap/services/user/src/db/seeders/development/02-portal-admin-user.js +0 -27
  154. package/templates/service/schema/{{serviceName}}.schema.js.hbs +0 -14
  155. /package/templates/service/{controllers → src/controllers}/http.controller.js.hbs +0 -0
  156. /package/templates/service/{controllers → src/controllers}/message.controller.js.hbs +0 -0
  157. /package/templates/service/{db → src/mysql.db}/migrations/01-init.js.hbs +0 -0
  158. /package/templates/service/{db → src/mysql.db}/migrations/02-{{lowerCase serviceName}}-service-init.js.hbs +0 -0
  159. /package/templates/service/{policies → src/policies}/{{serviceName}}.policy.js.hbs +0 -0
  160. /package/templates/service/{services/{{serviceName}}.service.js.hbs → src/services/mysql.{{serviceName}}.service.js.hbs} +0 -0
@@ -1,315 +0,0 @@
1
- import { useEffect, useState } from "react";
2
- import gnarEngine from '@gnar-engine/js-client';
3
- import SaveButton from "../../ui/saveButton/SaveButton";
4
- import Repeater from "../../ui/repeater/Repeater";
5
- import Notes from "../notes/Notes";
6
- import CustomSelect from "../../ui/customSelect/CustomSelect";
7
- import { orderTypes, orderStatuses } from '../../data/data';
8
- import { Link } from "react-router-dom";
9
- import BillingShipping from "../billingShipping/BillingShipping";
10
- import LineItems from "../lineItems/LineItems";
11
-
12
-
13
- const CrudOrderSingle = ({ loading, setLoading, order, setView, refreshSelectedOrder, setOrder, formatDate, setSelectedSingleItemId }) => {
14
-
15
- const [formData, setFormData] = useState({});
16
- const [validationErrors, setValidationErrors] = useState([]);
17
- const [orderType, setOrderType] = useState(null);
18
- const [orderStatus, setOrderStatus] = useState(null);
19
- const [notes, setNotes] = useState([]);
20
-
21
- useEffect(() => {
22
- if (order && order._id) {
23
- setFormData(prevFormData => ({
24
- ...prevFormData,
25
- userId: order.userId,
26
- type: order.type,
27
- status: order.status,
28
- billingAddress: order.billingAddress,
29
- shippingAddress: order.shippingAddress,
30
- lineItems: order.lineItems,
31
- currency: order.currency,
32
- subTotal: order.subTotal,
33
- shipping: order.shipping,
34
- tax: order.tax,
35
- total: order.total,
36
- }));
37
-
38
- setNotes(order.notes || []);
39
-
40
- // set order type
41
- const existingOrderType = orderTypes.find(type => type.id === order.type);
42
- setOrderType(existingOrderType);
43
-
44
- // set order status
45
- const existingOrderStatus = orderStatuses.find(status => status.id === order.status);
46
- setOrderStatus(existingOrderStatus);
47
-
48
- } else {
49
- setFormData({
50
- ...formData,
51
- userId: '',
52
- type: null,
53
- status: null,
54
- billingAddress: {
55
- firstName: '',
56
- lastName: '',
57
- addressLine1: '',
58
- addressLine2: '',
59
- city: '',
60
- postcode: '',
61
- email: '',
62
- phone: '',
63
- },
64
- shippingAddress: {
65
- firstName: '',
66
- lastName: '',
67
- addressLine1: '',
68
- addressLine2: '',
69
- city: '',
70
- postcode: '',
71
- },
72
- lineItems: [],
73
- currency: 'GBP',
74
- subTotal: 0,
75
- shipping: 0,
76
- tax: 0,
77
- total: 0,
78
- });
79
- setNotes([]);
80
- }
81
- }, [order]);
82
-
83
-
84
- const handleSubmit = async (e) => {
85
- e.preventDefault();
86
- setLoading('loading');
87
- setValidationErrors([]);
88
-
89
- try {
90
- const updatedOrder = {
91
- ...formData,
92
- notes: notes,
93
- };
94
-
95
- if (order) {
96
- const response = await gnarEngine.order.updateOrder(order._id,{
97
- ...order,
98
- ...updatedOrder
99
- });
100
- console.log('response:', response);
101
-
102
- setLoading('success');
103
- setTimeout(() => {
104
- setLoading(null);
105
- }, 3000);
106
-
107
- refreshSelectedOrder();
108
- } else {
109
-
110
- const response = await gnarEngine.order.createOrder([updatedOrder]);
111
- console.log('response:', response);
112
-
113
- if (response.error) {
114
- setValidationErrors(response.error);
115
- } else {
116
- setOrder(response.order);
117
- refreshSelectedOrder();
118
- setView('list');
119
- }
120
- }
121
- }
122
- catch (error) {
123
- console.error('Error updating order:', error);
124
- setValidationErrors(['Error updating order']);
125
- setTimeout(() => {
126
- setLoading(null);
127
- }, 3000);
128
- }
129
-
130
-
131
- }
132
-
133
- // handle delete user
134
- const handleDelete = async () => {
135
- if (window.confirm('Are you sure you want to delete this order?')) {
136
- try {
137
- setLoading('loading');
138
-
139
- await gnarEngine.order.delete(order._id);
140
-
141
- setLoading('success');
142
- setTimeout(() => {
143
- setLoading(null);
144
- }, 3000);
145
-
146
- refreshSelectedOrder();
147
- setView('list');
148
-
149
- } catch (error) {
150
-
151
- setLoading('error');
152
- console.error('Error deleting order:', error);
153
- }
154
- } else {
155
- console.log('Deletion canceled');
156
- }
157
- };
158
-
159
- // check order being passed in
160
- useEffect(() => {
161
- console.log('order:', order);
162
- }, [order]);
163
-
164
-
165
- const handleTypeChange = (selectedOption) => {
166
- setOrderStatus(selectedOption);
167
- setFormData({
168
- ...formData,
169
- type: selectedOption.id,
170
- });
171
- }
172
-
173
- const handleStatusChange = (selectedOption) => {
174
- setOrderStatus(selectedOption);
175
- setFormData({
176
- ...formData,
177
- status: selectedOption.id,
178
- });
179
- }
180
-
181
-
182
- return (
183
-
184
- <div className="single-edit order">
185
- {validationErrors.length > 0 &&
186
- <div className="error-messages">
187
- {validationErrors.map((error, index) => {
188
- return <p key={index}>{error}</p>
189
- })}
190
- </div>
191
- }
192
-
193
- <div className='single-edit-header'>
194
- <div className='single-edit-header-left'>
195
- <p><strong>{order ? 'Order# ' + order._id : 'Add New Order'}</strong></p>
196
- <p>Date Added: {formatDate(order?.createdAt)}</p>
197
- <label>Order Type</label>
198
- <CustomSelect
199
- name="type"
200
- labelKey="type"
201
- placeholder="Select order type"
202
- options={orderTypes}
203
- setSelectedOption={handleTypeChange}
204
- selectedOption={orderType}
205
- />
206
- <label>Order Status</label>
207
- <CustomSelect
208
- name="status"
209
- labelKey="status"
210
- placeholder="Select order status"
211
- options={orderStatuses}
212
- setSelectedOption={handleStatusChange}
213
- selectedOption={orderStatus}
214
- />
215
- <div className="input-cont flex-row flex-row-end">
216
- <div>
217
- <label>User ID</label>
218
- <input
219
- type="text"
220
- name="userId"
221
- placeholder="User ID"
222
- value={formData.userId}
223
- onChange={(e) => setFormData({ ...formData, userId: e.target.value })}
224
- />
225
- </div>
226
- <Link to={`/portal/users?view=single&id=${order?.userId}`}>
227
- <button className="mainButton">View / Edit</button>
228
- </Link>
229
- </div>
230
-
231
- </div>
232
- <div className='single-edit-header-right'>
233
- <div className="flex-row-buttons-cont">
234
- <button onClick={() => {
235
- setView('list');
236
- setOrder(null);
237
- setSelectedSingleItemId(null);
238
- }} className="secondaryButton">
239
- Back
240
- </button>
241
- <button onClick={handleDelete} className="secondaryButton">Delete</button>
242
- <SaveButton
243
- save={handleSubmit}
244
- loading={loading}
245
- textCreate="Add Order"
246
- textCreateLoading="Saving..."
247
- textCreateSuccess="Saved"
248
- textCreateError="Error"
249
- textUpdate="Save"
250
- textUpdateLoading="Updating..."
251
- textUpdateSuccess="Updated"
252
- textUpdateError="Error"
253
- isUpdating={!!order}
254
- />
255
- </div>
256
- </div>
257
- </div>
258
-
259
- <BillingShipping
260
- order={order}
261
- />
262
-
263
- <LineItems
264
- order={order}
265
- />
266
-
267
- <div className="card">
268
- <div className='card-header'>
269
- <h2>Order Notes</h2>
270
- </div>
271
- <div className='card-content'>
272
- <div className="order-notes-cont">
273
- <Repeater
274
- items={notes}
275
- setItems={setNotes}
276
- defaultItem={{ note: '' }}
277
- renderRow={(item, index, onChange, remove) => (
278
- <Notes key={index} item={item} onChange={onChange} remove={remove} />
279
- )}
280
- buttonText="Add Note"
281
- />
282
- </div>
283
- </div>
284
- </div>
285
-
286
- {order && order.subscriptions && (
287
- <div className="card">
288
- <div className='card-header'>
289
- <h2>Subscriptions</h2>
290
- </div>
291
- <div className='card-content'>
292
- {order.subscriptions.length > 0 ? (
293
- <>
294
- {order.subscriptions.map((subscription, index) => (
295
- <div className="subscription-details-cont" key={index}>
296
- <p><strong>Subscription ID:</strong> {subscription?._id}</p>
297
- <Link to={`/portal/subscriptions?view=single&id=${subscription._id}`}>
298
- <button className="secondaryButton">View / Edit</button>
299
- </Link>
300
- </div>
301
- ))}
302
- </>
303
- ) : (
304
- <p>No subscriptions found.</p>
305
- )}
306
- </div>
307
- </div>
308
- )}
309
- </div>
310
-
311
- );
312
-
313
- };
314
-
315
- export default CrudOrderSingle;
@@ -1,104 +0,0 @@
1
- import React, { useState, useEffect } from 'react';
2
- import gnarEngine from "@gnar-engine/js-client";
3
- import CustomCheckbox from '../../ui/customCheckbox/CustomCheckbox';
4
-
5
- const CrudProductList = ({ setSelectedSingleItemId, setView, selectedProductIds, setSelectedProductIds, products, message }) => {
6
-
7
- const allSelected = products.length > 0 && selectedProductIds.size === products.length;
8
-
9
- const toggleProductSelection = (productId) => {
10
- setSelectedProductIds(prev => {
11
- const newSet = new Set(prev);
12
- if (newSet.has(productId)) {
13
- newSet.delete(productId);
14
- } else {
15
- newSet.add(productId);
16
- }
17
- return newSet;
18
- });
19
- };
20
-
21
- const toggleSelectAll = () => {
22
- if (allSelected) {
23
- setSelectedProductIds(new Set());
24
- } else {
25
- setSelectedProductIds(new Set(products.map(product => product.id)));
26
- }
27
- };
28
-
29
- const handleEditClick = (product) => {
30
- setSelectedSingleItemId(product.id);
31
- setView('single');
32
- };
33
-
34
- const columns = [
35
- { columnLabel: 'ID', dataKey: 'id' },
36
- { columnLabel: 'Image', dataKey: 'image' },
37
- { columnLabel: 'Name', dataKey: 'name' },
38
- { columnLabel: 'Sku', dataKey: 'sku' },
39
- { columnLabel: 'Categories', dataKey: 'categories' },
40
- { columnLabel: 'Date Added', dataKey: 'createdAt' }
41
- ];
42
-
43
- return (
44
- <div className="">
45
- <div className='pagination-labels-cont'>
46
- <div className='pagination-count'>
47
- Showing {products.length} of {products.length} product{products.length !== 1 ? 's' : ''}
48
- </div>
49
- <div className="pagination-count">
50
- {selectedProductIds.size} of {products.length} product{products.length !== 1 ? 's' : ''} selected
51
- </div>
52
- </div>
53
- <div className='crud-list'>
54
- <table className='custom-table'>
55
- <thead>
56
- <tr>
57
- <th className="checkbox">
58
- <CustomCheckbox
59
- name="selectAll"
60
- checked={allSelected}
61
- setChecked={toggleSelectAll}
62
- />
63
- </th>
64
- {columns.map(column => (
65
- <th key={column.columnLabel}>{column.columnLabel}</th>
66
- ))}
67
- </tr>
68
- </thead>
69
-
70
- <tbody>
71
- {message ? (
72
- <tr>
73
- <td colSpan={columns.length + 1}>{message}</td>
74
- </tr>
75
- ) : (
76
- products.length > 0 ? (
77
- products.map(product => (
78
- <tr key={product.id} onClick={() => handleEditClick(product)}>
79
- <td>
80
- <CustomCheckbox
81
- name={`checkbox-${product.id}`}
82
- checked={selectedProductIds.has(product.id)}
83
- setChecked={() => toggleProductSelection(product.id)}
84
- />
85
- </td>
86
- {columns.map(column => (
87
- <td key={column.dataKey}>{product[column.dataKey]}</td>
88
- ))}
89
- </tr>
90
- ))
91
- ) : (
92
- <tr>
93
- <td colSpan={columns.length + 1}>No products found</td>
94
- </tr>
95
- )
96
- )}
97
- </tbody>
98
- </table>
99
- </div>
100
- </div>
101
- );
102
- };
103
-
104
- export default CrudProductList;