@paro.io/expert-shared-components 1.12.21 → 1.12.22

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.
@@ -184,9 +184,9 @@ const DecisionSection = ({ dispute, onUpdateDispute, updateInvoiceMutation, upda
184
184
  react_1.default.createElement("div", { className: "text-xs text-gray-500" }, project.disputeType === 'Hourly'
185
185
  ? `Disputed Hours: ${project.disputeHours}`
186
186
  : `Dispute Amount: $${((_a = project.disputeAmount) === null || _a === void 0 ? void 0 : _a.toFixed(2)) || '0.00'}`)),
187
- react_1.default.createElement("div", { className: "w-32" }, project.disputeType === 'Hourly' ? (react_1.default.createElement("input", { type: "number", step: "0.01", min: "0", max: project.disputeHours, value: projectApprovedHours[project.projectId] || '', onChange: (e) => handleProjectHoursChange(project.projectId, parseFloat(e.target.value) || 0), className: "w-full px-2 py-1 border border-[#CCCCCC] rounded text-sm focus:outline-none focus:ring-2 focus:ring-[#248384]", placeholder: "Hours" })) : (react_1.default.createElement("div", { className: "relative" },
187
+ react_1.default.createElement("div", { className: "w-32" }, project.disputeType === 'Hourly' ? (react_1.default.createElement("input", { type: "number", step: "1", min: "0", max: project.disputeHours, value: projectApprovedHours[project.projectId] || '', onChange: (e) => handleProjectHoursChange(project.projectId, parseFloat(e.target.value) || 0), className: "w-full px-2 py-1 border border-[#CCCCCC] rounded text-sm focus:outline-none focus:ring-2 focus:ring-[#248384]", placeholder: "Hours" })) : (react_1.default.createElement("div", { className: "relative" },
188
188
  react_1.default.createElement("span", { className: "absolute left-2 top-1/2 transform -translate-y-1/2 text-gray-500" }, "$"),
189
- react_1.default.createElement("input", { type: "number", step: "0.01", min: "0", max: project.disputeAmount, value: projectApprovedHours[project.projectId] || '', onChange: (e) => handleProjectHoursChange(project.projectId, parseFloat(e.target.value) || 0), className: "w-full pl-2 pr-2 py-1 border border-[#CCCCCC] rounded text-sm focus:outline-none focus:ring-2 focus:ring-[#248384]", placeholder: "0.00" }))))));
189
+ react_1.default.createElement("input", { type: "number", step: "1", min: "0", max: project.disputeAmount, value: projectApprovedHours[project.projectId] || '', onChange: (e) => handleProjectHoursChange(project.projectId, parseFloat(e.target.value) || 0), className: "w-full pl-2 pr-2 py-1 border border-[#CCCCCC] rounded text-sm focus:outline-none focus:ring-2 focus:ring-[#248384]", placeholder: "0.00" }))))));
190
190
  })),
