')
+ .css('display', 'flex')
+ .css('align-items', 'center');
+
+ const label = $('
')
+ .text('Similarity Factor:')
+ .css('margin-right', '8px');
+
+ const editor = $('')
+ .dxNumberBox({
+ value: similarityFactor,
+ min: 0,
+ max: 1,
+ format: '0.00',
+ step: 0.05,
+ showSpinButtons: true,
+ inputAttr: { 'aria-label': 'Similarity Factor' },
+ onValueChanged(e) {
+ similarityFactor = e.value;
+ if (searchValue !== '') {
+ dataGrid.getDataSource().reload();
+ }
+ },
+ });
+
+ return container.append(label, editor);
+ },
+ },
+ {
+ name: 'searchPanel',
+ },
+ ],
+ },
+ onEditorPreparing(e) {
+ if (e.parentType === 'searchPanel') {
+ let searchTimeout;
+ e.editorOptions.onValueChanged = (args) => {
+ clearTimeout(searchTimeout);
+ searchTimeout = setTimeout(() => {
+ searchValue = args.value;
+ e.component.getDataSource().reload();
+ }, e.updateValueTimeout);
+ };
+ e.editorOptions.placeholder = 'Try: clothing';
+ }
+ },
+ }).dxDataGrid('instance');
+});
diff --git a/apps/demos/menuMeta.json b/apps/demos/menuMeta.json
index 615934456789..f761c41660c8 100644
--- a/apps/demos/menuMeta.json
+++ b/apps/demos/menuMeta.json
@@ -37,6 +37,35 @@
"Modules": "openai"
}
]
+ },
+ {
+ "Name": "Semantic Search",
+ "Equivalents": "",
+ "Demos": [
+ {
+ "Title": "Semantic Search",
+ "Name": "SemanticSearch",
+ "Widget": "DataGrid",
+ "Badge": "AI",
+ "DemoType": "Web",
+ "Modules": "devextreme-aspnet-data-nojquery",
+ "MvcAdditionalFiles": [
+ "/DataProviders/SmartFilterProvider.cs",
+ "/Controllers/ApiControllers/DataGridSemanticSearchController.cs",
+ "/Services/EmbeddingsInitializerService.cs",
+ "/Models/DataGrid/DictionaryItem.cs",
+ "/Models/SampleData/DictionaryItems.cs"
+ ],
+ "BackendFiles": [
+ "SmartFilterProvider.cs",
+ "DataGridSemanticSearchController.cs",
+ "EmbeddingsInitializerService.cs",
+ "DictionaryItem.cs"
+ ],
+ "TopLevel": true,
+ "Equivalents": "AI-Powered Search, Smart Search, Context-Aware Search, Natural Language Search, AI Search, Semantic Retrieval, Similarity Search"
+ }
+ ]
}
]
},
@@ -312,6 +341,28 @@
"/Models/SampleData/DataGridEmployees.cs"
],
"DemoType": "Web"
+ },
+ {
+ "Title": "Semantic Search",
+ "Name": "SemanticSearch",
+ "Widget": "DataGrid",
+ "Badge": "AI",
+ "DemoType": "Web",
+ "Modules": "devextreme-aspnet-data-nojquery",
+ "MvcAdditionalFiles": [
+ "/DataProviders/SmartFilterProvider.cs",
+ "/Controllers/ApiControllers/DataGridSemanticSearchController.cs",
+ "/Services/EmbeddingsInitializerService.cs",
+ "/Models/DataGrid/DictionaryItem.cs",
+ "/Models/SampleData/DictionaryItems.cs"
+ ],
+ "BackendFiles": [
+ "SmartFilterProvider.cs",
+ "DataGridSemanticSearchController.cs",
+ "EmbeddingsInitializerService.cs",
+ "DictionaryItem.cs"
+ ],
+ "Equivalents": "AI-Powered Search, Smart Search, Context-Aware Search, Natural Language Search, AI Search, Semantic Retrieval, Similarity Search"
}
]
},
diff --git a/apps/demos/testing/etalons/DataGrid-SemanticSearch (fluent.blue.light).png b/apps/demos/testing/etalons/DataGrid-SemanticSearch (fluent.blue.light).png
new file mode 100644
index 000000000000..826709c5a1e1
Binary files /dev/null and b/apps/demos/testing/etalons/DataGrid-SemanticSearch (fluent.blue.light).png differ
diff --git a/apps/demos/testing/etalons/DataGrid-SemanticSearch (material.blue.light).png b/apps/demos/testing/etalons/DataGrid-SemanticSearch (material.blue.light).png
new file mode 100644
index 000000000000..7c2ab3efa148
Binary files /dev/null and b/apps/demos/testing/etalons/DataGrid-SemanticSearch (material.blue.light).png differ
diff --git a/apps/demos/utils/server/csp-server.js b/apps/demos/utils/server/csp-server.js
index c3523e7a7413..5b2243644fd6 100644
--- a/apps/demos/utils/server/csp-server.js
+++ b/apps/demos/utils/server/csp-server.js
@@ -91,6 +91,9 @@ const CSP_DEMO_ALLOWLIST = {
'DataGrid/RemoteVirtualScrolling': {
'img-src': ['data:'],
},
+ 'DataGrid/SemanticSearch': {
+ 'img-src': ['data:'],
+ },
'DataGrid/VirtualScrolling': {
'img-src': ['data:'],
},