df-ae-forms-package 1.1.13 → 1.1.15
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.
- package/dist/index.esm.js +50 -14
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +50 -14
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.esm.js
CHANGED
|
@@ -327,6 +327,22 @@ var EIssueStatus;
|
|
|
327
327
|
EIssueStatus["REJECTED"] = "Rejected";
|
|
328
328
|
EIssueStatus["RESOLVE"] = "Resolve";
|
|
329
329
|
})(EIssueStatus || (EIssueStatus = {}));
|
|
330
|
+
const normalizeIssueStatus = (issueStatus) => {
|
|
331
|
+
const normalizedValue = String(issueStatus || '').trim().toLowerCase().replace(/[\s_-]+/g, '');
|
|
332
|
+
if (normalizedValue === 'open') {
|
|
333
|
+
return EIssueStatus.OPEN;
|
|
334
|
+
}
|
|
335
|
+
if (normalizedValue === 'inprogress') {
|
|
336
|
+
return EIssueStatus.IN_PROGRESS;
|
|
337
|
+
}
|
|
338
|
+
if (normalizedValue === 'reject' || normalizedValue === 'rejected') {
|
|
339
|
+
return EIssueStatus.REJECTED;
|
|
340
|
+
}
|
|
341
|
+
if (normalizedValue === 'resolve' || normalizedValue === 'resolved') {
|
|
342
|
+
return EIssueStatus.RESOLVE;
|
|
343
|
+
}
|
|
344
|
+
return EIssueStatus.OPEN;
|
|
345
|
+
};
|
|
330
346
|
const RaiseIssueModal = ({ isOpen, onClose, onSuccess, component, formTemplateId, notes = '', attachments = null, issue = null, onCreateIssue, onUpdateIssue, user, availableUsers = [
|
|
331
347
|
'Priya Das',
|
|
332
348
|
'Maria Garcia',
|
|
@@ -349,6 +365,7 @@ const RaiseIssueModal = ({ isOpen, onClose, onSuccess, component, formTemplateId
|
|
|
349
365
|
const [localAttachments, setLocalAttachments] = useState(attachments || []);
|
|
350
366
|
const [isDragging, setIsDragging] = useState(false);
|
|
351
367
|
const [isViewMode, setIsViewMode] = useState(!!issue && !inEditMode);
|
|
368
|
+
const [previewImage, setPreviewImage] = useState(null);
|
|
352
369
|
const fileInputRef = React.useRef(null);
|
|
353
370
|
const isEditMode = isEdit !== undefined ? isEdit : !!issue;
|
|
354
371
|
useEffect(() => {
|
|
@@ -420,8 +437,9 @@ const RaiseIssueModal = ({ isOpen, onClose, onSuccess, component, formTemplateId
|
|
|
420
437
|
const getAttachmentPreview = (file) => {
|
|
421
438
|
if (!file)
|
|
422
439
|
return null;
|
|
423
|
-
const
|
|
424
|
-
const
|
|
440
|
+
const name = file.fileName || file.name || file.filename || '';
|
|
441
|
+
const isImage = (n) => /\.(jpg|jpeg|png|gif|webp)$/i.test(n || '');
|
|
442
|
+
const isDataUrlImage = (data) => typeof data === 'string' && data.startsWith('data:image');
|
|
425
443
|
if (file instanceof File) {
|
|
426
444
|
if (file.type.startsWith('image/')) {
|
|
427
445
|
return URL.createObjectURL(file);
|
|
@@ -432,12 +450,28 @@ const RaiseIssueModal = ({ isOpen, onClose, onSuccess, component, formTemplateId
|
|
|
432
450
|
if (isDataUrlImage(file) || isImage(file)) {
|
|
433
451
|
return file;
|
|
434
452
|
}
|
|
453
|
+
if (/^[a-zA-Z0-9+/]+={0,2}$/.test(file) && (file.length > 100)) {
|
|
454
|
+
return `data:image/jpeg;base64,${file}`;
|
|
455
|
+
}
|
|
435
456
|
return null;
|
|
436
457
|
}
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
458
|
+
let mimeType = 'image/jpeg';
|
|
459
|
+
if (name.toLowerCase().endsWith('.png'))
|
|
460
|
+
mimeType = 'image/png';
|
|
461
|
+
if (file.data) {
|
|
462
|
+
if (isDataUrlImage(file.data))
|
|
463
|
+
return file.data;
|
|
464
|
+
if (!file.data.startsWith('data:')) {
|
|
465
|
+
return `data:${mimeType};base64,${file.data}`;
|
|
466
|
+
}
|
|
440
467
|
return file.data;
|
|
468
|
+
}
|
|
469
|
+
if (file.base64) {
|
|
470
|
+
return `data:${mimeType};base64,${file.base64}`;
|
|
471
|
+
}
|
|
472
|
+
if (file.uri) {
|
|
473
|
+
return file.uri;
|
|
474
|
+
}
|
|
441
475
|
return null;
|
|
442
476
|
};
|
|
443
477
|
useEffect(() => {
|
|
@@ -449,13 +483,7 @@ const RaiseIssueModal = ({ isOpen, onClose, onSuccess, component, formTemplateId
|
|
|
449
483
|
setWorkOrderNumber(issue?.workOrderNumber || initialWorkOrderNumber || '');
|
|
450
484
|
setAssetNumber(issue?.assetNumber || initialAssetNumber || '');
|
|
451
485
|
setPriority(issue?.priority || 'Medium');
|
|
452
|
-
|
|
453
|
-
const issueStatus = issue?.status || EIssueStatus.OPEN;
|
|
454
|
-
// Normalize to enum values if needed (handle legacy values)
|
|
455
|
-
const normalizedStatus = issueStatus === EIssueStatus.OPEN || issueStatus === EIssueStatus.IN_PROGRESS || issueStatus === EIssueStatus.REJECTED || issueStatus === EIssueStatus.RESOLVE
|
|
456
|
-
? issueStatus
|
|
457
|
-
: EIssueStatus.OPEN;
|
|
458
|
-
setStatus(normalizedStatus);
|
|
486
|
+
setStatus(normalizeIssueStatus(issue?.status || EIssueStatus.OPEN));
|
|
459
487
|
// Correctly map assignTo or fallback to assignee
|
|
460
488
|
setAssignee(issue?.assignTo || '');
|
|
461
489
|
setComments(issue?.comments || '');
|
|
@@ -673,6 +701,9 @@ const RaiseIssueModal = ({ isOpen, onClose, onSuccess, component, formTemplateId
|
|
|
673
701
|
if (!isOpen) {
|
|
674
702
|
return null;
|
|
675
703
|
}
|
|
704
|
+
const normalizedWorkflowStatus = normalizeIssueStatus(status);
|
|
705
|
+
const showAcceptRejectActions = isEditMode && !!issue && normalizedWorkflowStatus === EIssueStatus.OPEN;
|
|
706
|
+
const showResolveAction = isEditMode && !!issue && normalizedWorkflowStatus === EIssueStatus.IN_PROGRESS;
|
|
676
707
|
const modalContent = (jsx("div", { className: "raise-issue-modal-overlay", onClick: onClose, children: jsxs("div", { className: "raise-issue-modal", onClick: (e) => e.stopPropagation(), children: [jsxs("div", { className: "raise-issue-modal-header", children: [jsxs("div", { className: "raise-issue-modal-header-left", children: [jsx(AlertTriangle, { className: "raise-issue-modal-icon", size: 20 }), jsx("div", { className: "raise-issue-modal-header-text", children: jsx("div", { className: "raise-issue-modal-title-main", children: isEditMode ? 'Issue Details' : 'Create Issue' }) })] }), jsx("button", { className: "raise-issue-modal-close", onClick: onClose, "aria-label": "Close", children: jsx(X$1, { size: 18 }) })] }), jsx("div", { className: "raise-issue-modal-content", children: jsxs("div", { className: "raise-issue-fields-grid", children: [isEditMode && issue?.issueNumber && (jsxs("div", { className: "raise-issue-field", children: [jsx("label", { className: "raise-issue-field-label", children: "Issue ID" }), jsx("input", { type: "text", className: "raise-issue-field-input raise-issue-field-readonly", value: issue.issueNumber, readOnly: true })] })), jsxs("div", { className: "raise-issue-field", children: [jsx("label", { className: "raise-issue-field-label", children: "Task" }), jsx("input", { type: "text", className: "raise-issue-field-input raise-issue-field-readonly", value: isEditMode ? (issue?.component?.basic?.label || '') : (component?.basic?.label || ''), readOnly: true })] }), jsxs("div", { className: "raise-issue-field", children: [jsx("label", { className: "raise-issue-field-label", children: "Task Value" }), jsx("input", { type: "text", className: "raise-issue-field-input raise-issue-field-readonly", value: isEditMode ? (issue?.component?.basic?.value || '') : (component?.basic?.value || ''), readOnly: true })] }), jsxs("div", { className: "raise-issue-field", children: [jsxs("label", { className: "raise-issue-field-label", children: ["Title ", jsx("span", { className: "raise-issue-required", children: "*" })] }), jsx("input", { type: "text", className: `raise-issue-field-input ${isEditMode ? 'raise-issue-field-readonly' : ''}`, value: title, onChange: (e) => setTitle(e.target.value), placeholder: "Enter issue title", readOnly: isEditMode && isViewMode })] }), !isStandalone && (jsxs("div", { className: "raise-issue-field", children: [jsxs("label", { className: "raise-issue-field-label", children: ["Work Order ", jsx("span", { className: "raise-issue-required", children: "*" })] }), jsx("input", { type: "text", className: `raise-issue-field-input ${isEditMode ? 'raise-issue-field-readonly' : ''}`, value: workOrderNumber, onChange: (e) => setWorkOrderNumber(e.target.value), placeholder: "N/A", readOnly: isEditMode && isViewMode })] })), !isStandalone && (jsxs("div", { className: "raise-issue-field", children: [jsxs("label", { className: "raise-issue-field-label", children: ["Asset Number ", jsx("span", { className: "raise-issue-required", children: "*" })] }), jsx("input", { type: "text", className: `raise-issue-field-input ${isEditMode ? 'raise-issue-field-readonly' : ''}`, value: assetNumber, onChange: (e) => setAssetNumber(e.target.value), placeholder: "Enter asset number", readOnly: isEditMode && isViewMode })] })), jsxs("div", { className: "raise-issue-field", children: [jsxs("label", { className: "raise-issue-field-label", children: ["Raised By ", jsx("span", { className: "raise-issue-required", children: "*" })] }), jsxs("div", { className: "raise-issue-field-value-with-icon", children: [jsx(User, { size: 16 }), jsx("span", { children: user ? `${user.firstName || ''} ${user.lastName || ''}`.trim() || 'User' : 'User' })] })] }), jsxs("div", { className: "raise-issue-field", children: [jsx("label", { className: "raise-issue-field-label", children: "Created On" }), jsxs("div", { className: "raise-issue-field-value-with-icon", children: [jsx(Calendar, { size: 16 }), jsx("span", { children: isEditMode && issue?.createdAt
|
|
677
708
|
? (safeDate(issue.createdAt) || new Date()).toLocaleString('en-US', {
|
|
678
709
|
year: 'numeric',
|
|
@@ -689,9 +720,14 @@ const RaiseIssueModal = ({ isOpen, onClose, onSuccess, component, formTemplateId
|
|
|
689
720
|
hour: '2-digit',
|
|
690
721
|
minute: '2-digit',
|
|
691
722
|
hour12: true
|
|
692
|
-
}) })] })] }), jsxs("div", { className: "raise-issue-field raise-issue-field-full-width", children: [jsxs("label", { className: "raise-issue-field-label", children: ["Description ", jsx("span", { className: "raise-issue-required", children: "*" })] }), jsx("textarea", { className: `raise-issue-field-textarea ${isEditMode ? 'raise-issue-field-readonly' : ''}`, value: description, onChange: (e) => setDescription(e.target.value), placeholder: "Enter issue description", rows: 4, readOnly: isEditMode && isViewMode })] }), jsxs("div", { className: "raise-issue-field", children: [jsxs("label", { className: "raise-issue-field-label", children: ["Status ", jsx("span", { className: "raise-issue-required", children: "*" })] }), jsx("input", { type: "text", className: "raise-issue-field-input raise-issue-field-readonly", value: status, readOnly: true })] }), jsxs("div", { className: "raise-issue-field", children: [jsxs("label", { className: "raise-issue-field-label", children: ["Assign to ", jsx("span", { className: "raise-issue-required", children: "*" })] }), jsxs("select", { className: "raise-issue-field-select", value: assignee, onChange: (e) => setAssignee(e.target.value), disabled: isEditMode && isViewMode, children: [jsx("option", { value: "", children: "Unassigned" }), availableUsers.map(userName => (jsx("option", { value: userName, children: userName }, userName)))] })] }), jsxs("div", { className: "raise-issue-field raise-issue-field-full-width", children: [jsxs("label", { className: "raise-issue-field-label", children: ["Priority ", jsx("span", { className: "raise-issue-required", children: "*" })] }), jsxs("div", { className: "raise-issue-priority-buttons", children: [jsx("button", { type: "button", className: `priority-button priority-low ${priority === 'Low' ? 'active' : ''}`, onClick: () => setPriority('Low'), disabled: isEditMode && isViewMode, children: "Low" }), jsx("button", { type: "button", className: `priority-button priority-medium ${priority === 'Medium' ? 'active' : ''}`, onClick: () => setPriority('Medium'), disabled: isEditMode && isViewMode, children: "Medium" }), jsx("button", { type: "button", className: `priority-button priority-high ${priority === 'High' ? 'active' : ''}`, onClick: () => setPriority('High'), disabled: isEditMode && isViewMode, children: "High" })] })] }), jsxs("div", { className: "raise-issue-field raise-issue-field-full-width", children: [jsxs("label", { className: "raise-issue-field-label-with-icon", children: [jsx(MessageSquare, { size: 16 }), jsx("span", { children: "Comments" })] }), !comments && (jsx("div", { className: "raise-issue-no-comments", children: "No comments yet" })), jsx("textarea", { className: `raise-issue-field-textarea raise-issue-comments-textarea ${isEditMode ? 'raise-issue-field-readonly' : ''}`, value: comments, onChange: (e) => setComments(e.target.value), placeholder: "Add a comment...", rows: 4, readOnly: isEditMode })] }), jsxs("div", { className: "raise-issue-field raise-issue-field-full-width", style: { marginTop: '1rem' }, children: [jsx("label", { className: "raise-issue-field-label", children: "Attachments" }), jsxs("div", { className: "raise-issue-attachments-container", children: [!isEditMode && (jsxs("div", { className: `raise-issue-dropzone ${isDragging ? 'dragging' : ''}`, onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, onClick: () => fileInputRef.current?.click(), children: [jsx("input", { type: "file", ref: fileInputRef, style: { display: 'none' }, onChange: handleFileChange, multiple: true }), jsx("div", { className: "raise-issue-dropzone-icon", children: jsx(UploadCloud, { size: 24 }) }), jsx("div", { className: "raise-issue-dropzone-text", children: "Click to upload or drag and drop" }), jsx("div", { className: "raise-issue-dropzone-hint", children: "PNG, JPG up to 10MB" })] })), localAttachments.length > 0 && (jsx("div", { className: "raise-issue-attachments-list", children: localAttachments.map((file, index) => (jsxs("div", { className: "raise-issue-attachment-item", children: [jsx("div", { className: "raise-issue-attachment-thumbnail",
|
|
723
|
+
}) })] })] }), jsxs("div", { className: "raise-issue-field raise-issue-field-full-width", children: [jsxs("label", { className: "raise-issue-field-label", children: ["Description ", jsx("span", { className: "raise-issue-required", children: "*" })] }), jsx("textarea", { className: `raise-issue-field-textarea ${isEditMode ? 'raise-issue-field-readonly' : ''}`, value: description, onChange: (e) => setDescription(e.target.value), placeholder: "Enter issue description", rows: 4, readOnly: isEditMode && isViewMode })] }), jsxs("div", { className: "raise-issue-field", children: [jsxs("label", { className: "raise-issue-field-label", children: ["Status ", jsx("span", { className: "raise-issue-required", children: "*" })] }), jsx("input", { type: "text", className: "raise-issue-field-input raise-issue-field-readonly", value: status, readOnly: true })] }), jsxs("div", { className: "raise-issue-field", children: [jsxs("label", { className: "raise-issue-field-label", children: ["Assign to ", jsx("span", { className: "raise-issue-required", children: "*" })] }), jsxs("select", { className: "raise-issue-field-select", value: assignee, onChange: (e) => setAssignee(e.target.value), disabled: isEditMode && isViewMode, children: [jsx("option", { value: "", children: "Unassigned" }), availableUsers.map(userName => (jsx("option", { value: userName, children: userName }, userName)))] })] }), jsxs("div", { className: "raise-issue-field raise-issue-field-full-width", children: [jsxs("label", { className: "raise-issue-field-label", children: ["Priority ", jsx("span", { className: "raise-issue-required", children: "*" })] }), jsxs("div", { className: "raise-issue-priority-buttons", children: [jsx("button", { type: "button", className: `priority-button priority-low ${priority === 'Low' ? 'active' : ''}`, onClick: () => setPriority('Low'), disabled: isEditMode && isViewMode, children: "Low" }), jsx("button", { type: "button", className: `priority-button priority-medium ${priority === 'Medium' ? 'active' : ''}`, onClick: () => setPriority('Medium'), disabled: isEditMode && isViewMode, children: "Medium" }), jsx("button", { type: "button", className: `priority-button priority-high ${priority === 'High' ? 'active' : ''}`, onClick: () => setPriority('High'), disabled: isEditMode && isViewMode, children: "High" })] })] }), jsxs("div", { className: "raise-issue-field raise-issue-field-full-width", children: [jsxs("label", { className: "raise-issue-field-label-with-icon", children: [jsx(MessageSquare, { size: 16 }), jsx("span", { children: "Comments" })] }), !comments && (jsx("div", { className: "raise-issue-no-comments", children: "No comments yet" })), jsx("textarea", { className: `raise-issue-field-textarea raise-issue-comments-textarea ${isEditMode ? 'raise-issue-field-readonly' : ''}`, value: comments, onChange: (e) => setComments(e.target.value), placeholder: "Add a comment...", rows: 4, readOnly: isEditMode })] }), jsxs("div", { className: "raise-issue-field raise-issue-field-full-width", style: { marginTop: '1rem' }, children: [jsx("label", { className: "raise-issue-field-label", children: "Attachments" }), jsxs("div", { className: "raise-issue-attachments-container", children: [!isEditMode && (jsxs("div", { className: `raise-issue-dropzone ${isDragging ? 'dragging' : ''}`, onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, onClick: () => fileInputRef.current?.click(), children: [jsx("input", { type: "file", ref: fileInputRef, style: { display: 'none' }, onChange: handleFileChange, multiple: true }), jsx("div", { className: "raise-issue-dropzone-icon", children: jsx(UploadCloud, { size: 24 }) }), jsx("div", { className: "raise-issue-dropzone-text", children: "Click to upload or drag and drop" }), jsx("div", { className: "raise-issue-dropzone-hint", children: "PNG, JPG up to 10MB" })] })), localAttachments.length > 0 && (jsx("div", { className: "raise-issue-attachments-list", children: localAttachments.map((file, index) => (jsxs("div", { className: "raise-issue-attachment-item", children: [jsx("div", { className: "raise-issue-attachment-thumbnail", onClick: () => {
|
|
724
|
+
const preview = getAttachmentPreview(file);
|
|
725
|
+
if (preview)
|
|
726
|
+
setPreviewImage(preview);
|
|
727
|
+
}, style: { cursor: getAttachmentPreview(file) ? 'pointer' : 'default' }, children: getAttachmentPreview(file) ? (jsx("img", { src: getAttachmentPreview(file), alt: "Thumbnail" })) : (jsx(Paperclip, { size: 20, color: "#9ca3af" })) }), jsxs("div", { className: "raise-issue-attachment-info", children: [jsx("span", { className: "attachment-name", title: getAttachmentName(file), children: getAttachmentName(file) }), file instanceof File && (jsxs("span", { className: "attachment-size", children: [(file.size / 1024).toFixed(1), " KB"] }))] }), !isEditMode && (jsx("button", { type: "button", className: "attachment-remove-btn", onClick: () => handleRemoveAttachment(index), title: "Remove", children: jsx(X$1, { size: 12 }) }))] }, index))) }))] })] })] }) }), jsx("div", { className: "raise-issue-modal-actions", children: jsxs("div", { className: "raise-issue-modal-actions-buttons", children: [(showAcceptRejectActions || showResolveAction) && (jsxs(Fragment, { children: [showAcceptRejectActions && (jsx("button", { className: "raise-issue-modal-button raise-issue-modal-button-accept", onClick: handleAccept, disabled: isSubmitting, children: isSubmitting ? 'Processing...' : 'Accept' })), showResolveAction && (jsx("button", { className: "raise-issue-modal-button raise-issue-modal-button-resolve", onClick: handleResolve, disabled: isSubmitting, children: isSubmitting ? 'Processing...' : 'Resolve' })), showAcceptRejectActions && (jsx("button", { className: "raise-issue-modal-button raise-issue-modal-button-reject", onClick: handleReject, disabled: isSubmitting, children: isSubmitting ? 'Processing...' : 'Reject' }))] })), !isEditMode && (jsx("button", { className: `raise-issue-modal-button raise-issue-modal-button-save ${!isFormValid ? 'disabled' : ''}`, onClick: handleSubmit, disabled: isSubmitting || !isFormValid, children: isSubmitting ? 'Creating...' : 'Create Issue' }))] }) })] }) }));
|
|
728
|
+
const previewModal = previewImage ? (jsx("div", { className: "raise-issue-modal-overlay", style: { zIndex: 10000 }, onClick: () => setPreviewImage(null), children: jsxs("div", { className: "raise-issue-preview-container", onClick: (e) => e.stopPropagation(), style: { position: 'relative', maxWidth: '90vw', maxHeight: '90vh' }, children: [jsx("button", { className: "raise-issue-preview-close", onClick: () => setPreviewImage(null), style: { position: 'absolute', top: '-40px', right: '0', background: 'none', border: 'none', cursor: 'pointer' }, children: jsx(X$1, { size: 32, color: "#fff" }) }), jsx("img", { src: previewImage, alt: "Attachment Preview", style: { maxWidth: '100%', maxHeight: '90vh', objectFit: 'contain', borderRadius: '4px' } })] }) })) : null;
|
|
693
729
|
// Render modal using portal to document body for full-page overlay
|
|
694
|
-
return createPortal(modalContent, document.body);
|
|
730
|
+
return createPortal(jsxs(Fragment, { children: [modalContent, previewModal] }), document.body);
|
|
695
731
|
};
|
|
696
732
|
|
|
697
733
|
const ThresholdAlert = ({ component, condition, currentValue, thresholdValue, formTemplateId, workOrderNumber, assetNumber, user, onIssueRaised, isIssueRaised = false, compact = false }) => {
|