pixel-sharan 1.13.83 → 1.13.85

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/lib/index.cjs CHANGED
@@ -40644,252 +40644,275 @@ const ActiveCell = props => {
40644
40644
  const [allOption, setAllOption] = React__namespace.useState();
40645
40645
  const [selectedFiles, setSelectedFiles] = React__namespace.useState([]);
40646
40646
  const handleFilesChange = async (newFiles, selected, actionType) => {
40647
- if (actionType === 'ADD' && cell?.inputType?.type === 'file') {
40648
- // Parse existing cell.value
40649
- let existingFiles = [];
40650
- try {
40651
- if (cell?.value) {
40652
- existingFiles = JSON.parse(cell.value);
40653
- }
40654
- } catch (error) {
40655
- console.error('Error parsing cell.value:', error);
40656
- }
40657
- // Deduplicate within newFiles and against existingFiles
40658
- let duplicateCount = 0;
40659
- const uniqueFiles = newFiles.filter((file, index, self) => {
40660
- const baseName = file.name.split('*')[0];
40661
- // Check for duplicates within newFiles
40662
- const isDuplicateInSelf = self.findIndex(f => f.name.split('*')[0] === baseName) !== index;
40663
- // Check for duplicates in existingFiles
40664
- const isDuplicateInExisting = existingFiles.some(existingFile => existingFile.name.split('*')[0] === baseName);
40665
- if (isDuplicateInSelf || isDuplicateInExisting) {
40666
- duplicateCount++;
40667
- return false;
40668
- }
40669
- return true;
40670
- });
40671
- // Check total file count (existing + new)
40672
- if (existingFiles.length + uniqueFiles.length > 5) {
40673
- toast.info('Cannot upload more than 5 files.');
40674
- return;
40675
- }
40676
- if (props.attachmentAction?.addAttachment && uniqueFiles.length > 0) {
40647
+ try {
40648
+ console.log('newFiles:', newFiles, 'selected:', selected, 'actionType:', actionType);
40649
+ if (actionType === 'ADD' && cell?.inputType?.type === 'file') {
40650
+ // Parse existing cell.value
40651
+ let existingFiles = [];
40677
40652
  try {
40678
- let successCount = 0;
40679
- let failureCount = 0;
40680
- const processedFiles = [...existingFiles];
40681
- // Show duplicate toast if any duplicates were found
40682
- if (duplicateCount > 0) {
40683
- toast.warning('Duplicate attachments not allowed within the same row');
40684
- }
40685
- // Upload files with error handling
40686
- const uploadPromises = uniqueFiles.map(async file => {
40687
- try {
40688
- // Skip files with UUID suffix (already uploaded)
40689
- if (file.name.includes('*')) {
40690
- return {
40691
- file,
40692
- status: 'existing',
40693
- data: {
40694
- name: file.name
40695
- }
40696
- };
40697
- }
40698
- const response = await props?.attachmentAction?.addAttachment(file);
40699
- // Check for invalid response
40700
- if (!response || typeof response === 'string' && response.trim().length === 0) {
40701
- return {
40702
- file,
40703
- status: 'failed',
40704
- reason: 'no response'
40705
- };
40706
- }
40707
- // Handle string responses
40708
- if (typeof response === 'string') {
40709
- try {
40710
- const parsedResponse = JSON.parse(response);
40711
- // Check for response code 400
40712
- if (parsedResponse.responseCode === 400) {
40653
+ if (cell?.value) {
40654
+ existingFiles = JSON.parse(cell.value);
40655
+ }
40656
+ } catch (error) {
40657
+ console.error('Error parsing cell.value:', error);
40658
+ }
40659
+ // Deduplicate within newFiles and against existingFiles
40660
+ let duplicateCount = 0;
40661
+ const uniqueFiles = newFiles.filter((file, index, self) => {
40662
+ const baseName = file.name.split('*')[0];
40663
+ const isDuplicateInSelf = self.findIndex(f => f.name.split('*')[0] === baseName) !== index;
40664
+ const isDuplicateInExisting = existingFiles.some(existingFile => existingFile.name.split('*')[0] === baseName);
40665
+ if (isDuplicateInSelf || isDuplicateInExisting) {
40666
+ duplicateCount++;
40667
+ return false;
40668
+ }
40669
+ return true;
40670
+ });
40671
+ console.log('Unique files after deduplication:', uniqueFiles.map(f => f.name)); //Debug logs
40672
+ // Check total file count
40673
+ if (existingFiles.length + uniqueFiles.length > 5) {
40674
+ toast.info('Cannot upload more than 5 files.');
40675
+ return;
40676
+ }
40677
+ if (props.attachmentAction?.addAttachment && uniqueFiles.length > 0) {
40678
+ try {
40679
+ let successCount = 0;
40680
+ let failureCount = 0;
40681
+ const processedFiles = [...existingFiles];
40682
+ if (duplicateCount > 0) {
40683
+ toast.warning('Duplicate attachments not allowed within the same row');
40684
+ }
40685
+ const uploadPromises = uniqueFiles.map(async file => {
40686
+ try {
40687
+ if (file.name.includes('*')) {
40688
+ console.log(`Skipping ${file.name}: Already uploaded`);
40689
+ return {
40690
+ file,
40691
+ status: 'existing',
40692
+ data: {
40693
+ name: file.name
40694
+ }
40695
+ };
40696
+ }
40697
+ const response = await props?.attachmentAction?.addAttachment(file);
40698
+ console.log(`Raw response for ${file.name}:`, response); // Debug log
40699
+ if (!response || typeof response === 'string' && response.trim().length === 0) {
40700
+ console.log(`No valid response for ${file.name}`);
40701
+ return {
40702
+ file,
40703
+ status: 'failed',
40704
+ reason: 'no response'
40705
+ };
40706
+ }
40707
+ if (typeof response === 'string') {
40708
+ try {
40709
+ const parsedResponse = JSON.parse(response);
40710
+ console.log(`Parsed response for ${file.name}:`, parsedResponse); // Debug log
40711
+ if (parsedResponse.responseCode === 400) {
40712
+ console.log(`Invalid file for ${file.name}: responseCode 400`);
40713
+ return {
40714
+ file,
40715
+ status: 'failed',
40716
+ reason: 'invalid file'
40717
+ };
40718
+ }
40719
+ if (parsedResponse?.id && parsedResponse?.name) {
40720
+ console.log(`Valid response for ${file.name}`);
40721
+ return {
40722
+ file,
40723
+ status: 'success',
40724
+ data: parsedResponse
40725
+ };
40726
+ } else {
40727
+ console.error(`Invalid response structure for ${file.name}:`, parsedResponse);
40728
+ return {
40729
+ file,
40730
+ status: 'failed',
40731
+ reason: 'invalid response'
40732
+ };
40733
+ }
40734
+ } catch (error) {
40735
+ console.error(`Parse error for ${file.name}:`, error);
40713
40736
  return {
40714
40737
  file,
40715
40738
  status: 'failed',
40716
- reason: 'invalid file'
40739
+ reason: 'parse error'
40717
40740
  };
40718
40741
  }
40719
- // Validate parsed response structure
40720
- if (parsedResponse && parsedResponse.id && parsedResponse.name) {
40742
+ }
40743
+ if (typeof response === 'object' && response !== null) {
40744
+ const typedResponse = response;
40745
+ if (typedResponse?.id && typedResponse?.name) {
40746
+ console.log(`Valid response for ${file.name}`);
40721
40747
  return {
40722
40748
  file,
40723
40749
  status: 'success',
40724
- data: parsedResponse
40750
+ data: typedResponse
40725
40751
  };
40726
40752
  } else {
40753
+ console.error(`Invalid response structure for ${file.name}:`, response);
40727
40754
  return {
40728
40755
  file,
40729
40756
  status: 'failed',
40730
40757
  reason: 'invalid response'
40731
40758
  };
40732
40759
  }
40733
- } catch (error) {
40734
- console.error(`Parse error for ${file.name}:`, error);
40735
- return {
40736
- file,
40737
- status: 'failed',
40738
- reason: 'parse error'
40739
- };
40740
40760
  }
40761
+ console.error(`Unknown response for ${file.name}:`, response);
40762
+ return {
40763
+ file,
40764
+ status: 'failed',
40765
+ reason: 'unknown'
40766
+ };
40767
+ } catch (error) {
40768
+ console.error(`Upload failed for ${file.name}:`, error);
40769
+ return {
40770
+ file,
40771
+ status: 'failed',
40772
+ reason: 'upload error'
40773
+ };
40741
40774
  }
40742
- // Handle object responses
40743
- if (typeof response === 'object' && response !== null) {
40744
- const typedResponse = response;
40745
- if (typedResponse?.id && typedResponse?.name) {
40746
- return {
40747
- file,
40748
- status: 'success',
40749
- data: typedResponse
40750
- };
40775
+ });
40776
+ const results = await Promise.allSettled(uploadPromises);
40777
+ results.forEach((result, index) => {
40778
+ if (result.status === 'fulfilled' && result.value) {
40779
+ const {
40780
+ status,
40781
+ data,
40782
+ file
40783
+ } = result.value;
40784
+ console.log(`Processing result for ${file.name}:`, {
40785
+ status,
40786
+ data
40787
+ }); // Debug
40788
+ if (status === 'success' && data?.id && data?.name) {
40789
+ processedFiles.push(data);
40790
+ successCount++;
40791
+ } else if (status === 'existing' && data?.name) {
40792
+ processedFiles.push(data);
40751
40793
  } else {
40752
- return {
40753
- file,
40754
- status: 'failed',
40755
- reason: 'invalid response'
40756
- };
40794
+ failureCount++;
40757
40795
  }
40758
- }
40759
- return {
40760
- file,
40761
- status: 'failed',
40762
- reason: 'unknown'
40763
- };
40764
- } catch (error) {
40765
- console.error(`Upload failed for ${file.name}:`, error);
40766
- return {
40767
- file,
40768
- status: 'failed',
40769
- reason: 'upload error'
40770
- };
40771
- }
40772
- });
40773
- const results = await Promise.allSettled(uploadPromises);
40774
- results.forEach(result => {
40775
- if (result.status === 'fulfilled' && result.value) {
40776
- const {
40777
- status,
40778
- data
40779
- } = result.value;
40780
- if (status === 'success' && data?.id && data?.name) {
40781
- processedFiles.push(data);
40782
- successCount++;
40783
- } else if (status === 'existing' && data?.name) {
40784
- processedFiles.push(data);
40785
- } else if (result.value.reason === 'invalid file') {
40786
- failureCount++;
40787
40796
  } else {
40797
+ console.log(`Upload promise rejected for file ${index}:`, result); // Debug
40788
40798
  failureCount++;
40789
40799
  }
40800
+ });
40801
+ if (successCount > 0 || processedFiles.length > existingFiles.length) {
40802
+ const newValue = processedFiles.length > 0 ? JSON.stringify(processedFiles) : '';
40803
+ handleChange({
40804
+ ...cell,
40805
+ value: newValue,
40806
+ style: cell?.style,
40807
+ inputType: cell?.inputType
40808
+ });
40809
+ setSelectedFiles(processedFiles.map(file => new File([new Blob()], file.name)));
40810
+ console.log('Counts:', {
40811
+ duplicateCount,
40812
+ successCount,
40813
+ failureCount
40814
+ }); // Debug log
40790
40815
  } else {
40791
- failureCount++;
40816
+ console.log('No new valid files added, retaining cell.value'); // Debug log
40792
40817
  }
40793
- });
40794
- // Update cell value only if new valid files were added
40795
- if (successCount > 0 || processedFiles.length > existingFiles.length) {
40796
- const newValue = processedFiles.length > 0 ? JSON.stringify(processedFiles) : '';
40797
- handleChange({
40798
- ...cell,
40799
- value: newValue,
40800
- style: cell?.style,
40801
- inputType: cell?.inputType
40802
- });
40803
- setSelectedFiles(processedFiles.map(file => new File([new Blob()], file.name)));
40804
- }
40805
- // Show toast messages
40806
- if (successCount > 0) {
40807
- toast.success(`${successCount} file${successCount > 1 ? 's' : ''} uploaded successfully`);
40808
- }
40809
- if (failureCount > 0) {
40810
- toast.info(`${failureCount} unsupported ${failureCount > 1 ? 'files' : 'file'}.`);
40818
+ if (successCount > 0) {
40819
+ toast.success(`${successCount} file${successCount > 1 ? 's' : ''} uploaded successfully`);
40820
+ }
40821
+ if (failureCount > 0) {
40822
+ toast.info(`${failureCount} unsupported ${failureCount > 1 ? 'files' : 'file'}.`);
40823
+ }
40824
+ } catch (error) {
40825
+ console.error('Upload operation failed:', error);
40826
+ toast.error('Operation failed');
40811
40827
  }
40812
- } catch (error) {
40813
- console.error('Upload operation failed:', error);
40814
- toast.error('Operation failed');
40828
+ } else if (duplicateCount > 0) {
40829
+ toast.warning('Duplicate attachments not allowed within the same row');
40815
40830
  }
40816
- } else if (duplicateCount > 0) {
40817
- toast.warning('Duplicate attachments not allowed within the same row');
40818
- }
40819
- } else if (actionType === 'DELETE' && cell?.inputType?.type === 'file') {
40820
- try {
40821
- console.log('cell.value before parse:', cell.value); // Debug log
40822
- const parsedValue = cell && JSON.parse(cell.value);
40823
- console.log('DELETE action:', {
40824
- selected,
40825
- parsedValue
40826
- }); // Debug log
40827
- let updatedFileDetails = [...parsedValue];
40828
- let deletedCount = 0;
40829
- for (const file of selected || []) {
40830
- const index = updatedFileDetails.findIndex(originalFile => originalFile.name.split('*')[0] === file.name.split('*')[0]);
40831
- console.log(`Comparing file ${file.name} with stored files:`, {
40832
- index,
40833
- storedNames: updatedFileDetails.map(f => f.name)
40831
+ } else if (actionType === 'DELETE' && cell?.inputType?.type === 'file') {
40832
+ try {
40833
+ console.log('cell.value before parse:', cell.value); // Debug log
40834
+ const parsedValue = cell && JSON.parse(cell.value);
40835
+ console.log('DELETE action:', {
40836
+ selected,
40837
+ parsedValue
40834
40838
  }); // Debug log
40835
- const fileId = updatedFileDetails[index]?.id;
40836
- if (index !== -1 && fileId && props.attachmentAction?.deleteAttachment) {
40837
- console.log(`Deleting fileId: ${fileId}`); // Debug log
40838
- try {
40839
- const response = await props.attachmentAction.deleteAttachment(fileId);
40840
- console.log(`Delete response for ${file.name}:`, response); // Debug log
40841
- if (response && (response === 'SUCCESS' || typeof response === 'object' && ('status' in response && response.status === 200 || Object.keys(response).length > 0))) {
40842
- updatedFileDetails.splice(index, 1);
40843
- console.log(`After splice for ${file.name}:`, updatedFileDetails); // Debug log
40844
- deletedCount++;
40845
- console.log(`Deleted ${file.name} successfully`); // Debug log
40846
- } else {
40847
- console.error(`Delete failed for ${file.name}: Invalid response`, response);
40848
- }
40849
- } catch (deleteError) {
40850
- console.error(`Delete error for ${file.name}:`, deleteError);
40851
- }
40852
- } else {
40853
- console.error(`Cannot delete ${file.name}: Invalid fileId or no match`, {
40839
+ let updatedFileDetails = [...parsedValue];
40840
+ let deletedCount = 0;
40841
+ for (const file of selected || []) {
40842
+ const index = updatedFileDetails.findIndex(originalFile => originalFile.name.split('*')[0] === file.name.split('*')[0]);
40843
+ console.log(`Comparing file ${file.name} with stored files:`, {
40854
40844
  index,
40855
- fileId,
40856
- hasDeleteAttachment: !!props.attachmentAction?.deleteAttachment
40845
+ storedNames: updatedFileDetails.map(f => f.name)
40857
40846
  }); // Debug log
40847
+ const fileId = updatedFileDetails[index]?.id;
40848
+ if (index !== -1 && fileId && props.attachmentAction?.deleteAttachment) {
40849
+ console.log(`Deleting fileId: ${fileId}`); // Debug log
40850
+ try {
40851
+ const response = await props.attachmentAction.deleteAttachment(fileId);
40852
+ console.log(`Delete response for ${file.name}:`, response); // Debug log
40853
+ // Check for valid response
40854
+ if (response === 'SUCCESS' || typeof response === 'object' && response !== null && ('status' in response && response.status === 'SUCCESS' || 'responseCode' in response && response.responseCode === 200)) {
40855
+ updatedFileDetails.splice(index, 1);
40856
+ console.log(`After splice for ${file.name}:`, updatedFileDetails); // Debug log
40857
+ deletedCount++;
40858
+ console.log(`Deleted ${file.name} successfully`); // Debug log
40859
+ } else {
40860
+ console.error(`Delete failed for ${file.name}: Invalid response`, response);
40861
+ toast.warning('Failed to delete file: Invalid server response');
40862
+ }
40863
+ } catch (deleteError) {
40864
+ console.error(`Delete error for ${file.name}:`, deleteError);
40865
+ toast.error('Error deleting file');
40866
+ }
40867
+ } else {
40868
+ console.error(`Cannot delete ${file.name}: Invalid fileId or no match`, {
40869
+ index,
40870
+ fileId,
40871
+ hasDeleteAttachment: !!props.attachmentAction?.deleteAttachment
40872
+ }); // Debug log
40873
+ toast.error('Failed to delete file: Invalid file data');
40874
+ }
40858
40875
  }
40859
- }
40860
- if (deletedCount > 0) {
40861
- const newValue = updatedFileDetails.length > 0 ? JSON.stringify(updatedFileDetails) : '';
40862
- console.log('Updated cell.value:', newValue); // Debug log
40863
- handleChange({
40864
- ...cell,
40865
- value: newValue,
40866
- style: cell?.style,
40867
- inputType: cell?.inputType
40868
- });
40869
- setSelectedFiles(updatedFileDetails.map(file => new File([new Blob()], file.name)));
40870
- console.log('Updated selectedFiles:', updatedFileDetails); // Debug log
40871
- toast.success(`${deletedCount} file${deletedCount > 1 ? 's' : ''} deleted successfully`);
40872
- } else if (selected?.length) {
40873
- console.log('No files deleted, retaining original state'); // Debug log
40874
- const validFiles = updatedFileDetails.filter(file => file.id && file.name);
40875
- if (validFiles.length < updatedFileDetails.length) {
40876
- const newValue = validFiles.length > 0 ? JSON.stringify(validFiles) : '';
40877
- console.log('Cleaning invalid files, new cell.value:', newValue); // Debug log
40876
+ // Update cell value and selected files
40877
+ if (deletedCount > 0) {
40878
+ const newValue = updatedFileDetails.length > 0 ? JSON.stringify(updatedFileDetails) : '';
40879
+ console.log('Updated cell.value:', newValue); // Debug log
40878
40880
  handleChange({
40879
40881
  ...cell,
40880
40882
  value: newValue,
40881
40883
  style: cell?.style,
40882
40884
  inputType: cell?.inputType
40883
40885
  });
40884
- setSelectedFiles(validFiles.map(file => new File([new Blob()], file.name)));
40885
- console.log('Updated selectedFiles after cleanup:', validFiles); // Debug log
40886
+ setSelectedFiles(updatedFileDetails.map(file => new File([new Blob()], file.name)));
40887
+ console.log('Updated selectedFiles:', updatedFileDetails); // Debug log
40888
+ toast.success(`${deletedCount} file${deletedCount > 1 ? 's' : ''} deleted successfully`);
40889
+ } else if (selected?.length) {
40890
+ console.log('No files deleted, retaining original state'); // Debug log
40891
+ const validFiles = updatedFileDetails.filter(file => file.id && file.name);
40892
+ if (validFiles.length < updatedFileDetails.length) {
40893
+ const newValue = validFiles.length > 0 ? JSON.stringify(validFiles) : '';
40894
+ console.log('Cleaning invalid files, new cell.value:', newValue); // Debug log
40895
+ handleChange({
40896
+ ...cell,
40897
+ value: newValue,
40898
+ style: cell?.style,
40899
+ inputType: cell?.inputType
40900
+ });
40901
+ setSelectedFiles(validFiles.map(file => new File([new Blob()], file.name)));
40902
+ console.log('Updated selectedFiles after cleanup:', validFiles); // Debug log
40903
+ toast.error('Failed to delete file(s). Invalid file data detected.');
40904
+ } else {
40905
+ toast.error('Failed to delete file(s). No valid files removed.');
40906
+ }
40886
40907
  }
40887
- toast.error('Failed to delete file(s). Invalid file data detected.');
40908
+ } catch (error) {
40909
+ console.error('Delete operation failed:', error);
40910
+ toast.error('Delete operation failed');
40888
40911
  }
40889
- } catch (error) {
40890
- console.error('Delete operation failed:', error);
40891
- toast.error('Delete operation failed');
40892
40912
  }
40913
+ } catch (error) {
40914
+ console.error('handleFilesChange error:', error);
40915
+ toast.error('Operation failed');
40893
40916
  }
40894
40917
  };
40895
40918
  const handleClick = e => {