{"id":50432800,"url":"https://github.com/tommykho/datatables","last_synced_at":"2026-05-31T15:01:42.353Z","repository":{"id":351382407,"uuid":"1165160836","full_name":"tommykho/datatables","owner":"tommykho","description":"Universal JQuery Datatables App. This is a server-less, offline data inspection tool. Drop it in any folder with CSV or XLSX files and open it in a browser.","archived":false,"fork":false,"pushed_at":"2026-04-14T18:52:21.000Z","size":219,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-14T20:24:32.692Z","etag":null,"topics":["csv","datatables","filter","html","jquery","viewer","xlsx"],"latest_commit_sha":null,"homepage":"https://github.com/tommykho/datatables","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tommykho.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-02-23T22:15:42.000Z","updated_at":"2026-04-14T18:52:24.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/tommykho/datatables","commit_stats":null,"previous_names":["tommykho/datatables"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/tommykho/datatables","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tommykho%2Fdatatables","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tommykho%2Fdatatables/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tommykho%2Fdatatables/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tommykho%2Fdatatables/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tommykho","download_url":"https://codeload.github.com/tommykho/datatables/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tommykho%2Fdatatables/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33735663,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-31T02:00:06.040Z","response_time":95,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csv","datatables","filter","html","jquery","viewer","xlsx"],"created_at":"2026-05-31T15:01:40.858Z","updated_at":"2026-05-31T15:01:42.348Z","avatar_url":"https://github.com/tommykho.png","language":"HTML","funding_links":["https://paypal.me/tommykho"],"categories":[],"sub_categories":[],"readme":"```\n ██████╗  █████╗ ████████╗ █████╗ ████████╗ █████╗ ██████╗ ██╗     ███████╗███████╗\n ██╔══██╗██╔══██╗╚══██╔══╝██╔══██╗╚══██╔══╝██╔══██╗██╔══██╗██║     ██╔════╝██╔════╝\n ██║  ██║███████║   ██║   ███████║   ██║   ███████║██████╔╝██║     █████╗  ███████╗\n ██║  ██║██╔══██║   ██║   ██╔══██║   ██║   ██╔══██║██╔══██╗██║     ██╔══╝  ╚════██║\n ██████╔╝██║  ██║   ██║   ██║  ██║   ██║   ██║  ██║██████╔╝███████╗███████╗███████║\n ╚═════╝ ╚═╝  ╚═╝   ╚═╝   ╚═╝  ╚═╝   ╚═╝   ╚═╝  ╚═╝╚═════╝ ╚══════╝╚══════╝╚══════╝\n                        V I E W E R   ·   v260320A\n```\n\n\u003e **100% static · single-file · offline · no backend · no build**\n\n---\n\n```\n╔══════════════════════════════════════════╗\n║  [1]  OVERVIEW                           ║\n╚══════════════════════════════════════════╝\n```\n\n`index.html` is a server-less, offline data inspection tool.\nDrop it in any folder with CSV or XLSX files and open it in a browser.\n\n**Feature set:**\n\n| # | Feature |\n|---|---|\n| 1 | CSV \u0026 XLSX loading (SheetJS) |\n| 2 | Multi-sheet XLSX — auto-loads first; modal for selection |\n| 3 | Light / Dark mode — OS auto-detect + manual toggle |\n| 4 | Dynamic row grouping by any column |\n| 5 | Per-column search header row |\n| 6 | Multi-row selection |\n| 7 | QR code rendering (on toggle) |\n| 8 | Barcode rendering (on toggle) |\n| 9 | Export filtered dataset to CSV |\n| 10 | Classic pagination — 10 / 25 / 50 / 100 / 250 |\n| 11 | Column visibility toggle |\n| 12 | Optimised for datasets up to 10,000 rows |\n\n---\n\n```\n╔══════════════════════════════════════════╗\n║  [2]  PROJECT STRUCTURE                  ║\n╚══════════════════════════════════════════╝\n```\n\n```\n/\n├── index.html            ← entire application (single file)\n├── README.md\n├── AGENTS.md             ← agent \u0026 contributor rules\n├── PROJECT_CHECKLIST.md  ← phased implementation tracker\n├── *.csv                 ← sample data files\n└── *.xlsx                ← sample data files\n```\n\n---\n\n```\n╔══════════════════════════════════════════╗\n║  [3]  GETTING STARTED                    ║\n╚══════════════════════════════════════════╝\n```\n\n```bash\npython -m http.server 8000\n```\n\nThen open: `http://localhost:8000/index.html`\n\n\u003e **Note:** The folder-scan auto-load feature requires HTTP — it will not work via `file://` directly.\n\n---\n\n```\n╔══════════════════════════════════════════╗\n║  [4]  FILE LOADING                       ║\n╚══════════════════════════════════════════╝\n```\n\n### On Page Load\n\nThe app scans the folder where `index.html` resides for all `.csv` and `.xlsx` files.\nFiles are listed alphabetically in the dropdown. The first file is auto-loaded on startup.\n\n### File Dropdown\n\n```\nsample.csv\nsample.xlsx\n──────────────\nFile Upload...\n```\n\n**\"File Upload...\"** is always present at the bottom. Selecting it opens a native OS file picker\nfiltered to `.csv` and `.xlsx`. The uploaded file is treated identically to a folder file.\n\n### XLSX Multi-Sheet\n\n- Auto-loads the first sheet\n- If multiple sheets exist, a modal allows selecting a different sheet\n- Only raw cell values imported — no formulas, no formatting\n\n---\n\n```\n╔══════════════════════════════════════════╗\n║  [5]  TOOLBAR BUTTONS                    ║\n╚══════════════════════════════════════════╝\n```\n\nButtons appear in the `col-8 text-end` toolbar area, rendered left-to-right:\n\n| Order | Button | Action |\n|---|---|---|\n| 1 | **QR** | Toggle QR code column (lazy render) |\n| 2 | **Bar** | Toggle barcode column (lazy render) |\n| 3 | **Show Selected** | Filter table to selected rows only |\n| 4 | **Column Visibility** | Toggle individual column visibility |\n| 5 | **Export CSV** | Export filtered rows to CSV |\n\n\u003e QR and Barcode are **never** auto-rendered on load — only on user toggle.\n\n---\n\n```\n╔══════════════════════════════════════════╗\n║  [6]  DATATABLES CONFIGURATION           ║\n╚══════════════════════════════════════════╝\n```\n\n| Setting | Value |\n|---|---|\n| `deferRender` | `true` |\n| Pagination lengths | 10, 25, 50, 100, 250 |\n| Pagination position | Left-aligned |\n| Row count info | Right-aligned |\n| Responsive | Enabled |\n| Row selection | Multi-row |\n| Row grouping | Dynamic (any column) |\n| Column visibility | colVis button |\n| Per-column search | Enabled (second header row) |\n| Button class | `btn btn-sm` (no `btn-secondary`) |\n\n---\n\n```\n╔══════════════════════════════════════════╗\n║  [7]  DARK MODE                          ║\n╚══════════════════════════════════════════╝\n```\n\n| Behavior | Detail |\n|---|---|\n| Auto-detect | Reads OS `prefers-color-scheme` on first load |\n| Manual toggle | User can override at any time |\n| Persistence | Manual override stored in `localStorage` |\n| Implementation | `body.dark-mode` CSS class only — no inline styles |\n| Pagination | Bootstrap `.page-link` fully dark-themed |\n\n---\n\n```\n╔══════════════════════════════════════════╗\n║  [8]  DATA FLOW                          ║\n╚══════════════════════════════════════════╝\n```\n\n```\nUser selects file\n       │\n       ▼\nDetect extension (.csv / .xlsx)\n       │\n       ▼\nCSV Parser ──or── XLSX Parser\n       │\n       ▼\nnormalizeData()  →  { headers: string[], data: string[][] }\n       │\n       ▼\nDataTable Initializer\n       │\n       ▼\nExtensions: GroupingManager · ThemeManager · ExportManager · QR/Barcode\n```\n\n---\n\n```\n╔══════════════════════════════════════════╗\n║  [9]  EXPORT                             ║\n╚══════════════════════════════════════════╝\n```\n\n- Exports **filtered rows only** — respects global search, column search, column visibility\n- Search header row is **never** included\n- User prompted via native `prompt()` to confirm or edit the filename\n- Default filename pre-filled from the loaded file\n\n---\n\n```\n╔══════════════════════════════════════════╗\n║  [10] CDN DEPENDENCIES                   ║\n╚══════════════════════════════════════════╝\n```\n\n| Library | Version |\n|---|---|\n| Bootstrap | 5.3.3 |\n| jQuery | 3.7.1 |\n| DataTables | 2.3.4 |\n| DataTables Buttons | 3.2.5 |\n| DataTables RowGroup | 1.6.0 |\n| DataTables Responsive | 3.0.6 |\n| DataTables Select | 3.1.3 |\n| SheetJS | CDN latest |\n| JsBarcode | 3.11.5 |\n| QRCode.js | 1.0.0 |\n\nAll loaded via CDN. No local install required.\n\n---\n\n```\n╔══════════════════════════════════════════╗\n║  [11] VERSIONING SCHEME                  ║\n╚══════════════════════════════════════════╝\n```\n\n```\nYYMM + MajorRevision (letter) + MinorRevision (number)\n```\n\n| Part | Meaning |\n|---|---|\n| `YYMM` | Year + month of build |\n| `A–Z` | Major revision — A = 1st, B = 2nd … |\n| `0–9` | Minor revision — starts at 0 |\n\n**Example:** `260320A` = March 2026, 20th day, 1st major revision\n\n\u003e **Agents must never modify the version string.**\n\u003e All version changes are the sole responsibility of the programmer.\n\n---\n\n```\n╔══════════════════════════════════════════╗\n║  [12] BROWSER SUPPORT                    ║\n╚══════════════════════════════════════════╝\n```\n\n| Browser | Status |\n|---|---|\n| Chrome | ✅ |\n| Edge | ✅ |\n| Firefox | ✅ |\n\nWorks via static HTTP server. No backend required.\n\n---\n\n## License\n\nThis project is licensed under the [GNU General Public License v3.0 (GPL-3.0)](https://github.com/tommykho/edgetts/blob/main/LICENSE).\n\n## Support\n\nIf you find this useful, consider buying me a coffee!\n\n[![Donate via PayPal](https://img.shields.io/badge/Donate-PayPal-blue?logo=paypal)](https://paypal.me/tommykho)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftommykho%2Fdatatables","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftommykho%2Fdatatables","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftommykho%2Fdatatables/lists"}