django-cfg 1.2.8__py3-none-any.whl → 1.2.9__py3-none-any.whl
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.
- django_cfg/__init__.py +1 -1
- django_cfg/templates/admin/snippets/components/django_commands.html +180 -56
- {django_cfg-1.2.8.dist-info → django_cfg-1.2.9.dist-info}/METADATA +1 -1
- {django_cfg-1.2.8.dist-info → django_cfg-1.2.9.dist-info}/RECORD +7 -7
- {django_cfg-1.2.8.dist-info → django_cfg-1.2.9.dist-info}/WHEEL +0 -0
- {django_cfg-1.2.8.dist-info → django_cfg-1.2.9.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.2.8.dist-info → django_cfg-1.2.9.dist-info}/licenses/LICENSE +0 -0
django_cfg/__init__.py
CHANGED
@@ -3,16 +3,39 @@
|
|
3
3
|
<!-- Django Commands Section -->
|
4
4
|
<div class="mt-8 w-full">
|
5
5
|
<!-- Header -->
|
6
|
-
<div class="flex items-center mb-6">
|
7
|
-
<div class="flex items-center
|
8
|
-
<
|
6
|
+
<div class="flex items-center justify-between mb-6">
|
7
|
+
<div class="flex items-center">
|
8
|
+
<div class="flex items-center justify-center w-8 h-8 bg-purple-100 dark:bg-purple-900/20 rounded-lg mr-3">
|
9
|
+
<span class="material-icons text-purple-600 dark:text-purple-400 text-lg">terminal</span>
|
10
|
+
</div>
|
11
|
+
<h2 class="text-xl font-semibold text-font-important-light dark:text-font-important-dark">
|
12
|
+
Django Commands
|
13
|
+
</h2>
|
14
|
+
<span class="ml-4 text-xs text-font-subtle-light dark:text-font-subtle-dark bg-base-100 dark:bg-base-800 px-2 py-1 rounded-full">
|
15
|
+
<span id="commandsCount">{{ django_commands.total_commands }}</span> commands
|
16
|
+
</span>
|
17
|
+
</div>
|
18
|
+
|
19
|
+
<!-- Search Box -->
|
20
|
+
<div class="flex items-center space-x-3">
|
21
|
+
<div class="bg-white border border-base-200 flex flex-row items-center px-3 rounded-default relative shadow-xs w-64 focus-within:outline-2 focus-within:-outline-offset-2 focus-within:outline-primary-600 dark:bg-base-900 dark:border-base-700">
|
22
|
+
<span class="material-symbols-outlined md-18 text-base-400 dark:text-base-500">search</span>
|
23
|
+
<input
|
24
|
+
type="text"
|
25
|
+
id="commandSearch"
|
26
|
+
placeholder="Search commands..."
|
27
|
+
class="grow font-medium min-w-0 overflow-hidden p-2 placeholder-font-subtle-light truncate focus:outline-hidden dark:bg-base-900 dark:placeholder-font-subtle-dark dark:text-font-default-dark"
|
28
|
+
oninput="searchCommands(this.value)"
|
29
|
+
>
|
30
|
+
</div>
|
31
|
+
<button
|
32
|
+
id="clearSearch"
|
33
|
+
onclick="clearSearch()"
|
34
|
+
class="px-3 py-2 text-xs text-font-subtle-light dark:text-font-subtle-dark hover:text-font-default-light dark:hover:text-font-default-dark transition-colors hidden"
|
35
|
+
>
|
36
|
+
Clear
|
37
|
+
</button>
|
9
38
|
</div>
|
10
|
-
<h2 class="text-xl font-semibold text-font-important-light dark:text-font-important-dark">
|
11
|
-
Django Commands
|
12
|
-
</h2>
|
13
|
-
<span class="ml-auto text-xs text-font-subtle-light dark:text-font-subtle-dark bg-base-100 dark:bg-base-800 px-2 py-1 rounded-full">
|
14
|
-
{{ django_commands.total_commands }} commands
|
15
|
-
</span>
|
16
39
|
</div>
|
17
40
|
|
18
41
|
{% if django_commands.categorized %}
|
@@ -44,11 +67,11 @@
|
|
44
67
|
<div class="p-4">
|
45
68
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
46
69
|
{% for command in commands %}
|
47
|
-
<div class="bg-white dark:bg-base-900 rounded-lg border border-base-200 dark:border-base-700 hover:shadow-lg dark:hover:shadow-base-900/50 transition-all duration-200 overflow-hidden">
|
70
|
+
<div class="command-item bg-white dark:bg-base-900 rounded-lg border border-base-200 dark:border-base-700 hover:shadow-lg dark:hover:shadow-base-900/50 transition-all duration-200 overflow-hidden">
|
48
71
|
<!-- Card Header -->
|
49
72
|
<div class="p-4 border-b border-base-100 dark:border-base-700">
|
50
73
|
<div class="flex items-center justify-between mb-2">
|
51
|
-
<code class="text-sm font-mono bg-base-100 dark:bg-base-700 px-2 py-1 rounded-lg text-font-default-light dark:text-font-default-dark">
|
74
|
+
<code class="command-name text-sm font-mono bg-base-100 dark:bg-base-700 px-2 py-1 rounded-lg text-font-default-light dark:text-font-default-dark">
|
52
75
|
{{ command.name }}
|
53
76
|
</code>
|
54
77
|
<div class="flex items-center space-x-1">
|
@@ -74,7 +97,7 @@
|
|
74
97
|
<div class="p-4">
|
75
98
|
<!-- Description -->
|
76
99
|
{% if command.description %}
|
77
|
-
<p class="text-sm text-font-default-light dark:text-font-default-dark mb-3 line-clamp-2">
|
100
|
+
<p class="command-description text-sm text-font-default-light dark:text-font-default-dark mb-3 line-clamp-2">
|
78
101
|
{{ command.description }}
|
79
102
|
</p>
|
80
103
|
{% endif %}
|
@@ -126,49 +149,6 @@
|
|
126
149
|
{% endfor %}
|
127
150
|
</div>
|
128
151
|
|
129
|
-
<!-- Summary Stats -->
|
130
|
-
<div class="mt-6 grid grid-cols-1 md:grid-cols-4 gap-4">
|
131
|
-
<div class="bg-white dark:bg-base-900 rounded-lg p-4 border border-base-200 dark:border-base-700">
|
132
|
-
<div class="flex items-center">
|
133
|
-
<span class="material-icons text-blue-600 dark:text-blue-400 mr-3">terminal</span>
|
134
|
-
<div>
|
135
|
-
<h3 class="text-lg font-semibold text-font-default-light dark:text-font-default-dark">{{ django_commands.total_commands }}</h3>
|
136
|
-
<p class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Total Commands</p>
|
137
|
-
</div>
|
138
|
-
</div>
|
139
|
-
</div>
|
140
|
-
|
141
|
-
<div class="bg-white dark:bg-base-900 rounded-lg p-4 border border-base-200 dark:border-base-700">
|
142
|
-
<div class="flex items-center">
|
143
|
-
<span class="material-icons text-green-600 dark:text-green-400 mr-3">settings</span>
|
144
|
-
<div>
|
145
|
-
<h3 class="text-lg font-semibold text-font-default-light dark:text-font-default-dark">{{ django_commands.core_commands }}</h3>
|
146
|
-
<p class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Core Commands</p>
|
147
|
-
</div>
|
148
|
-
</div>
|
149
|
-
</div>
|
150
|
-
|
151
|
-
<div class="bg-white dark:bg-base-900 rounded-lg p-4 border border-base-200 dark:border-base-700">
|
152
|
-
<div class="flex items-center">
|
153
|
-
<span class="material-icons text-indigo-600 dark:text-indigo-400 mr-3">apps</span>
|
154
|
-
<div>
|
155
|
-
<h3 class="text-lg font-semibold text-font-default-light dark:text-font-default-dark">{{ django_commands.custom_commands }}</h3>
|
156
|
-
<p class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Custom Commands</p>
|
157
|
-
</div>
|
158
|
-
</div>
|
159
|
-
</div>
|
160
|
-
|
161
|
-
<div class="bg-white dark:bg-base-900 rounded-lg p-4 border border-base-200 dark:border-base-700">
|
162
|
-
<div class="flex items-center">
|
163
|
-
<span class="material-icons text-purple-600 dark:text-purple-400 mr-3">category</span>
|
164
|
-
<div>
|
165
|
-
<h3 class="text-lg font-semibold text-font-default-light dark:text-font-default-dark">{{ django_commands.categories|length }}</h3>
|
166
|
-
<p class="text-sm text-font-subtle-light dark:text-font-subtle-dark">Categories</p>
|
167
|
-
</div>
|
168
|
-
</div>
|
169
|
-
</div>
|
170
|
-
</div>
|
171
|
-
|
172
152
|
{% else %}
|
173
153
|
<!-- No Commands -->
|
174
154
|
<div class="text-center py-12">
|
@@ -230,4 +210,148 @@
|
|
230
210
|
</div>
|
231
211
|
</div>
|
232
212
|
|
233
|
-
<!--
|
213
|
+
<!-- JavaScript for command search functionality -->
|
214
|
+
<script>
|
215
|
+
function searchCommands(query) {
|
216
|
+
const searchQuery = query.toLowerCase().trim();
|
217
|
+
const categories = document.querySelectorAll('[id^="content-"]');
|
218
|
+
const clearButton = document.getElementById('clearSearch');
|
219
|
+
const commandsCount = document.getElementById('commandsCount');
|
220
|
+
let visibleCommands = 0;
|
221
|
+
|
222
|
+
// Show/hide clear button
|
223
|
+
if (searchQuery) {
|
224
|
+
clearButton.classList.remove('hidden');
|
225
|
+
} else {
|
226
|
+
clearButton.classList.add('hidden');
|
227
|
+
}
|
228
|
+
|
229
|
+
categories.forEach(category => {
|
230
|
+
const categoryName = category.id.replace('content-', '');
|
231
|
+
const commands = category.querySelectorAll('.command-item');
|
232
|
+
let categoryHasVisibleCommands = false;
|
233
|
+
|
234
|
+
commands.forEach(command => {
|
235
|
+
const commandName = command.querySelector('.command-name').textContent.toLowerCase();
|
236
|
+
const commandDesc = command.querySelector('.command-description')?.textContent.toLowerCase() || '';
|
237
|
+
|
238
|
+
if (!searchQuery || commandName.includes(searchQuery) || commandDesc.includes(searchQuery)) {
|
239
|
+
command.style.display = 'block';
|
240
|
+
categoryHasVisibleCommands = true;
|
241
|
+
visibleCommands++;
|
242
|
+
} else {
|
243
|
+
command.style.display = 'none';
|
244
|
+
}
|
245
|
+
});
|
246
|
+
|
247
|
+
// Show/hide category based on whether it has visible commands
|
248
|
+
const categoryHeader = document.querySelector(`button[onclick="toggleCategory('${categoryName}')"]`);
|
249
|
+
const categoryContainer = categoryHeader.parentElement;
|
250
|
+
|
251
|
+
if (categoryHasVisibleCommands) {
|
252
|
+
categoryContainer.style.display = 'block';
|
253
|
+
|
254
|
+
// Auto-expand categories when searching
|
255
|
+
if (searchQuery) {
|
256
|
+
category.style.display = 'block';
|
257
|
+
const icon = categoryHeader.querySelector('.material-icons');
|
258
|
+
if (icon) {
|
259
|
+
icon.textContent = 'expand_less';
|
260
|
+
icon.style.transform = 'rotate(0deg)';
|
261
|
+
}
|
262
|
+
}
|
263
|
+
} else {
|
264
|
+
categoryContainer.style.display = 'none';
|
265
|
+
}
|
266
|
+
});
|
267
|
+
|
268
|
+
// Update commands count
|
269
|
+
commandsCount.textContent = visibleCommands;
|
270
|
+
|
271
|
+
// Show "no results" message if no commands found
|
272
|
+
showNoResultsMessage(visibleCommands === 0 && searchQuery);
|
273
|
+
}
|
274
|
+
|
275
|
+
function clearSearch() {
|
276
|
+
const searchInput = document.getElementById('commandSearch');
|
277
|
+
const clearButton = document.getElementById('clearSearch');
|
278
|
+
const commandsCount = document.getElementById('commandsCount');
|
279
|
+
|
280
|
+
searchInput.value = '';
|
281
|
+
clearButton.classList.add('hidden');
|
282
|
+
|
283
|
+
// Show all commands and categories
|
284
|
+
const categories = document.querySelectorAll('[id^="content-"]');
|
285
|
+
const allCommands = document.querySelectorAll('.command-item');
|
286
|
+
|
287
|
+
categories.forEach(category => {
|
288
|
+
const categoryName = category.id.replace('content-', '');
|
289
|
+
const categoryHeader = document.querySelector(`button[onclick="toggleCategory('${categoryName}')"]`);
|
290
|
+
categoryHeader.parentElement.style.display = 'block';
|
291
|
+
// Reset to collapsed state
|
292
|
+
category.style.display = 'none';
|
293
|
+
const icon = categoryHeader.querySelector('.material-icons');
|
294
|
+
if (icon) {
|
295
|
+
icon.textContent = 'expand_less';
|
296
|
+
icon.style.transform = 'rotate(-90deg)';
|
297
|
+
}
|
298
|
+
});
|
299
|
+
|
300
|
+
allCommands.forEach(command => {
|
301
|
+
command.style.display = 'block';
|
302
|
+
});
|
303
|
+
|
304
|
+
// Reset commands count
|
305
|
+
commandsCount.textContent = '{{ django_commands.total_commands }}';
|
306
|
+
|
307
|
+
// Hide no results message
|
308
|
+
showNoResultsMessage(false);
|
309
|
+
}
|
310
|
+
|
311
|
+
function showNoResultsMessage(show) {
|
312
|
+
let noResultsDiv = document.getElementById('noSearchResults');
|
313
|
+
|
314
|
+
if (show && !noResultsDiv) {
|
315
|
+
// Create no results message
|
316
|
+
noResultsDiv = document.createElement('div');
|
317
|
+
noResultsDiv.id = 'noSearchResults';
|
318
|
+
noResultsDiv.className = 'text-center py-12';
|
319
|
+
noResultsDiv.innerHTML = `
|
320
|
+
<div class="flex flex-col items-center">
|
321
|
+
<span class="material-icons text-6xl text-base-400 dark:text-base-500 mb-4">search_off</span>
|
322
|
+
<h3 class="text-lg font-medium text-font-important-light dark:text-font-important-dark mb-2">
|
323
|
+
No Commands Found
|
324
|
+
</h3>
|
325
|
+
<p class="text-font-subtle-light dark:text-font-subtle-dark max-w-md mx-auto">
|
326
|
+
No commands match your search criteria. Try different keywords or clear the search.
|
327
|
+
</p>
|
328
|
+
</div>
|
329
|
+
`;
|
330
|
+
|
331
|
+
// Insert after the commands container
|
332
|
+
const commandsContainer = document.querySelector('.space-y-4');
|
333
|
+
commandsContainer.parentNode.insertBefore(noResultsDiv, commandsContainer.nextSibling);
|
334
|
+
} else if (!show && noResultsDiv) {
|
335
|
+
noResultsDiv.remove();
|
336
|
+
}
|
337
|
+
}
|
338
|
+
|
339
|
+
// Add search keyboard shortcuts
|
340
|
+
document.addEventListener('DOMContentLoaded', function() {
|
341
|
+
const searchInput = document.getElementById('commandSearch');
|
342
|
+
|
343
|
+
// Focus search with Ctrl+F or Cmd+F
|
344
|
+
document.addEventListener('keydown', function(e) {
|
345
|
+
if ((e.ctrlKey || e.metaKey) && e.key === 'f') {
|
346
|
+
e.preventDefault();
|
347
|
+
searchInput.focus();
|
348
|
+
}
|
349
|
+
|
350
|
+
// Clear search with Escape
|
351
|
+
if (e.key === 'Escape' && document.activeElement === searchInput) {
|
352
|
+
clearSearch();
|
353
|
+
searchInput.blur();
|
354
|
+
}
|
355
|
+
});
|
356
|
+
});
|
357
|
+
</script>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: django-cfg
|
3
|
-
Version: 1.2.
|
3
|
+
Version: 1.2.9
|
4
4
|
Summary: 🚀 Next-gen Django configuration: type-safety, AI features, blazing-fast setup, and automated best practices — all in one.
|
5
5
|
Project-URL: Homepage, https://django-cfg.com
|
6
6
|
Project-URL: Documentation, https://django-cfg.com
|
@@ -1,5 +1,5 @@
|
|
1
1
|
django_cfg/README.md,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
django_cfg/__init__.py,sha256=
|
2
|
+
django_cfg/__init__.py,sha256=GUdqKMqGZ0XnY9fwb5M8zW1abvs6mUj3UNShKL60JbE,1630
|
3
3
|
django_cfg/apps.py,sha256=k84brkeXJI7EgKZLEpTkM9YFZofKI4PzhFOn1cl9Msc,1656
|
4
4
|
django_cfg/config.py,sha256=0cuRJVEnf03WzvEqhwzLvn9Zi1805C5KG1yk27ekABA,1190
|
5
5
|
django_cfg/urls.py,sha256=bpRFjMonQuk4UCUMxx4ueBX3YDNB7HXKFwEghQ3KR3o,793
|
@@ -438,7 +438,7 @@ django_cfg/templates/admin/import_export/change_list_import_export.html,sha256=K
|
|
438
438
|
django_cfg/templates/admin/layouts/dashboard_with_tabs.html,sha256=wxtJWKhTtMH9cz_JIY-cj5AHIzIxGfpxeqFz1OwTD6k,18219
|
439
439
|
django_cfg/templates/admin/snippets/components/activity_tracker.html,sha256=FDiS4SfTiXBYWCWUWNyF7BPx05Bj4_wiFJ2RQSej5GU,3085
|
440
440
|
django_cfg/templates/admin/snippets/components/charts_section.html,sha256=sPjWvCc0y50gIOhpfloF6s9uT9XHc_S0u1eC3zZ6DwY,5401
|
441
|
-
django_cfg/templates/admin/snippets/components/django_commands.html,sha256=
|
441
|
+
django_cfg/templates/admin/snippets/components/django_commands.html,sha256=SQT9Rl4uVbh9Dnp_e_dUdUhhyQfCJttqpoLUbaW4EMk,20230
|
442
442
|
django_cfg/templates/admin/snippets/components/quick_actions.html,sha256=AZ-93LK5TVvDdoTexrKGjoluKTRXAr9vQpj7OkFxj3s,4020
|
443
443
|
django_cfg/templates/admin/snippets/components/recent_activity.html,sha256=eWFII320pZL3S6hxCcdWKCwWjjn7bEERotjvVqGDAYU,1713
|
444
444
|
django_cfg/templates/admin/snippets/components/recent_users_table.html,sha256=xqlKawGT7RMLg1lDhW5vYsJuIjB2thvRgtjGMhoRVJo,6551
|
@@ -461,8 +461,8 @@ django_cfg/utils/path_resolution.py,sha256=C9As6p4Q9l3VeoVkFDRPQWGrzAWf8O8UxLVka
|
|
461
461
|
django_cfg/utils/smart_defaults.py,sha256=b6A1z7VO1NJGq0oUQXN5P97c3k_Ssgw6qUi0mK-4TlM,19786
|
462
462
|
django_cfg/utils/toolkit.py,sha256=Td8_iXNaftonF_xdZP4Y3uO65nuA_4_zditn5Q_Pfcw,23310
|
463
463
|
django_cfg/utils/version_check.py,sha256=jI4v3YMdQriUEeb_TvRl511sDghy6I75iKRDUaNpucs,4800
|
464
|
-
django_cfg-1.2.
|
465
|
-
django_cfg-1.2.
|
466
|
-
django_cfg-1.2.
|
467
|
-
django_cfg-1.2.
|
468
|
-
django_cfg-1.2.
|
464
|
+
django_cfg-1.2.9.dist-info/METADATA,sha256=35EHhp9QoBO442D3LE_jF7UxU1VaF_UM723VMXOEkwY,45638
|
465
|
+
django_cfg-1.2.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
466
|
+
django_cfg-1.2.9.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
|
467
|
+
django_cfg-1.2.9.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
|
468
|
+
django_cfg-1.2.9.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|