Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>JSON Builder Tool</title>
- <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
- <style>
- textarea {
- font-family: monospace;
- }
- </style>
- </head>
- <body class="p-4">
- <div class="container">
- <h2>JSON Builder Tool</h2>
- <button class="btn btn-primary me-2" data-bs-toggle="modal" data-bs-target="#inputModal">Input JSON</button>
- <button class="btn btn-success" onclick="showGeneratedModal()">Generate JSON</button>
- <!-- CRUD Table -->
- <div class="mt-4">
- <h4>Data Entries</h4>
- <button class="btn btn-outline-primary mb-2" onclick="showAddEntryModal()">Add New Entry</button>
- <table class="table table-bordered">
- <thead>
- <tr>
- <th>Slug</th>
- <th>Title</th>
- <th>Description</th>
- <th>Keyword</th>
- <th>adsData</th>
- <th>Actions</th>
- </tr>
- </thead>
- <tbody id="dataTable"></tbody>
- </table>
- </div>
- </div>
- <!-- Input Modal -->
- <div class="modal fade" id="inputModal" tabindex="-1">
- <div class="modal-dialog modal-lg">
- <div class="modal-content">
- <div class="modal-header">
- <h5 class="modal-title">Input JSON</h5>
- <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
- </div>
- <div class="modal-body">
- <div class="mb-3">
- <label for="jsonPaste" class="form-label">Paste JSON:</label>
- <textarea id="jsonPaste" class="form-control" rows="5"></textarea>
- </div>
- <div class="mb-3">
- <label for="jsonFile" class="form-label">Upload JSON File:</label>
- <input type="file" id="jsonFile" accept="application/json" class="form-control">
- </div>
- </div>
- <div class="modal-footer">
- <button class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
- <button class="btn btn-primary" onclick="loadFromPaste(); document.getElementById('inputModalClose').click();">Load</button>
- <button id="inputModalClose" type="button" class="d-none" data-bs-dismiss="modal"></button>
- </div>
- </div>
- </div>
- </div>
- <!-- Generate Modal -->
- <div class="modal fade" id="generateModal" tabindex="-1">
- <div class="modal-dialog modal-lg">
- <div class="modal-content">
- <div class="modal-header">
- <h5 class="modal-title">Generated JSON</h5>
- <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
- </div>
- <div class="modal-body">
- <textarea id="generatedJson" class="form-control" rows="10" disabled></textarea>
- </div>
- <div class="modal-footer">
- <button class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
- <button class="btn btn-info" onclick="copyJson()">Copy</button>
- <button class="btn btn-success" onclick="downloadJson()">Download</button>
- </div>
- </div>
- </div>
- </div>
- <!-- Add/Edit Entry Modal -->
- <div class="modal fade" id="addEntryModal" tabindex="-1">
- <div class="modal-dialog">
- <div class="modal-content">
- <div class="modal-header">
- <h5 class="modal-title" id="entryModalTitle">Add New Entry</h5>
- <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
- </div>
- <div class="modal-body">
- <input id="slug" class="form-control mb-2" placeholder="Slug">
- <input id="title" class="form-control mb-2" placeholder="Title">
- <textarea id="description" class="form-control mb-2" placeholder="Description"></textarea>
- <input id="keyword" class="form-control mb-2" placeholder="Keyword">
- <input id="adsData" class="form-control" placeholder="adsData URL">
- </div>
- <div class="modal-footer">
- <button class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
- <button class="btn btn-primary" id="entryModalBtn" onclick="addEntry()">Add</button>
- </div>
- </div>
- </div>
- </div>
- <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
- <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
- <script>
- let jsonData = { data: [] };
- let editingIndex = null;
- function slugify(text) {
- return text.toString().toLowerCase()
- .replace(/\s+/g, '-')
- .replace(/[^a-z0-9\-]/g, '')
- .replace(/\-+/g, '-')
- .replace(/^-+|-+$/g, '');
- }
- function isValidURL(url) {
- try {
- new URL(url);
- return true;
- } catch (_) {
- return false;
- }
- }
- function loadFromPaste() {
- const text = $('#jsonPaste').val();
- try {
- const loaded = JSON.parse(text);
- if (loaded.data && Array.isArray(loaded.data)) {
- jsonData = loaded;
- alert('JSON loaded successfully!');
- renderTable();
- } else {
- alert('Invalid JSON format');
- }
- } catch (err) {
- alert('Error parsing pasted JSON: ' + err);
- }
- }
- $('#jsonFile').on('change', function(e) {
- const file = e.target.files[0];
- if (!file) return;
- const reader = new FileReader();
- reader.onload = function(evt) {
- try {
- const loaded = JSON.parse(evt.target.result);
- if (loaded.data && Array.isArray(loaded.data)) {
- jsonData = loaded;
- alert('File loaded successfully!');
- renderTable();
- } else {
- alert('Invalid JSON format');
- }
- } catch (err) {
- alert('Error reading JSON: ' + err);
- }
- };
- reader.readAsText(file);
- });
- function showGeneratedModal() {
- $('#generatedJson').val(JSON.stringify(jsonData, null, 2));
- new bootstrap.Modal(document.getElementById('generateModal')).show();
- }
- function downloadJson() {
- const blob = new Blob([JSON.stringify(jsonData, null, 2)], { type: 'application/json' });
- const url = URL.createObjectURL(blob);
- const a = document.createElement('a');
- a.href = url;
- a.download = 'data.json';
- document.body.appendChild(a);
- a.click();
- document.body.removeChild(a);
- }
- function copyJson() {
- navigator.clipboard.writeText(JSON.stringify(jsonData, null, 2))
- .then(() => alert('JSON copied to clipboard'))
- .catch(err => alert('Failed to copy: ' + err));
- }
- function renderTable() {
- const tbody = $('#dataTable');
- tbody.empty();
- jsonData.data.forEach((item, index) => {
- tbody.append(`
- <tr>
- <td>${item.slug}</td>
- <td>${item.meta.title}</td>
- <td>${item.meta.description}</td>
- <td>${item.meta.keyword}</td>
- <td>${item.adsData}</td>
- <td>
- <button class="btn btn-sm btn-warning me-1" onclick="showEditEntryModal(${index})">Edit</button>
- <button class="btn btn-sm btn-danger" onclick="deleteEntry(${index})">Delete</button>
- </td>
- </tr>
- `);
- });
- }
- function showAddEntryModal() {
- editingIndex = null;
- $('#entryModalTitle').text('Add New Entry');
- $('#entryModalBtn').text('Add').attr('onclick', 'addEntry()');
- $('#slug').val('');
- $('#title').val('');
- $('#description').val('');
- $('#keyword').val('');
- $('#adsData').val('');
- new bootstrap.Modal(document.getElementById('addEntryModal')).show();
- }
- function addEntry() {
- const slug = slugify($('#slug').val());
- const ads = $('#adsData').val();
- if (!isValidURL(ads)) {
- alert('Invalid adsData URL');
- return;
- }
- const newEntry = {
- slug,
- meta: {
- title: $('#title').val(),
- description: $('#description').val(),
- keyword: $('#keyword').val(),
- },
- adsData: ads,
- };
- jsonData.data.push(newEntry);
- renderTable();
- bootstrap.Modal.getInstance(document.getElementById('addEntryModal')).hide();
- }
- function showEditEntryModal(index) {
- editingIndex = index;
- const entry = jsonData.data[index];
- $('#entryModalTitle').text('Edit Entry');
- $('#entryModalBtn').text('Update').attr('onclick', 'updateEntry()');
- $('#slug').val(entry.slug);
- $('#title').val(entry.meta.title);
- $('#description').val(entry.meta.description);
- $('#keyword').val(entry.meta.keyword);
- $('#adsData').val(entry.adsData);
- new bootstrap.Modal(document.getElementById('addEntryModal')).show();
- }
- function updateEntry() {
- if (editingIndex !== null) {
- const slug = slugify($('#slug').val());
- const ads = $('#adsData').val();
- if (!isValidURL(ads)) {
- alert('Invalid adsData URL');
- return;
- }
- jsonData.data[editingIndex] = {
- slug,
- meta: {
- title: $('#title').val(),
- description: $('#description').val(),
- keyword: $('#keyword').val(),
- },
- adsData: ads,
- };
- renderTable();
- bootstrap.Modal.getInstance(document.getElementById('addEntryModal')).hide();
- }
- }
- function deleteEntry(index) {
- if (confirm('Are you sure you want to delete this entry?')) {
- jsonData.data.splice(index, 1);
- renderTable();
- }
- }
- </script>
- </body>
- </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement