Spaces:
Running
Running
כרדע אני רוצה שאחרי שאני מעלה את הקבוץ הראשון בשדה הכחול
Browse filesהאפליקציה תשלום אילו אריכי חשבוניות הזנתי בטופס
ואת "סוג השירות
בגינו מבוקש החזר"
מה שרשום מתחת
ייעוץ פסיכיאטרי
ובצד אחד תרשום לי את כל מה שהאפליקציה מצאה כולל הצגת preview של מסמך ה pdf
ובצד ליד בעמודה נופסת את השדות החדשים שארצה להזין
- index.html +18 -9
- script.js +60 -4
- style.css +23 -2
index.html
CHANGED
|
@@ -42,23 +42,32 @@
|
|
| 42 |
</div>
|
| 43 |
</div>
|
| 44 |
</div>
|
| 45 |
-
|
| 46 |
<div class="col-md-6">
|
| 47 |
<div class="card mb-4">
|
| 48 |
<div class="card-header bg-info text-white">
|
| 49 |
-
<h5>
|
| 50 |
</div>
|
| 51 |
<div class="card-body">
|
| 52 |
-
<div class="
|
| 53 |
-
<
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 57 |
</div>
|
| 58 |
</div>
|
| 59 |
</div>
|
| 60 |
-
|
| 61 |
-
<div class="card">
|
| 62 |
<div class="card-header bg-warning text-dark">
|
| 63 |
<h5>Step 3: Generate PDFs</h5>
|
| 64 |
</div>
|
|
|
|
| 42 |
</div>
|
| 43 |
</div>
|
| 44 |
</div>
|
|
|
|
| 45 |
<div class="col-md-6">
|
| 46 |
<div class="card mb-4">
|
| 47 |
<div class="card-header bg-info text-white">
|
| 48 |
+
<h5>PDF Form Fields</h5>
|
| 49 |
</div>
|
| 50 |
<div class="card-body">
|
| 51 |
+
<div id="pdfFieldsPreview" class="mb-4">
|
| 52 |
+
<h6>Existing Fields in PDF:</h6>
|
| 53 |
+
<ul id="existingFieldsList" class="list-group"></ul>
|
| 54 |
+
</div>
|
| 55 |
+
<div id="pdfPreview" class="mb-4">
|
| 56 |
+
<h6>PDF Preview:</h6>
|
| 57 |
+
<iframe id="pdfViewer" style="width:100%; height:300px; border:1px solid #ddd;"></iframe>
|
| 58 |
+
</div>
|
| 59 |
+
<div id="newFieldsSection">
|
| 60 |
+
<h6>Add New Fields:</h6>
|
| 61 |
+
<div class="mb-3">
|
| 62 |
+
<input type="text" id="newFieldName" class="form-control mb-2" placeholder="Field Name">
|
| 63 |
+
<input type="text" id="newFieldValue" class="form-control mb-2" placeholder="Field Value">
|
| 64 |
+
<button id="addFieldBtn" class="btn btn-sm btn-primary">Add Field</button>
|
| 65 |
+
</div>
|
| 66 |
+
<div id="newFieldsList" class="list-group"></div>
|
| 67 |
</div>
|
| 68 |
</div>
|
| 69 |
</div>
|
| 70 |
+
<div class="card">
|
|
|
|
| 71 |
<div class="card-header bg-warning text-dark">
|
| 72 |
<h5>Step 3: Generate PDFs</h5>
|
| 73 |
</div>
|
script.js
CHANGED
|
@@ -11,8 +11,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
|
| 11 |
|
| 12 |
let csvData = [];
|
| 13 |
let headers = [];
|
| 14 |
-
|
| 15 |
-
// Upload template PDF
|
| 16 |
uploadTemplateBtn.addEventListener('click', async () => {
|
| 17 |
if (!templateUpload.files.length) {
|
| 18 |
alert('Please select a PDF file first');
|
|
@@ -28,14 +27,71 @@ document.addEventListener('DOMContentLoaded', function() {
|
|
| 28 |
body: formData
|
| 29 |
});
|
| 30 |
const result = await response.json();
|
| 31 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
} catch (error) {
|
| 33 |
console.error('Error uploading template:', error);
|
| 34 |
alert('Failed to upload template');
|
| 35 |
}
|
| 36 |
});
|
| 37 |
|
| 38 |
-
//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 39 |
uploadCsvBtn.addEventListener('click', async () => {
|
| 40 |
if (!csvUpload.files.length) {
|
| 41 |
alert('Please select a CSV file first');
|
|
|
|
| 11 |
|
| 12 |
let csvData = [];
|
| 13 |
let headers = [];
|
| 14 |
+
// Upload template PDF and extract fields
|
|
|
|
| 15 |
uploadTemplateBtn.addEventListener('click', async () => {
|
| 16 |
if (!templateUpload.files.length) {
|
| 17 |
alert('Please select a PDF file first');
|
|
|
|
| 27 |
body: formData
|
| 28 |
});
|
| 29 |
const result = await response.json();
|
| 30 |
+
|
| 31 |
+
// Display PDF preview
|
| 32 |
+
const pdfViewer = document.getElementById('pdfViewer');
|
| 33 |
+
pdfViewer.src = URL.createObjectURL(templateUpload.files[0]);
|
| 34 |
+
|
| 35 |
+
// Display form fields (mock data - in real app this would come from server)
|
| 36 |
+
const fieldsList = document.getElementById('existingFieldsList');
|
| 37 |
+
fieldsList.innerHTML = '';
|
| 38 |
+
|
| 39 |
+
// Mock fields - replace with actual fields from your PDF
|
| 40 |
+
const mockFields = [
|
| 41 |
+
'מספר ח חשבונית',
|
| 42 |
+
'תאריך ח חשבונית',
|
| 43 |
+
'סוג השירות',
|
| 44 |
+
'ששם המ המטופל',
|
| 45 |
+
'סכום לה להחזר'
|
| 46 |
+
];
|
| 47 |
+
|
| 48 |
+
mockFields.forEach(field => {
|
| 49 |
+
const li = document.createElement('li');
|
| 50 |
+
li.className = 'list-group-item';
|
| 51 |
+
li.textContent = field;
|
| 52 |
+
fieldsList.appendChild(li);
|
| 53 |
+
});
|
| 54 |
+
|
| 55 |
+
// Show the fields section
|
| 56 |
+
document.getElementById('pdfFieldsPreview').classList.remove('d-none');
|
| 57 |
+
document.getElementById('pdfPreview').classList.remove('d-none');
|
| 58 |
+
|
| 59 |
} catch (error) {
|
| 60 |
console.error('Error uploading template:', error);
|
| 61 |
alert('Failed to upload template');
|
| 62 |
}
|
| 63 |
});
|
| 64 |
|
| 65 |
+
// Add new field functionality
|
| 66 |
+
document.getElementById('addFieldBtn').addEventListener('click', () => {
|
| 67 |
+
const nameInput = document.getElementById('newFieldName');
|
| 68 |
+
const valueInput = document.getElementById('newFieldValue');
|
| 69 |
+
const fieldsList = document.getElementById('newFieldsList');
|
| 70 |
+
|
| 71 |
+
if (!nameInput.value.trim()) {
|
| 72 |
+
alert('Please enter a field name');
|
| 73 |
+
return;
|
| 74 |
+
}
|
| 75 |
+
|
| 76 |
+
const fieldItem = document.createElement('div');
|
| 77 |
+
fieldItem.className = 'list-group-item d-flex justify-content-between align-items-center';
|
| 78 |
+
fieldItem.innerHTML = `
|
| 79 |
+
<span><strong>${nameInput.value}:</strong> ${valueInput.value}</span>
|
| 80 |
+
<button class="btn btn-sm btn-danger remove-field">×</button>
|
| 81 |
+
`;
|
| 82 |
+
|
| 83 |
+
fieldsList.appendChild(fieldItem);
|
| 84 |
+
|
| 85 |
+
// Clear inputs
|
| 86 |
+
nameInput.value = '';
|
| 87 |
+
valueInput.value = '';
|
| 88 |
+
|
| 89 |
+
// Add remove functionality
|
| 90 |
+
fieldItem.querySelector('.remove-field').addEventListener('click', () => {
|
| 91 |
+
fieldItem.remove();
|
| 92 |
+
});
|
| 93 |
+
});
|
| 94 |
+
// Upload and preview CSV
|
| 95 |
uploadCsvBtn.addEventListener('click', async () => {
|
| 96 |
if (!csvUpload.files.length) {
|
| 97 |
alert('Please select a CSV file first');
|
style.css
CHANGED
|
@@ -16,12 +16,33 @@ body {
|
|
| 16 |
.card-header {
|
| 17 |
font-weight: 600;
|
| 18 |
}
|
| 19 |
-
|
| 20 |
-
#
|
|
|
|
| 21 |
max-height: 300px;
|
| 22 |
overflow-y: auto;
|
| 23 |
}
|
| 24 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
.btn {
|
| 26 |
font-weight: 500;
|
| 27 |
padding: 0.5rem 1.5rem;
|
|
|
|
| 16 |
.card-header {
|
| 17 |
font-weight: 600;
|
| 18 |
}
|
| 19 |
+
#csvPreview,
|
| 20 |
+
#existingFieldsList,
|
| 21 |
+
#newFieldsList {
|
| 22 |
max-height: 300px;
|
| 23 |
overflow-y: auto;
|
| 24 |
}
|
| 25 |
|
| 26 |
+
.list-group-item {
|
| 27 |
+
padding: 0.75rem 1.25rem;
|
| 28 |
+
}
|
| 29 |
+
|
| 30 |
+
.remove-field {
|
| 31 |
+
padding: 0 0.5rem;
|
| 32 |
+
line-height: 1;
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
#pdfPreview {
|
| 36 |
+
background: #f8f9fa;
|
| 37 |
+
border-radius: 0.25rem;
|
| 38 |
+
padding: 1rem;
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
+
#newFieldsSection {
|
| 42 |
+
margin-top: 1.5rem;
|
| 43 |
+
padding-top: 1.5rem;
|
| 44 |
+
border-top: 1px solid #eee;
|
| 45 |
+
}
|
| 46 |
.btn {
|
| 47 |
font-weight: 500;
|
| 48 |
padding: 0.5rem 1.5rem;
|