|
1 | 1 | import React, { useState, useEffect, useCallback, useMemo, useRef } from 'react'; |
2 | 2 | import { useNavigate } from 'react-router-dom'; |
3 | 3 | import { SelectedResource, DbInfo, BreadcrumbItem, CosmosDBAccount, CollectionInfo } from '../types'; |
4 | | -import { getDocuments, getCollectionInfo, findDocumentById, getDatabasesForAccount, clearDocumentsCache, getSingleDocument } from '../services/dbService'; |
| 4 | +import { getDocuments, getCollectionInfo, findDocumentById, getDatabasesForAccount, clearDocumentsCache, getSingleDocument, getDocumentsQueryCode } from '../services/dbService'; |
5 | 5 | import { extractSchemaTree, SchemaKeyNode } from '../utils/schemaUtils'; |
6 | 6 | import MongoIcon from '../components/icons/MongoIcon'; |
7 | 7 | import { isEqual, omit } from 'lodash'; |
@@ -351,6 +351,9 @@ const DataExplorerPage: React.FC<DataExplorerPageProps> = ({ |
351 | 351 | const maxCardWidth = 600; |
352 | 352 | const prevPinnedCount = useRef(pinnedDocuments.length); |
353 | 353 |
|
| 354 | + // --- Export Query State --- |
| 355 | + const [copiedQuery, setCopiedQuery] = useState(false); |
| 356 | + |
354 | 357 | // --- Theme State --- |
355 | 358 | const { theme, toggleTheme } = useTheme(); |
356 | 359 |
|
@@ -1352,13 +1355,45 @@ const DataExplorerPage: React.FC<DataExplorerPageProps> = ({ |
1352 | 1355 | )} |
1353 | 1356 | </div> |
1354 | 1357 | ))} |
1355 | | - <button |
1356 | | - onClick={addFilter} |
1357 | | - disabled={!selectedCollection || isFetchingSchema} |
1358 | | - className="w-full flex justify-center items-center gap-1 p-2 text-sm font-medium text-slate-600 dark:text-slate-300 bg-slate-100 dark:bg-slate-700/50 hover:bg-slate-200 dark:hover:bg-slate-600 border border-slate-300 dark:border-slate-600 rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed" |
1359 | | - > |
1360 | | - <span>+ Add Filter</span> |
1361 | | - </button> |
| 1358 | + <div className="flex gap-2"> |
| 1359 | + <button |
| 1360 | + onClick={addFilter} |
| 1361 | + disabled={!selectedCollection || isFetchingSchema} |
| 1362 | + className="flex-1 flex justify-center items-center gap-1 p-2 text-sm font-medium text-slate-600 dark:text-slate-300 bg-slate-100 dark:bg-slate-700/50 hover:bg-slate-200 dark:hover:bg-slate-600 border border-slate-300 dark:border-slate-600 rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed" |
| 1363 | + > |
| 1364 | + <span>+ Add Filter</span> |
| 1365 | + </button> |
| 1366 | + <button |
| 1367 | + onClick={() => { |
| 1368 | + if (!selectedCollection) return; |
| 1369 | + |
| 1370 | + const validFilters = debouncedFilters.map(f => ({ |
| 1371 | + key: f.key, |
| 1372 | + value: getCoercedFilterValue(f.value), |
| 1373 | + operator: f.operator || 'equals', |
| 1374 | + type: f.type || 'string' |
| 1375 | + })); |
| 1376 | + |
| 1377 | + getDocumentsQueryCode(selectedCollection, currentResource, undefined, validFilters) |
| 1378 | + .then((queryCodeStr) => { |
| 1379 | + navigator.clipboard.writeText(queryCodeStr).then(() => { |
| 1380 | + setCopiedQuery(true); |
| 1381 | + setTimeout(() => setCopiedQuery(false), 2000); |
| 1382 | + }); |
| 1383 | + }) |
| 1384 | + .catch(err => { |
| 1385 | + console.error("Failed to generate query code:", err); |
| 1386 | + alert("Failed to generate query code: " + err.message); |
| 1387 | + }); |
| 1388 | + }} |
| 1389 | + disabled={!selectedCollection || isFetchingSchema} |
| 1390 | + className="flex justify-center items-center gap-2 p-2 px-3 text-sm font-medium text-slate-600 dark:text-slate-300 bg-white dark:bg-slate-700 hover:bg-slate-50 dark:hover:bg-slate-600 border border-slate-300 dark:border-slate-600 rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed" |
| 1391 | + title="Export current filter criteria as Python script (MongoDB PyMongo)" |
| 1392 | + > |
| 1393 | + {copiedQuery ? <CheckIcon className="w-4 h-4 text-green-500" /> : <FileCopyIcon className="w-4 h-4" />} |
| 1394 | + <span>Export</span> |
| 1395 | + </button> |
| 1396 | + </div> |
1362 | 1397 | </div> |
1363 | 1398 | </div> |
1364 | 1399 | <div className="flex-grow overflow-hidden"> |
|
0 commit comments