@keenthemes/ktui 1.0.28 → 1.1.0
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/README.md +27 -0
- package/dist/ktui.js +8780 -6199
- package/dist/ktui.min.js +1 -1
- package/dist/ktui.min.js.map +1 -1
- package/dist/styles.css +2744 -1367
- package/lib/cjs/components/alert/alert.js +1025 -0
- package/lib/cjs/components/alert/alert.js.map +1 -0
- package/lib/cjs/components/alert/index.js +20 -0
- package/lib/cjs/components/alert/index.js.map +1 -0
- package/lib/cjs/components/alert/templates.js +120 -0
- package/lib/cjs/components/alert/templates.js.map +1 -0
- package/lib/cjs/components/alert/types.js +7 -0
- package/lib/cjs/components/alert/types.js.map +1 -0
- package/lib/cjs/components/datepicker/config/config.js +42 -0
- package/lib/cjs/components/datepicker/config/config.js.map +1 -0
- package/lib/cjs/components/datepicker/config/index.js +24 -0
- package/lib/cjs/components/datepicker/config/index.js.map +1 -0
- package/lib/cjs/components/datepicker/config/interfaces.js +7 -0
- package/lib/cjs/components/datepicker/config/interfaces.js.map +1 -0
- package/lib/cjs/components/datepicker/config/types.js +7 -0
- package/lib/cjs/components/datepicker/config/types.js.map +1 -0
- package/lib/cjs/components/datepicker/core/event-manager.js +135 -0
- package/lib/cjs/components/datepicker/core/event-manager.js.map +1 -0
- package/lib/cjs/components/datepicker/core/focus-manager.js +167 -0
- package/lib/cjs/components/datepicker/core/focus-manager.js.map +1 -0
- package/lib/cjs/components/datepicker/core/helpers.js +219 -0
- package/lib/cjs/components/datepicker/core/helpers.js.map +1 -0
- package/lib/cjs/components/datepicker/core/index.js +25 -0
- package/lib/cjs/components/datepicker/core/index.js.map +1 -0
- package/lib/cjs/components/datepicker/core/unified-state-manager.js +394 -0
- package/lib/cjs/components/datepicker/core/unified-state-manager.js.map +1 -0
- package/lib/cjs/components/datepicker/datepicker.js +2066 -763
- package/lib/cjs/components/datepicker/datepicker.js.map +1 -1
- package/lib/cjs/components/datepicker/index.js +19 -8
- package/lib/cjs/components/datepicker/index.js.map +1 -1
- package/lib/cjs/components/datepicker/ui/index.js +23 -0
- package/lib/cjs/components/datepicker/ui/index.js.map +1 -0
- package/lib/cjs/components/datepicker/ui/input/dropdown.js +489 -0
- package/lib/cjs/components/datepicker/ui/input/dropdown.js.map +1 -0
- package/lib/cjs/components/datepicker/ui/input/index.js +23 -0
- package/lib/cjs/components/datepicker/ui/input/index.js.map +1 -0
- package/lib/cjs/components/datepicker/ui/input/segmented-input.js +640 -0
- package/lib/cjs/components/datepicker/ui/input/segmented-input.js.map +1 -0
- package/lib/cjs/components/datepicker/ui/renderers/calendar.js +446 -0
- package/lib/cjs/components/datepicker/ui/renderers/calendar.js.map +1 -0
- package/lib/cjs/components/datepicker/ui/renderers/footer.js +42 -0
- package/lib/cjs/components/datepicker/ui/renderers/footer.js.map +1 -0
- package/lib/cjs/components/datepicker/ui/renderers/header.js +32 -0
- package/lib/cjs/components/datepicker/ui/renderers/header.js.map +1 -0
- package/lib/cjs/components/datepicker/ui/renderers/index.js +25 -0
- package/lib/cjs/components/datepicker/ui/renderers/index.js.map +1 -0
- package/lib/cjs/components/datepicker/ui/renderers/time-picker.js +384 -0
- package/lib/cjs/components/datepicker/ui/renderers/time-picker.js.map +1 -0
- package/lib/cjs/components/datepicker/ui/templates/index.js +22 -0
- package/lib/cjs/components/datepicker/ui/templates/index.js.map +1 -0
- package/lib/cjs/components/datepicker/ui/templates/templates.js +253 -0
- package/lib/cjs/components/datepicker/ui/templates/templates.js.map +1 -0
- package/lib/cjs/components/datepicker/utils/date-formatters.js +88 -0
- package/lib/cjs/components/datepicker/utils/date-formatters.js.map +1 -0
- package/lib/cjs/components/datepicker/utils/date-utils.js +194 -0
- package/lib/cjs/components/datepicker/utils/date-utils.js.map +1 -0
- package/lib/cjs/components/datepicker/utils/index.js +24 -0
- package/lib/cjs/components/datepicker/utils/index.js.map +1 -0
- package/lib/cjs/components/datepicker/utils/time-utils.js +213 -0
- package/lib/cjs/components/datepicker/utils/time-utils.js.map +1 -0
- package/lib/cjs/index.js +6 -1
- package/lib/cjs/index.js.map +1 -1
- package/lib/esm/components/alert/alert.js +1022 -0
- package/lib/esm/components/alert/alert.js.map +1 -0
- package/lib/esm/components/alert/index.js +4 -0
- package/lib/esm/components/alert/index.js.map +1 -0
- package/lib/esm/components/alert/templates.js +112 -0
- package/lib/esm/components/alert/templates.js.map +1 -0
- package/lib/esm/components/alert/types.js +6 -0
- package/lib/esm/components/alert/types.js.map +1 -0
- package/lib/esm/components/datepicker/config/config.js +39 -0
- package/lib/esm/components/datepicker/config/config.js.map +1 -0
- package/lib/esm/components/datepicker/config/index.js +8 -0
- package/lib/esm/components/datepicker/config/index.js.map +1 -0
- package/lib/esm/components/datepicker/config/interfaces.js +6 -0
- package/lib/esm/components/datepicker/config/interfaces.js.map +1 -0
- package/lib/esm/components/datepicker/config/types.js +6 -0
- package/lib/esm/components/datepicker/config/types.js.map +1 -0
- package/lib/esm/components/datepicker/core/event-manager.js +133 -0
- package/lib/esm/components/datepicker/core/event-manager.js.map +1 -0
- package/lib/esm/components/datepicker/core/focus-manager.js +164 -0
- package/lib/esm/components/datepicker/core/focus-manager.js.map +1 -0
- package/lib/esm/components/datepicker/core/helpers.js +211 -0
- package/lib/esm/components/datepicker/core/helpers.js.map +1 -0
- package/lib/esm/components/datepicker/core/index.js +9 -0
- package/lib/esm/components/datepicker/core/index.js.map +1 -0
- package/lib/esm/components/datepicker/core/unified-state-manager.js +391 -0
- package/lib/esm/components/datepicker/core/unified-state-manager.js.map +1 -0
- package/lib/esm/components/datepicker/datepicker.js +2065 -763
- package/lib/esm/components/datepicker/datepicker.js.map +1 -1
- package/lib/esm/components/datepicker/index.js +6 -8
- package/lib/esm/components/datepicker/index.js.map +1 -1
- package/lib/esm/components/datepicker/ui/index.js +7 -0
- package/lib/esm/components/datepicker/ui/index.js.map +1 -0
- package/lib/esm/components/datepicker/ui/input/dropdown.js +486 -0
- package/lib/esm/components/datepicker/ui/input/dropdown.js.map +1 -0
- package/lib/esm/components/datepicker/ui/input/index.js +7 -0
- package/lib/esm/components/datepicker/ui/input/index.js.map +1 -0
- package/lib/esm/components/datepicker/ui/input/segmented-input.js +637 -0
- package/lib/esm/components/datepicker/ui/input/segmented-input.js.map +1 -0
- package/lib/esm/components/datepicker/ui/renderers/calendar.js +443 -0
- package/lib/esm/components/datepicker/ui/renderers/calendar.js.map +1 -0
- package/lib/esm/components/datepicker/ui/renderers/footer.js +39 -0
- package/lib/esm/components/datepicker/ui/renderers/footer.js.map +1 -0
- package/lib/esm/components/datepicker/ui/renderers/header.js +29 -0
- package/lib/esm/components/datepicker/ui/renderers/header.js.map +1 -0
- package/lib/esm/components/datepicker/ui/renderers/index.js +9 -0
- package/lib/esm/components/datepicker/ui/renderers/index.js.map +1 -0
- package/lib/esm/components/datepicker/ui/renderers/time-picker.js +381 -0
- package/lib/esm/components/datepicker/ui/renderers/time-picker.js.map +1 -0
- package/lib/esm/components/datepicker/ui/templates/index.js +6 -0
- package/lib/esm/components/datepicker/ui/templates/index.js.map +1 -0
- package/lib/esm/components/datepicker/ui/templates/templates.js +242 -0
- package/lib/esm/components/datepicker/ui/templates/templates.js.map +1 -0
- package/lib/esm/components/datepicker/utils/date-formatters.js +83 -0
- package/lib/esm/components/datepicker/utils/date-formatters.js.map +1 -0
- package/lib/esm/components/datepicker/utils/date-utils.js +184 -0
- package/lib/esm/components/datepicker/utils/date-utils.js.map +1 -0
- package/lib/esm/components/datepicker/utils/index.js +8 -0
- package/lib/esm/components/datepicker/utils/index.js.map +1 -0
- package/lib/esm/components/datepicker/utils/time-utils.js +201 -0
- package/lib/esm/components/datepicker/utils/time-utils.js.map +1 -0
- package/lib/esm/index.js +4 -0
- package/lib/esm/index.js.map +1 -1
- package/package.json +22 -3
- package/src/components/alert/alert.css +429 -188
- package/src/components/alert/alert.ts +990 -0
- package/src/components/alert/index.ts +4 -0
- package/src/components/alert/templates.ts +110 -0
- package/src/components/alert/tests/accessibility/aria-roles.test.ts +19 -0
- package/src/components/alert/tests/accessibility/focus-management.test.ts +19 -0
- package/src/components/alert/tests/accessibility/keyboard-nav.test.ts +22 -0
- package/src/components/alert/tests/actions/confirm-cancel.test.ts +122 -0
- package/src/components/alert/tests/actions/input-field.test.ts +180 -0
- package/src/components/alert/tests/alert.basic.test.ts +126 -0
- package/src/components/alert/tests/alert.config.test.ts +75 -0
- package/src/components/alert/tests/alert.templates.test.ts +17 -0
- package/src/components/alert/tests/config/attribute-config.test.ts +94 -0
- package/src/components/alert/tests/config/json-config.test.ts +119 -0
- package/src/components/alert/tests/config/merging.test.ts +89 -0
- package/src/components/alert/tests/dismissal/auto-dismiss.test.ts +96 -0
- package/src/components/alert/tests/dismissal/escape-key-dismiss.test.ts +105 -0
- package/src/components/alert/tests/dismissal/manual-dismiss.test.ts +90 -0
- package/src/components/alert/tests/dismissal/outside-click-dismiss.test.ts +91 -0
- package/src/components/alert/tests/edge-cases/invalid-config.test.ts +19 -0
- package/src/components/alert/tests/edge-cases/multiple-alerts.test.ts +19 -0
- package/src/components/alert/tests/rendering/custom-content.test.ts +81 -0
- package/src/components/alert/tests/rendering/info-alert.test.ts +84 -0
- package/src/components/alert/tests/rendering/success-alert.test.ts +100 -0
- package/src/components/alert/tests/templates/default-templates.test.ts +16 -0
- package/src/components/alert/tests/templates/user-templates.test.ts +16 -0
- package/src/components/alert/types.ts +145 -0
- package/src/components/datepicker/__tests__/datepicker-events.test.ts +356 -0
- package/src/components/datepicker/__tests__/datepicker-init.test.ts +343 -0
- package/src/components/datepicker/__tests__/datepicker-integration.test.ts +435 -0
- package/src/components/datepicker/__tests__/datepicker-timezone.test.ts +220 -0
- package/src/components/datepicker/__tests__/segmented-input-focus.test.ts +380 -0
- package/src/components/datepicker/__tests__/selective-state-updates.test.ts +400 -0
- package/src/components/datepicker/__tests__/state-manager.test.ts +421 -0
- package/src/components/datepicker/__tests__/time-preservation.test.ts +387 -0
- package/src/components/datepicker/config/config.ts +40 -0
- package/src/components/datepicker/config/index.ts +8 -0
- package/src/components/datepicker/config/interfaces.ts +82 -0
- package/src/components/datepicker/config/types.ts +188 -0
- package/src/components/datepicker/core/event-manager.ts +159 -0
- package/src/components/datepicker/core/focus-manager.ts +201 -0
- package/src/components/datepicker/core/helpers.ts +231 -0
- package/src/components/datepicker/core/index.ts +9 -0
- package/src/components/datepicker/core/unified-state-manager.ts +459 -0
- package/src/components/datepicker/datepicker.css +429 -1
- package/src/components/datepicker/datepicker.ts +2538 -1277
- package/src/components/datepicker/index.ts +6 -8
- package/src/components/datepicker/ui/index.ts +7 -0
- package/src/components/datepicker/ui/input/dropdown.ts +552 -0
- package/src/components/datepicker/ui/input/index.ts +7 -0
- package/src/components/datepicker/ui/input/segmented-input.ts +638 -0
- package/src/components/datepicker/ui/renderers/__tests__/calendar-optimizations.test.ts +611 -0
- package/src/components/datepicker/ui/renderers/calendar.ts +530 -0
- package/src/components/datepicker/ui/renderers/footer.ts +43 -0
- package/src/components/datepicker/ui/renderers/header.ts +33 -0
- package/src/components/datepicker/ui/renderers/index.ts +9 -0
- package/src/components/datepicker/ui/renderers/time-picker.ts +438 -0
- package/src/components/datepicker/ui/templates/index.ts +6 -0
- package/src/components/datepicker/ui/templates/templates.ts +306 -0
- package/src/components/datepicker/utils/__tests__/date-formatters.test.ts +160 -0
- package/src/components/datepicker/utils/__tests__/date-utils-keys.test.ts +86 -0
- package/src/components/datepicker/utils/__tests__/date-utils-timezone.test.ts +215 -0
- package/src/components/datepicker/utils/date-formatters.ts +85 -0
- package/src/components/datepicker/utils/date-utils.ts +172 -0
- package/src/components/datepicker/utils/index.ts +8 -0
- package/src/components/datepicker/utils/time-utils.ts +221 -0
- package/src/index.ts +7 -1
- package/CONTRIBUTING.md +0 -101
- package/examples/datatable/checkbox-events-test.html +0 -400
- package/examples/datatable/credentials-test.html +0 -423
- package/examples/datatable/remote-checkbox-test.html +0 -365
- package/examples/datatable/sorting-test.html +0 -258
- package/examples/image-input/file-upload-example.html +0 -189
- package/examples/modal/persistent.html +0 -205
- package/examples/modal/remote-select-dropdown.html +0 -166
- package/examples/modal/select-dropdown-container.html +0 -129
- package/examples/select/avatar.html +0 -47
- package/examples/select/basic-usage.html +0 -39
- package/examples/select/country.html +0 -43
- package/examples/select/dark-mode.html +0 -93
- package/examples/select/description.html +0 -53
- package/examples/select/disable-option.html +0 -37
- package/examples/select/disable-select.html +0 -35
- package/examples/select/dropdowncontainer.html +0 -111
- package/examples/select/dynamic-methods.html +0 -273
- package/examples/select/formdata-remote.html +0 -161
- package/examples/select/global-config.html +0 -81
- package/examples/select/icon-multiple.html +0 -50
- package/examples/select/icon.html +0 -48
- package/examples/select/max-selection.html +0 -38
- package/examples/select/modal-container.html +0 -128
- package/examples/select/modal-positioning-test.html +0 -338
- package/examples/select/modal.html +0 -80
- package/examples/select/multiple.html +0 -40
- package/examples/select/native-selected.html +0 -64
- package/examples/select/placeholder.html +0 -40
- package/examples/select/remote-data-preselected.html +0 -283
- package/examples/select/remote-data.html +0 -38
- package/examples/select/search.html +0 -57
- package/examples/select/sizes.html +0 -94
- package/examples/select/tags-enhanced.html +0 -86
- package/examples/select/tags-icons.html +0 -57
- package/examples/select/template-customization.html +0 -61
- package/examples/sticky/README.md +0 -158
- package/examples/sticky/debug-sticky.html +0 -144
- package/examples/sticky/test-runner.html +0 -175
- package/examples/sticky/test-sticky-logic.js +0 -369
- package/examples/sticky/test-sticky-positioning.html +0 -386
- package/examples/toast/example.html +0 -479
- package/lib/cjs/components/datepicker/calendar.js +0 -1061
- package/lib/cjs/components/datepicker/calendar.js.map +0 -1
- package/lib/cjs/components/datepicker/config.js +0 -332
- package/lib/cjs/components/datepicker/config.js.map +0 -1
- package/lib/cjs/components/datepicker/dropdown.js +0 -635
- package/lib/cjs/components/datepicker/dropdown.js.map +0 -1
- package/lib/cjs/components/datepicker/events.js +0 -129
- package/lib/cjs/components/datepicker/events.js.map +0 -1
- package/lib/cjs/components/datepicker/keyboard.js +0 -536
- package/lib/cjs/components/datepicker/keyboard.js.map +0 -1
- package/lib/cjs/components/datepicker/locales.js +0 -78
- package/lib/cjs/components/datepicker/locales.js.map +0 -1
- package/lib/cjs/components/datepicker/templates.js +0 -403
- package/lib/cjs/components/datepicker/templates.js.map +0 -1
- package/lib/cjs/components/datepicker/types.js +0 -23
- package/lib/cjs/components/datepicker/types.js.map +0 -1
- package/lib/cjs/components/datepicker/utils.js +0 -524
- package/lib/cjs/components/datepicker/utils.js.map +0 -1
- package/lib/esm/components/datepicker/calendar.js +0 -1058
- package/lib/esm/components/datepicker/calendar.js.map +0 -1
- package/lib/esm/components/datepicker/config.js +0 -329
- package/lib/esm/components/datepicker/config.js.map +0 -1
- package/lib/esm/components/datepicker/dropdown.js +0 -632
- package/lib/esm/components/datepicker/dropdown.js.map +0 -1
- package/lib/esm/components/datepicker/events.js +0 -126
- package/lib/esm/components/datepicker/events.js.map +0 -1
- package/lib/esm/components/datepicker/keyboard.js +0 -533
- package/lib/esm/components/datepicker/keyboard.js.map +0 -1
- package/lib/esm/components/datepicker/locales.js +0 -74
- package/lib/esm/components/datepicker/locales.js.map +0 -1
- package/lib/esm/components/datepicker/templates.js +0 -390
- package/lib/esm/components/datepicker/templates.js.map +0 -1
- package/lib/esm/components/datepicker/types.js +0 -20
- package/lib/esm/components/datepicker/types.js.map +0 -1
- package/lib/esm/components/datepicker/utils.js +0 -508
- package/lib/esm/components/datepicker/utils.js.map +0 -1
- package/prettier.config.js +0 -9
- package/src/components/datepicker/calendar.ts +0 -1397
- package/src/components/datepicker/config.ts +0 -368
- package/src/components/datepicker/dropdown.ts +0 -757
- package/src/components/datepicker/events.ts +0 -149
- package/src/components/datepicker/keyboard.ts +0 -646
- package/src/components/datepicker/locales.ts +0 -80
- package/src/components/datepicker/templates.ts +0 -792
- package/src/components/datepicker/types.ts +0 -154
- package/src/components/datepicker/utils.ts +0 -631
- package/src/components/select/variants.css +0 -4
- package/tsconfig.json +0 -17
- package/webpack.config.js +0 -118
|
@@ -1,365 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
|
|
4
|
-
<head>
|
|
5
|
-
<meta charset="UTF-8">
|
|
6
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
-
<title>DataTable Remote Data with Checkboxes Test</title>
|
|
8
|
-
<link rel="stylesheet" href="../../dist/styles.css">
|
|
9
|
-
</head>
|
|
10
|
-
|
|
11
|
-
<body class="bg-gray-50 min-h-screen p-4">
|
|
12
|
-
<div class="container mx-auto max-w-5xl">
|
|
13
|
-
<div class="bg-white rounded-lg shadow-lg p-8 mt-6 border border-gray-200">
|
|
14
|
-
<div class="mb-6">
|
|
15
|
-
<h1 class="text-xl font-bold text-gray-900">DataTable Remote Data with Checkboxes Test</h1>
|
|
16
|
-
<p class="text-sm text-gray-600 mt-2">Tests checkbox events with server-side data from JSONPlaceholder API</p>
|
|
17
|
-
</div>
|
|
18
|
-
|
|
19
|
-
<!-- Current Selection Display -->
|
|
20
|
-
<div class="mb-6">
|
|
21
|
-
<h2 class="text-lg font-semibold text-gray-800 mb-3">Current Selection</h2>
|
|
22
|
-
<div id="selectionDisplay" class="bg-blue-50 border border-blue-200 rounded-md p-4">
|
|
23
|
-
<div class="text-gray-700">
|
|
24
|
-
<strong>Checked IDs:</strong> <span id="checkedIds" class="font-mono">[]</span>
|
|
25
|
-
</div>
|
|
26
|
-
<div class="text-gray-700 mt-2">
|
|
27
|
-
<strong>Count:</strong> <span id="checkedCount" class="font-semibold">0</span>
|
|
28
|
-
</div>
|
|
29
|
-
</div>
|
|
30
|
-
</div>
|
|
31
|
-
|
|
32
|
-
<!-- Test Controls -->
|
|
33
|
-
<div class="mb-6 flex gap-3 flex-wrap">
|
|
34
|
-
<button
|
|
35
|
-
onclick="testCheckAll()"
|
|
36
|
-
class="px-4 py-2 bg-green-600 text-white rounded-md hover:bg-green-700 transition-colors font-medium">
|
|
37
|
-
Check All
|
|
38
|
-
</button>
|
|
39
|
-
<button
|
|
40
|
-
onclick="testUncheckAll()"
|
|
41
|
-
class="px-4 py-2 bg-red-600 text-white rounded-md hover:bg-red-700 transition-colors font-medium">
|
|
42
|
-
Uncheck All
|
|
43
|
-
</button>
|
|
44
|
-
<button
|
|
45
|
-
onclick="testToggle()"
|
|
46
|
-
class="px-4 py-2 bg-purple-600 text-white rounded-md hover:bg-purple-700 transition-colors font-medium">
|
|
47
|
-
Toggle All
|
|
48
|
-
</button>
|
|
49
|
-
<button
|
|
50
|
-
onclick="testGetChecked()"
|
|
51
|
-
class="px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 transition-colors font-medium">
|
|
52
|
-
Get Checked
|
|
53
|
-
</button>
|
|
54
|
-
</div>
|
|
55
|
-
|
|
56
|
-
<!-- DataTable Container -->
|
|
57
|
-
<div class="kt-card">
|
|
58
|
-
<div class="kt-card-table" id="remote-datatable-container">
|
|
59
|
-
<div class="kt-table-wrapper kt-scrollable">
|
|
60
|
-
<table id="remote-checkbox-table" class="kt-table" data-kt-datatable-table="true">
|
|
61
|
-
<thead>
|
|
62
|
-
<tr>
|
|
63
|
-
<th scope="col" class="w-12" data-kt-datatable-column="checkbox">
|
|
64
|
-
<input
|
|
65
|
-
type="checkbox"
|
|
66
|
-
data-kt-datatable-check="true"
|
|
67
|
-
class="w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 focus:ring-2">
|
|
68
|
-
</th>
|
|
69
|
-
<th scope="col" class="w-20" data-kt-datatable-column="id">
|
|
70
|
-
<span class="kt-table-col">
|
|
71
|
-
<span class="kt-table-col-label">ID</span>
|
|
72
|
-
<span class="kt-table-col-sort"></span>
|
|
73
|
-
</span>
|
|
74
|
-
</th>
|
|
75
|
-
<th scope="col" class="w-48" data-kt-datatable-column="name">
|
|
76
|
-
<span class="kt-table-col">
|
|
77
|
-
<span class="kt-table-col-label">Name</span>
|
|
78
|
-
<span class="kt-table-col-sort"></span>
|
|
79
|
-
</span>
|
|
80
|
-
</th>
|
|
81
|
-
<th scope="col" class="w-64" data-kt-datatable-column="email">
|
|
82
|
-
<span class="kt-table-col">
|
|
83
|
-
<span class="kt-table-col-label">Email</span>
|
|
84
|
-
<span class="kt-table-col-sort"></span>
|
|
85
|
-
</span>
|
|
86
|
-
</th>
|
|
87
|
-
<th scope="col" class="w-40" data-kt-datatable-column="company">
|
|
88
|
-
<span class="kt-table-col">
|
|
89
|
-
<span class="kt-table-col-label">Company</span>
|
|
90
|
-
<span class="kt-table-col-sort"></span>
|
|
91
|
-
</span>
|
|
92
|
-
</th>
|
|
93
|
-
</tr>
|
|
94
|
-
</thead>
|
|
95
|
-
<tbody>
|
|
96
|
-
<!-- Data will be loaded from API -->
|
|
97
|
-
</tbody>
|
|
98
|
-
</table>
|
|
99
|
-
</div>
|
|
100
|
-
|
|
101
|
-
<!-- Pagination Info -->
|
|
102
|
-
<div class="flex items-center justify-between mt-4">
|
|
103
|
-
<div class="flex items-center space-x-2">
|
|
104
|
-
<span class="text-sm text-gray-700">Show</span>
|
|
105
|
-
<select data-kt-datatable-size="true" class="border border-gray-300 rounded px-2 py-1 bg-white text-gray-900">
|
|
106
|
-
<option value="5" selected>5</option>
|
|
107
|
-
<option value="10">10</option>
|
|
108
|
-
</select>
|
|
109
|
-
<span class="text-sm text-gray-700">entries</span>
|
|
110
|
-
</div>
|
|
111
|
-
<div data-kt-datatable-info="true" class="text-sm text-gray-700"></div>
|
|
112
|
-
</div>
|
|
113
|
-
|
|
114
|
-
<!-- Pagination Controls -->
|
|
115
|
-
<div class="flex justify-center mt-4">
|
|
116
|
-
<div data-kt-datatable-pagination="true" class="flex space-x-1"></div>
|
|
117
|
-
</div>
|
|
118
|
-
</div>
|
|
119
|
-
</div>
|
|
120
|
-
</div>
|
|
121
|
-
|
|
122
|
-
<!-- Event Log Section -->
|
|
123
|
-
<div class="bg-white rounded-lg shadow-lg p-8 mt-6 border border-gray-200">
|
|
124
|
-
<div class="flex items-center justify-between mb-3">
|
|
125
|
-
<h2 class="text-lg font-semibold text-gray-800">Event Log</h2>
|
|
126
|
-
<button
|
|
127
|
-
id="clearLog"
|
|
128
|
-
onclick="clearEventLog()"
|
|
129
|
-
class="px-3 py-1 text-sm bg-gray-200 text-gray-700 rounded-md hover:bg-gray-300 transition-colors">
|
|
130
|
-
Clear Log
|
|
131
|
-
</button>
|
|
132
|
-
</div>
|
|
133
|
-
<div id="eventLog" class="bg-gray-50 border border-gray-200 rounded-md p-4 h-64 overflow-y-auto font-mono text-sm">
|
|
134
|
-
<div class="text-gray-500">No events yet. Interact with checkboxes to see events...</div>
|
|
135
|
-
</div>
|
|
136
|
-
</div>
|
|
137
|
-
</div>
|
|
138
|
-
|
|
139
|
-
<script src="../../dist/ktui.js"></script>
|
|
140
|
-
<script>
|
|
141
|
-
let datatableInstance = null;
|
|
142
|
-
|
|
143
|
-
// Event log helper functions
|
|
144
|
-
function addEventLog(eventName, details = '') {
|
|
145
|
-
const logElement = document.getElementById('eventLog');
|
|
146
|
-
const timestamp = new Date().toLocaleTimeString();
|
|
147
|
-
const logEntry = document.createElement('div');
|
|
148
|
-
logEntry.className = 'mb-2 pb-2 border-b border-gray-200';
|
|
149
|
-
|
|
150
|
-
let eventColor = 'text-gray-700';
|
|
151
|
-
if (eventName === 'checked') {
|
|
152
|
-
eventColor = 'text-green-600';
|
|
153
|
-
} else if (eventName === 'unchecked') {
|
|
154
|
-
eventColor = 'text-red-600';
|
|
155
|
-
} else if (eventName === 'changed') {
|
|
156
|
-
eventColor = 'text-blue-600';
|
|
157
|
-
} else if (eventName === 'fetch' || eventName === 'fetched') {
|
|
158
|
-
eventColor = 'text-purple-600';
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
logEntry.innerHTML = `
|
|
162
|
-
<div class="flex items-start gap-2">
|
|
163
|
-
<span class="text-gray-500 text-xs">[${timestamp}]</span>
|
|
164
|
-
<span class="font-semibold ${eventColor}">${eventName.toUpperCase()}</span>
|
|
165
|
-
${details ? `<span class="text-gray-600">${details}</span>` : ''}
|
|
166
|
-
</div>
|
|
167
|
-
`;
|
|
168
|
-
|
|
169
|
-
// Remove "No events yet" message if it exists
|
|
170
|
-
const firstChild = logElement.firstChild;
|
|
171
|
-
if (firstChild && firstChild.textContent.includes('No events yet')) {
|
|
172
|
-
logElement.removeChild(firstChild);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
logElement.insertBefore(logEntry, logElement.firstChild);
|
|
176
|
-
|
|
177
|
-
// Keep only last 50 entries
|
|
178
|
-
while (logElement.children.length > 50) {
|
|
179
|
-
logElement.removeChild(logElement.lastChild);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
function clearEventLog() {
|
|
184
|
-
const logElement = document.getElementById('eventLog');
|
|
185
|
-
logElement.innerHTML = '<div class="text-gray-500">No events yet. Interact with checkboxes to see events...</div>';
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
function updateSelectionDisplay() {
|
|
189
|
-
if (!datatableInstance || typeof datatableInstance.getChecked !== 'function') {
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
try {
|
|
193
|
-
const checkedIds = datatableInstance.getChecked();
|
|
194
|
-
document.getElementById('checkedIds').textContent = JSON.stringify(checkedIds);
|
|
195
|
-
document.getElementById('checkedCount').textContent = checkedIds.length;
|
|
196
|
-
} catch (e) {
|
|
197
|
-
console.error('Error updating selection display:', e);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
// Test functions
|
|
202
|
-
function testCheckAll() {
|
|
203
|
-
if (datatableInstance) {
|
|
204
|
-
datatableInstance.check();
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
function testUncheckAll() {
|
|
209
|
-
if (datatableInstance) {
|
|
210
|
-
datatableInstance.uncheck();
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
function testToggle() {
|
|
215
|
-
if (datatableInstance) {
|
|
216
|
-
datatableInstance.toggle();
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
function testGetChecked() {
|
|
221
|
-
if (datatableInstance) {
|
|
222
|
-
const checkedIds = datatableInstance.getChecked();
|
|
223
|
-
addEventLog('info', `Manual getChecked() call returned: [${checkedIds.join(', ')}]`);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// Initialize the datatable when page loads
|
|
228
|
-
document.addEventListener('DOMContentLoaded', function() {
|
|
229
|
-
setTimeout(() => {
|
|
230
|
-
try {
|
|
231
|
-
// Initialize KTUI components
|
|
232
|
-
if (typeof KTDataTable !== 'undefined') {
|
|
233
|
-
const container = document.getElementById('remote-datatable-container');
|
|
234
|
-
if (container) {
|
|
235
|
-
// Set data attributes for datatable initialization
|
|
236
|
-
container.setAttribute('data-kt-datatable', 'true');
|
|
237
|
-
container.setAttribute('data-kt-datatable-page-size', '5');
|
|
238
|
-
container.setAttribute('data-kt-datatable-api-endpoint', 'https://jsonplaceholder.typicode.com/users');
|
|
239
|
-
|
|
240
|
-
datatableInstance = new KTDataTable(container, {
|
|
241
|
-
apiEndpoint: 'https://jsonplaceholder.typicode.com/users',
|
|
242
|
-
requestMethod: 'GET',
|
|
243
|
-
requestHeaders: {
|
|
244
|
-
'Content-Type': 'application/json'
|
|
245
|
-
},
|
|
246
|
-
columns: {
|
|
247
|
-
'checkbox': {
|
|
248
|
-
render: function(cellData, rowData, context) {
|
|
249
|
-
const checkbox = document.createElement('input');
|
|
250
|
-
checkbox.type = 'checkbox';
|
|
251
|
-
checkbox.value = rowData.id;
|
|
252
|
-
checkbox.setAttribute('data-kt-datatable-row-check', 'true');
|
|
253
|
-
checkbox.className = 'w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 focus:ring-2';
|
|
254
|
-
return checkbox;
|
|
255
|
-
}
|
|
256
|
-
},
|
|
257
|
-
'id': {
|
|
258
|
-
render: function(cellData, rowData, context) {
|
|
259
|
-
return String(cellData);
|
|
260
|
-
}
|
|
261
|
-
},
|
|
262
|
-
'name': {
|
|
263
|
-
render: function(cellData, rowData, context) {
|
|
264
|
-
return String(cellData);
|
|
265
|
-
}
|
|
266
|
-
},
|
|
267
|
-
'email': {
|
|
268
|
-
render: function(cellData, rowData, context) {
|
|
269
|
-
return String(cellData);
|
|
270
|
-
}
|
|
271
|
-
},
|
|
272
|
-
'company': {
|
|
273
|
-
render: function(cellData, rowData, context) {
|
|
274
|
-
return String(cellData);
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
},
|
|
278
|
-
mapResponse: function(response) {
|
|
279
|
-
// JSONPlaceholder returns an array directly
|
|
280
|
-
// Transform nested objects to flat structure and format for datatable
|
|
281
|
-
if (Array.isArray(response)) {
|
|
282
|
-
const transformedData = response.map(user => ({
|
|
283
|
-
checkbox: '', // Empty value for checkbox column
|
|
284
|
-
id: user.id,
|
|
285
|
-
name: user.name,
|
|
286
|
-
email: user.email,
|
|
287
|
-
company: user.company ? user.company.name : ''
|
|
288
|
-
}));
|
|
289
|
-
|
|
290
|
-
// Get current pagination state for client-side pagination
|
|
291
|
-
// Since JSONPlaceholder doesn't support server-side pagination
|
|
292
|
-
// Use 'this' context which refers to the datatable instance
|
|
293
|
-
const state = this.getState();
|
|
294
|
-
const page = state.page || 1;
|
|
295
|
-
const pageSize = state.pageSize || 10;
|
|
296
|
-
|
|
297
|
-
// Slice data for current page (client-side pagination)
|
|
298
|
-
const startIndex = (page - 1) * pageSize;
|
|
299
|
-
const endIndex = startIndex + pageSize;
|
|
300
|
-
const paginatedData = transformedData.slice(startIndex, endIndex);
|
|
301
|
-
|
|
302
|
-
return {
|
|
303
|
-
data: paginatedData,
|
|
304
|
-
totalCount: transformedData.length
|
|
305
|
-
};
|
|
306
|
-
}
|
|
307
|
-
// If already in correct format, return as is
|
|
308
|
-
return response;
|
|
309
|
-
},
|
|
310
|
-
checkbox: {
|
|
311
|
-
preserveSelection: true
|
|
312
|
-
}
|
|
313
|
-
});
|
|
314
|
-
|
|
315
|
-
console.log('✅ Remote DataTable with Checkboxes initialized successfully!');
|
|
316
|
-
|
|
317
|
-
// Attach event listeners using DOM events (without kt-datatable- prefix)
|
|
318
|
-
container.addEventListener('checked', function(event) {
|
|
319
|
-
const checkedIds = datatableInstance.getChecked();
|
|
320
|
-
addEventLog('checked', `Selected ${checkedIds.length} rows: [${checkedIds.join(', ')}]`);
|
|
321
|
-
updateSelectionDisplay();
|
|
322
|
-
});
|
|
323
|
-
|
|
324
|
-
container.addEventListener('unchecked', function(event) {
|
|
325
|
-
const checkedIds = datatableInstance.getChecked();
|
|
326
|
-
addEventLog('unchecked', `Deselected. Remaining: ${checkedIds.length} rows: [${checkedIds.join(', ')}]`);
|
|
327
|
-
updateSelectionDisplay();
|
|
328
|
-
});
|
|
329
|
-
|
|
330
|
-
container.addEventListener('changed', function(event) {
|
|
331
|
-
const checkedIds = datatableInstance.getChecked();
|
|
332
|
-
addEventLog('changed', `Selection changed. Total: ${checkedIds.length} rows: [${checkedIds.join(', ')}]`);
|
|
333
|
-
updateSelectionDisplay();
|
|
334
|
-
});
|
|
335
|
-
|
|
336
|
-
container.addEventListener('fetch', function() {
|
|
337
|
-
addEventLog('fetch', 'Fetching data from server...');
|
|
338
|
-
});
|
|
339
|
-
|
|
340
|
-
container.addEventListener('fetched', function() {
|
|
341
|
-
try {
|
|
342
|
-
const state = datatableInstance.getState();
|
|
343
|
-
addEventLog('fetched', `Loaded ${state.totalItems || 0} total records`);
|
|
344
|
-
// Update selection display after data is loaded
|
|
345
|
-
updateSelectionDisplay();
|
|
346
|
-
} catch (e) {
|
|
347
|
-
console.error('Error in fetched handler:', e);
|
|
348
|
-
}
|
|
349
|
-
});
|
|
350
|
-
} else {
|
|
351
|
-
console.error('❌ DataTable container not found');
|
|
352
|
-
}
|
|
353
|
-
} else {
|
|
354
|
-
console.error('❌ KTDataTable is not defined');
|
|
355
|
-
}
|
|
356
|
-
} catch (error) {
|
|
357
|
-
console.error('❌ Error initializing Remote DataTable: ' + error.message);
|
|
358
|
-
}
|
|
359
|
-
}, 100);
|
|
360
|
-
});
|
|
361
|
-
</script>
|
|
362
|
-
</body>
|
|
363
|
-
|
|
364
|
-
</html>
|
|
365
|
-
|
|
@@ -1,258 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
-
<title>KT DataTable Sorting Test</title>
|
|
7
|
-
<script src="https://cdn.tailwindcss.com"></script>
|
|
8
|
-
<link rel="stylesheet" href="../../dist/styles.css">
|
|
9
|
-
<style>
|
|
10
|
-
/* Custom styles for the test */
|
|
11
|
-
.test-container {
|
|
12
|
-
max-width: 1200px;
|
|
13
|
-
margin: 0 auto;
|
|
14
|
-
padding: 20px;
|
|
15
|
-
}
|
|
16
|
-
.test-header {
|
|
17
|
-
background: #f8f9fa;
|
|
18
|
-
padding: 20px;
|
|
19
|
-
border-radius: 8px;
|
|
20
|
-
margin-bottom: 20px;
|
|
21
|
-
}
|
|
22
|
-
.test-controls {
|
|
23
|
-
display: flex;
|
|
24
|
-
gap: 10px;
|
|
25
|
-
margin-bottom: 20px;
|
|
26
|
-
flex-wrap: wrap;
|
|
27
|
-
}
|
|
28
|
-
.test-button {
|
|
29
|
-
background: #007bff;
|
|
30
|
-
color: white;
|
|
31
|
-
border: none;
|
|
32
|
-
padding: 8px 16px;
|
|
33
|
-
border-radius: 4px;
|
|
34
|
-
cursor: pointer;
|
|
35
|
-
}
|
|
36
|
-
.test-button:hover {
|
|
37
|
-
background: #0056b3;
|
|
38
|
-
}
|
|
39
|
-
.test-status {
|
|
40
|
-
padding: 10px;
|
|
41
|
-
border-radius: 4px;
|
|
42
|
-
margin-top: 10px;
|
|
43
|
-
font-weight: bold;
|
|
44
|
-
}
|
|
45
|
-
.test-pass {
|
|
46
|
-
background: #d4edda;
|
|
47
|
-
color: #155724;
|
|
48
|
-
border: 1px solid #c3e6cb;
|
|
49
|
-
}
|
|
50
|
-
.test-fail {
|
|
51
|
-
background: #f8d7da;
|
|
52
|
-
color: #721c24;
|
|
53
|
-
border: 1px solid #f5c6cb;
|
|
54
|
-
}
|
|
55
|
-
</style>
|
|
56
|
-
</head>
|
|
57
|
-
<body>
|
|
58
|
-
<div class="test-container">
|
|
59
|
-
<!-- Search Input -->
|
|
60
|
-
<div class="mb-4">
|
|
61
|
-
<input
|
|
62
|
-
type="text"
|
|
63
|
-
id="search-input"
|
|
64
|
-
placeholder="Search data..."
|
|
65
|
-
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
|
|
66
|
-
data-kt-datatable-search="#sorting-test-table"
|
|
67
|
-
>
|
|
68
|
-
</div>
|
|
69
|
-
|
|
70
|
-
<!-- DataTable Container using official structure -->
|
|
71
|
-
<div class="kt-card">
|
|
72
|
-
<div class="kt-card-table" data-kt-datatable="true" data-kt-datatable-page-size="5" data-kt-datatable-state-save="true">
|
|
73
|
-
<div class="kt-table-wrapper kt-scrollable">
|
|
74
|
-
<table id="sorting-test-table" class="kt-table" data-kt-datatable-table="true">
|
|
75
|
-
<thead>
|
|
76
|
-
<tr>
|
|
77
|
-
<th scope="col" class="w-20" data-kt-datatable-column="id">
|
|
78
|
-
<span class="kt-table-col">
|
|
79
|
-
<span class="kt-table-col-label">ID</span>
|
|
80
|
-
<span class="kt-table-col-sort"></span>
|
|
81
|
-
</span>
|
|
82
|
-
</th>
|
|
83
|
-
<th scope="col" class="w-32" data-kt-datatable-column="name">
|
|
84
|
-
<span class="kt-table-col">
|
|
85
|
-
<span class="kt-table-col-label">Name</span>
|
|
86
|
-
<span class="kt-table-col-sort"></span>
|
|
87
|
-
</span>
|
|
88
|
-
</th>
|
|
89
|
-
<th scope="col" class="w-40" data-kt-datatable-column="email">
|
|
90
|
-
<span class="kt-table-col">
|
|
91
|
-
<span class="kt-table-col-label">Email</span>
|
|
92
|
-
<span class="kt-table-col-sort"></span>
|
|
93
|
-
</span>
|
|
94
|
-
</th>
|
|
95
|
-
<th scope="col" class="w-32" data-kt-datatable-column="department">
|
|
96
|
-
<span class="kt-table-col">
|
|
97
|
-
<span class="kt-table-col-label">Department</span>
|
|
98
|
-
<span class="kt-table-col-sort"></span>
|
|
99
|
-
</span>
|
|
100
|
-
</th>
|
|
101
|
-
<th scope="col" class="w-24" data-kt-datatable-column="salary">
|
|
102
|
-
<span class="kt-table-col">
|
|
103
|
-
<span class="kt-table-col-label">Salary</span>
|
|
104
|
-
<span class="kt-table-col-sort"></span>
|
|
105
|
-
</span>
|
|
106
|
-
</th>
|
|
107
|
-
<th scope="col" class="w-24" data-kt-datatable-column="status">
|
|
108
|
-
<span class="kt-table-col">
|
|
109
|
-
<span class="kt-table-col-label">Status</span>
|
|
110
|
-
<span class="kt-table-col-sort"></span>
|
|
111
|
-
</span>
|
|
112
|
-
</th>
|
|
113
|
-
</tr>
|
|
114
|
-
</thead>
|
|
115
|
-
<tbody>
|
|
116
|
-
<tr>
|
|
117
|
-
<td>1</td>
|
|
118
|
-
<td>John Doe</td>
|
|
119
|
-
<td>john.doe@example.com</td>
|
|
120
|
-
<td>Engineering</td>
|
|
121
|
-
<td>$75,000</td>
|
|
122
|
-
<td><span class="kt-badge kt-badge-success">Active</span></td>
|
|
123
|
-
</tr>
|
|
124
|
-
<tr>
|
|
125
|
-
<td>2</td>
|
|
126
|
-
<td>Jane Smith</td>
|
|
127
|
-
<td>jane.smith@example.com</td>
|
|
128
|
-
<td>Marketing</td>
|
|
129
|
-
<td>$65,000</td>
|
|
130
|
-
<td><span class="kt-badge kt-badge-success">Active</span></td>
|
|
131
|
-
</tr>
|
|
132
|
-
<tr>
|
|
133
|
-
<td>3</td>
|
|
134
|
-
<td>Mike Johnson</td>
|
|
135
|
-
<td>mike.johnson@example.com</td>
|
|
136
|
-
<td>Engineering</td>
|
|
137
|
-
<td>$80,000</td>
|
|
138
|
-
<td><span class="kt-badge kt-badge-destructive">Inactive</span></td>
|
|
139
|
-
</tr>
|
|
140
|
-
<tr>
|
|
141
|
-
<td>4</td>
|
|
142
|
-
<td>Sarah Wilson</td>
|
|
143
|
-
<td>sarah.wilson@example.com</td>
|
|
144
|
-
<td>Sales</td>
|
|
145
|
-
<td>$70,000</td>
|
|
146
|
-
<td><span class="kt-badge kt-badge-success">Active</span></td>
|
|
147
|
-
</tr>
|
|
148
|
-
<tr>
|
|
149
|
-
<td>5</td>
|
|
150
|
-
<td>David Brown</td>
|
|
151
|
-
<td>david.brown@example.com</td>
|
|
152
|
-
<td>HR</td>
|
|
153
|
-
<td>$60,000</td>
|
|
154
|
-
<td><span class="kt-badge kt-badge-success">Active</span></td>
|
|
155
|
-
</tr>
|
|
156
|
-
<tr>
|
|
157
|
-
<td>6</td>
|
|
158
|
-
<td>Lisa Davis</td>
|
|
159
|
-
<td>lisa.davis@example.com</td>
|
|
160
|
-
<td>Engineering</td>
|
|
161
|
-
<td>$85,000</td>
|
|
162
|
-
<td><span class="kt-badge kt-badge-primary">Verified</span></td>
|
|
163
|
-
</tr>
|
|
164
|
-
<tr>
|
|
165
|
-
<td>7</td>
|
|
166
|
-
<td>Tom Anderson</td>
|
|
167
|
-
<td>tom.anderson@example.com</td>
|
|
168
|
-
<td>Marketing</td>
|
|
169
|
-
<td>$68,000</td>
|
|
170
|
-
<td><span class="kt-badge kt-badge-destructive">Inactive</span></td>
|
|
171
|
-
</tr>
|
|
172
|
-
<tr>
|
|
173
|
-
<td>8</td>
|
|
174
|
-
<td>Emma Taylor</td>
|
|
175
|
-
<td>emma.taylor@example.com</td>
|
|
176
|
-
<td>Sales</td>
|
|
177
|
-
<td>$72,000</td>
|
|
178
|
-
<td><span class="kt-badge kt-badge-success">Active</span></td>
|
|
179
|
-
</tr>
|
|
180
|
-
<tr>
|
|
181
|
-
<td>9</td>
|
|
182
|
-
<td>Chris Miller</td>
|
|
183
|
-
<td>chris.miller@example.com</td>
|
|
184
|
-
<td>Engineering</td>
|
|
185
|
-
<td>$78,000</td>
|
|
186
|
-
<td><span class="kt-badge kt-badge-success">Active</span></td>
|
|
187
|
-
</tr>
|
|
188
|
-
<tr>
|
|
189
|
-
<td>10</td>
|
|
190
|
-
<td>Amy Garcia</td>
|
|
191
|
-
<td>amy.garcia@example.com</td>
|
|
192
|
-
<td>HR</td>
|
|
193
|
-
<td>$62,000</td>
|
|
194
|
-
<td><span class="kt-badge kt-badge-success">Active</span></td>
|
|
195
|
-
</tr>
|
|
196
|
-
</tbody>
|
|
197
|
-
</table>
|
|
198
|
-
</div>
|
|
199
|
-
|
|
200
|
-
<!-- Pagination Info -->
|
|
201
|
-
<div class="flex items-center justify-between mt-4">
|
|
202
|
-
<div class="flex items-center space-x-2">
|
|
203
|
-
<span class="text-sm text-gray-700">Show</span>
|
|
204
|
-
<select data-kt-datatable-size="true" class="border border-gray-300 rounded px-2 py-1">
|
|
205
|
-
<option value="5">5</option>
|
|
206
|
-
<option value="10" selected>10</option>
|
|
207
|
-
<option value="20">20</option>
|
|
208
|
-
<option value="50">50</option>
|
|
209
|
-
</select>
|
|
210
|
-
<span class="text-sm text-gray-700">entries</span>
|
|
211
|
-
</div>
|
|
212
|
-
<div data-kt-datatable-info="true" class="text-sm text-gray-700"></div>
|
|
213
|
-
</div>
|
|
214
|
-
|
|
215
|
-
<!-- Pagination Controls -->
|
|
216
|
-
<div class="flex justify-center mt-4">
|
|
217
|
-
<div data-kt-datatable-pagination="true" class="flex space-x-1"></div>
|
|
218
|
-
</div>
|
|
219
|
-
</div>
|
|
220
|
-
</div>
|
|
221
|
-
</div>
|
|
222
|
-
|
|
223
|
-
<!-- Load KTUI -->
|
|
224
|
-
<script src="../../dist/ktui.js"></script>
|
|
225
|
-
|
|
226
|
-
<script>
|
|
227
|
-
let datatableInstance = null;
|
|
228
|
-
|
|
229
|
-
// Initialize the datatable when page loads
|
|
230
|
-
document.addEventListener('DOMContentLoaded', function() {
|
|
231
|
-
// Wait a bit for the DOM to be fully ready
|
|
232
|
-
setTimeout(() => {
|
|
233
|
-
try {
|
|
234
|
-
// Initialize KTUI components using official method
|
|
235
|
-
if (typeof KTDataTable !== 'undefined') {
|
|
236
|
-
KTDataTable.init();
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
// Get the datatable instance using official API
|
|
240
|
-
const container = document.querySelector('[data-kt-datatable="true"]');
|
|
241
|
-
if (container) {
|
|
242
|
-
datatableInstance = KTDataTable.getInstance(container);
|
|
243
|
-
if (datatableInstance) {
|
|
244
|
-
console.log('✅ DataTable initialized successfully using official API!');
|
|
245
|
-
} else {
|
|
246
|
-
console.error('❌ Failed to get DataTable instance');
|
|
247
|
-
}
|
|
248
|
-
} else {
|
|
249
|
-
console.error('❌ DataTable container not found');
|
|
250
|
-
}
|
|
251
|
-
} catch (error) {
|
|
252
|
-
console.error('❌ Error initializing DataTable: ' + error.message);
|
|
253
|
-
}
|
|
254
|
-
}, 100);
|
|
255
|
-
});
|
|
256
|
-
</script>
|
|
257
|
-
</body>
|
|
258
|
-
</html>
|