191
191
  react_1.default.createElement("div", { className: "text-sm text-gray-600" }, dispute.disputeProjects.some((p) => p.disputeType === 'Hourly') &&
192
192
  dispute.disputeProjects.some((p) => p.disputeType !== 'Hourly') ? (
@@ -10,35 +10,38 @@ const InvoiceHeader = ({ invoice, isInternal = false, isClient = false }) => {
10
10
  var _a, _b, _c, _d, _e, _f;
11
11
  const disputeAmount = (_a = invoice === null || invoice === void 0 ? void 0 : invoice.disputeProjects) === null || _a === void 0 ? void 0 : _a.reduce((acc, project) => acc + (project === null || project === void 0 ? void 0 : project.disputeAmount), 0);
12
12
  return (react_1.default.createElement("div", { className: "bg-[#0F172A] w-full text-white px-6 py-4 rounded-t-lg flex items-center justify-between font-arial" },
13
- react_1.default.createElement("div", { className: "flex items-center space-x-8" },
13
+ react_1.default.createElement("div", { className: "flex items-center space-x-4 overflow-x-auto" },
14
+ react_1.default.createElement("div", { className: "flex-shrink-0" },
15
+ react_1.default.createElement("span", { className: "text-sm font-bold" }, "Dispute #:"),
16
+ react_1.default.createElement("span", { className: "ml-1" }, invoice === null || invoice === void 0 ? void 0 : invoice.disputeId)),
17
+ react_1.default.createElement("div", { className: "flex-shrink-0" },
18
+ react_1.default.createElement("span", { className: "text-sm font-bold" }, "Invoice #:"),
19
+ react_1.default.createElement("span", { className: "ml-1" }, (_b = invoice === null || invoice === void 0 ? void 0 : invoice.invoice) === null || _b === void 0 ? void 0 : _b.id)),
20
+ !isClient && (react_1.default.createElement("div", { className: "flex-shrink-0" },
21
+ react_1.default.createElement("span", { className: "text-sm font-bold" }, "Client:"),
22
+ react_1.default.createElement("span", { className: "ml-1" }, (_c = invoice === null || invoice === void 0 ? void 0 : invoice.client) === null || _c === void 0 ? void 0 : _c.name))),
14
23
  react_1.default.createElement("div", null,
15
- react_1.default.createElement("span", { className: "text-sm font-bold" }, "Dispute Invoice #: "),
16
- react_1.default.createElement("span", { className: "ml-2" }, (_b = invoice === null || invoice === void 0 ? void 0 : invoice.invoice) === null || _b === void 0 ? void 0 : _b.id)),
17
- !isClient && (react_1.default.createElement("div", null,
18
- react_1.default.createElement("span", { className: "text-sm font-bold" }, "Client: "),
19
- react_1.default.createElement("span", { className: "ml-2" }, (_c = invoice === null || invoice === void 0 ? void 0 : invoice.client) === null || _c === void 0 ? void 0 : _c.name))),
20
- react_1.default.createElement("div", null,
21
- react_1.default.createElement("span", { className: "text-sm font-bold" }, "Amount: "),
22
- react_1.default.createElement("span", { className: "ml-2" },
24
+ react_1.default.createElement("span", { className: "text-sm font-bold" }, "Amount:"),
25
+ react_1.default.createElement("span", { className: "ml-1" },
23
26
  "$",
24
27
  disputeAmount)),
25
28
  react_1.default.createElement("div", null,
26
- react_1.default.createElement("span", { className: "text-sm font-bold" }, "Dispute Date: "),
27
- react_1.default.createElement("span", { className: "ml-2" }, (0, dayjs_1.default)(invoice === null || invoice === void 0 ? void 0 : invoice.disputeDate).format('MMM D, YYYY'))),
29
+ react_1.default.createElement("span", { className: "text-sm font-bold" }, "Date:"),
30
+ react_1.default.createElement("span", { className: "ml-1" }, (0, dayjs_1.default)(invoice === null || invoice === void 0 ? void 0 : invoice.disputeDate).format('MMM D, YYYY'))),
28
31
  react_1.default.createElement("div", null,
29
- react_1.default.createElement("span", { className: "text-sm font-bold" }, "Invoice Date: "),
30
- react_1.default.createElement("span", { className: "ml-2" }, (0, dayjs_1.default)((_d = invoice === null || invoice === void 0 ? void 0 : invoice.invoice) === null || _d === void 0 ? void 0 : _d.dateGenerated).format('MMM D, YYYY'))),
32
+ react_1.default.createElement("span", { className: "text-sm font-bold" }, "Invoice Date:"),
33
+ react_1.default.createElement("span", { className: "ml-1" }, (0, dayjs_1.default)((_d = invoice === null || invoice === void 0 ? void 0 : invoice.invoice) === null || _d === void 0 ? void 0 : _d.dateGenerated).format('MMM D, YYYY'))),
31
34
  react_1.default.createElement("div", null,
32
- react_1.default.createElement("span", { className: "text-sm font-bold" }, "Dispute Status: "),
33
- react_1.default.createElement("span", { className: "ml-2" }, (invoice === null || invoice === void 0 ? void 0 : invoice.status) === "InProgress" ? "In Progress" : invoice === null || invoice === void 0 ? void 0 : invoice.status)),
35
+ react_1.default.createElement("span", { className: "text-sm font-bold" }, "Status:"),
36
+ react_1.default.createElement("span", { className: "ml-1" }, (invoice === null || invoice === void 0 ? void 0 : invoice.status) === "InProgress" ? "In Progress" : invoice === null || invoice === void 0 ? void 0 : invoice.status)),
34
37
  (invoice === null || invoice === void 0 ? void 0 : invoice.approvedAmount) >= 0 && (invoice === null || invoice === void 0 ? void 0 : invoice.status) === 'Resolved' && (react_1.default.createElement("div", null,
35
- react_1.default.createElement("span", { className: "text-sm font-bold" }, "Approved Amount: "),
36
- react_1.default.createElement("span", { className: "ml-2" },
38
+ react_1.default.createElement("span", { className: "text-sm font-bold" }, "Approved Amount:"),
39
+ react_1.default.createElement("span", { className: "ml-1" },
37
40
  "$", invoice === null || invoice === void 0 ? void 0 :
38
41
  invoice.approvedAmount))),
39
42
  !isInternal && (react_1.default.createElement("div", null,
40
43
  react_1.default.createElement("span", { className: "text-sm font-bold" }, "Expert Name: "),
41
- react_1.default.createElement("span", { className: "ml-2" }, (_e = invoice === null || invoice === void 0 ? void 0 : invoice.freelancer) === null || _e === void 0 ? void 0 :
44
+ react_1.default.createElement("span", { className: "ml-1" }, (_e = invoice === null || invoice === void 0 ? void 0 : invoice.freelancer) === null || _e === void 0 ? void 0 :
42
45
  _e.firstName,
43
46
  " ", (_f = invoice === null || invoice === void 0 ? void 0 : invoice.freelancer) === null || _f === void 0 ? void 0 :
44
47
  _f.lastName))))));
@@ -69,12 +69,9 @@ const ProjectHoursAdjustmentModal = ({ isOpen, onClose, disputeProjects, dispute
69
69
  setLoading(true);
70
70
  try {
71
71
  if ((_a = invoiceSummary === null || invoiceSummary === void 0 ? void 0 : invoiceSummary.getClientInvoiceSummaryByMonth) === null || _a === void 0 ? void 0 : _a.projects) {
72
- // Group tasks by project based on disputeProjects
73
72
  const projectSectionsData = [];
74
73
  disputeProjects.forEach(disputeProject => {
75
- // Find matching project in invoice summary
76
74
  const invoiceProject = invoiceSummary.getClientInvoiceSummaryByMonth.projects.find((proj) => {
77
- // Match by project name since we don't have direct projectId mapping
78
75
  return proj.projectName === disputeProject.project.name;
79
76
  });
80
77
  if (invoiceProject) {
@@ -90,14 +87,23 @@ const ProjectHoursAdjustmentModal = ({ isOpen, onClose, disputeProjects, dispute
90
87
  }
91
88
  });
92
89
  setProjectSections(projectSectionsData);
93
- // Initialize adjusted hours for all tasks
94
90
  const initialAdjustedHours = {};
95
91
  projectSectionsData.forEach(section => {
96
92
  section.tasks.forEach(task => {
97
- initialAdjustedHours[task.projectHourId] = {
98
- originalHours: parseFloat(task.hours.toFixed(2)),
99
- newHours: parseFloat(task.hours.toFixed(2))
100
- };
93
+ if (section.disputeType !== 'Hourly') {
94
+ initialAdjustedHours[task.projectHourId] = {
95
+ originalAmount: parseFloat((task.hours * task.rate).toFixed(2)),
96
+ newAmount: parseFloat((task.hours * task.rate).toFixed(2)),
97
+ originalHours: parseFloat(task.hours.toFixed(2)),
98
+ newHours: parseFloat(task.hours.toFixed(2))
99
+ };
100
+ }
101
+ else {
102
+ initialAdjustedHours[task.projectHourId] = {
103
+ originalHours: parseFloat(task.hours.toFixed(2)),
104
+ newHours: parseFloat(task.hours.toFixed(2))
105
+ };
106
+ }
101
107
  });
102
108
  });
103
109
  setAdjustedHours(initialAdjustedHours);
@@ -118,9 +124,7 @@ const ProjectHoursAdjustmentModal = ({ isOpen, onClose, disputeProjects, dispute
118
124
  const numericValue = parseFloat(newHours);
119
125
  const originalHours = ((_a = adjustedHours[projectHourId]) === null || _a === void 0 ? void 0 : _a.originalHours) || 0;
120
126
  setAdjustedHours(prev => (Object.assign(Object.assign({}, prev), { [projectHourId]: Object.assign(Object.assign({}, prev[projectHourId]), { newHours: numericValue }) })));
121
- // Clear individual hour error
122
127
  setErrors(prev => (Object.assign(Object.assign({}, prev), { [projectHourId]: '' })));
123
- // Validate individual hour
124
128
  if (numericValue > originalHours) {
125
129
  setErrors(prev => (Object.assign(Object.assign({}, prev), { [projectHourId]: 'New hours cannot exceed original hours' })));
126
130
  }
@@ -128,15 +132,28 @@ const ProjectHoursAdjustmentModal = ({ isOpen, onClose, disputeProjects, dispute
128
132
  setErrors(prev => (Object.assign(Object.assign({}, prev), { [projectHourId]: 'Hours cannot be negative' })));
129
133
  }
130
134
  };
135
+ const handleAmountChange = (projectHourId, newAmount) => {
136
+ var _a;
137
+ const numericValue = parseFloat(newAmount);
138
+ const originalAmount = ((_a = adjustedHours[projectHourId]) === null || _a === void 0 ? void 0 : _a.originalAmount) || 0;
139
+ setAdjustedHours(prev => (Object.assign(Object.assign({}, prev), { [projectHourId]: Object.assign(Object.assign({}, prev[projectHourId]), { newAmount: numericValue }) })));
140
+ setErrors(prev => (Object.assign(Object.assign({}, prev), { [projectHourId]: '' })));
141
+ if (numericValue > originalAmount) {
142
+ setErrors(prev => (Object.assign(Object.assign({}, prev), { [projectHourId]: 'New Dispute Amount cannot exceed original Amount' })));
143
+ }
144
+ else if (numericValue < 0) {
145
+ setErrors(prev => (Object.assign(Object.assign({}, prev), { [projectHourId]: 'Dispute Amount cannot be negative' })));
146
+ }
147
+ };
131
148
  const getProjectTotalHours = (projectId, type) => {
132
149
  const section = projectSections.find(s => s.projectId === projectId);
133
150
  if (!section)
134
151
  return 0;
135
152
  return section.tasks.reduce((total, task) => {
136
153
  const adjustment = adjustedHours[task.projectHourId];
137
- if (!adjustment || isNaN(adjustment.newHours))
154
+ if (!adjustment)
138
155
  return total;
139
- return total + (type === 'original' ? adjustment.originalHours : adjustment.newHours);
156
+ return total + (type === 'original' ? adjustment.originalHours || 0 : adjustment.newHours || 0);
140
157
  }, 0);
141
158
  };
142
159
  const getProjectTotalAmount = (projectId, type) => {
@@ -147,8 +164,8 @@ const ProjectHoursAdjustmentModal = ({ isOpen, onClose, disputeProjects, dispute
147
164
  const adjustment = adjustedHours[task.projectHourId];
148
165
  if (!adjustment)
149
166
  return total;
150
- const hours = type === 'original' ? adjustment.originalHours : adjustment.newHours;
151
- return total + (hours * task.rate); // Calculate amount based on hours * rate
167
+ const newAmount = type === 'original' ? adjustment.originalAmount || 0 : adjustment.newAmount || 0;
168
+ return total + newAmount; // Calculate amount based on hours * rate
152
169
  }, 0);
153
170
  };
154
171
  const getProjectReduction = (projectId) => {
@@ -167,32 +184,37 @@ const ProjectHoursAdjustmentModal = ({ isOpen, onClose, disputeProjects, dispute
167
184
  let hasErrors = false;
168
185
  const newErrors = {};
169
186
  const newProjectErrors = {};
170
- // Validate each project section
171
187
  projectSections.forEach(section => {
172
188
  const projectId = section.projectId;
173
- const disputeHours = section.disputeHours;
174
- // Use project-specific approved hours if available, otherwise use dispute hours
175
189
  const maxAllowedReduction = projectApprovedHours[projectId] !== undefined
176
190
  ? projectApprovedHours[projectId]
177
191
  : section.disputeType === 'Hourly'
178
192
  ? section.disputeHours
179
193
  : section.disputeAmount;
180
- // Validate individual hours within this project
181
194
  section.tasks.forEach(task => {
182
- var _a, _b;
195
+ var _a, _b, _c, _d;
183
196
  const projectHourId = task.projectHourId;
184
197
  const originalHours = ((_a = adjustedHours[projectHourId]) === null || _a === void 0 ? void 0 : _a.originalHours) || 0;
185
198
  const newHours = (_b = adjustedHours[projectHourId]) === null || _b === void 0 ? void 0 : _b.newHours;
186
- if (newHours > originalHours) {
199
+ const newAmount = (_c = adjustedHours[projectHourId]) === null || _c === void 0 ? void 0 : _c.newAmount;
200
+ const originalAmount = ((_d = adjustedHours[projectHourId]) === null || _d === void 0 ? void 0 : _d.originalAmount) || 0;
201
+ if (newHours && newHours > originalHours) {
187
202
  newErrors[projectHourId] = 'New hours cannot exceed original hours';
188
203
  hasErrors = true;
189
204
  }
190
- else if (newHours < 0) {
205
+ else if (newHours && newHours < 0) {
191
206
  newErrors[projectHourId] = 'Hours cannot be negative';
192
207
  hasErrors = true;
193
208
  }
209
+ else if (newAmount && newAmount < 0) {
210
+ newErrors[projectHourId] = 'Dispute Amount cannot be negative';
211
+ hasErrors = true;
212
+ }
213
+ else if (newAmount && newAmount > originalAmount) {
214
+ newErrors[projectHourId] = 'New Dispute Amount cannot exceed original Amount';
215
+ hasErrors = true;
216
+ }
194
217
  });
195
- // Validate project-level hour reduction
196
218
  const projectReduction = getProjectReduction(projectId);
197
219
  if (Math.abs(projectReduction - maxAllowedReduction) > 0.01) {
198
220
  const reductionType = projectApprovedHours[projectId] !== undefined ? 'approved' : 'disputed';
@@ -204,44 +226,34 @@ const ProjectHoursAdjustmentModal = ({ isOpen, onClose, disputeProjects, dispute
204
226
  setErrors(newErrors);
205
227
  setProjectErrors(newProjectErrors);
206
228
  if (!hasErrors) {
207
- // Generate the submission data in the required format
208
229
  let freelancerRate = 0;
209
230
  const inputArray = [];
210
231
  projectSections.forEach(section => {
211
232
  section.tasks.forEach(task => {
212
233
  const projectHourId = task.projectHourId;
213
234
  const adjustedHour = adjustedHours[projectHourId];
235
+ const newHours = adjustedHour === null || adjustedHour === void 0 ? void 0 : adjustedHour.newHours;
214
236
  freelancerRate = task.freelancerRate;
215
- // Calculate hours based on dispute type
216
- let calculatedHours = (adjustedHour === null || adjustedHour === void 0 ? void 0 : adjustedHour.newHours) || 0;
237
+ let calculatedHours = newHours || 0;
217
238
  if (section.disputeType !== 'Hourly') {
218
- // For non-hourly projects, calculate hour equivalent based on approved dispute amount ratio
219
239
  const approvedDisputeAmount = projectApprovedHours[section.projectId] !== undefined
220
240
  ? projectApprovedHours[section.projectId]
221
241
  : section.disputeAmount;
222
242
  const totalProjectAmount = section.totalProjectAmount;
223
243
  if (totalProjectAmount > 0) {
224
- // Calculate the ratio of approved dispute amount to total project amount
225
244
  const disputeRatio = approvedDisputeAmount / totalProjectAmount;
226
- // Apply this ratio to the original hours for this task
227
245
  const originalTaskHours = (adjustedHour === null || adjustedHour === void 0 ? void 0 : adjustedHour.originalHours) || 0;
228
- // The reduction in hours should be proportional to the dispute ratio
229
246
  const hourReduction = originalTaskHours * disputeRatio;
230
247
  calculatedHours = originalTaskHours - hourReduction;
231
- // Ensure hours don't go negative
232
- calculatedHours = Math.max(0, calculatedHours);
248
+ calculatedHours = Number(Math.max(0, calculatedHours).toFixed(4));
233
249
  }
234
250
  }
235
- // Generate expert name
236
- const expertName = (dispute === null || dispute === void 0 ? void 0 : dispute.freelancer) ?
237
- `${dispute.freelancer.firstName} ${dispute.freelancer.lastName}` : '';
238
- // Generate internal user name
239
- const internalUser = user ?
240
- `${user.firstName} ${user.lastName}` : '';
251
+ const expertName = (dispute === null || dispute === void 0 ? void 0 : dispute.freelancer) ? `${dispute.freelancer.firstName} ${dispute.freelancer.lastName}` : '';
252
+ const internalUser = user ? `${user.firstName} ${user.lastName}` : '';
241
253
  inputArray.push({
242
254
  clientRate: task.rate,
243
255
  freelancerRate: task.freelancerRate,
244
- hours: parseFloat(calculatedHours.toFixed(2)),
256
+ hours: calculatedHours,
245
257
  projectId: section.projectId,
246
258
  projectHourId: task.projectHourId,
247
259
  projectName: section.projectName,
@@ -359,26 +371,24 @@ const ProjectHoursAdjustmentModal = ({ isOpen, onClose, disputeProjects, dispute
359
371
  react_1.default.createElement("th", { className: "border border-gray-300 px-4 py-2 text-left" }, section.disputeType === 'Hourly' ? 'Original Hours' : 'Original Dispute $'),
360
372
  react_1.default.createElement("th", { className: "border border-gray-300 px-4 py-2 text-left" }, section.disputeType === 'Hourly' ? 'Adjusted Hours' : 'Adjusted $ Amount'))),
361
373
  react_1.default.createElement("tbody", null, section.tasks.map((task) => {
362
- var _a, _b;
374
+ var _a, _b, _c;
363
375
  const projectHourId = task.projectHourId;
364
376
  const originalHours = task.hours;
365
377
  const originalAmount = task.hours * task.rate;
366
378
  const newHours = (_a = adjustedHours[projectHourId]) === null || _a === void 0 ? void 0 : _a.newHours;
367
- const newAmount = newHours * task.rate;
379
+ const newAmount = (_b = adjustedHours[projectHourId]) === null || _b === void 0 ? void 0 : _b.newAmount;
368
380
  const hasError = errors[projectHourId];
369
381
  return (react_1.default.createElement("tr", { key: projectHourId, className: hasError ? 'bg-red-50' : '' },
370
382
  react_1.default.createElement("td", { className: "border border-gray-300 px-4 py-2" }, formatDate(task.date)),
371
383
  react_1.default.createElement("td", { className: "border border-gray-300 px-4 py-2" }, task.description),
372
384
  react_1.default.createElement("td", { className: "border border-gray-300 px-4 py-2" }, section.disputeType === 'Hourly'
373
385
  ? originalHours.toFixed(2)
374
- : `$${((_b = section.disputeAmount) === null || _b === void 0 ? void 0 : _b.toFixed(2)) || '0.00'}`),
386
+ : `$${((_c = section.disputeAmount) === null || _c === void 0 ? void 0 : _c.toFixed(2)) || '0.00'}`),
375
387
  react_1.default.createElement("td", { className: "border border-gray-300 px-4 py-2" },
376
388
  react_1.default.createElement("div", null,
377
- section.disputeType === 'Hourly' ? (react_1.default.createElement("input", { type: "number", step: "0.01", max: originalHours, value: newHours >= 0 ? newHours : '', onChange: (e) => handleHourChange(projectHourId, e.target.value), className: `w-full px-2 py-1 border rounded focus:outline-none focus:ring-2 focus:ring-blue-500 ${hasError ? 'border-red-500' : 'border-gray-300'}` })) : (react_1.default.createElement("div", { className: "flex items-center" },
389
+ section.disputeType === 'Hourly' ? (react_1.default.createElement("input", { type: "number", step: "1", max: originalHours, value: newHours !== undefined && newHours >= 0 ? newHours : '', onChange: (e) => handleHourChange(projectHourId, e.target.value), className: `w-full px-2 py-1 border rounded focus:outline-none focus:ring-2 focus:ring-blue-500 ${hasError ? 'border-red-500' : 'border-gray-300'}` })) : (react_1.default.createElement("div", { className: "flex items-center" },
378
390
  react_1.default.createElement("span", { className: "mr-1" }, "$"),
379
- react_1.default.createElement("input", { type: "number", step: "0.01", min: "0", max: originalAmount, value: newAmount >= 0 ? newAmount : '', onChange: (e) => handleHourChange(projectHourId, (parseFloat(e.target.value) / task.rate).toString()), className: `w-32 px-2 py-1 border rounded focus:outline-none focus:ring-2 focus:ring-blue-500 ${hasError ? 'border-red-500' : 'border-gray-300'}`, placeholder: "$0.00" }),
380
- react_1.default.createElement("span", { className: "ml-2" }, newHours.toFixed(2)),
381
- react_1.default.createElement("span", { className: "ml-1 text-xs text-gray-500" }, "hrs"))),
391
+ react_1.default.createElement("input", { type: "number", step: "1", min: "0", max: originalAmount, value: newAmount !== undefined && newAmount >= 0 ? newAmount : '', onChange: (e) => handleAmountChange(projectHourId, (e.target.value).toString()), className: `w-32 px-2 py-1 border rounded focus:outline-none focus:ring-2 focus:ring-blue-500 ${hasError ? 'border-red-500' : 'border-gray-300'}`, placeholder: "$0.00" }))),
382
392
  hasError && (react_1.default.createElement("div", { className: "text-red-500 text-xs mt-1" }, hasError))))));
383
393
  }))))));
384
394
  })),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paro.io/expert-shared-components",
3
- "version": "1.12.21",
3
+ "version": "1.12.22",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {