From 0d84746831462216a50d5ef9522eae04f4fe416a Mon Sep 17 00:00:00 2001 From: Kolea PLESCO Date: Fri, 20 Dec 2024 00:47:42 +0200 Subject: [PATCH 01/51] Minor improvements and fixes --- .../backend/fields_registry/entrypoints/api/routes.py | 2 +- .../backend/package_importer/entrypoints/api/routes.py | 2 +- .../package_importer/services/import_mapping_suite.py | 10 ++++++---- .../frontend/src/api/mapping-packages/index.js | 3 ++- .../sections/app/mapping-package/package-importer.js | 3 +-- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/mapping_workbench/backend/fields_registry/entrypoints/api/routes.py b/mapping_workbench/backend/fields_registry/entrypoints/api/routes.py index ec420e58..2978b4b2 100644 --- a/mapping_workbench/backend/fields_registry/entrypoints/api/routes.py +++ b/mapping_workbench/backend/fields_registry/entrypoints/api/routes.py @@ -194,7 +194,7 @@ async def route_search_structural_elements_versioned_view_by_eforms_version( status_code=status.HTTP_201_CREATED ) async def route_task_import_eforms_xsd( - github_repository_url: str = Form(...), + github_repository_url: str = Form(default=None), branch_or_tag_name: str = Form(...), project_id: PydanticObjectId = Form(...), user: User = Depends(current_active_user) diff --git a/mapping_workbench/backend/package_importer/entrypoints/api/routes.py b/mapping_workbench/backend/package_importer/entrypoints/api/routes.py index c57a5608..653b92ea 100644 --- a/mapping_workbench/backend/package_importer/entrypoints/api/routes.py +++ b/mapping_workbench/backend/package_importer/entrypoints/api/routes.py @@ -48,7 +48,7 @@ async def route_import_package_archive( user: User = Depends(current_active_user) ): imported_mapping_package: ImportedMappingSuiteResponse = await import_mapping_package_from_archive( - file.file.read(), await get_project(project), package_type, user + file.file.read(), await get_project(project), package_type, False, user ) return imported_mapping_package diff --git a/mapping_workbench/backend/package_importer/services/import_mapping_suite.py b/mapping_workbench/backend/package_importer/services/import_mapping_suite.py index 23c7c9be..e5d0871e 100644 --- a/mapping_workbench/backend/package_importer/services/import_mapping_suite.py +++ b/mapping_workbench/backend/package_importer/services/import_mapping_suite.py @@ -31,7 +31,6 @@ async def import_mapping_package( package_type: PackageType, user: User = None, task_response: TaskResponse = None ) -> ImportedMappingSuiteResponse: - MappingPackageStructureValidator(mapping_package_dir_path).validate() if package_type == PackageType.STANDARD: @@ -62,7 +61,9 @@ async def import_and_process_mapping_package_from_archive( ) -> ImportedMappingSuiteResponse: if not task_response: task_response = TaskResponse() - result = await import_mapping_package_from_archive(file_content, project, package_type, cleanup_project, user, task_response) + result = await import_mapping_package_from_archive( + file_content, project, package_type, cleanup_project, user, task_response + ) await process_mapping_package( package_id=result.mapping_package.id, @@ -75,7 +76,8 @@ async def import_and_process_mapping_package_from_archive( async def import_mapping_package_from_archive( file_content: bytes, project: Project, package_type: PackageType, - cleanup_project: bool = False, user: User = None, + cleanup_project: bool = False, + user: User = None, task_response: TaskResponse = None ) -> ImportedMappingSuiteResponse: if not task_response: @@ -84,7 +86,7 @@ async def import_mapping_package_from_archive( tempdir = tempfile.TemporaryDirectory() tempdir_name = tempdir.name tempdir_path = pathlib.Path(tempdir_name) - zf.extractall(tempdir_name) # NOSONAR + zf.extractall(tempdir_name) # NOSONAR dir_contents = list(tempdir_path.iterdir()) try: assert len(dir_contents) == 1, "Archive must contain only the package folder!" diff --git a/mapping_workbench/frontend/src/api/mapping-packages/index.js b/mapping_workbench/frontend/src/api/mapping-packages/index.js index 4bee6cdc..c54ea14e 100644 --- a/mapping_workbench/frontend/src/api/mapping-packages/index.js +++ b/mapping_workbench/frontend/src/api/mapping-packages/index.js @@ -9,7 +9,8 @@ export const PACKAGE_TYPE = { EFORMS: 'eForms', STANDARD: 'Standard' }; -export const DEFAULT_PACKAGE_TYPE = "EFORMS"; +export const EFORMS_PACKAGE_TYPE = "EFORMS"; +export const DEFAULT_PACKAGE_TYPE = EFORMS_PACKAGE_TYPE; class MappingPackagesApi extends SectionApi { get SECTION_TITLE() { diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/package-importer.js b/mapping_workbench/frontend/src/sections/app/mapping-package/package-importer.js index b85ae04f..ed8dc2f3 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/package-importer.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/package-importer.js @@ -23,7 +23,6 @@ import {toastError, toastLoad, toastSuccess} from "src/components/app-toast"; import Divider from "@mui/material/Divider"; - export const PackageImporter = (props) => { const {onClose, open = false, sectionApi} = props; @@ -119,7 +118,7 @@ export const PackageImporter = (props) => { {PACKAGE_TYPE[key]} ))} - + After Import Date: Mon, 13 Jan 2025 17:49:30 +0200 Subject: [PATCH 02/51] updates --- .../frontend/src/api/mapping-packages/index.js | 7 +++++++ .../frontend/src/pages/app/mapping-packages/index.js | 2 -- .../src/sections/app/mapping-package/list-table.js | 11 ++++++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/mapping_workbench/frontend/src/api/mapping-packages/index.js b/mapping_workbench/frontend/src/api/mapping-packages/index.js index c54ea14e..f355e906 100644 --- a/mapping_workbench/frontend/src/api/mapping-packages/index.js +++ b/mapping_workbench/frontend/src/api/mapping-packages/index.js @@ -9,6 +9,13 @@ export const PACKAGE_TYPE = { EFORMS: 'eForms', STANDARD: 'Standard' }; +export const PROCESS_STATUS = { + PROCESSING: {title: 'Processing', color: "info"}, + PROCESSED_SUCCESS: {title: 'Processed (success)', color: "success"}, + PROCESSED_ERROR: {title: 'Processed (error)', color: "error"}, + UNPROCESSED: {title: 'Unprocessed', color: "warning"} +}; + export const EFORMS_PACKAGE_TYPE = "EFORMS"; export const DEFAULT_PACKAGE_TYPE = EFORMS_PACKAGE_TYPE; diff --git a/mapping_workbench/frontend/src/pages/app/mapping-packages/index.js b/mapping_workbench/frontend/src/pages/app/mapping-packages/index.js index c8f5c5c7..fcece3bf 100644 --- a/mapping_workbench/frontend/src/pages/app/mapping-packages/index.js +++ b/mapping_workbench/frontend/src/pages/app/mapping-packages/index.js @@ -6,8 +6,6 @@ import AddIcon from '@mui/icons-material/Add'; import ClearIcon from '@mui/icons-material/Clear'; import UploadIcon from '@mui/icons-material/Upload'; import DownloadIcon from '@mui/icons-material/Download'; - -import Card from '@mui/material/Card'; import Stack from '@mui/material/Stack'; import Button from '@mui/material/Button'; import Dialog from "@mui/material/Dialog"; diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/list-table.js b/mapping_workbench/frontend/src/sections/app/mapping-package/list-table.js index effa975d..f57314e1 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/list-table.js @@ -35,7 +35,8 @@ import TablePagination from "src/sections/components/table-pagination-pages"; import {ForListItemAction} from 'src/contexts/app/section/for-list-item-action'; import {MappingPackageProcessForm} from './components/mapping-package-process-form'; import {MappingPackagesBulkActions} from './components/mapping-packages-bulk-actions'; - +import {PROCESS_STATUS} from "../../../api/mapping-packages"; +import Alert from "@mui/material/Alert"; const MappingPackageRowFragment = (props) => { const { @@ -55,6 +56,8 @@ const MappingPackageRowFragment = (props) => { const [confirmOpen, setConfirmOpen] = useState(false); const [cleanupProject, setCleanupProject] = useState(false); + let process_status = PROCESS_STATUS.UNPROCESSED + return ( <> @@ -102,6 +105,9 @@ const MappingPackageRowFragment = (props) => { {timeTransformer(item.created_at, timeSetting)} + + {process_status.title} + { + From d6ced19895530c7df839d869424a0652beee80f6 Mon Sep 17 00:00:00 2001 From: Kolea PLESCO Date: Mon, 13 Jan 2025 21:13:14 +0200 Subject: [PATCH 03/51] updated node_env for prod deploy --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f9f21e0e..186cad3f 100644 --- a/Makefile +++ b/Makefile @@ -109,7 +109,7 @@ prod-dotenv-file: @ echo VAULT_TOKEN=${VAULT_TOKEN} >> ${ENV_FILE} @ echo BACKEND_INFRA_FOLDER=${BACKEND_INFRA_FOLDER} >> ${ENV_FILE} @ echo FRONTEND_INFRA_FOLDER=${FRONTEND_INFRA_FOLDER} >> ${ENV_FILE} - @ echo NODE_ENV=development >> ${ENV_FILE} + @ echo NODE_ENV=production >> ${ENV_FILE} @ echo RML_MAPPER_PATH=${RML_MAPPER_PATH} >> ${ENV_FILE} @ vault kv get -format="json" mapping-workbench-prod/app | jq -r ".data.data | keys[] as \$$k | \"\(\$$k)=\(.[\$$k])\"" >> ${ENV_FILE} From fc2b5bea8fa0d9e95a00e9985407427ffd4d6f83 Mon Sep 17 00:00:00 2001 From: Kolea PLESCO Date: Tue, 14 Jan 2025 00:37:09 +0200 Subject: [PATCH 04/51] added process status in Mapping Packages list view --- .../backend/mapping_package/models/entity.py | 1 + .../backend/mapping_package/services/api.py | 20 +++++++++++++++++ .../backend/mapping_package/services/data.py | 12 ++++++++++ .../package_processor/services/__init__.py | 3 +++ .../package_processor/services/tasks.py | 15 +++++++++++-- .../backend/task_manager/adapters/task.py | 18 ++++++++++++++- .../src/api/mapping-packages/index.js | 17 ++++++++++++-- .../src/pages/app/mapping-packages/index.js | 21 +++++++++++++----- .../mapping-package-process-form.js | 9 +++++--- .../app/mapping-package/list-table.js | 22 +++++++++++-------- 10 files changed, 116 insertions(+), 22 deletions(-) diff --git a/mapping_workbench/backend/mapping_package/models/entity.py b/mapping_workbench/backend/mapping_package/models/entity.py index 81385744..94bb6369 100644 --- a/mapping_workbench/backend/mapping_package/models/entity.py +++ b/mapping_workbench/backend/mapping_package/models/entity.py @@ -76,6 +76,7 @@ class MappingPackageOut(BaseProjectResourceEntityOutSchema): shacl_test_suites: Optional[List[Link[SHACLTestSuite]]] = None sparql_test_suites: Optional[List[Link[SPARQLTestSuite]]] = None resource_collections: Optional[List[Link[ResourceCollection]]] = None + process_status: Optional[str] = None class MappingPackageListFilters(BaseTitledEntityListFiltersSchema): diff --git a/mapping_workbench/backend/mapping_package/services/api.py b/mapping_workbench/backend/mapping_package/services/api.py index 4ed00f90..6828e064 100644 --- a/mapping_workbench/backend/mapping_package/services/api.py +++ b/mapping_workbench/backend/mapping_package/services/api.py @@ -12,7 +12,10 @@ api_entity_is_found, prepare_search_param, pagination_params from mapping_workbench.backend.mapping_package.models.entity import MappingPackage, MappingPackageCreateIn, \ MappingPackageUpdateIn, MappingPackageOut, MappingPackageStateGate +from mapping_workbench.backend.mapping_package.services.data import mapping_package_process_status +from mapping_workbench.backend.package_processor.services import TASK_ENTITY_TYPE from mapping_workbench.backend.state_manager.services.object_state_manager import delete_object_state +from mapping_workbench.backend.task_manager.entrypoints import AppTaskManager from mapping_workbench.backend.triple_map_fragment.models.entity import SpecificTripleMapFragment, \ GenericTripleMapFragment from mapping_workbench.backend.user.models.user import User @@ -33,6 +36,23 @@ async def list_mapping_packages(filters: dict = None, page: int = None, limit: i limit=limit ).to_list() + tasks_metadata = AppTaskManager.get_task_statuses() + + tasks_statuses = { + item.meta.entity.id: item.task_status.value + for item in tasks_metadata + if item.meta and item.meta.entity and item.meta.entity.type == TASK_ENTITY_TYPE + } + + for item in items: + item_id = str(item.id) + tasks_status = None + if item_id in tasks_statuses: + tasks_status = tasks_statuses[item_id] + + item.process_status = mapping_package_process_status(tasks_status) + + total_count: int = await MappingPackage.find(query_filters).count() return items, total_count diff --git a/mapping_workbench/backend/mapping_package/services/data.py b/mapping_workbench/backend/mapping_package/services/data.py index 7a5b87b9..02746980 100644 --- a/mapping_workbench/backend/mapping_package/services/data.py +++ b/mapping_workbench/backend/mapping_package/services/data.py @@ -6,6 +6,7 @@ from mapping_workbench.backend.mapping_package.models.entity import MappingPackage, MappingPackageState, \ MappingPackageStateGate from mapping_workbench.backend.state_manager.services.object_state_manager import load_object_state +from mapping_workbench.backend.tasks.models.task_response import TaskProgressStatus DEFAULT_PACKAGE_NAME = "DEFAULT" DEFAULT_PACKAGE_IDENTIFIER = "default" @@ -55,3 +56,14 @@ def get_mapping_package_state_ns_definitions(mapping_package_state: MappingPacka ) } return ns_definitions + + +def mapping_package_process_status(task_status): + if task_status == TaskProgressStatus.RUNNING: + return "PROCESSING" + elif task_status == TaskProgressStatus.FINISHED: + return "PROCESSED_SUCCESS" + elif task_status in [TaskProgressStatus.TIMEOUT, TaskProgressStatus.FAILED, TaskProgressStatus.CANCELED]: + return "PROCESSED_ERROR" + else: + return "UNPROCESSED" diff --git a/mapping_workbench/backend/package_processor/services/__init__.py b/mapping_workbench/backend/package_processor/services/__init__.py index 05161084..6e387a97 100644 --- a/mapping_workbench/backend/package_processor/services/__init__.py +++ b/mapping_workbench/backend/package_processor/services/__init__.py @@ -11,3 +11,6 @@ MAPPING_SUITE_HASH = "mapping_suite_hash_digest" VERSION_KEY = "mapping_version" VERSION_FIELD = 'Mapping Version' + +TASK_ENTITY_ACTION = "process" +TASK_ENTITY_TYPE = "mapping_package" \ No newline at end of file diff --git a/mapping_workbench/backend/package_processor/services/tasks.py b/mapping_workbench/backend/package_processor/services/tasks.py index 284695dc..3b097a50 100644 --- a/mapping_workbench/backend/package_processor/services/tasks.py +++ b/mapping_workbench/backend/package_processor/services/tasks.py @@ -3,8 +3,9 @@ from beanie import PydanticObjectId from mapping_workbench.backend.mapping_package.models.entity import MappingPackageOut, MappingPackage +from mapping_workbench.backend.package_processor.services import TASK_ENTITY_TYPE, TASK_ENTITY_ACTION from mapping_workbench.backend.package_processor.services.mapping_package_processor import process_mapping_package -from mapping_workbench.backend.task_manager.adapters.task import Task +from mapping_workbench.backend.task_manager.adapters.task import Task, TaskMetadataMeta, TaskEntity from mapping_workbench.backend.task_manager.services.task_wrapper import run_task, add_task from mapping_workbench.backend.tasks.models.task_response import TaskResponse from mapping_workbench.backend.user.models.user import User @@ -33,7 +34,7 @@ async def add_task_process_mapping_package( mapping_package_in: MappingPackageOut = await MappingPackage.find_one( MappingPackage.id == package_id, projection_model=MappingPackageOut) - return add_task( + task: Task = add_task( task_process_mapping_package, f"Processing Package {mapping_package_in.identifier} Task", task_timeout, @@ -41,3 +42,13 @@ async def add_task_process_mapping_package( True, package_id, use_only_package_state, tasks_to_run, user ) + + task.set_task_metadata_meta(meta=TaskMetadataMeta( + entity=TaskEntity( + type=TASK_ENTITY_TYPE, + id=str(package_id), + action=TASK_ENTITY_ACTION + ) + )) + + return task diff --git a/mapping_workbench/backend/task_manager/adapters/task.py b/mapping_workbench/backend/task_manager/adapters/task.py index 03864c60..028a2fdf 100644 --- a/mapping_workbench/backend/task_manager/adapters/task.py +++ b/mapping_workbench/backend/task_manager/adapters/task.py @@ -1,4 +1,3 @@ -import re import random import re import unicodedata @@ -23,6 +22,16 @@ class TaskResult: warnings: List[str] = [] task_status: TaskStatus = TaskStatus.FINISHED +class TaskEntity(BaseModel): + type: str = None + id: str = None + action: str = None + +class TaskMetadataMeta(BaseModel): + """ + TaskMetadataMeta is a class that represents task metadata meta. + """ + entity: TaskEntity = None class TaskMetadata(BaseModel): """ @@ -38,6 +47,7 @@ class TaskMetadata(BaseModel): exception_message: str = None warnings: List[str] = [] progress: TaskProgressData = None + meta: TaskMetadataMeta = None, created_by: Optional[str] = None @@ -221,6 +231,12 @@ def get_task_metadata(self) -> TaskMetadata: """ return self.task_metadata + def set_task_metadata_meta(self, meta: TaskMetadataMeta): + """ + """ + self.task_metadata.meta = meta + print(self.task_metadata) + def get_task_id(self) -> str: """ Gets task id, which is a string that represents task id. diff --git a/mapping_workbench/frontend/src/api/mapping-packages/index.js b/mapping_workbench/frontend/src/api/mapping-packages/index.js index f355e906..1b7a5f51 100644 --- a/mapping_workbench/frontend/src/api/mapping-packages/index.js +++ b/mapping_workbench/frontend/src/api/mapping-packages/index.js @@ -10,10 +10,10 @@ export const PACKAGE_TYPE = { }; export const PROCESS_STATUS = { - PROCESSING: {title: 'Processing', color: "info"}, + PROCESSING: {title: 'Processing', color: "warning"}, PROCESSED_SUCCESS: {title: 'Processed (success)', color: "success"}, PROCESSED_ERROR: {title: 'Processed (error)', color: "error"}, - UNPROCESSED: {title: 'Unprocessed', color: "warning"} + UNPROCESSED: {title: 'Unprocessed', color: "info"} }; export const EFORMS_PACKAGE_TYPE = "EFORMS"; @@ -100,6 +100,19 @@ class MappingPackagesApi extends SectionApi { let endpoint = this.paths['item'].replace(':id', id); return await appApi.delete(endpoint, {cleanup_project: cleanup_project}); } + + processStatus(api_status) { + switch (api_status) { + case "PROCESSING": + return PROCESS_STATUS.PROCESSING + case "PROCESSED_SUCCESS": + return PROCESS_STATUS.PROCESSED_SUCCESS + case "PROCESSED_ERROR": + return PROCESS_STATUS.PROCESSED_ERROR + default: + return PROCESS_STATUS.UNPROCESSED + } + } } export const mappingPackagesApi = new MappingPackagesApi(); diff --git a/mapping_workbench/frontend/src/pages/app/mapping-packages/index.js b/mapping_workbench/frontend/src/pages/app/mapping-packages/index.js index bbb1a6eb..db37044f 100644 --- a/mapping_workbench/frontend/src/pages/app/mapping-packages/index.js +++ b/mapping_workbench/frontend/src/pages/app/mapping-packages/index.js @@ -27,6 +27,8 @@ import {TableSearchBar} from "src/sections/components/table-search-bar"; import {mappingPackagesApi as sectionApi} from 'src/api/mapping-packages'; import {toastError, toastLoad, toastSuccess} from "src/components/app-toast"; import {PackageImporter} from 'src/sections/app/mapping-package/package-importer'; +import AutorenewIcon from "@mui/icons-material/Autorenew"; + const useItemsStore = () => { const [state, setState] = useState({ @@ -44,12 +46,11 @@ const useItemsStore = () => { } useEffect(() => { - handleItemsGet(); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - []); + handleItemsGet(); + }, []); return { + handleItemsGet, ...state }; }; @@ -57,7 +58,7 @@ const useItemsStore = () => { const Page = () => { const itemsStore = useItemsStore(); - const itemsSearch = useItemsSearch(itemsStore.items, sectionApi, ['title', 'identifier'], {}, { + const itemsSearch = useItemsSearch(itemsStore.items, sectionApi, ['title', 'identifier', 'process_status'], {}, { column: 'created_at', sort: 'desc' }); @@ -95,6 +96,14 @@ const Page = () => { direction="row" spacing={3} > + @@ -187,7 +185,9 @@ const Page = () => { {currentTab === 'details' && ( - + )} {currentTab === 'xpath' && ( diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage.js new file mode 100644 index 00000000..729129cb --- /dev/null +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage.js @@ -0,0 +1,70 @@ +import OpenInNewIcon from '@mui/icons-material/OpenInNew'; + +import Stack from '@mui/material/Stack'; +import Paper from '@mui/material/Paper'; +import Button from '@mui/material/Button'; +import Typography from '@mui/material/Typography'; +import LinearProgress, {linearProgressClasses} from '@mui/material/LinearProgress'; +import {styled} from '@mui/material/styles'; + +const ResultSummaryCoverage = ({item, sid, validationReport}) => { + + const {coveredReports, notCoveredReports} = validationReport?.reduce((acc, report) => { + acc[report.is_covered ? "coveredReports" : "notCoveredReports"].push({sdk_element_xpath: report.sdk_element_xpath}) + return acc + }, {coveredReports: [], notCoveredReports: []}) + + const coveredReportPercent = (coveredReports.length / validationReport.length * 100).toFixed(2) + const notCoveredReportPercent = (notCoveredReports.length / validationReport.length * 100).toFixed(2) + + const BorderLinearProgress = styled(LinearProgress)(({theme}) => ({ + height: 32, + borderRadius: 16, + [`&.${linearProgressClasses.root}`]: { + backgroundColor: theme.palette.grey[200], + ...theme.applyStyles('dark', { + backgroundColor: theme.palette.grey[800], + }), + }, + [`& .${linearProgressClasses.bar}`]: { + borderBottomStartRadius: 16, + borderTopStartRadius: 16, + ...theme.applyStyles('dark', {}), + }, + })); + + return + + + Result summary + Coverage (XPath) + + + + + + Mapping suite identifier + {item.identifier} + + + XPATHs covered + {`${coveredReports.length}/${coveredReportPercent}%`} + + + + XPATHs covered + {`${notCoveredReports.length}/${notCoveredReportPercent}%`} + + + + +} + +export default ResultSummaryCoverage \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js index c20451aa..8e3e22e4 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js @@ -2,14 +2,43 @@ import Card from "@mui/material/Card"; import Divider from "@mui/material/Divider"; import Grid from "@mui/material/Unstable_Grid2"; import CardContent from "@mui/material/CardContent"; +import {useEffect, useState} from 'react'; import {PropertyList} from "src/components/property-list"; import {PropertyListItem} from "src/components/property-list-item"; +import {mappingPackageStatesApi as sectionApi} from '../../../../api/mapping-packages/states'; +import ResultSummaryCoverage from './result-summary-coverage'; -const StateDetails = ({item}) => { - return( +const StateDetails = ({item, sid, reportTree}) => { + const [validationReport, setValidationReport] = useState(undefined) + const [dataState, setDataState] = useState() + + useEffect(() => { + sid && handleValidationReportsGet(sid) + }, [sid]) + + const handleValidationReportsGet = (sid) => { + setDataState({load: true, error: false}) + sectionApi.getXpathReports(sid) + .then(res => { + setValidationReport(res.results.map(e => ({...e, notice_count: e.test_data_xpaths.length}))) + setDataState(e => ({...e, load: false})) + }) + .catch(err => { + console.error(err); + setDataState({load: false, error: true}) + }) + } + + console.log(validationReport) + if (!validationReport) return null + + return ( + From 531a309040cda52cc388a5ee7e9e8845f90e7ff6 Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Tue, 14 Jan 2025 17:46:29 +0200 Subject: [PATCH 08/51] MWB-952: add charts for shacl and sparql --- mapping_workbench/frontend/package.json | 1 + .../state/result-summary-coverage-shacl.js | 53 +++++++++ .../state/result-summary-coverage-sparql.js | 54 ++++++++++ ...ge.js => result-summary-coverage-xpath.js} | 7 +- .../mapping-package/state/state-details.js | 101 +++++++++++++++--- 5 files changed, 202 insertions(+), 14 deletions(-) create mode 100644 mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js create mode 100644 mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js rename mapping_workbench/frontend/src/sections/app/mapping-package/state/{result-summary-coverage.js => result-summary-coverage-xpath.js} (94%) diff --git a/mapping_workbench/frontend/package.json b/mapping_workbench/frontend/package.json index eca4a140..e73b8e14 100644 --- a/mapping_workbench/frontend/package.json +++ b/mapping_workbench/frontend/package.json @@ -43,6 +43,7 @@ "@mui/lab": "^5.0.0-alpha.129", "@mui/material": "^5.13.0", "@mui/system": "5.15.20", + "@mui/x-charts": "^7.23.6", "@mui/x-date-pickers": "6.4.0", "@mui/x-tree-view": "^7.15.0", "@react-pdf/renderer": "3.1.9", diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js new file mode 100644 index 00000000..4e9f33c9 --- /dev/null +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js @@ -0,0 +1,53 @@ +import OpenInNewIcon from '@mui/icons-material/OpenInNew'; + +import Stack from '@mui/material/Stack'; +import Paper from '@mui/material/Paper'; +import Button from '@mui/material/Button'; +import Typography from '@mui/material/Typography'; +import {PieChart} from '@mui/x-charts'; + +const ResultSummaryCoverageShacl= ({validationReport}) => { + + console.log('shacl',validationReport) + if (!validationReport) return null + + const {itemsTotal, ...itemsReduce} = + validationReport.map(item => item.result).reduce((acc, report) => { + Object.keys(report).forEach(reportKey => { + acc[reportKey] = (acc[reportKey] ?? 0) + report[reportKey].count + acc["itemsTotal"] = (acc["itemsTotal"] ?? 0) + report[reportKey].count + } + ) + return acc + },{info:0, valid:0, violation:0, warning:0}) + + const itemsDisplay = Object.entries(itemsReduce)?.map(item => { + const [itemName, itemCount] = item + return {label: itemName, value: itemCount, itemPercent: (itemCount / itemsTotal) * 100 ?? 0} + }) + + return + + + Result summary + Coverage (SHALC) + + + + + + + +} + +export default ResultSummaryCoverageShacl \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js new file mode 100644 index 00000000..fdfe9af2 --- /dev/null +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js @@ -0,0 +1,54 @@ +import OpenInNewIcon from '@mui/icons-material/OpenInNew'; + +import Stack from '@mui/material/Stack'; +import Paper from '@mui/material/Paper'; +import Button from '@mui/material/Button'; +import Typography from '@mui/material/Typography'; +import {PieChart} from '@mui/x-charts'; + +const ResultSummaryCoverageSparql = ({item, sid, validationReport}) => { + + console.log(validationReport) + if (!validationReport) return null + + const {itemsTotal, ...itemsReduce} = + validationReport.map(item => item.result).reduce((acc, report) => { + Object.keys(report).forEach(reportKey => { + acc[reportKey] = (acc[reportKey] ?? 0) + report[reportKey].count + acc["itemsTotal"] = (acc["itemsTotal"] ?? 0) + report[reportKey].count + } + ) + return acc + }, {valid: 0, unverifiable: 0, warning: 0, invalid: 0, error: 0, unknown: 0}) + + const itemsDisplay = Object.entries(itemsReduce)?.map(item => { + const [itemName, itemCount] = item + return {label: itemName, value: itemCount, itemPercent: (itemCount / itemsTotal) * 100 ?? 0} + }) + + + return + + + Result summary + Coverage (SPARQL) + + + + + + + +} + +export default ResultSummaryCoverageSparql \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js similarity index 94% rename from mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage.js rename to mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js index 729129cb..f62b6271 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js @@ -7,7 +7,10 @@ import Typography from '@mui/material/Typography'; import LinearProgress, {linearProgressClasses} from '@mui/material/LinearProgress'; import {styled} from '@mui/material/styles'; -const ResultSummaryCoverage = ({item, sid, validationReport}) => { +const ResultSummaryCoverageXpath = ({item, validationReport}) => { + + console.log(validationReport) + if (!validationReport) return null const {coveredReports, notCoveredReports} = validationReport?.reduce((acc, report) => { acc[report.is_covered ? "coveredReports" : "notCoveredReports"].push({sdk_element_xpath: report.sdk_element_xpath}) @@ -67,4 +70,4 @@ const ResultSummaryCoverage = ({item, sid, validationReport}) => { } -export default ResultSummaryCoverage \ No newline at end of file +export default ResultSummaryCoverageXpath \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js index 8e3e22e4..b50834b1 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js @@ -1,5 +1,6 @@ import Card from "@mui/material/Card"; import Divider from "@mui/material/Divider"; +import Stack from '@mui/material/Stack'; import Grid from "@mui/material/Unstable_Grid2"; import CardContent from "@mui/material/CardContent"; import {useEffect, useState} from 'react'; @@ -7,38 +8,114 @@ import {useEffect, useState} from 'react'; import {PropertyList} from "src/components/property-list"; import {PropertyListItem} from "src/components/property-list-item"; import {mappingPackageStatesApi as sectionApi} from '../../../../api/mapping-packages/states'; -import ResultSummaryCoverage from './result-summary-coverage'; +import ResultSummaryCoverageShacl from './result-summary-coverage-shacl'; +import ResultSummaryCoverageSparql from './result-summary-coverage-sparql'; +import ResultSummaryCoverageXpath from './result-summary-coverage-xpath'; const StateDetails = ({item, sid, reportTree}) => { - const [validationReport, setValidationReport] = useState(undefined) + const [validationReport, setValidationReport] = useState({}) const [dataState, setDataState] = useState() useEffect(() => { - sid && handleValidationReportsGet(sid) + if (sid) { + resultSummaryXPATHGet(sid) + resultSummarySPARQLGet(sid) + resultSummarySHACLGet(sid) + } }, [sid]) - const handleValidationReportsGet = (sid) => { - setDataState({load: true, error: false}) - sectionApi.getXpathReports(sid) + + const resultSummarySPARQLGet = (sid) => { + sectionApi.getSparqlReports(sid) .then(res => { - setValidationReport(res.results.map(e => ({...e, notice_count: e.test_data_xpaths.length}))) + setValidationReport(prev => ({...prev, sparql: mapSparqlResults(res.summary)})) setDataState(e => ({...e, load: false})) }) .catch(err => { console.error(err); - setDataState({load: false, error: true}) }) } + const mapSparqlResults = (result) => result.map(e => { + const queryAsArray = e.query.content.split("\n") + const values = queryAsArray.slice(0, 3) + const resultArray = {} + values.forEach(e => { + const res = e.split(": ") + resultArray[res[0].substring(1)] = res[1] + } + ) + resultArray["query"] = queryAsArray.slice(4, queryAsArray.length).join("\n") + resultArray["test_suite"] = e.query.filename + resultArray["result"] = e.result + Object.entries(e.result).forEach(entrie => { + const [key, value] = entrie + resultArray[`${key}Count`] = value.count + }) + resultArray["meets_xpath_condition"] = e.meets_xpath_condition + resultArray["xpath_condition"] = e.query?.cm_rule?.xpath_condition + return resultArray; + }) + + + const resultSummaryXPATHGet = (sid) => { + sectionApi.getXpathReports(sid) + .then(res => { + setValidationReport(prev => ({ + ...prev, + xpath: res.results.map(e => ({...e, notice_count: e.test_data_xpaths.length})) + })) + }) + .catch(err => { + console.error(err); + }) + } + + + const resultSummarySHACLGet = (sid) => { + sectionApi.getShaclReports(sid) + .then(res => { + setValidationReport(prev => ({...prev, shacl: mapShaclResults(res.summary)})) + }) + .catch(err => { + console.error(err); + }) + } + + const mapShaclResults = (result) => { + return result.results.map(e => { + const resultArray = {} + resultArray["shacl_suite"] = result.shacl_suites?.[0]?.shacl_suite_id + resultArray["short_result_path"] = e.short_result_path + resultArray["result"] = e.result + Object.entries(e.result).forEach(entrie => { + const [key, value] = entrie + resultArray[`${key}Count`] = value.count + }) + return resultArray; + }) + } + console.log(validationReport) - if (!validationReport) return null + return ( - + + + + + From abe63594a709ebc4e5d06070bd4fd6fbe282f3f6 Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Wed, 15 Jan 2025 09:38:50 +0200 Subject: [PATCH 09/51] MWB-952: update charts style --- .../state/result-summary-coverage-shacl.js | 35 ++++++++++++++----- .../state/result-summary-coverage-sparql.js | 35 ++++++++++++++----- 2 files changed, 52 insertions(+), 18 deletions(-) diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js index 4e9f33c9..f062d7fc 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js @@ -4,7 +4,7 @@ import Stack from '@mui/material/Stack'; import Paper from '@mui/material/Paper'; import Button from '@mui/material/Button'; import Typography from '@mui/material/Typography'; -import {PieChart} from '@mui/x-charts'; +import {legendClasses, PieChart} from '@mui/x-charts'; const ResultSummaryCoverageShacl= ({validationReport}) => { @@ -38,14 +38,31 @@ const ResultSummaryCoverageShacl= ({validationReport}) => { - + } diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js index fdfe9af2..7f33e8a4 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js @@ -4,7 +4,7 @@ import Stack from '@mui/material/Stack'; import Paper from '@mui/material/Paper'; import Button from '@mui/material/Button'; import Typography from '@mui/material/Typography'; -import {PieChart} from '@mui/x-charts'; +import {legendClasses, PieChart} from '@mui/x-charts'; const ResultSummaryCoverageSparql = ({item, sid, validationReport}) => { @@ -39,14 +39,31 @@ const ResultSummaryCoverageSparql = ({item, sid, validationReport}) => { - + } From 5e4ee18bfcdfdd22911a45034ca26a9948b25213 Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Wed, 15 Jan 2025 11:28:04 +0200 Subject: [PATCH 10/51] MWB-952: add chart custom tooltip --- .../state/result-summary-coverage-shacl.js | 26 +++++++++++++++---- .../state/result-summary-coverage-sparql.js | 14 ++++++++++ 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js index f062d7fc..fa8496e3 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js @@ -3,12 +3,13 @@ import OpenInNewIcon from '@mui/icons-material/OpenInNew'; import Stack from '@mui/material/Stack'; import Paper from '@mui/material/Paper'; import Button from '@mui/material/Button'; +import Tooltip from '@mui/material/Tooltip'; import Typography from '@mui/material/Typography'; import {legendClasses, PieChart} from '@mui/x-charts'; -const ResultSummaryCoverageShacl= ({validationReport}) => { +const ResultSummaryCoverageShacl = ({validationReport}) => { - console.log('shacl',validationReport) + console.log('shacl', validationReport) if (!validationReport) return null const {itemsTotal, ...itemsReduce} = @@ -19,7 +20,7 @@ const ResultSummaryCoverageShacl= ({validationReport}) => { } ) return acc - },{info:0, valid:0, violation:0, warning:0}) + }, {info: 0, valid: 0, violation: 0, warning: 0}) const itemsDisplay = Object.entries(itemsReduce)?.map(item => { const [itemName, itemCount] = item @@ -38,7 +39,7 @@ const ResultSummaryCoverageShacl= ({validationReport}) => { - { }} series={[ { + dataKey: 'value', data: itemsDisplay, innerRadius: 60, outerRadius: 100, - cy: 100 + cy: 100, } ]} + tooltip={{ + trigger: 'item', + itemContent: (params) => { + const data=params.series.data[params.itemData.dataIndex] + return ( + + + {data.itemPercent}% + {data.data} + + + ); + } + }} width={368} height={348}/> diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js index 7f33e8a4..f01597a7 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js @@ -62,6 +62,20 @@ const ResultSummaryCoverageSparql = ({item, sid, validationReport}) => { cy: 100 } ]} + tooltip={{ + trigger: 'item', + itemContent: (params) => { + const data = params.series.data[params.itemData.dataIndex] + return ( + + + {data.itemPercent}% + {data.data} + + + ); + } + }} width={368} height={348}/> From 0331d478e010533bd7d6bf2a88a57080b9494bf4 Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Wed, 15 Jan 2025 12:42:11 +0200 Subject: [PATCH 11/51] MWB-952: update page layout --- .../[id]/states/[sid]/view.js | 1 - .../state/result-summary-coverage-shacl.js | 10 +- .../state/result-summary-coverage-sparql.js | 9 +- .../state/result-summary-coverage-xpath.js | 12 +- .../mapping-package/state/state-details.js | 161 ++++++++---------- 5 files changed, 84 insertions(+), 109 deletions(-) diff --git a/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js b/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js index bc00af51..ed08ba54 100644 --- a/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js +++ b/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js @@ -182,7 +182,6 @@ const Page = () => { /> ))} - {currentTab === 'details' && ( { - console.log('shacl', validationReport) if (!validationReport) return null const {itemsTotal, ...itemsReduce} = @@ -27,7 +25,7 @@ const ResultSummaryCoverageShacl = ({validationReport}) => { return {label: itemName, value: itemCount, itemPercent: (itemCount / itemsTotal) * 100 ?? 0} }) - return + return @@ -38,7 +36,8 @@ const ResultSummaryCoverageShacl = ({validationReport}) => { - + { innerRadius: 60, outerRadius: 100, cy: 100, + cx: 180, } ]} tooltip={{ trigger: 'item', itemContent: (params) => { - const data=params.series.data[params.itemData.dataIndex] + const data = params.series.data[params.itemData.dataIndex] return ( diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js index f01597a7..c3b81d94 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js @@ -8,7 +8,6 @@ import {legendClasses, PieChart} from '@mui/x-charts'; const ResultSummaryCoverageSparql = ({item, sid, validationReport}) => { - console.log(validationReport) if (!validationReport) return null const {itemsTotal, ...itemsReduce} = @@ -27,7 +26,7 @@ const ResultSummaryCoverageSparql = ({item, sid, validationReport}) => { }) - return + return @@ -38,7 +37,8 @@ const ResultSummaryCoverageSparql = ({item, sid, validationReport}) => { - + { data: itemsDisplay, innerRadius: 60, outerRadius: 100, - cy: 100 + cy: 100, + cx: 180, } ]} tooltip={{ diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js index f62b6271..f360359f 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js @@ -9,7 +9,6 @@ import {styled} from '@mui/material/styles'; const ResultSummaryCoverageXpath = ({item, validationReport}) => { - console.log(validationReport) if (!validationReport) return null const {coveredReports, notCoveredReports} = validationReport?.reduce((acc, report) => { @@ -36,8 +35,9 @@ const ResultSummaryCoverageXpath = ({item, validationReport}) => { }, })); - return + return Result summary @@ -46,20 +46,20 @@ const ResultSummaryCoverageXpath = ({item, validationReport}) => { - - + + Mapping suite identifier {item.identifier} - + XPATHs covered {`${coveredReports.length}/${coveredReportPercent}%`} - + XPATHs covered {`${notCoveredReports.length}/${notCoveredReportPercent}%`} { }) } - console.log(validationReport) - - return ( - + + + + Conceptual mapping for {item.title} + + + {item._id} + {item.title} + + + {'Mapping / EPO Version'} + {`${item.mapping_version} / ${item.epo_version}`} + + + {'eForms XSD'} + {item.eforms_sdk_versions?.join(', ')} + + + {'eForms Subtype'} + {item.eform_subtypes?.join(', ')} + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + ) From f00b9ffd9ae647af57bb709bd1b59f1a226425a5 Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Wed, 15 Jan 2025 12:53:18 +0200 Subject: [PATCH 12/51] MWB-952: add links to pages --- .../app/mapping-packages/[id]/states/[sid]/view.js | 2 +- .../state/result-summary-coverage-shacl.js | 8 +++++--- .../state/result-summary-coverage-sparql.js | 12 +++++++----- .../state/result-summary-coverage-xpath.js | 9 +++++++-- .../app/mapping-package/state/state-details.js | 5 ++++- 5 files changed, 24 insertions(+), 12 deletions(-) diff --git a/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js b/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js index ed08ba54..488b87ef 100644 --- a/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js +++ b/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js @@ -11,7 +11,6 @@ import Link from '@mui/material/Link'; import Card from "@mui/material/Card"; import Stack from '@mui/material/Stack'; import Button from "@mui/material/Button"; -import Divider from '@mui/material/Divider'; import SvgIcon from '@mui/material/SvgIcon'; import Typography from '@mui/material/Typography'; import CardContent from "@mui/material/CardContent"; @@ -185,6 +184,7 @@ const Page = () => { {currentTab === 'details' && ( )} diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js index 1022ad4f..1cbec65f 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js @@ -6,7 +6,7 @@ import Button from '@mui/material/Button'; import Typography from '@mui/material/Typography'; import {legendClasses, PieChart} from '@mui/x-charts'; -const ResultSummaryCoverageShacl = ({validationReport}) => { +const ResultSummaryCoverageShacl = ({validationReport, handleChangeTab}) => { if (!validationReport) return null @@ -34,7 +34,10 @@ const ResultSummaryCoverageShacl = ({validationReport}) => { Coverage (SHALC) - + @@ -50,7 +53,6 @@ const ResultSummaryCoverageShacl = ({validationReport}) => { position: {vertical: 'bottom', horizontal: 'middle'}, itemMarkWidth: 12, itemMarkHeight: 12, - // padding:-10 } }} series={[ diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js index c3b81d94..6c73649d 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js @@ -6,7 +6,7 @@ import Button from '@mui/material/Button'; import Typography from '@mui/material/Typography'; import {legendClasses, PieChart} from '@mui/x-charts'; -const ResultSummaryCoverageSparql = ({item, sid, validationReport}) => { +const ResultSummaryCoverageSparql = ({validationReport, handleChangeTab}) => { if (!validationReport) return null @@ -26,7 +26,7 @@ const ResultSummaryCoverageSparql = ({item, sid, validationReport}) => { }) - return + return @@ -35,7 +35,10 @@ const ResultSummaryCoverageSparql = ({item, sid, validationReport}) => { Coverage (SPARQL) - + @@ -50,8 +53,7 @@ const ResultSummaryCoverageSparql = ({item, sid, validationReport}) => { direction: 'row', position: {vertical: 'bottom', horizontal: 'middle'}, itemMarkWidth: 12, - itemMarkHeight: 12, - // padding:-10 + itemMarkHeight: 12 } }} series={[ diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js index f360359f..19d94350 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js @@ -7,7 +7,7 @@ import Typography from '@mui/material/Typography'; import LinearProgress, {linearProgressClasses} from '@mui/material/LinearProgress'; import {styled} from '@mui/material/styles'; -const ResultSummaryCoverageXpath = ({item, validationReport}) => { +const ResultSummaryCoverageXpath = ({item, validationReport, handleChangeTab}) => { if (!validationReport) return null @@ -44,7 +44,12 @@ const ResultSummaryCoverageXpath = ({item, validationReport}) => { Coverage (XPath) - + diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js index 7edb7e9f..bc82323b 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js @@ -10,7 +10,7 @@ import ResultSummaryCoverageShacl from './result-summary-coverage-shacl'; import ResultSummaryCoverageSparql from './result-summary-coverage-sparql'; import ResultSummaryCoverageXpath from './result-summary-coverage-xpath'; -const StateDetails = ({item, sid, reportTree}) => { +const StateDetails = ({item, sid, handleChangeTab}) => { const [validationReport, setValidationReport] = useState({}) const [dataState, setDataState] = useState() @@ -154,18 +154,21 @@ const StateDetails = ({item, sid, reportTree}) => { md={4}> From 77dbbd31b63e04f46adfd71b95fb31f1f6bb3efe Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Wed, 15 Jan 2025 16:56:46 +0200 Subject: [PATCH 13/51] MWB-952: update xpath view --- .../[id]/states/[sid]/view.js | 102 +++++++++++++++--- .../app/mapping-package/state/file-list.js | 47 ++++++++ .../state/result-summary-coverage-sparql.js | 2 +- .../mapping-package/state/state-details.js | 84 +-------------- .../result-summary-coverage.js | 80 ++++++++++++++ .../xpath_validation_report_package_state.js | 15 --- .../xpath_validation_report_view.js | 65 ++++++----- 7 files changed, 247 insertions(+), 148 deletions(-) create mode 100644 mapping_workbench/frontend/src/sections/app/mapping-package/state/file-list.js create mode 100644 mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js diff --git a/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js b/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js index 488b87ef..ac77dbd0 100644 --- a/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js +++ b/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js @@ -16,7 +16,6 @@ import Typography from '@mui/material/Typography'; import CardContent from "@mui/material/CardContent"; import CircularProgress from "@mui/material/CircularProgress"; - import {paths} from 'src/paths'; import {Seo} from 'src/components/seo'; import {useRouter} from "src/hooks/use-router"; @@ -39,11 +38,12 @@ const ShaclValidationReport = dynamic(() => import("src/sections/app/shacl-validation-report/shacl_validation_report_view"), {loading: () => }); + const tabs = [ {label: 'Details', value: 'details'}, - {label: 'XPath Reports', value: 'xpath'}, - {label: 'SPARQL Reports', value: 'sparql'}, - {label: 'SHACL Reports', value: 'shacl'}, + {label: 'Coverage (XPath)', value: 'xpath'}, + {label: 'Correctness (SPARQL)', value: 'sparql'}, + {label: 'Compliance (SHACL)', value: 'shacl'}, ]; const Page = () => { @@ -55,14 +55,89 @@ const Page = () => { const [currentTab, setCurrentTab] = useState('details'); const [isExporting, setIsExporting] = useState() const [validationReportTree, setValidationReportTree] = useState([]) + const [validationReport, setValidationReport] = useState({}) useEffect(() => { if (sid) { handleItemsGet(sid); handleValidationReportTreeGet(sid) + resultSummaryXPATHGet(sid) + resultSummarySPARQLGet(sid) + resultSummarySHACLGet(sid) } }, [sid]); + + const resultSummarySPARQLGet = (sid) => { + sectionApi.getSparqlReports(sid) + .then(res => { + setValidationReport(prev => ({...prev, sparql: mapSparqlResults(res.summary)})) + }) + .catch(err => { + console.error(err); + }) + } + + const mapSparqlResults = (result) => result.map(e => { + const queryAsArray = e.query.content.split("\n") + const values = queryAsArray.slice(0, 3) + const resultArray = {} + values.forEach(e => { + const res = e.split(": ") + resultArray[res[0].substring(1)] = res[1] + } + ) + resultArray["query"] = queryAsArray.slice(4, queryAsArray.length).join("\n") + resultArray["test_suite"] = e.query.filename + resultArray["result"] = e.result + Object.entries(e.result).forEach(entrie => { + const [key, value] = entrie + resultArray[`${key}Count`] = value.count + }) + resultArray["meets_xpath_condition"] = e.meets_xpath_condition + resultArray["xpath_condition"] = e.query?.cm_rule?.xpath_condition + return resultArray; + }) + + + const resultSummaryXPATHGet = (sid) => { + sectionApi.getXpathReports(sid) + .then(res => { + setValidationReport(prev => ({ + ...prev, + xpath: res.results.map(e => ({...e, notice_count: e.test_data_xpaths.length})) + })) + }) + .catch(err => { + console.error(err); + }) + } + + + const resultSummarySHACLGet = (sid) => { + sectionApi.getShaclReports(sid) + .then(res => { + setValidationReport(prev => ({...prev, shacl: mapShaclResults(res.summary)})) + }) + .catch(err => { + console.error(err); + }) + } + + const mapShaclResults = (result) => { + return result.results.map(e => { + const resultArray = {} + resultArray["shacl_suite"] = result.shacl_suites?.[0]?.shacl_suite_id + resultArray["short_result_path"] = e.short_result_path + resultArray["result"] = e.result + Object.entries(e.result).forEach(entrie => { + const [key, value] = entrie + resultArray[`${key}Count`] = value.count + }) + return resultArray; + }) + } + const handleItemsGet = (sid) => { sectionApi.getState(sid) .then(res => setItem(res)) @@ -77,9 +152,7 @@ const Page = () => { const handleTabsChange = (event, value) => setCurrentTab(value) - const handleExport = (item) => { - return exportPackage(sectionApi, id, setIsExporting, item) - } + const handleExport = (item) => exportPackage(sectionApi, id, setIsExporting, item) return ( <> @@ -186,17 +259,14 @@ const Page = () => { + validationReport={validationReport}/> )} {currentTab === 'xpath' && ( - - - - - + )} {currentTab === 'sparql' && ( diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/file-list.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/file-list.js new file mode 100644 index 00000000..c073776e --- /dev/null +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/file-list.js @@ -0,0 +1,47 @@ +import ChevronRightIcon from '@mui/icons-material/ChevronRight'; +import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; +import Paper from '@mui/material/Paper'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import {TreeItem, treeItemClasses} from '@mui/x-tree-view'; +import {SimpleTreeView} from '@mui/x-tree-view/SimpleTreeView'; +import FolderOpenIcon from '@mui/icons-material/FolderOpen'; +import InsertDriveFileOutlinedIcon from '@mui/icons-material/InsertDriveFileOutlined'; + +const FileList = ({files, handleFileChange, handleFolderChange}) => { + console.log(files) + + const FileIcon = () => + const CollapseIcon = () => + const ExpandIcon = () => + + return ( + + + Test Set Summary + + {files?.map(item => handleFolderChange(item)}> + {item.test_data_states?.map(child => handleFileChange(child)}> + )} + )} + + + + ) +} + +export default FileList \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js index 6c73649d..9ea75291 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js @@ -22,7 +22,7 @@ const ResultSummaryCoverageSparql = ({validationReport, handleChangeTab}) => { const itemsDisplay = Object.entries(itemsReduce)?.map(item => { const [itemName, itemCount] = item - return {label: itemName, value: itemCount, itemPercent: (itemCount / itemsTotal) * 100 ?? 0} + return {label: itemName, value: itemCount, itemPercent: (itemCount / itemsTotal) * 100 ?? 0, color: itemName==='valid' ? 'red' : 'blue'} }) diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js index bc82323b..d268fdb5 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js @@ -10,89 +10,7 @@ import ResultSummaryCoverageShacl from './result-summary-coverage-shacl'; import ResultSummaryCoverageSparql from './result-summary-coverage-sparql'; import ResultSummaryCoverageXpath from './result-summary-coverage-xpath'; -const StateDetails = ({item, sid, handleChangeTab}) => { - const [validationReport, setValidationReport] = useState({}) - const [dataState, setDataState] = useState() - - useEffect(() => { - if (sid) { - resultSummaryXPATHGet(sid) - resultSummarySPARQLGet(sid) - resultSummarySHACLGet(sid) - } - }, [sid]) - - - const resultSummarySPARQLGet = (sid) => { - sectionApi.getSparqlReports(sid) - .then(res => { - setValidationReport(prev => ({...prev, sparql: mapSparqlResults(res.summary)})) - setDataState(e => ({...e, load: false})) - }) - .catch(err => { - console.error(err); - }) - } - - const mapSparqlResults = (result) => result.map(e => { - const queryAsArray = e.query.content.split("\n") - const values = queryAsArray.slice(0, 3) - const resultArray = {} - values.forEach(e => { - const res = e.split(": ") - resultArray[res[0].substring(1)] = res[1] - } - ) - resultArray["query"] = queryAsArray.slice(4, queryAsArray.length).join("\n") - resultArray["test_suite"] = e.query.filename - resultArray["result"] = e.result - Object.entries(e.result).forEach(entrie => { - const [key, value] = entrie - resultArray[`${key}Count`] = value.count - }) - resultArray["meets_xpath_condition"] = e.meets_xpath_condition - resultArray["xpath_condition"] = e.query?.cm_rule?.xpath_condition - return resultArray; - }) - - - const resultSummaryXPATHGet = (sid) => { - sectionApi.getXpathReports(sid) - .then(res => { - setValidationReport(prev => ({ - ...prev, - xpath: res.results.map(e => ({...e, notice_count: e.test_data_xpaths.length})) - })) - }) - .catch(err => { - console.error(err); - }) - } - - - const resultSummarySHACLGet = (sid) => { - sectionApi.getShaclReports(sid) - .then(res => { - setValidationReport(prev => ({...prev, shacl: mapShaclResults(res.summary)})) - }) - .catch(err => { - console.error(err); - }) - } - - const mapShaclResults = (result) => { - return result.results.map(e => { - const resultArray = {} - resultArray["shacl_suite"] = result.shacl_suites?.[0]?.shacl_suite_id - resultArray["short_result_path"] = e.short_result_path - resultArray["result"] = e.result - Object.entries(e.result).forEach(entrie => { - const [key, value] = entrie - resultArray[`${key}Count`] = value.count - }) - return resultArray; - }) - } +const StateDetails = ({item, sid, handleChangeTab, validationReport}) => { return ( { + + if (!validationReport) return null + + const {coveredReports, notCoveredReports} = validationReport?.reduce((acc, report) => { + acc[report.is_covered ? "coveredReports" : "notCoveredReports"].push({sdk_element_xpath: report.sdk_element_xpath}) + return acc + }, {coveredReports: [], notCoveredReports: []}) + + const coveredReportPercent = (coveredReports.length / validationReport.length * 100).toFixed(2) + const notCoveredReportPercent = (notCoveredReports.length / validationReport.length * 100).toFixed(2) + + const BorderLinearProgress = styled(LinearProgress)(({theme}) => ({ + height: 32, + borderRadius: 16, + [`&.${linearProgressClasses.root}`]: { + backgroundColor: '#F9C74F', + }, + [`& .${linearProgressClasses.bar}`]: { + borderBottomStartRadius: 16, + borderTopStartRadius: 16, + backgroundColor: '#90BE6D' + }, + })); + + return + + + Result summary + Coverage (XPath) + + + + + + Mapping suite identifier + {item.identifier} + + + + XPATHs covered + {`${coveredReports.length}/${coveredReportPercent}%`} + + + XPATHs covered + {`${notCoveredReports.length}/${notCoveredReportPercent}%`} + + + + + + + +} + +export default ResultSummaryCoverage \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js index 3379fef1..e7be5fbd 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js @@ -39,21 +39,6 @@ const XpathValidationReport = ({sid, files, mappingSuiteIdentifier, handleSelect return ( <> - - Summary - - - - - - - Assertions - {/**/} diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js index f7fd9da5..c014b51a 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js @@ -1,3 +1,4 @@ +import Grid from '@mui/material/Unstable_Grid2'; import {useState} from "react"; import ChevronRightIcon from '@mui/icons-material/ChevronRight'; @@ -6,8 +7,10 @@ import Link from "@mui/material/Link"; import Stack from "@mui/material/Stack"; import Typography from "@mui/material/Typography"; import Breadcrumbs from "@mui/material/Breadcrumbs"; +import FileList from '../mapping-package/state/file-list'; import CoverageFiles from "./coverage_files"; +import ResultSummaryCoverage from './result-summary-coverage'; import XpathValidationReportTest from "./xpath_validation_report_file"; import XpathValidationReport from "./xpath_validation_report_package_state"; import XpathValidationReportSuite from "./xpath_validation_report_test_dataset"; @@ -19,17 +22,19 @@ const TEST_DATASET_LABEL = "Test Dataset XPath Coverage" const FILE_COVERAGE = "file"; const FILE_COVERAGE_LABEL = "File XPath Coverage" -const XpathValidationReportView = ({sid, reportTree}) => { +const XpathValidationReportView = ({sid, reportTree, validationReport}) => { const [currentTab, setCurrentTab] = useState(PACKAGE_STATE) const [selectedPackageState, setSelectedPackageState] = useState(reportTree.test_data_suites[0]) const [selectedTestDataset, setSelectedTestDataset] = useState(reportTree.test_data_suites[0].test_data_states[0]) const handleSetPackageState = (file) => { + console.log(file) setSelectedPackageState(file) setCurrentTab(TEST_DATASET) } const handleSetTestDataset = (file) => { + console.log(file) setSelectedTestDataset(file) setCurrentTab(FILE_COVERAGE) } @@ -46,43 +51,37 @@ const XpathValidationReportView = ({sid, reportTree}) => { } return ( - <> - - }> - setCurrentTab(PACKAGE_STATE)} - > - {PACKAGE_STATE_LABEL} - - {currentTab !== PACKAGE_STATE && - setCurrentTab(TEST_DATASET)} - > - {FILE_COVERAGE_LABEL}: {{selectedPackageState.identifier}} - } - {currentTab === FILE_COVERAGE && - - {TEST_DATASET_LABEL}: {{selectedTestDataset.identifier}} - } - - + {currentTab === PACKAGE_STATE && <> - - + + + + + + + + + } {currentTab === TEST_DATASET && <> - + + + { testId={selectedTestDataset.oid} mappingSuiteIdentifier={reportTree.identifier}/> } - + ) } From d247a734b9e014953df55f660591c3cf30ad2e92 Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Wed, 15 Jan 2025 17:43:41 +0200 Subject: [PATCH 14/51] MWB-952: update lower pages for xpath --- .../[id]/states/[sid]/view.js | 6 +- .../result-summary-coverage.js | 17 +++-- .../xpath_validation_report_file.js | 65 ++++++++-------- .../xpath_validation_report_package_state.js | 37 ++------- .../xpath_validation_report_test_dataset.js | 75 +++++++++---------- .../xpath_validation_report_view.js | 45 ++++------- 6 files changed, 97 insertions(+), 148 deletions(-) diff --git a/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js b/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js index ac77dbd0..ba4f87a9 100644 --- a/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js +++ b/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js @@ -116,9 +116,7 @@ const Page = () => { const resultSummarySHACLGet = (sid) => { sectionApi.getShaclReports(sid) - .then(res => { - setValidationReport(prev => ({...prev, shacl: mapShaclResults(res.summary)})) - }) + .then(res => setValidationReport(prev => ({...prev, shacl: mapShaclResults(res.summary)}))) .catch(err => { console.error(err); }) @@ -229,8 +227,6 @@ const Page = () => { onClick={() => handleExport(item)} disabled={isExporting} startIcon={} - // variant="contained" - > {isExporting ? "Exporting..." : "Export State"} diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js index 35b1884c..3de957e4 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js @@ -1,13 +1,13 @@ -import OpenInNewIcon from '@mui/icons-material/OpenInNew'; +import FileDownloadOutlinedIcon from '@mui/icons-material/FileDownloadOutlined'; import Stack from '@mui/material/Stack'; import Paper from '@mui/material/Paper'; import Button from '@mui/material/Button'; +import {styled} from '@mui/material/styles'; import Typography from '@mui/material/Typography'; import LinearProgress, {linearProgressClasses} from '@mui/material/LinearProgress'; -import {styled, useTheme} from '@mui/material/styles'; -const ResultSummaryCoverage = ({item, validationReport, handleChangeTab}) => { +const ResultSummaryCoverage = ({identifier, validationReport, handleChangeTab, load}) => { if (!validationReport) return null @@ -34,26 +34,27 @@ const ResultSummaryCoverage = ({item, validationReport, handleChangeTab}) => { return - Result summary Coverage (XPath) - Mapping suite identifier - {item.identifier} + {identifier} @@ -69,7 +70,7 @@ const ResultSummaryCoverage = ({item, validationReport, handleChangeTab}) => { - diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_file.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_file.js index cec91ef7..3e48d562 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_file.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_file.js @@ -1,13 +1,13 @@ +import Grid from '@mui/material/Unstable_Grid2'; import {useEffect, useState} from "react"; -import Typography from "@mui/material/Typography"; +import Card from '@mui/material/Card'; import {TableLoadWrapper} from "./utils"; import {ListTable} from "./list-table-file"; -import CoverageReport from "./coverage_report"; -// import ItemSearchInput from "../file-manager/item-search-input"; -import {mappingPackageStatesApi as sectionApi} from "../../../api/mapping-packages/states"; +import ResultSummaryCoverage from './result-summary-coverage'; import useItemsSearch from "../../../hooks/use-items-search"; +import {mappingPackageStatesApi as sectionApi} from "../../../api/mapping-packages/states"; const XpathValidationReportTest = ({sid, suiteId, testId, mappingSuiteIdentifier}) => { const [validationReport, setValidationReport] = useState([]) @@ -34,37 +34,32 @@ const XpathValidationReportTest = ({sid, suiteId, testId, mappingSuiteIdentifier return ( <> - - Summary - - - - - - Assertions - - - {/**/} - - + + + + + + + + + + ) } diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js index e7be5fbd..50cb7fff 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js @@ -1,47 +1,26 @@ -import {useEffect, useState} from "react"; +import {useState} from "react"; -import Typography from "@mui/material/Typography"; +import Card from '@mui/material/Card'; -import {CoverageFilter, TableLoadWrapper} from "./utils"; import {ListTable} from "./list-table"; -import CoverageReport from "./coverage_report"; -// import ItemSearchInput from "../file-manager/item-search-input"; +import {CoverageFilter, TableLoadWrapper} from "./utils"; import {mappingPackageStatesApi as sectionApi} from "../../../api/mapping-packages/states"; import useItemsSearch from "../../../hooks/use-items-search"; -const XpathValidationReport = ({sid, files, mappingSuiteIdentifier, handleSelectFile}) => { - const [validationReport, setValidationReport] = useState([]) - const [dataState, setDataState] = useState({load: true, error: false}) +const XpathValidationReport = ({ validationReport, handleSelectFile}) => { + const [dataState, setDataState] = useState({load: false, error: false}) - useEffect(() => { - handleValidationReportsGet(sid) - }, []) - const handleValidationReportsGet = (sid) => { - setDataState({load: true, error: false}) - sectionApi.getXpathReports(sid) - .then(res => { - setValidationReport(res.results.map(e => ({...e, notice_count: e.test_data_xpaths.length}))) - setDataState(e => ({...e, load: false})) - }) - .catch(err => { - console.error(err); - setDataState({load: false, error: true}) - }) - } - - const itemsSearch = useItemsSearch(validationReport, sectionApi); + const itemsSearch = useItemsSearch(validationReport, sectionApi) const handleCoverageFilterChange = e => { itemsSearch.handleFiltersChange({is_covered: e.target.value}) } - return ( - <> + - {/**/} - + ) } export default XpathValidationReport \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_test_dataset.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_test_dataset.js index 6463ee3a..210f551f 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_test_dataset.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_test_dataset.js @@ -1,11 +1,11 @@ +import Grid from '@mui/material/Unstable_Grid2'; import {useEffect, useState} from "react"; -import Typography from "@mui/material/Typography"; +import Card from '@mui/material/Card'; -import {CoverageFilter, TableLoadWrapper} from "./utils"; import {ListTable} from "./list-table"; -import CoverageReport from "./coverage_report"; -// import ItemSearchInput from "../file-manager/item-search-input"; +import {CoverageFilter, TableLoadWrapper} from "./utils"; +import ResultSummaryCoverage from './result-summary-coverage'; import {mappingPackageStatesApi as sectionApi} from "../../../api/mapping-packages/states"; import useItemsSearch from "../../../hooks/use-items-search"; @@ -32,46 +32,39 @@ const XpathValidationReportSuite = ({sid, suiteId, files, mappingSuiteIdentifier const itemsSearch = useItemsSearch(validationReport, sectionApi); - const handleCoverageFilterChange = e => { - itemsSearch.handleFiltersChange({is_covered: e.target.value}) - } + const handleCoverageFilterChange = e => itemsSearch.handleFiltersChange({is_covered: e.target.value}) return ( <> - - Summary - - - - - - Assertions - - - {/**/} - - - + + + + + + + + + + + ) } diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js index c014b51a..136ca275 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js @@ -1,15 +1,8 @@ -import Grid from '@mui/material/Unstable_Grid2'; import {useState} from "react"; -import ChevronRightIcon from '@mui/icons-material/ChevronRight'; - -import Link from "@mui/material/Link"; -import Stack from "@mui/material/Stack"; -import Typography from "@mui/material/Typography"; -import Breadcrumbs from "@mui/material/Breadcrumbs"; +import Grid from '@mui/material/Unstable_Grid2'; import FileList from '../mapping-package/state/file-list'; -import CoverageFiles from "./coverage_files"; import ResultSummaryCoverage from './result-summary-coverage'; import XpathValidationReportTest from "./xpath_validation_report_file"; import XpathValidationReport from "./xpath_validation_report_package_state"; @@ -28,13 +21,11 @@ const XpathValidationReportView = ({sid, reportTree, validationReport}) => { const [selectedTestDataset, setSelectedTestDataset] = useState(reportTree.test_data_suites[0].test_data_states[0]) const handleSetPackageState = (file) => { - console.log(file) setSelectedPackageState(file) setCurrentTab(TEST_DATASET) } const handleSetTestDataset = (file) => { - console.log(file) setSelectedTestDataset(file) setCurrentTab(FILE_COVERAGE) } @@ -53,21 +44,23 @@ const XpathValidationReportView = ({sid, reportTree, validationReport}) => { return ( + + + {currentTab === PACKAGE_STATE && <> - - - - + @@ -75,19 +68,11 @@ const XpathValidationReportView = ({sid, reportTree, validationReport}) => { } {currentTab === TEST_DATASET && - <> - - - - - + } {currentTab === FILE_COVERAGE && Date: Wed, 15 Jan 2025 17:55:54 +0200 Subject: [PATCH 15/51] MWB-952: update pages --- .../src/sections/app/mapping-package/state/file-list.js | 9 +++++---- .../xpath-validation-report/result-summary-coverage.js | 7 +++---- .../xpath_validation_report_file.js | 2 +- .../xpath_validation_report_view.js | 1 + 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/file-list.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/file-list.js index c073776e..e9b6c5e8 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/file-list.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/file-list.js @@ -9,16 +9,17 @@ import FolderOpenIcon from '@mui/icons-material/FolderOpen'; import InsertDriveFileOutlinedIcon from '@mui/icons-material/InsertDriveFileOutlined'; const FileList = ({files, handleFileChange, handleFolderChange}) => { - console.log(files) - const FileIcon = () => const CollapseIcon = () => const ExpandIcon = () => return ( - - Test Set Summary + + console.log('click')}> + Test Set Summary + + justifyContent='space-between'> Coverage (XPath) @@ -61,12 +60,12 @@ const ResultSummaryCoverage = ({identifier, validationReport, handleChangeTab, l XPATHs covered {`${coveredReports.length}/${coveredReportPercent}%`} + fontWeight='bold'>{`${coveredReports.length} / ${coveredReportPercent}%`} XPATHs covered {`${notCoveredReports.length}/${notCoveredReportPercent}%`} + fontWeight='bold'>{`${notCoveredReports.length} / ${notCoveredReportPercent}%`} diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_file.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_file.js index 3e48d562..1e48f561 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_file.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_file.js @@ -1,7 +1,7 @@ -import Grid from '@mui/material/Unstable_Grid2'; import {useEffect, useState} from "react"; import Card from '@mui/material/Card'; +import Grid from '@mui/material/Unstable_Grid2'; import {TableLoadWrapper} from "./utils"; import {ListTable} from "./list-table-file"; diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js index 136ca275..47c0f524 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js @@ -43,6 +43,7 @@ const XpathValidationReportView = ({sid, reportTree, validationReport}) => { return ( From 18b49c5fb61b4323880bcc2973206ae76c8d6988 Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Thu, 16 Jan 2025 09:50:04 +0200 Subject: [PATCH 16/51] MWB-952: fix file selection --- .../app/mapping-package/state/file-list.js | 14 ++++++--- .../app/xpath-validation-report/list-table.js | 4 +-- .../xpath_validation_report_package_state.js | 12 +++---- .../xpath_validation_report_test_dataset.js | 8 ++--- .../xpath_validation_report_view.js | 31 +++++++------------ 5 files changed, 32 insertions(+), 37 deletions(-) diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/file-list.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/file-list.js index e9b6c5e8..77d141d7 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/file-list.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/file-list.js @@ -1,5 +1,6 @@ import ChevronRightIcon from '@mui/icons-material/ChevronRight'; import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; + import Paper from '@mui/material/Paper'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; @@ -8,7 +9,7 @@ import {SimpleTreeView} from '@mui/x-tree-view/SimpleTreeView'; import FolderOpenIcon from '@mui/icons-material/FolderOpen'; import InsertDriveFileOutlinedIcon from '@mui/icons-material/InsertDriveFileOutlined'; -const FileList = ({files, handleFileChange, handleFolderChange}) => { +const FileList = ({files, handleFileChange, handleFolderChange, selectedPackageState, selectedTestDataset}) => { const FileIcon = () => const CollapseIcon = () => const ExpandIcon = () => @@ -17,7 +18,7 @@ const FileList = ({files, handleFileChange, handleFolderChange}) => { console.log('click')}> + onClick={() => handleFolderChange(undefined)}> Test Set Summary { collapseIcon: CollapseIcon, endIcon: FileIcon }} + selectedItems={selectedTestDataset?.oid ?? selectedPackageState?.oid ?? ''} sx={{ overflowX: 'hidden', minHeight: 270, flexGrow: 1, [`& .${treeItemClasses.iconContainer}`]: {minWidth: 40, color: 'gray'} @@ -32,11 +34,15 @@ const FileList = ({files, handleFileChange, handleFolderChange}) => { {files?.map(item => handleFolderChange(item)}> + + onClick={() => handleFolderChange(item)}> {item.test_data_states?.map(child => handleFileChange(child)}> + onClick={() => { + handleFolderChange(item) + handleFileChange(child) + }}> )} )} diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table.js index 05c2a729..4e43c371 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table.js @@ -20,10 +20,10 @@ import DialogContent from "@mui/material/DialogContent"; import DialogActions from "@mui/material/DialogActions"; import {Scrollbar} from 'src/components/scrollbar'; +import {useHighlighterTheme} from "src/hooks/use-highlighter-theme"; import TablePagination from "src/sections/components/table-pagination"; import TableSorterHeader from "src/sections/components/table-sorter-header"; -import {useHighlighterTheme} from "src/hooks/use-highlighter-theme"; -import {TableFilterHeader} from "../../../layouts/app/table-filter-header/table-filter-header"; +import {TableFilterHeader} from "src/layouts/app/table-filter-header/table-filter-header"; export const ListTable = (props) => { const highLighterTheme = useHighlighterTheme() diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js index 50cb7fff..0cec99e0 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js @@ -4,18 +4,16 @@ import Card from '@mui/material/Card'; import {ListTable} from "./list-table"; import {CoverageFilter, TableLoadWrapper} from "./utils"; -import {mappingPackageStatesApi as sectionApi} from "../../../api/mapping-packages/states"; -import useItemsSearch from "../../../hooks/use-items-search"; +import useItemsSearch from "src/hooks/use-items-search"; +import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; -const XpathValidationReport = ({ validationReport, handleSelectFile}) => { +const XpathValidationReport = ({validationReport, handleSelectFile}) => { const [dataState, setDataState] = useState({load: false, error: false}) - const itemsSearch = useItemsSearch(validationReport, sectionApi) - const handleCoverageFilterChange = e => { - itemsSearch.handleFiltersChange({is_covered: e.target.value}) - } + const handleCoverageFilterChange = e => itemsSearch.handleFiltersChange({is_covered: e.target.value}) + return ( diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_test_dataset.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_test_dataset.js index 210f551f..56cd4582 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_test_dataset.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_test_dataset.js @@ -1,15 +1,15 @@ -import Grid from '@mui/material/Unstable_Grid2'; import {useEffect, useState} from "react"; import Card from '@mui/material/Card'; +import Grid from '@mui/material/Unstable_Grid2'; import {ListTable} from "./list-table"; +import useItemsSearch from "src/hooks/use-items-search"; import {CoverageFilter, TableLoadWrapper} from "./utils"; import ResultSummaryCoverage from './result-summary-coverage'; -import {mappingPackageStatesApi as sectionApi} from "../../../api/mapping-packages/states"; -import useItemsSearch from "../../../hooks/use-items-search"; +import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; -const XpathValidationReportSuite = ({sid, suiteId, files, mappingSuiteIdentifier, handleSelectFile}) => { +const XpathValidationReportSuite = ({sid, suiteId, mappingSuiteIdentifier, handleSelectFile}) => { const [validationReport, setValidationReport] = useState([]) const [dataState, setDataState] = useState({load: true, error: false}) diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js index 47c0f524..bd5ec3c3 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js @@ -8,37 +8,26 @@ import XpathValidationReportTest from "./xpath_validation_report_file"; import XpathValidationReport from "./xpath_validation_report_package_state"; import XpathValidationReportSuite from "./xpath_validation_report_test_dataset"; -const PACKAGE_STATE = "package_state" -const PACKAGE_STATE_LABEL = "Package State XPath Coverage" -const TEST_DATASET = "test_dataset" -const TEST_DATASET_LABEL = "Test Dataset XPath Coverage" -const FILE_COVERAGE = "file"; -const FILE_COVERAGE_LABEL = "File XPath Coverage" - const XpathValidationReportView = ({sid, reportTree, validationReport}) => { - const [currentTab, setCurrentTab] = useState(PACKAGE_STATE) - const [selectedPackageState, setSelectedPackageState] = useState(reportTree.test_data_suites[0]) - const [selectedTestDataset, setSelectedTestDataset] = useState(reportTree.test_data_suites[0].test_data_states[0]) + const [selectedPackageState, setSelectedPackageState] = useState() + const [selectedTestDataset, setSelectedTestDataset] = useState() const handleSetPackageState = (file) => { setSelectedPackageState(file) - setCurrentTab(TEST_DATASET) + setSelectedTestDataset(undefined) } const handleSetTestDataset = (file) => { setSelectedTestDataset(file) - setCurrentTab(FILE_COVERAGE) } const handleSetTestAndPackage = (testDataSuite, testData) => { const packageState = reportTree.test_data_suites.find(tds => tds.oid === testDataSuite) + setSelectedPackageState(packageState) if (testData) { setSelectedTestDataset(packageState?.test_data_states.find(ps => ps.oid === testData)); - setCurrentTab(FILE_COVERAGE) - } else { - setSelectedPackageState(packageState); - setCurrentTab(TEST_DATASET) - } + } else + setSelectedTestDataset(undefined) } return ( @@ -48,10 +37,12 @@ const XpathValidationReportView = ({sid, reportTree, validationReport}) => { - {currentTab === PACKAGE_STATE && + {!selectedPackageState && <> @@ -68,14 +59,14 @@ const XpathValidationReportView = ({sid, reportTree, validationReport}) => { } - {currentTab === TEST_DATASET && + {selectedPackageState && !selectedTestDataset && } - {currentTab === FILE_COVERAGE && + {selectedPackageState && selectedTestDataset && Date: Thu, 16 Jan 2025 11:01:35 +0200 Subject: [PATCH 17/51] MWB-952: update colors --- .../[id]/states/[sid]/view.js | 11 ++-- .../state/result-summary-coverage-shacl.js | 52 ++++--------------- .../state/result-summary-coverage-sparql.js | 50 ++++-------------- .../state/result-summary-coverage-xpath.js | 20 +++---- .../mapping-package/state/state-details.js | 3 -- .../mapping-package/state/state-pie-chart.js | 49 +++++++++++++++++ .../mapping-package/state/validation-color.js | 19 +++++++ .../result-summary-coverage.js | 2 +- 8 files changed, 104 insertions(+), 102 deletions(-) create mode 100644 mapping_workbench/frontend/src/sections/app/mapping-package/state/state-pie-chart.js create mode 100644 mapping_workbench/frontend/src/sections/app/mapping-package/state/validation-color.js diff --git a/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js b/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js index ba4f87a9..d2599650 100644 --- a/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js +++ b/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js @@ -12,6 +12,7 @@ import Card from "@mui/material/Card"; import Stack from '@mui/material/Stack'; import Button from "@mui/material/Button"; import SvgIcon from '@mui/material/SvgIcon'; +import {useTheme} from '@mui/material/styles'; import Typography from '@mui/material/Typography'; import CardContent from "@mui/material/CardContent"; import CircularProgress from "@mui/material/CircularProgress"; @@ -48,6 +49,8 @@ const tabs = [ const Page = () => { const router = useRouter(); + const theme = useTheme() + console.log(theme) const {id, sid} = router.query; @@ -70,12 +73,8 @@ const Page = () => { const resultSummarySPARQLGet = (sid) => { sectionApi.getSparqlReports(sid) - .then(res => { - setValidationReport(prev => ({...prev, sparql: mapSparqlResults(res.summary)})) - }) - .catch(err => { - console.error(err); - }) + .then(res => setValidationReport(prev => ({...prev, sparql: mapSparqlResults(res.summary)}))) + .catch(err => console.error(err)) } const mapSparqlResults = (result) => result.map(e => { diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js index 1cbec65f..1c1bec02 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js @@ -4,7 +4,9 @@ import Stack from '@mui/material/Stack'; import Paper from '@mui/material/Paper'; import Button from '@mui/material/Button'; import Typography from '@mui/material/Typography'; -import {legendClasses, PieChart} from '@mui/x-charts'; + +import StatePieChart from './state-pie-chart'; +import getValidationColor from './validation-color'; const ResultSummaryCoverageShacl = ({validationReport, handleChangeTab}) => { @@ -22,7 +24,12 @@ const ResultSummaryCoverageShacl = ({validationReport, handleChangeTab}) => { const itemsDisplay = Object.entries(itemsReduce)?.map(item => { const [itemName, itemCount] = item - return {label: itemName, value: itemCount, itemPercent: (itemCount / itemsTotal) * 100 ?? 0} + return { + label: itemName, + value: itemCount, + itemPercent: (itemCount / itemsTotal) * 100 ?? 0, + color: getValidationColor(itemName) + } }) return @@ -41,46 +48,7 @@ const ResultSummaryCoverageShacl = ({validationReport, handleChangeTab}) => { - { - const data = params.series.data[params.itemData.dataIndex] - return ( - - - {data.itemPercent}% - {data.data} - - - ); - } - }} - width={368} - height={348}/> + } diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js index 9ea75291..dbaeb0ce 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js @@ -5,6 +5,8 @@ import Paper from '@mui/material/Paper'; import Button from '@mui/material/Button'; import Typography from '@mui/material/Typography'; import {legendClasses, PieChart} from '@mui/x-charts'; +import StatePieChart from './state-pie-chart'; +import getValidationColor from './validation-color'; const ResultSummaryCoverageSparql = ({validationReport, handleChangeTab}) => { @@ -22,9 +24,15 @@ const ResultSummaryCoverageSparql = ({validationReport, handleChangeTab}) => { const itemsDisplay = Object.entries(itemsReduce)?.map(item => { const [itemName, itemCount] = item - return {label: itemName, value: itemCount, itemPercent: (itemCount / itemsTotal) * 100 ?? 0, color: itemName==='valid' ? 'red' : 'blue'} + return { + label: itemName, + value: itemCount, + itemPercent: (itemCount / itemsTotal) * 100 ?? 0, + color: getValidationColor(itemName) + } }) + console.log(itemsDisplay.length) return { - { - const data = params.series.data[params.itemData.dataIndex] - return ( - - - {data.itemPercent}% - {data.data} - - - ); - } - }} - width={368} - height={348}/> + } diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js index 19d94350..021a1fb7 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js @@ -6,9 +6,9 @@ import Button from '@mui/material/Button'; import Typography from '@mui/material/Typography'; import LinearProgress, {linearProgressClasses} from '@mui/material/LinearProgress'; import {styled} from '@mui/material/styles'; +import getValidationColor from './validation-color'; const ResultSummaryCoverageXpath = ({item, validationReport, handleChangeTab}) => { - if (!validationReport) return null const {coveredReports, notCoveredReports} = validationReport?.reduce((acc, report) => { @@ -19,7 +19,7 @@ const ResultSummaryCoverageXpath = ({item, validationReport, handleChangeTab}) = const coveredReportPercent = (coveredReports.length / validationReport.length * 100).toFixed(2) const notCoveredReportPercent = (notCoveredReports.length / validationReport.length * 100).toFixed(2) - const BorderLinearProgress = styled(LinearProgress)(({theme}) => ({ + const BorderLinearProgress = styled(LinearProgress)(({theme, lineColor}) => ({ height: 32, borderRadius: 16, [`&.${linearProgressClasses.root}`]: { @@ -31,11 +31,11 @@ const ResultSummaryCoverageXpath = ({item, validationReport, handleChangeTab}) = [`& .${linearProgressClasses.bar}`]: { borderBottomStartRadius: 16, borderTopStartRadius: 16, - ...theme.applyStyles('dark', {}), + backgroundColor: getValidationColor(lineColor), }, })); - return + return @@ -46,13 +46,13 @@ const ResultSummaryCoverageXpath = ({item, validationReport, handleChangeTab}) = - + Mapping suite identifier {item.identifier} @@ -61,15 +61,15 @@ const ResultSummaryCoverageXpath = ({item, validationReport, handleChangeTab}) = XPATHs covered {`${coveredReports.length}/${coveredReportPercent}%`} - + XPATHs covered {`${notCoveredReports.length}/${notCoveredReportPercent}%`} + lineColor='error'/> diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js index d268fdb5..0b3e3187 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js @@ -1,11 +1,8 @@ -import {useEffect, useState} from 'react'; - import Paper from '@mui/material/Paper'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; import Grid from "@mui/material/Unstable_Grid2"; -import {mappingPackageStatesApi as sectionApi} from '../../../../api/mapping-packages/states'; import ResultSummaryCoverageShacl from './result-summary-coverage-shacl'; import ResultSummaryCoverageSparql from './result-summary-coverage-sparql'; import ResultSummaryCoverageXpath from './result-summary-coverage-xpath'; diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-pie-chart.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-pie-chart.js new file mode 100644 index 00000000..1510f561 --- /dev/null +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-pie-chart.js @@ -0,0 +1,49 @@ +import Paper from '@mui/material/Paper'; +import Stack from '@mui/material/Stack'; +import {legendClasses, PieChart} from '@mui/x-charts'; + +const StatePieChart = ({items}) => { + console.log('items',items) + return { + const data = params.series.data[params.itemData.dataIndex] + return ( + + + {data.itemPercent}% + {data.data} + + + ); + } + }} + width={368} + height={348}/> +} + +export default StatePieChart \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/validation-color.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/validation-color.js new file mode 100644 index 00000000..a0b0250b --- /dev/null +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/validation-color.js @@ -0,0 +1,19 @@ +const getValidationColor = (color) => { + switch (color) { + case 'valid': + return '#90BE6D' + case 'unverifiable': + case 'info': + return '#2D9CDB' + case 'invalid': + return '#F94144' + case 'error': + return '#F8961E' + case 'warning': + return '#F9C74F' + default: + return '#577590' + } +} + +export default getValidationColor \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js index 5958e91c..c55a93c6 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js @@ -63,7 +63,7 @@ const ResultSummaryCoverage = ({identifier, validationReport, handleChangeTab, l fontWeight='bold'>{`${coveredReports.length} / ${coveredReportPercent}%`} - XPATHs covered + XPATHs not covered {`${notCoveredReports.length} / ${notCoveredReportPercent}%`} From 1b7dbb8a5765fe3756ad4cbf3cc63b8287d53e4c Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Thu, 16 Jan 2025 11:51:41 +0200 Subject: [PATCH 18/51] MWB-952: update line graph --- .../state/result-summary-coverage-xpath.js | 32 +++--------- .../state/state-line-progress.js | 51 +++++++++++++++++++ .../mapping-package/state/validation-color.js | 1 + .../result-summary-coverage.js | 32 ++++-------- 4 files changed, 67 insertions(+), 49 deletions(-) create mode 100644 mapping_workbench/frontend/src/sections/app/mapping-package/state/state-line-progress.js diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js index 021a1fb7..8aaefd38 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js @@ -4,9 +4,7 @@ import Stack from '@mui/material/Stack'; import Paper from '@mui/material/Paper'; import Button from '@mui/material/Button'; import Typography from '@mui/material/Typography'; -import LinearProgress, {linearProgressClasses} from '@mui/material/LinearProgress'; -import {styled} from '@mui/material/styles'; -import getValidationColor from './validation-color'; +import {LineProgress} from './state-line-progress'; const ResultSummaryCoverageXpath = ({item, validationReport, handleChangeTab}) => { if (!validationReport) return null @@ -19,22 +17,6 @@ const ResultSummaryCoverageXpath = ({item, validationReport, handleChangeTab}) = const coveredReportPercent = (coveredReports.length / validationReport.length * 100).toFixed(2) const notCoveredReportPercent = (notCoveredReports.length / validationReport.length * 100).toFixed(2) - const BorderLinearProgress = styled(LinearProgress)(({theme, lineColor}) => ({ - height: 32, - borderRadius: 16, - [`&.${linearProgressClasses.root}`]: { - backgroundColor: theme.palette.grey[200], - ...theme.applyStyles('dark', { - backgroundColor: theme.palette.grey[800], - }), - }, - [`& .${linearProgressClasses.bar}`]: { - borderBottomStartRadius: 16, - borderTopStartRadius: 16, - backgroundColor: getValidationColor(lineColor), - }, - })); - return XPATHs covered {`${coveredReports.length}/${coveredReportPercent}%`} - + - XPATHs covered + XPATHs not covered {`${notCoveredReports.length}/${notCoveredReportPercent}%`} - + diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-line-progress.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-line-progress.js new file mode 100644 index 00000000..123560aa --- /dev/null +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-line-progress.js @@ -0,0 +1,51 @@ +import LinearProgress, {linearProgressClasses} from '@mui/material/LinearProgress'; +import {styled} from '@mui/material/styles'; +import getValidationColor from './validation-color'; + +export const LineProgressDouble = ({value, load, color, endColor}) => { + const BorderLinearProgress = styled(LinearProgress)(({linecolor, endcolor}) => ({ + height: 32, + borderRadius: 16, + [`&.${linearProgressClasses.root}`]: { + backgroundColor: getValidationColor(endColor), + }, + [`& .${linearProgressClasses.bar}`]: { + borderBottomStartRadius: 16, + borderTopStartRadius: 16, + backgroundColor: getValidationColor(linecolor) + }, + })); + + + return ( + ) +}; + + +export const LineProgress = ({value, load, color}) => { + const BorderLinearProgress = styled(LinearProgress)(({theme, linecolor}) => ({ + height: 32, + borderRadius: 16, + [`&.${linearProgressClasses.root}`]: { + backgroundColor: theme.palette.grey[200], + ...theme.applyStyles('dark', { + backgroundColor: theme.palette.grey[800], + }), + }, + [`& .${linearProgressClasses.bar}`]: { + borderBottomStartRadius: 16, + borderTopStartRadius: 16, + backgroundColor: getValidationColor(linecolor), + }, + })); + + return ( + + ) +} + diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/validation-color.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/validation-color.js index a0b0250b..166e86ec 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/validation-color.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/validation-color.js @@ -6,6 +6,7 @@ const getValidationColor = (color) => { case 'info': return '#2D9CDB' case 'invalid': + case 'violation': return '#F94144' case 'error': return '#F8961E' diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js index c55a93c6..4ef18114 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js @@ -3,9 +3,8 @@ import FileDownloadOutlinedIcon from '@mui/icons-material/FileDownloadOutlined'; import Stack from '@mui/material/Stack'; import Paper from '@mui/material/Paper'; import Button from '@mui/material/Button'; -import {styled} from '@mui/material/styles'; import Typography from '@mui/material/Typography'; -import LinearProgress, {linearProgressClasses} from '@mui/material/LinearProgress'; +import {LineProgress, LineProgressDouble} from '../mapping-package/state/state-line-progress'; const ResultSummaryCoverage = ({identifier, validationReport, handleChangeTab, load}) => { @@ -19,18 +18,6 @@ const ResultSummaryCoverage = ({identifier, validationReport, handleChangeTab, l const coveredReportPercent = (coveredReports.length / validationReport.length * 100).toFixed(2) const notCoveredReportPercent = (notCoveredReports.length / validationReport.length * 100).toFixed(2) - const BorderLinearProgress = styled(LinearProgress)(({theme}) => ({ - height: 32, - borderRadius: 16, - [`&.${linearProgressClasses.root}`]: { - backgroundColor: '#F9C74F', - }, - [`& .${linearProgressClasses.bar}`]: { - borderBottomStartRadius: 16, - borderTopStartRadius: 16, - backgroundColor: '#90BE6D' - }, - })); return Coverage (XPath) @@ -69,10 +55,10 @@ const ResultSummaryCoverage = ({identifier, validationReport, handleChangeTab, l - - + } From 41135665a534a20a282f75326bcd514784da25e5 Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Thu, 16 Jan 2025 14:09:31 +0200 Subject: [PATCH 19/51] MWB-952: update shacl pages --- .../[id]/states/[sid]/view.js | 27 ++--- .../state/result-summary-coverage-shacl.js | 2 +- .../state/result-summary-coverage-sparql.js | 5 +- .../mapping-package/state/state-pie-chart.js | 47 +++++++- .../result-summary-coverage.js | 60 ++++++++++ .../result-summary-query.js | 50 ++++++++ .../sparql_validation_report_file.js | 74 ++++++------ .../sparql_validation_report_package_state.js | 13 --- .../sparql_validation_report_test_dataset.js | 72 ++++++------ .../sparql_validation_report_view.js | 108 +++++++----------- .../result-summary-coverage.js | 2 +- 11 files changed, 272 insertions(+), 188 deletions(-) create mode 100644 mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js create mode 100644 mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-query.js diff --git a/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js b/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js index d2599650..aabc5e92 100644 --- a/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js +++ b/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js @@ -8,13 +8,11 @@ import Tab from '@mui/material/Tab'; import Chip from '@mui/material/Chip'; import Tabs from '@mui/material/Tabs'; import Link from '@mui/material/Link'; -import Card from "@mui/material/Card"; import Stack from '@mui/material/Stack'; import Button from "@mui/material/Button"; import SvgIcon from '@mui/material/SvgIcon'; import {useTheme} from '@mui/material/styles'; import Typography from '@mui/material/Typography'; -import CardContent from "@mui/material/CardContent"; import CircularProgress from "@mui/material/CircularProgress"; import {paths} from 'src/paths'; @@ -264,24 +262,17 @@ const Page = () => { /> )} {currentTab === 'sparql' && ( - - - - - + )} {currentTab === 'shacl' && ( - - - - - + )} diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js index 1c1bec02..358aec5d 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js @@ -5,7 +5,7 @@ import Paper from '@mui/material/Paper'; import Button from '@mui/material/Button'; import Typography from '@mui/material/Typography'; -import StatePieChart from './state-pie-chart'; +import {StatePieChart} from './state-pie-chart'; import getValidationColor from './validation-color'; const ResultSummaryCoverageShacl = ({validationReport, handleChangeTab}) => { diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js index dbaeb0ce..b5b21a1e 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js @@ -4,8 +4,7 @@ import Stack from '@mui/material/Stack'; import Paper from '@mui/material/Paper'; import Button from '@mui/material/Button'; import Typography from '@mui/material/Typography'; -import {legendClasses, PieChart} from '@mui/x-charts'; -import StatePieChart from './state-pie-chart'; +import {StatePieChart} from './state-pie-chart'; import getValidationColor from './validation-color'; const ResultSummaryCoverageSparql = ({validationReport, handleChangeTab}) => { @@ -32,8 +31,6 @@ const ResultSummaryCoverageSparql = ({validationReport, handleChangeTab}) => { } }) - console.log(itemsDisplay.length) - return { - console.log('items',items) +export const StatePieChart = ({items}) => { return { height={348}/> } -export default StatePieChart \ No newline at end of file + +export const StatePieChartBig = ({items}) => { + return { + const data = params.series.data[params.itemData.dataIndex] + return ( + + + {data.itemPercent}% + {data.data} + + + ); + } + }} + width={500} + height={220}/> +} diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js new file mode 100644 index 00000000..5f0b8491 --- /dev/null +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js @@ -0,0 +1,60 @@ +import FileDownloadOutlinedIcon from '@mui/icons-material/FileDownloadOutlined'; +import Button from '@mui/material/Button'; +import Paper from '@mui/material/Paper'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import {StatePieChartBig} from '../mapping-package/state/state-pie-chart'; +import getValidationColor from '../mapping-package/state/validation-color'; + + +const ResultSummaryCoverage = ({validationReport}) => { + + + if (!validationReport) return null + + const {itemsTotal, ...itemsReduce} = + validationReport.map(item => item.result).reduce((acc, report) => { + Object.keys(report).forEach(reportKey => { + acc[reportKey] = (acc[reportKey] ?? 0) + report[reportKey].count + acc["itemsTotal"] = (acc["itemsTotal"] ?? 0) + report[reportKey].count + } + ) + return acc + }, {valid: 0, unverifiable: 0, warning: 0, invalid: 0, error: 0, unknown: 0}) + + const itemsDisplay = Object.entries(itemsReduce)?.map(item => { + const [itemName, itemCount] = item + return { + label: itemName, + value: itemCount, + itemPercent: (itemCount / itemsTotal) * 100 ?? 0, + color: getValidationColor(itemName) + } + }) + + return ( + + + + Coverage (XPath) + + + + + + + + ) +} + +export default ResultSummaryCoverage \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-query.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-query.js new file mode 100644 index 00000000..ff5a4b66 --- /dev/null +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-query.js @@ -0,0 +1,50 @@ +import FileDownloadOutlinedIcon from '@mui/icons-material/FileDownloadOutlined'; + +import Button from '@mui/material/Button'; +import Paper from '@mui/material/Paper'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import {StatePieChartBig} from '../mapping-package/state/state-pie-chart'; +import getValidationColor from '../mapping-package/state/validation-color'; + +const ResultSummaryQuery = ({validationReport}) => { + const itemsReduce = validationReport.reduce((acc, item) => { + acc[item.result] = (acc[item.result] ?? 0) + 1 + return acc + }, {valid: 0, unverifiable: 0, warning: 0, invalid: 0, error: 0, unknown: 0}) + + const itemsDisplay = Object.entries(itemsReduce)?.map(item => { + const [itemName, itemCount] = item + return { + label: itemName, + value: itemCount, + itemPercent: (itemCount / validationReport.length) * 100 ?? 0, + color: getValidationColor(itemName) + } + }) + + return ( + + + + Coverage (XPath) + + + + + + + + ) +} + +export default ResultSummaryQuery \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js index 3b8b3543..35a6a26b 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js @@ -1,11 +1,13 @@ import {useEffect, useState} from "react"; -import Typography from "@mui/material/Typography"; + +import Paper from '@mui/material/Paper'; +import Grid from '@mui/material/Unstable_Grid2'; import {ListTableFile} from "./list-table-file"; -import {QueryResultTable} from "./query-result-table"; +import ResultSummaryQuery from './result-summary-query'; import {ResultFilter, TableLoadWrapper} from "./utils"; +import useItemsSearch from "src/hooks/use-items-search"; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; -import useItemsSearch from "../../../hooks/use-items-search"; const SparqlFileReport = ({sid, suiteId, testId}) => { @@ -14,7 +16,7 @@ const SparqlFileReport = ({sid, suiteId, testId}) => { useEffect(() => { handleValidationReportsGet(sid, suiteId, testId) - }, []) + }, [testId]) const handleValidationReportsGet = (sid, suiteId, testId) => { setDataState({load: true, error: false}) @@ -49,46 +51,36 @@ const SparqlFileReport = ({sid, suiteId, testId}) => { const itemsSearch = useItemsSearch(validationReport, sectionApi); - const handleResultFilterChange = e => { - itemsSearch.handleFiltersChange({result: e.target.value}) - } + const handleResultFilterChange = e => itemsSearch.handleFiltersChange({result: e.target.value}) return ( <> - - Results Summary - - - - - - Assertions - - - {/**/} - - - + + + + + + + + + + + ) } export default SparqlFileReport \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js index 1e6152dc..722d29a1 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js @@ -56,19 +56,6 @@ const SparqlValidationReport = ({sid, handleSelectFile}) => { return ( <> - - Results Summary - - - - - - Assertions - diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js index 18064340..ac87cd2e 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js @@ -1,13 +1,12 @@ +import Paper from '@mui/material/Paper'; +import Grid from '@mui/material/Unstable_Grid2'; import {useEffect, useState} from "react"; -import Typography from "@mui/material/Typography"; - import {ListTable} from "./list-table"; +import ResultSummaryCoverage from './result-summary-coverage'; import {TableLoadWrapper} from "./utils"; -import ResultSummaryTable from "./result-summary-table"; -// import ItemSearchInput from "../file-manager/item-search-input"; -import {mappingPackageStatesApi as sectionApi} from "../../../api/mapping-packages/states"; -import useItemsSearch from "../../../hooks/use-items-search"; +import useItemsSearch from "src/hooks/use-items-search"; +import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; const SparqlTestDatasetReport = ({sid, suiteId, handleSelectFile}) => { const [validationReport, setValidationReport] = useState([]) @@ -56,38 +55,33 @@ const SparqlTestDatasetReport = ({sid, suiteId, handleSelectFile}) => { return ( <> - - Results Summary - - - - - - Assertions - - - {/**/} - - - ) + + + + + + + + + + + + ) } export default SparqlTestDatasetReport \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_view.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_view.js index cda1de12..e72765ea 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_view.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_view.js @@ -1,109 +1,81 @@ import {useState} from "react"; -import ChevronRightIcon from '@mui/icons-material/ChevronRight'; +import Grid from '@mui/material/Unstable_Grid2'; -import Link from "@mui/material/Link"; -import Stack from "@mui/material/Stack"; -import Typography from "@mui/material/Typography"; -import Breadcrumbs from "@mui/material/Breadcrumbs"; +import FileList from '../mapping-package/state/file-list'; +import ResultSummaryCoverage from './result-summary-coverage'; -import CoverageFiles from "./coverage_files"; import SparqlFileReport from "./sparql_validation_report_file"; import SparqlTestDatasetReport from "./sparql_validation_report_test_dataset"; import SparqlPackageStateReport from "./sparql_validation_report_package_state"; -const PACKAGE_STATE = "package_state"; -const PACKAGE_STATE_LABEL = "Package State SPARQL Coverage"; -const TEST_DATASET = "test_dataset"; -const TEST_DATASET_LABEL = "Test Dataset SPARQL Coverage"; -const FILE_COVERAGE = "file_coverage"; -const FILE_COVERAGE_LABEL = "File SPARQL Coverage" +const SparqlValidationReportView = ({sid, reportTree, validationReport}) => { -const SparqlValidationReportView = ({sid, reportTree}) => { - - const [selectedPackageState, setSelectedPackageState] = useState(reportTree.test_data_suites[0]) - const [selectedTestDataset, setSelectedTestDataset] = useState(reportTree.test_data_suites[0].test_data_states[0]) - const [currentTab, setCurrentTab] = useState(PACKAGE_STATE) + const [selectedPackageState, setSelectedPackageState] = useState() + const [selectedTestDataset, setSelectedTestDataset] = useState() const handleSetPackageState = (file) => { setSelectedPackageState(file) - setCurrentTab(TEST_DATASET) } const handleSetTestDataset = (file) => { setSelectedTestDataset(file) - setCurrentTab(FILE_COVERAGE) } const handleSetTestAndPackage = (testDataSuite, testData) => { const packageState = reportTree.test_data_suites.find(tds => tds.oid === testDataSuite) if (testData) { setSelectedTestDataset(packageState?.test_data_states.find(ps => ps.oid === testData)); - setCurrentTab(FILE_COVERAGE) } else { setSelectedPackageState(packageState); - setCurrentTab(TEST_DATASET) } } + console.log(selectedPackageState,selectedTestDataset) + return ( - <> - - }> - setCurrentTab(PACKAGE_STATE)} - > - {PACKAGE_STATE_LABEL} - - {currentTab !== PACKAGE_STATE && - setCurrentTab(TEST_DATASET)} - > - {TEST_DATASET_LABEL}: {{selectedPackageState.identifier}} - } - {currentTab === FILE_COVERAGE && - - {FILE_COVERAGE_LABEL}: {{selectedTestDataset.identifier}} - } - - - {currentTab === PACKAGE_STATE && + + + + + {!selectedPackageState && <> - - + + + + + + } - {currentTab === TEST_DATASET && - <> - - - + {selectedPackageState && !selectedTestDataset && + + } - {currentTab === FILE_COVERAGE && + {selectedPackageState && selectedTestDataset && } - + ) } diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js index 4ef18114..f7c9f12c 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js @@ -4,7 +4,7 @@ import Stack from '@mui/material/Stack'; import Paper from '@mui/material/Paper'; import Button from '@mui/material/Button'; import Typography from '@mui/material/Typography'; -import {LineProgress, LineProgressDouble} from '../mapping-package/state/state-line-progress'; +import {LineProgressDouble} from '../mapping-package/state/state-line-progress'; const ResultSummaryCoverage = ({identifier, validationReport, handleChangeTab, load}) => { From 0445d4678101a41a72fdc7d773799eae4128be17 Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Thu, 16 Jan 2025 14:33:07 +0200 Subject: [PATCH 20/51] MWB-952: update shacl and xpath pages file interactions --- .../result-summary-coverage.js | 79 ++++++++++++------- .../result-summary-query.js | 50 ------------ .../sparql_validation_report_file.js | 2 +- .../sparql_validation_report_package_state.js | 54 +++++++------ .../sparql_validation_report_test_dataset.js | 5 +- .../sparql_validation_report_view.js | 26 +++--- .../xpath_validation_report_package_state.js | 54 +++++++------ .../xpath_validation_report_view.js | 24 ++---- 8 files changed, 131 insertions(+), 163 deletions(-) delete mode 100644 mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-query.js diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js index 5f0b8491..c9a4595d 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js @@ -6,9 +6,34 @@ import Typography from '@mui/material/Typography'; import {StatePieChartBig} from '../mapping-package/state/state-pie-chart'; import getValidationColor from '../mapping-package/state/validation-color'; +const Pie = ({data}) => { + return ( + + + + Coverage (Sparql) + + + + + + + + ) +} -const ResultSummaryCoverage = ({validationReport}) => { - +export const ResultSummaryCoverage = ({validationReport}) => { if (!validationReport) return null @@ -24,37 +49,35 @@ const ResultSummaryCoverage = ({validationReport}) => { const itemsDisplay = Object.entries(itemsReduce)?.map(item => { const [itemName, itemCount] = item + const percent = (itemCount / validationReport.length) * 100 ?? 0 + return { - label: itemName, + label: `${itemName[0].toUpperCase()}${itemName.slice(1)} (${percent.toFixed(2)}% - ${itemCount})`, value: itemCount, - itemPercent: (itemCount / itemsTotal) * 100 ?? 0, + itemPercent: percent.toFixed(2), color: getValidationColor(itemName) } }) - return ( - - - - Coverage (XPath) - - - - - - - - ) + return } -export default ResultSummaryCoverage \ No newline at end of file +export const ResultSummaryQuery = ({validationReport}) => { + const itemsReduce = validationReport.reduce((acc, item) => { + acc[item.result] = (acc[item.result] ?? 0) + 1 + return acc + }, {valid: 0, unverifiable: 0, warning: 0, invalid: 0, error: 0, unknown: 0}) + + const itemsDisplay = Object.entries(itemsReduce)?.map(item => { + const [itemName, itemCount] = item + const percent = (itemCount / validationReport.length) * 100 ?? 0 + return { + label: `${itemName[0].toUpperCase()}${itemName.slice(1)} (${percent.toFixed(2)}% - ${itemCount})`, + value: itemCount, + itemPercent: percent.toFixed(2), + color: getValidationColor(itemName) + } + }) + + return +} diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-query.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-query.js deleted file mode 100644 index ff5a4b66..00000000 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-query.js +++ /dev/null @@ -1,50 +0,0 @@ -import FileDownloadOutlinedIcon from '@mui/icons-material/FileDownloadOutlined'; - -import Button from '@mui/material/Button'; -import Paper from '@mui/material/Paper'; -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; -import {StatePieChartBig} from '../mapping-package/state/state-pie-chart'; -import getValidationColor from '../mapping-package/state/validation-color'; - -const ResultSummaryQuery = ({validationReport}) => { - const itemsReduce = validationReport.reduce((acc, item) => { - acc[item.result] = (acc[item.result] ?? 0) + 1 - return acc - }, {valid: 0, unverifiable: 0, warning: 0, invalid: 0, error: 0, unknown: 0}) - - const itemsDisplay = Object.entries(itemsReduce)?.map(item => { - const [itemName, itemCount] = item - return { - label: itemName, - value: itemCount, - itemPercent: (itemCount / validationReport.length) * 100 ?? 0, - color: getValidationColor(itemName) - } - }) - - return ( - - - - Coverage (XPath) - - - - - - - - ) -} - -export default ResultSummaryQuery \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js index 35a6a26b..18196f62 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js @@ -4,9 +4,9 @@ import Paper from '@mui/material/Paper'; import Grid from '@mui/material/Unstable_Grid2'; import {ListTableFile} from "./list-table-file"; -import ResultSummaryQuery from './result-summary-query'; import {ResultFilter, TableLoadWrapper} from "./utils"; import useItemsSearch from "src/hooks/use-items-search"; +import {ResultSummaryQuery} from './result-summary-coverage'; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js index 722d29a1..3c7dcaa7 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js @@ -1,13 +1,12 @@ import {useEffect, useState} from "react"; -import {mappingPackageStatesApi as sectionApi} from "../../../api/mapping-packages/states"; +import Grid from '@mui/material/Unstable_Grid2'; -import Typography from "@mui/material/Typography"; - -// import ItemSearchInput from "../file-manager/item-search-input"; import {ListTable} from "./list-table"; -import ResultSummaryTable from "./result-summary-table"; + import {TableLoadWrapper} from "./utils"; -import useItemsSearch from "../../../hooks/use-items-search"; +import useItemsSearch from "src/hooks/use-items-search"; +import {ResultSummaryCoverage} from './result-summary-coverage'; +import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; const SparqlValidationReport = ({sid, handleSelectFile}) => { @@ -56,25 +55,30 @@ const SparqlValidationReport = ({sid, handleSelectFile}) => { return ( <> - - {/**/} - - + + + + + + + + ) } diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js index ac87cd2e..373d06f7 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js @@ -1,9 +1,10 @@ +import {useEffect, useState} from "react"; + import Paper from '@mui/material/Paper'; import Grid from '@mui/material/Unstable_Grid2'; -import {useEffect, useState} from "react"; import {ListTable} from "./list-table"; -import ResultSummaryCoverage from './result-summary-coverage'; +import {ResultSummaryCoverage} from './result-summary-coverage'; import {TableLoadWrapper} from "./utils"; import useItemsSearch from "src/hooks/use-items-search"; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_view.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_view.js index e72765ea..4e3f14cf 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_view.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_view.js @@ -3,8 +3,6 @@ import {useState} from "react"; import Grid from '@mui/material/Unstable_Grid2'; import FileList from '../mapping-package/state/file-list'; -import ResultSummaryCoverage from './result-summary-coverage'; - import SparqlFileReport from "./sparql_validation_report_file"; import SparqlTestDatasetReport from "./sparql_validation_report_test_dataset"; import SparqlPackageStateReport from "./sparql_validation_report_package_state"; @@ -16,6 +14,7 @@ const SparqlValidationReportView = ({sid, reportTree, validationReport}) => { const handleSetPackageState = (file) => { setSelectedPackageState(file) + setSelectedTestDataset(undefined) } const handleSetTestDataset = (file) => { @@ -24,14 +23,15 @@ const SparqlValidationReportView = ({sid, reportTree, validationReport}) => { const handleSetTestAndPackage = (testDataSuite, testData) => { const packageState = reportTree.test_data_suites.find(tds => tds.oid === testDataSuite) + setSelectedPackageState(packageState) if (testData) { setSelectedTestDataset(packageState?.test_data_states.find(ps => ps.oid === testData)); } else { - setSelectedPackageState(packageState); + setSelectedPackageState(undefined); } } - console.log(selectedPackageState,selectedTestDataset) + console.log(selectedPackageState, selectedTestDataset) return ( { handleFileChange={handleSetTestDataset}/> {!selectedPackageState && - <> - - - - - - - + } {selectedPackageState && !selectedTestDataset && { +const XpathValidationReport = ({validationReport, handleSelectFile, mappingSuiteIdentifier}) => { const [dataState, setDataState] = useState({load: false, error: false}) const itemsSearch = useItemsSearch(validationReport, sectionApi) @@ -16,27 +17,34 @@ const XpathValidationReport = ({validationReport, handleSelectFile}) => { return ( - - - - - - + <> + + + + + + + + + + ) } export default XpathValidationReport \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js index bd5ec3c3..436e3bf0 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js @@ -3,7 +3,6 @@ import {useState} from "react"; import Grid from '@mui/material/Unstable_Grid2'; import FileList from '../mapping-package/state/file-list'; -import ResultSummaryCoverage from './result-summary-coverage'; import XpathValidationReportTest from "./xpath_validation_report_file"; import XpathValidationReport from "./xpath_validation_report_package_state"; import XpathValidationReportSuite from "./xpath_validation_report_test_dataset"; @@ -26,8 +25,9 @@ const XpathValidationReportView = ({sid, reportTree, validationReport}) => { setSelectedPackageState(packageState) if (testData) { setSelectedTestDataset(packageState?.test_data_states.find(ps => ps.oid === testData)); - } else + } else { setSelectedTestDataset(undefined) + } } return ( @@ -43,21 +43,11 @@ const XpathValidationReportView = ({sid, reportTree, validationReport}) => { handleFileChange={handleSetTestDataset}/> {!selectedPackageState && - <> - - - - - - - - + } {selectedPackageState && !selectedTestDataset && Date: Thu, 16 Jan 2025 15:02:21 +0200 Subject: [PATCH 21/51] MWB-952: fixes for sparql --- .../sparql-validation-report/list-table.js | 2 +- .../result-summary-coverage.js | 8 +- .../sparql_validation_report_package_state.js | 87 ++++++------------- .../sparql_validation_report_view.js | 3 +- 4 files changed, 32 insertions(+), 68 deletions(-) diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js index e795fdf2..9a92a4dc 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js @@ -26,7 +26,7 @@ import {Scrollbar} from 'src/components/scrollbar'; import {useHighlighterTheme} from "src/hooks/use-highlighter-theme"; import TablePagination from "src/sections/components/table-pagination"; import TableSorterHeader from "src/sections/components/table-sorter-header"; -import {TableFilterHeader} from "../../../layouts/app/table-filter-header/table-filter-header"; +import {TableFilterHeader} from "src/layouts/app/table-filter-header/table-filter-header"; export const ListTable = (props) => { const [descriptionDialog, setDescriptionDialog] = useState({open: false, title: "", description: ""}) diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js index c9a4595d..2f39f02b 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js @@ -1,8 +1,10 @@ import FileDownloadOutlinedIcon from '@mui/icons-material/FileDownloadOutlined'; + import Button from '@mui/material/Button'; import Paper from '@mui/material/Paper'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; + import {StatePieChartBig} from '../mapping-package/state/state-pie-chart'; import getValidationColor from '../mapping-package/state/validation-color'; @@ -16,13 +18,11 @@ const Pie = ({data}) => { justifyContent='space-between'> Coverage (Sparql) + fontWeight='bold'>Coverage (SPARQL) diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js index 3c7dcaa7..3d56993b 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js @@ -1,56 +1,17 @@ -import {useEffect, useState} from "react"; +import {useState} from "react"; + +import Paper from '@mui/material/Paper'; import Grid from '@mui/material/Unstable_Grid2'; import {ListTable} from "./list-table"; - import {TableLoadWrapper} from "./utils"; import useItemsSearch from "src/hooks/use-items-search"; import {ResultSummaryCoverage} from './result-summary-coverage'; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; -const SparqlValidationReport = ({sid, handleSelectFile}) => { - const [validationReport, setValidationReport] = useState([]) - const [dataState, setDataState] = useState({load: true, error: false}) - - useEffect(() => { - handleValidationReportsGet(sid) - }, []) - - const handleValidationReportsGet = (sid) => { - setDataState({load: true, error: false}) - sectionApi.getSparqlReports(sid) - .then(res => { - setValidationReport(mapSparqlResults(res.summary)) - setDataState(e => ({...e, load: false})) - }) - .catch(err => { - console.error(err); - setDataState({load: false, error: true}) - }) - } - - const mapSparqlResults = (result) => result.map(e => { - const queryAsArray = e.query.content.split("\n") - const values = queryAsArray.slice(0, 3) - const resultArray = {} - values.forEach(e => { - const res = e.split(": ") - resultArray[res[0].substring(1)] = res[1] - } - ) - resultArray["query"] = queryAsArray.slice(4, queryAsArray.length).join("\n") - resultArray["test_suite"] = e.query.filename - resultArray["result"] = e.result - Object.entries(e.result).forEach(entrie => { - const [key, value] = entrie - resultArray[`${key}Count`] = value.count - }) - resultArray["meets_xpath_condition"] = e.meets_xpath_condition - resultArray["xpath_condition"] = e.query?.cm_rule?.xpath_condition - return resultArray; - }) - +const SparqlValidationReport = ({handleSelectFile, validationReport}) => { + const [dataState, setDataState] = useState({load: false, error: false}) const itemsSearch = useItemsSearch(validationReport, sectionApi); return ( @@ -60,24 +21,26 @@ const SparqlValidationReport = ({sid, handleSelectFile}) => { - - - + + + + + ) } diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_view.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_view.js index 4e3f14cf..fa00ac9c 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_view.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_view.js @@ -27,7 +27,7 @@ const SparqlValidationReportView = ({sid, reportTree, validationReport}) => { if (testData) { setSelectedTestDataset(packageState?.test_data_states.find(ps => ps.oid === testData)); } else { - setSelectedPackageState(undefined); + setSelectedTestDataset(undefined); } } @@ -48,6 +48,7 @@ const SparqlValidationReportView = ({sid, reportTree, validationReport}) => { {!selectedPackageState && From 2dfc920a7e4432595e506d376ebca99028faf76e Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Thu, 16 Jan 2025 15:38:29 +0200 Subject: [PATCH 22/51] MWB-952: update shacl page --- .../[id]/states/[sid]/view.js | 1 + .../result-summary-coverage.js | 84 ++++++++++++++ .../shacl_validation_report_file.js | 69 ++++++------ .../shacl_validation_report_package_state.js | 103 ++++++------------ .../shacl_validation_report_test_dataset.js | 65 +++++------ .../shacl_validation_report_view.js | 96 ++++++---------- .../result-summary-coverage.js | 2 +- .../xpath_validation_report_package_state.js | 41 +++---- .../xpath_validation_report_view.js | 2 +- 9 files changed, 241 insertions(+), 222 deletions(-) create mode 100644 mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-summary-coverage.js diff --git a/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js b/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js index aabc5e92..22064ff3 100644 --- a/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js +++ b/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js @@ -271,6 +271,7 @@ const Page = () => { {currentTab === 'shacl' && ( )} diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-summary-coverage.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-summary-coverage.js new file mode 100644 index 00000000..c82dca98 --- /dev/null +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-summary-coverage.js @@ -0,0 +1,84 @@ +import FileDownloadOutlinedIcon from '@mui/icons-material/FileDownloadOutlined'; + +import Button from '@mui/material/Button'; +import Paper from '@mui/material/Paper'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; + +import {StatePieChartBig} from '../mapping-package/state/state-pie-chart'; +import getValidationColor from '../mapping-package/state/validation-color'; + +const Pie = ({data}) => { + return ( + + + + Coverage (SHACL) + + + + + + + + ) +} + +export const ResultSummaryCoverage = ({validationReport}) => { + + if (!validationReport) return null + + const {itemsTotal, ...itemsReduce} = + validationReport.map(item => item.result).reduce((acc, report) => { + Object.keys(report).forEach(reportKey => { + acc[reportKey] = (acc[reportKey] ?? 0) + report[reportKey].count + acc["itemsTotal"] = (acc["itemsTotal"] ?? 0) + report[reportKey].count + } + ) + return acc + },{info:0, valid:0, violation:0, warning:0}) + + const itemsDisplay = Object.entries(itemsReduce)?.map(item => { + const [itemName, itemCount] = item + console.log(item) + const percent = (itemCount/itemsTotal) * 100 ?? 0 + + return { + label: `${itemName[0].toUpperCase()}${itemName.slice(1)} (${percent.toFixed(2)}% - ${itemCount})`, + value: itemCount, + itemPercent: percent.toFixed(2), + color: getValidationColor(itemName) + } + }) + + return +} + +export const ResultSummaryQuery = ({validationReport}) => { + const itemsReduce = validationReport.reduce((acc, item) => { + acc[item.result] = (acc[item.result] ?? 0) + 1 + return acc + }, {valid: 0, unverifiable: 0, warning: 0, invalid: 0, error: 0, unknown: 0}) + + const itemsDisplay = Object.entries(itemsReduce)?.map(item => { + const [itemName, itemCount] = item + const percent = (itemCount / validationReport.length) * 100 ?? 0 + return { + label: `${itemName[0].toUpperCase()}${itemName.slice(1)} (${percent.toFixed(2)}% - ${itemCount})`, + value: itemCount, + itemPercent: percent.toFixed(2), + color: getValidationColor(itemName) + } + }) + + return +} diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_file.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_file.js index 9eda11e6..8b46c61f 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_file.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_file.js @@ -1,12 +1,13 @@ import {useEffect, useState} from "react"; -import Typography from "@mui/material/Typography"; +import Paper from '@mui/material/Paper'; +import Grid from '@mui/material/Unstable_Grid2'; import {TableLoadWrapper} from "./utils"; import {ResultTable} from "./result-table"; import {ListTableFile} from "./list-table-file"; +import useItemsSearch from "src/hooks/use-items-search"; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; -import useItemsSearch from "../../../hooks/use-items-search"; const ShaclFileReport = ({sid, suiteId, testId}) => { @@ -16,7 +17,7 @@ const ShaclFileReport = ({sid, suiteId, testId}) => { useEffect(() => { handleValidationReportsGet(sid, suiteId, testId) - }, []) + }, [testId]) const handleValidationReportsGet = (sid, suiteId, testId) => { setDataState({load: true, error: false}) @@ -44,37 +45,37 @@ const ShaclFileReport = ({sid, suiteId, testId}) => { return ( <> - - Results - - - - - - Assertions - - - {/**/} - - + + + + + + + + + + + + + + ) } diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js index 8d6ff564..c6e73531 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js @@ -1,84 +1,47 @@ -import {useEffect, useState} from "react"; +import {useState} from "react"; -import Typography from "@mui/material/Typography"; +import Paper from '@mui/material/Paper'; +import Grid from '@mui/material/Unstable_Grid2'; import {ListTable} from "./list-table"; +import {ResultSummaryCoverage} from './result-summary-coverage'; import {TableLoadWrapper} from "./utils"; -import ResultSummaryTable from "./result-summary-table"; -// import ItemSearchInput from "../file-manager/item-search-input"; +import useItemsSearch from "src/hooks/use-items-search"; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; -import useItemsSearch from "../../../hooks/use-items-search"; -const ShaclPackageStateReport = ({sid, handleSelectFile}) => { - const [validationReport, setValidationReport] = useState([]) - const [dataState, setDataState] = useState({load: true, error: false}) - - - useEffect(() => { - handleValidationReportsGet(sid) - }, []) - - const handleValidationReportsGet = (sid) => { - setDataState({load: true, error: false}) - sectionApi.getShaclReports(sid) - .then(res => { - setValidationReport(mapShaclResults(res.summary)) - setDataState(e => ({...e, load: false})) - }) - .catch(err => { - console.error(err); - setDataState({load: false, error: true}) - }) - } - - const mapShaclResults = (result) => { - return result.results.map(e => { - const resultArray = {} - resultArray["shacl_suite"] = result.shacl_suites?.[0]?.shacl_suite_id - resultArray["short_result_path"] = e.short_result_path - resultArray["result"] = e.result - Object.entries(e.result).forEach(entrie => { - const [key, value] = entrie - resultArray[`${key}Count`] = value.count - }) - return resultArray; - }) - } +const ShaclPackageStateReport = ({sid, handleSelectFile, mappingSuiteIdentifier, validationReport}) => { + const [dataState, setDataState] = useState({load: false, error: false}) const itemsSearch = useItemsSearch(validationReport, sectionApi); return ( <> - - Results Summary - - - - - - Assertions - - - {/**/} - - + + + + + + + + + + ) } diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_test_dataset.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_test_dataset.js index d83737f1..d4b81f36 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_test_dataset.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_test_dataset.js @@ -1,13 +1,13 @@ import {useEffect, useState} from "react"; -import Typography from "@mui/material/Typography"; +import Paper from '@mui/material/Paper'; +import Grid from '@mui/material/Unstable_Grid2'; import {ListTable} from "./list-table"; import {TableLoadWrapper} from "./utils"; -import ResultSummaryTable from "./result-summary-table"; -// import ItemSearchInput from "../file-manager/item-search-input"; +import {ResultSummaryCoverage} from './result-summary-coverage'; +import useItemsSearch from "src/hooks/use-items-search"; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; -import useItemsSearch from "../../../hooks/use-items-search"; const ShaclTestDatasetReport = ({sid, suiteId, handleSelectFile}) => { @@ -17,7 +17,7 @@ const ShaclTestDatasetReport = ({sid, suiteId, handleSelectFile}) => { useEffect(() => { handleValidationReportsGet(sid, suiteId) - }, []) + }, [suiteId]) const handleValidationReportsGet = (sid, suiteId) => { setDataState({load: true, error: false}) @@ -50,36 +50,31 @@ const ShaclTestDatasetReport = ({sid, suiteId, handleSelectFile}) => { return ( <> - - Results Summary - - - - - - Assertions - - - {/**/} - - + + + + + + + + + + ) } diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_view.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_view.js index efa94503..27c21ba3 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_view.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_view.js @@ -1,99 +1,71 @@ import {useState} from "react"; -import ChevronRightIcon from '@mui/icons-material/ChevronRight'; +import Grid from '@mui/material/Unstable_Grid2'; -import Link from "@mui/material/Link"; -import Stack from "@mui/material/Stack"; -import Typography from "@mui/material/Typography"; -import Breadcrumbs from "@mui/material/Breadcrumbs"; +import FileList from '../mapping-package/state/file-list'; -import CoverageFiles from "./coverage_files"; import ShaclFileReport from "./shacl_validation_report_file"; import ShaclTestDatasetReport from "./shacl_validation_report_test_dataset"; import ShaclPackageStateReport from "./shacl_validation_report_package_state"; -const PACKAGE_STATE = "package_state"; -const PACKAGE_STATE_LABEL = "Package State SHACL Coverage"; -const TEST_DATASET = "test_dataset"; -const TEST_DATASET_LABEL = "Test Dataset SHACL Coverage"; -const FILE_COVERAGE = "file_coverage"; -const FILE_COVERAGE_LABEL = "File SHACL Coverage" +const ShaclValidationReportView = ({sid, reportTree, validationReport}) => { -const ShaclValidationReportView = ({sid, reportTree}) => { + const [selectedPackageState, setSelectedPackageState] = useState() + const [selectedTestDataset, setSelectedTestDataset] = useState() - const [selectedPackageState, setSelectedPackageState] = useState(reportTree.test_data_suites[0]) - const [selectedTestDataset, setSelectedTestDataset] = useState(selectedPackageState.test_data_states[0]) - const [currentTab, setCurrentTab] = useState(PACKAGE_STATE) + console.log(selectedTestDataset,selectedTestDataset) const handleSetPackageState = (file) => { setSelectedPackageState(file) - setCurrentTab(TEST_DATASET) + setSelectedTestDataset(undefined) } const handleSetTestDataset = (file) => { setSelectedTestDataset(file) - setCurrentTab(FILE_COVERAGE) } const handleSetTestAndPackage = (testDataSuite, testData) => { const packageState = reportTree.test_data_suites.find(tds => tds.oid === testDataSuite) + setSelectedPackageState(packageState) if (testData) { setSelectedTestDataset(packageState?.test_data_states.find(ps => ps.oid === testData)); - setCurrentTab(FILE_COVERAGE) } else { - setSelectedPackageState(packageState); - setCurrentTab(TEST_DATASET) + setSelectedTestDataset(undefined) } } return ( - <> - - }> - setCurrentTab(PACKAGE_STATE)} - > - {PACKAGE_STATE_LABEL} - - {currentTab !== PACKAGE_STATE && - setCurrentTab(TEST_DATASET)} - > - {TEST_DATASET_LABEL}: {{selectedPackageState.identifier}} - } - {currentTab === FILE_COVERAGE && - - {FILE_COVERAGE_LABEL}: {{selectedTestDataset.identifier}} - } - - - {currentTab === PACKAGE_STATE && - <> - - - + + + + + + {!selectedPackageState && + + } - {currentTab === TEST_DATASET && - <> - - - + {selectedPackageState && !selectedTestDataset && + + } - {currentTab === FILE_COVERAGE && + {selectedPackageState && selectedTestDataset && } - + ) } diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js index 2f39f02b..7754d87b 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js @@ -49,7 +49,7 @@ export const ResultSummaryCoverage = ({validationReport}) => { const itemsDisplay = Object.entries(itemsReduce)?.map(item => { const [itemName, itemCount] = item - const percent = (itemCount / validationReport.length) * 100 ?? 0 + const percent = (itemCount / itemsTotal) * 100 ?? 0 return { label: `${itemName[0].toUpperCase()}${itemName.slice(1)} (${percent.toFixed(2)}% - ${itemCount})`, diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js index 8db9e1f0..83fbba3e 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js @@ -1,5 +1,6 @@ import {useState} from "react"; +import Paper from '@mui/material/Paper'; import Grid from '@mui/material/Unstable_Grid2'; import {ListTable} from "./list-table"; @@ -24,25 +25,27 @@ const XpathValidationReport = ({validationReport, handleSelectFile, mappingSuite validationReport={validationReport}/> - - - - + + + + + + ) diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js index 436e3bf0..349e4f64 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js @@ -1,8 +1,8 @@ import {useState} from "react"; import Grid from '@mui/material/Unstable_Grid2'; -import FileList from '../mapping-package/state/file-list'; +import FileList from '../mapping-package/state/file-list'; import XpathValidationReportTest from "./xpath_validation_report_file"; import XpathValidationReport from "./xpath_validation_report_package_state"; import XpathValidationReportSuite from "./xpath_validation_report_test_dataset"; From 0beba2c59cd061250ae6cee21b040117fda7c5d7 Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Thu, 16 Jan 2025 15:57:22 +0200 Subject: [PATCH 23/51] MWB-952: fix theme colors --- .../state/result-summary-coverage-shacl.js | 5 +- .../state/result-summary-coverage-sparql.js | 5 +- .../state/result-summary-coverage-xpath.js | 4 +- .../mapping-package/state/state-details.js | 70 +++++++------------ 4 files changed, 36 insertions(+), 48 deletions(-) diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js index 358aec5d..4e9e018b 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js @@ -3,13 +3,14 @@ import OpenInNewIcon from '@mui/icons-material/OpenInNew'; import Stack from '@mui/material/Stack'; import Paper from '@mui/material/Paper'; import Button from '@mui/material/Button'; +import {useTheme} from '@mui/material/styles'; import Typography from '@mui/material/Typography'; import {StatePieChart} from './state-pie-chart'; import getValidationColor from './validation-color'; const ResultSummaryCoverageShacl = ({validationReport, handleChangeTab}) => { - + const theme = useTheme() if (!validationReport) return null const {itemsTotal, ...itemsReduce} = @@ -35,7 +36,7 @@ const ResultSummaryCoverageShacl = ({validationReport, handleChangeTab}) => { return + sx={{borderBottom: `2px solid ${theme.palette.divider}`, pb: 3}}> Result summary { - + const theme = useTheme() if (!validationReport) return null const {itemsTotal, ...itemsReduce} = @@ -34,7 +35,7 @@ const ResultSummaryCoverageSparql = ({validationReport, handleChangeTab}) => { return + sx={{borderBottom: `2px solid ${theme.palette.divider}`, pb: 3}}> Result summary { + const theme= useTheme() if (!validationReport) return null const {coveredReports, notCoveredReports} = validationReport?.reduce((acc, report) => { @@ -20,7 +22,7 @@ const ResultSummaryCoverageXpath = ({item, validationReport, handleChangeTab}) = return + sx={{borderBottom: `2px solid ${theme.palette.divider}`, pb: 3}}> Result summary { + const theme = useTheme() + console.log(theme) + return ( + + {title} + {value} + + ) +} + const StateDetails = ({item, sid, handleChangeTab, validationReport}) => { return ( @@ -18,49 +37,14 @@ const StateDetails = ({item, sid, handleChangeTab, validationReport}) => { Conceptual mapping for {item.title} - - {item._id} - {item.title} - - - {'Mapping / EPO Version'} - {`${item.mapping_version} / ${item.epo_version}`} - - - {'eForms XSD'} - {item.eforms_sdk_versions?.join(', ')} - - - {'eForms Subtype'} - {item.eform_subtypes?.join(', ')} - + + + + From 374520d76c07123b222919179f4953b500874ca3 Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Thu, 16 Jan 2025 16:35:22 +0200 Subject: [PATCH 24/51] MWB-952: update export button functional --- .../[id]/states/[sid]/view.js | 58 ++----------------- .../mapping-package/state/export-button.js | 20 +++++++ .../result-summary-coverage.js | 21 +++---- .../shacl_validation_report_package_state.js | 5 +- .../shacl_validation_report_test_dataset.js | 5 +- .../shacl_validation_report_view.js | 5 +- .../result-summary-coverage.js | 22 +++---- .../sparql_validation_report_file.js | 5 +- .../sparql_validation_report_package_state.js | 5 +- .../sparql_validation_report_test_dataset.js | 7 ++- .../sparql_validation_report_view.js | 7 ++- .../result-summary-coverage.js | 14 +---- .../xpath_validation_report_file.js | 3 +- .../xpath_validation_report_package_state.js | 5 +- .../xpath_validation_report_test_dataset.js | 3 +- .../xpath_validation_report_view.js | 5 +- 16 files changed, 81 insertions(+), 109 deletions(-) create mode 100644 mapping_workbench/frontend/src/sections/app/mapping-package/state/export-button.js diff --git a/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js b/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js index 22064ff3..a7d023dc 100644 --- a/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js +++ b/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js @@ -2,16 +2,12 @@ import {useEffect, useState} from 'react'; import dynamic from "next/dynamic"; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; -import FileDownloadIcon from '@mui/icons-material/FileDownload'; import Tab from '@mui/material/Tab'; -import Chip from '@mui/material/Chip'; import Tabs from '@mui/material/Tabs'; import Link from '@mui/material/Link'; import Stack from '@mui/material/Stack'; -import Button from "@mui/material/Button"; import SvgIcon from '@mui/material/SvgIcon'; -import {useTheme} from '@mui/material/styles'; import Typography from '@mui/material/Typography'; import CircularProgress from "@mui/material/CircularProgress"; @@ -47,14 +43,11 @@ const tabs = [ const Page = () => { const router = useRouter(); - const theme = useTheme() - console.log(theme) const {id, sid} = router.query; const [item, setItem] = useState({}) const [currentTab, setCurrentTab] = useState('details'); - const [isExporting, setIsExporting] = useState() const [validationReportTree, setValidationReportTree] = useState([]) const [validationReport, setValidationReport] = useState({}) @@ -105,18 +98,14 @@ const Page = () => { xpath: res.results.map(e => ({...e, notice_count: e.test_data_xpaths.length})) })) }) - .catch(err => { - console.error(err); - }) + .catch(err => console.error(err)) } const resultSummarySHACLGet = (sid) => { sectionApi.getShaclReports(sid) .then(res => setValidationReport(prev => ({...prev, shacl: mapShaclResults(res.summary)}))) - .catch(err => { - console.error(err); - }) + .catch(err => console.error(err)) } const mapShaclResults = (result) => { @@ -147,7 +136,7 @@ const Page = () => { const handleTabsChange = (event, value) => setCurrentTab(value) - const handleExport = (item) => exportPackage(sectionApi, id, setIsExporting, item) + const handleExport = (setIsExporting) => exportPackage(sectionApi, id, setIsExporting, item) return ( <> @@ -190,44 +179,6 @@ const Page = () => { - - - - - {item.title} - - - - - - - - { {currentTab === 'xpath' && ( @@ -264,6 +216,7 @@ const Page = () => { {currentTab === 'sparql' && ( @@ -271,6 +224,7 @@ const Page = () => { {currentTab === 'shacl' && ( diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/export-button.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/export-button.js new file mode 100644 index 00000000..4b53e0f1 --- /dev/null +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/export-button.js @@ -0,0 +1,20 @@ +import {useState} from 'react'; + +import Button from '@mui/material/Button'; +import FileDownloadOutlinedIcon from '@mui/icons-material/FileDownloadOutlined'; + +const ExportButton = ({handleExport}) => { + const [isExporting, setIsExporting] = useState(false) + + return ( + + ) +} + +export default ExportButton \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-summary-coverage.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-summary-coverage.js index c82dca98..0f6beaab 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-summary-coverage.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-summary-coverage.js @@ -1,14 +1,12 @@ -import FileDownloadOutlinedIcon from '@mui/icons-material/FileDownloadOutlined'; - -import Button from '@mui/material/Button'; import Paper from '@mui/material/Paper'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; +import ExportButton from '../mapping-package/state/export-button'; import {StatePieChartBig} from '../mapping-package/state/state-pie-chart'; import getValidationColor from '../mapping-package/state/validation-color'; -const Pie = ({data}) => { +const Pie = ({data, handleExport}) => { return ( { Coverage (SHACL) - + @@ -33,7 +27,7 @@ const Pie = ({data}) => { ) } -export const ResultSummaryCoverage = ({validationReport}) => { +export const ResultSummaryCoverage = ({validationReport, handleExport}) => { if (!validationReport) return null @@ -45,12 +39,12 @@ export const ResultSummaryCoverage = ({validationReport}) => { } ) return acc - },{info:0, valid:0, violation:0, warning:0}) + }, {info: 0, valid: 0, violation: 0, warning: 0}) const itemsDisplay = Object.entries(itemsReduce)?.map(item => { const [itemName, itemCount] = item console.log(item) - const percent = (itemCount/itemsTotal) * 100 ?? 0 + const percent = (itemCount / itemsTotal) * 100 ?? 0 return { label: `${itemName[0].toUpperCase()}${itemName.slice(1)} (${percent.toFixed(2)}% - ${itemCount})`, @@ -60,7 +54,8 @@ export const ResultSummaryCoverage = ({validationReport}) => { } }) - return + return } export const ResultSummaryQuery = ({validationReport}) => { diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js index c6e73531..e90bca71 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js @@ -9,7 +9,7 @@ import {TableLoadWrapper} from "./utils"; import useItemsSearch from "src/hooks/use-items-search"; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; -const ShaclPackageStateReport = ({sid, handleSelectFile, mappingSuiteIdentifier, validationReport}) => { +const ShaclPackageStateReport = ({handleSelectFile, mappingSuiteIdentifier, validationReport, handleExport}) => { const [dataState, setDataState] = useState({load: false, error: false}) const itemsSearch = useItemsSearch(validationReport, sectionApi); @@ -18,7 +18,8 @@ const ShaclPackageStateReport = ({sid, handleSelectFile, mappingSuiteIdentifier, <> - diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_test_dataset.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_test_dataset.js index d4b81f36..5c76aabe 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_test_dataset.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_test_dataset.js @@ -10,7 +10,7 @@ import useItemsSearch from "src/hooks/use-items-search"; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; -const ShaclTestDatasetReport = ({sid, suiteId, handleSelectFile}) => { +const ShaclTestDatasetReport = ({sid, suiteId, handleSelectFile, handleExport}) => { const [validationReport, setValidationReport] = useState([]) const [dataState, setDataState] = useState({load: true, error: false}) @@ -52,7 +52,8 @@ const ShaclTestDatasetReport = ({sid, suiteId, handleSelectFile}) => { <> - + diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_view.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_view.js index 27c21ba3..8991c3f1 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_view.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_view.js @@ -8,7 +8,7 @@ import ShaclFileReport from "./shacl_validation_report_file"; import ShaclTestDatasetReport from "./shacl_validation_report_test_dataset"; import ShaclPackageStateReport from "./shacl_validation_report_package_state"; -const ShaclValidationReportView = ({sid, reportTree, validationReport}) => { +const ShaclValidationReportView = ({sid, reportTree, validationReport, handleExport}) => { const [selectedPackageState, setSelectedPackageState] = useState() const [selectedTestDataset, setSelectedTestDataset] = useState() @@ -49,6 +49,7 @@ const ShaclValidationReportView = ({sid, reportTree, validationReport}) => { {!selectedPackageState && @@ -56,12 +57,14 @@ const ShaclValidationReportView = ({sid, reportTree, validationReport}) => { } {selectedPackageState && !selectedTestDataset && } {selectedPackageState && selectedTestDataset && } diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js index 7754d87b..a5f77aef 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js @@ -1,14 +1,12 @@ -import FileDownloadOutlinedIcon from '@mui/icons-material/FileDownloadOutlined'; - -import Button from '@mui/material/Button'; import Paper from '@mui/material/Paper'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; +import ExportButton from '../mapping-package/state/export-button'; import {StatePieChartBig} from '../mapping-package/state/state-pie-chart'; import getValidationColor from '../mapping-package/state/validation-color'; -const Pie = ({data}) => { +const Pie = ({data, handleExport}) => { return ( { Coverage (SPARQL) - + @@ -33,7 +27,7 @@ const Pie = ({data}) => { ) } -export const ResultSummaryCoverage = ({validationReport}) => { +export const ResultSummaryCoverage = ({validationReport, handleExport}) => { if (!validationReport) return null @@ -59,10 +53,11 @@ export const ResultSummaryCoverage = ({validationReport}) => { } }) - return + return } -export const ResultSummaryQuery = ({validationReport}) => { +export const ResultSummaryQuery = ({validationReport, handleExport}) => { const itemsReduce = validationReport.reduce((acc, item) => { acc[item.result] = (acc[item.result] ?? 0) + 1 return acc @@ -79,5 +74,6 @@ export const ResultSummaryQuery = ({validationReport}) => { } }) - return + return } diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js index 18196f62..cce2cf78 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js @@ -10,7 +10,7 @@ import {ResultSummaryQuery} from './result-summary-coverage'; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; -const SparqlFileReport = ({sid, suiteId, testId}) => { +const SparqlFileReport = ({sid, suiteId, testId, handleExport}) => { const [validationReport, setValidationReport] = useState([]) const [dataState, setDataState] = useState({load: true, error: false}) @@ -57,7 +57,8 @@ const SparqlFileReport = ({sid, suiteId, testId}) => { <> - + diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js index 3d56993b..da28a9ef 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js @@ -10,7 +10,7 @@ import {ResultSummaryCoverage} from './result-summary-coverage'; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; -const SparqlValidationReport = ({handleSelectFile, validationReport}) => { +const SparqlValidationReport = ({handleSelectFile, validationReport, handleExport}) => { const [dataState, setDataState] = useState({load: false, error: false}) const itemsSearch = useItemsSearch(validationReport, sectionApi); @@ -18,7 +18,8 @@ const SparqlValidationReport = ({handleSelectFile, validationReport}) => { <> - + diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js index 373d06f7..d4ad6c28 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js @@ -4,12 +4,12 @@ import Paper from '@mui/material/Paper'; import Grid from '@mui/material/Unstable_Grid2'; import {ListTable} from "./list-table"; -import {ResultSummaryCoverage} from './result-summary-coverage'; import {TableLoadWrapper} from "./utils"; import useItemsSearch from "src/hooks/use-items-search"; +import {ResultSummaryCoverage} from './result-summary-coverage'; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; -const SparqlTestDatasetReport = ({sid, suiteId, handleSelectFile}) => { +const SparqlTestDatasetReport = ({sid, suiteId, handleSelectFile, handleExport}) => { const [validationReport, setValidationReport] = useState([]) const [dataState, setDataState] = useState({load: true, error: false}) @@ -58,7 +58,8 @@ const SparqlTestDatasetReport = ({sid, suiteId, handleSelectFile}) => { <> - + diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_view.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_view.js index fa00ac9c..ac55dc3c 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_view.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_view.js @@ -7,7 +7,7 @@ import SparqlFileReport from "./sparql_validation_report_file"; import SparqlTestDatasetReport from "./sparql_validation_report_test_dataset"; import SparqlPackageStateReport from "./sparql_validation_report_package_state"; -const SparqlValidationReportView = ({sid, reportTree, validationReport}) => { +const SparqlValidationReportView = ({sid, reportTree, validationReport, handleExport}) => { const [selectedPackageState, setSelectedPackageState] = useState() const [selectedTestDataset, setSelectedTestDataset] = useState() @@ -31,8 +31,6 @@ const SparqlValidationReportView = ({sid, reportTree, validationReport}) => { } } - console.log(selectedPackageState, selectedTestDataset) - return ( { {!selectedPackageState && { {selectedPackageState && !selectedTestDataset && @@ -64,6 +64,7 @@ const SparqlValidationReportView = ({sid, reportTree, validationReport}) => { {selectedPackageState && selectedTestDataset && diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js index f7c9f12c..d9dd36c8 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js @@ -1,12 +1,10 @@ -import FileDownloadOutlinedIcon from '@mui/icons-material/FileDownloadOutlined'; - import Stack from '@mui/material/Stack'; import Paper from '@mui/material/Paper'; -import Button from '@mui/material/Button'; import Typography from '@mui/material/Typography'; +import ExportButton from '../mapping-package/state/export-button'; import {LineProgressDouble} from '../mapping-package/state/state-line-progress'; -const ResultSummaryCoverage = ({identifier, validationReport, handleChangeTab, load}) => { +const ResultSummaryCoverage = ({identifier, validationReport, handleExport, load}) => { if (!validationReport) return null @@ -27,13 +25,7 @@ const ResultSummaryCoverage = ({identifier, validationReport, handleChangeTab, l Coverage (XPath) - + diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_file.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_file.js index 1e48f561..8f7f7e8c 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_file.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_file.js @@ -9,7 +9,7 @@ import ResultSummaryCoverage from './result-summary-coverage'; import useItemsSearch from "../../../hooks/use-items-search"; import {mappingPackageStatesApi as sectionApi} from "../../../api/mapping-packages/states"; -const XpathValidationReportTest = ({sid, suiteId, testId, mappingSuiteIdentifier}) => { +const XpathValidationReportTest = ({sid, suiteId, testId, mappingSuiteIdentifier, handleExport}) => { const [validationReport, setValidationReport] = useState([]) const [dataState, setDataState] = useState({load: true, error: false}) @@ -37,6 +37,7 @@ const XpathValidationReportTest = ({sid, suiteId, testId, mappingSuiteIdentifier diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js index 83fbba3e..71d0dcde 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js @@ -2,6 +2,7 @@ import {useState} from "react"; import Paper from '@mui/material/Paper'; import Grid from '@mui/material/Unstable_Grid2'; +import exportPackage from '../../../utils/export-mapping-package'; import {ListTable} from "./list-table"; import ResultSummaryCoverage from './result-summary-coverage'; @@ -9,19 +10,19 @@ import {CoverageFilter, TableLoadWrapper} from "./utils"; import useItemsSearch from "src/hooks/use-items-search"; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; -const XpathValidationReport = ({validationReport, handleSelectFile, mappingSuiteIdentifier}) => { +const XpathValidationReport = ({validationReport, handleSelectFile, mappingSuiteIdentifier, handleExport}) => { const [dataState, setDataState] = useState({load: false, error: false}) const itemsSearch = useItemsSearch(validationReport, sectionApi) const handleCoverageFilterChange = e => itemsSearch.handleFiltersChange({is_covered: e.target.value}) - return ( <> diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_test_dataset.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_test_dataset.js index 56cd4582..aa758805 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_test_dataset.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_test_dataset.js @@ -9,7 +9,7 @@ import {CoverageFilter, TableLoadWrapper} from "./utils"; import ResultSummaryCoverage from './result-summary-coverage'; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; -const XpathValidationReportSuite = ({sid, suiteId, mappingSuiteIdentifier, handleSelectFile}) => { +const XpathValidationReportSuite = ({sid, suiteId, mappingSuiteIdentifier, handleSelectFile, handleExport}) => { const [validationReport, setValidationReport] = useState([]) const [dataState, setDataState] = useState({load: true, error: false}) @@ -39,6 +39,7 @@ const XpathValidationReportSuite = ({sid, suiteId, mappingSuiteIdentifier, handl diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js index 349e4f64..fa3c9961 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_view.js @@ -7,7 +7,7 @@ import XpathValidationReportTest from "./xpath_validation_report_file"; import XpathValidationReport from "./xpath_validation_report_package_state"; import XpathValidationReportSuite from "./xpath_validation_report_test_dataset"; -const XpathValidationReportView = ({sid, reportTree, validationReport}) => { +const XpathValidationReportView = ({sid, reportTree, validationReport, handleExport}) => { const [selectedPackageState, setSelectedPackageState] = useState() const [selectedTestDataset, setSelectedTestDataset] = useState() @@ -44,6 +44,7 @@ const XpathValidationReportView = ({sid, reportTree, validationReport}) => { {!selectedPackageState && { } {selectedPackageState && !selectedTestDataset && { } {selectedPackageState && selectedTestDataset && From 3c1e66725714376c772ee70e4236db5bec773c34 Mon Sep 17 00:00:00 2001 From: Kolea PLESCO Date: Thu, 16 Jan 2025 17:43:14 +0200 Subject: [PATCH 25/51] added api endpoint for test data transform history --- .../core/services/project_initilisers.py | 4 ++- .../test_data_suite/entrypoints/api/routes.py | 17 +++++++++++-- .../backend/test_data_suite/models/entity.py | 25 +++++++++++++++++-- .../backend/test_data_suite/services/api.py | 21 +++++++++++++++- .../services/test_data_transform_history.py | 17 +++++++++++++ .../services/transform_test_data.py | 8 +++++- 6 files changed, 85 insertions(+), 7 deletions(-) create mode 100644 mapping_workbench/backend/test_data_suite/services/test_data_transform_history.py diff --git a/mapping_workbench/backend/core/services/project_initilisers.py b/mapping_workbench/backend/core/services/project_initilisers.py index 58265a4a..f075fd22 100644 --- a/mapping_workbench/backend/core/services/project_initilisers.py +++ b/mapping_workbench/backend/core/services/project_initilisers.py @@ -18,7 +18,8 @@ from mapping_workbench.backend.security.models.security import AccessToken from mapping_workbench.backend.shacl_test_suite.models.entity import SHACLTestSuite, SHACLTestFileResource from mapping_workbench.backend.sparql_test_suite.models.entity import SPARQLTestSuite, SPARQLTestFileResource -from mapping_workbench.backend.test_data_suite.models.entity import TestDataSuite, TestDataFileResource +from mapping_workbench.backend.test_data_suite.models.entity import TestDataSuite, TestDataFileResource, \ + TestDataManifestationHistory from mapping_workbench.backend.triple_map_fragment.models.entity import SpecificTripleMapFragment, \ GenericTripleMapFragment from mapping_workbench.backend.triple_map_registry.models.entity import TripleMapRegistry @@ -58,6 +59,7 @@ async def init_project_models(mongodb_database: AsyncIOMotorDatabase): ResourceFile, TestDataSuite, TestDataFileResource, + TestDataManifestationHistory, MappingPackage, MappingPackageStateGate, MappingRuleRegistry, diff --git a/mapping_workbench/backend/test_data_suite/entrypoints/api/routes.py b/mapping_workbench/backend/test_data_suite/entrypoints/api/routes.py index 3e0639dd..b758f29c 100644 --- a/mapping_workbench/backend/test_data_suite/entrypoints/api/routes.py +++ b/mapping_workbench/backend/test_data_suite/entrypoints/api/routes.py @@ -14,7 +14,8 @@ from mapping_workbench.backend.task_manager.services.task_wrapper import add_task from mapping_workbench.backend.test_data_suite.adapters.rml_mapper import RMLMapperException from mapping_workbench.backend.test_data_suite.models.entity import TestDataSuite, TestDataFileResource, \ - TestDataFileResourceUpdateIn, TestDataFileResourceCreateIn + TestDataFileResourceUpdateIn, TestDataFileResourceCreateIn, TestDataManifestationHistory, \ + TestDataManifestationHistoryOut from mapping_workbench.backend.test_data_suite.models.entity_api_response import \ APIListTestDataSuitesPaginatedResponse, APIListTestDataFileResourcesPaginatedResponse from mapping_workbench.backend.test_data_suite.services import tasks @@ -27,7 +28,7 @@ list_test_data_suite_file_resources, create_test_data_suite_file_resource, get_test_data_file_resource, - delete_test_data_file_resource, update_test_data_file_resource + delete_test_data_file_resource, update_test_data_file_resource, get_test_data_transform_history ) from mapping_workbench.backend.test_data_suite.services.import_test_data_suite import \ import_test_data_suites_from_archive @@ -416,3 +417,15 @@ async def route_task_import_test_data_suites( ): await import_test_data_suites_from_archive(project, file, user) return APIEmptyContentResponse() + + +@router.get( + "/file_resources/{id}/transform/history", + description=f"Get Test Data Transform History", + name=f"{FILE_RESOURCE_NAME_FOR_ONE}:get_transform_history", +) +async def route_get_test_data_file_resource_transform_history( + project: PydanticObjectId, + test_data_file_resource: TestDataFileResource = Depends(get_test_data_file_resource) +) -> List[TestDataManifestationHistoryOut]: + return await get_test_data_transform_history(test_data_file_resource, project) diff --git a/mapping_workbench/backend/test_data_suite/models/entity.py b/mapping_workbench/backend/test_data_suite/models/entity.py index 8c322c04..d712ddf0 100644 --- a/mapping_workbench/backend/test_data_suite/models/entity.py +++ b/mapping_workbench/backend/test_data_suite/models/entity.py @@ -1,14 +1,18 @@ +from datetime import datetime from enum import Enum from typing import Optional, List import pymongo from beanie import Link, PydanticObjectId -from pydantic import BaseModel +from dateutil.tz import tzlocal +from pydantic import BaseModel, Field from pymongo import IndexModel +from mapping_workbench.backend.core.models.base_entity import BaseEntityOutSchema from mapping_workbench.backend.core.models.base_mapping_package_resource_entity import \ BaseMappingPackagesResourceSchemaTrait -from mapping_workbench.backend.core.models.base_project_resource_entity import BaseProjectResourceEntity +from mapping_workbench.backend.core.models.base_project_resource_entity import BaseProjectResourceEntity, \ + BaseProjectAbleResourceEntity from mapping_workbench.backend.file_resource.models.file_resource import FileResource, FileResourceCollection, \ FileResourceIn, FileResourceFormat, FileResourceState from mapping_workbench.backend.package_validator.models.shacl_validation import SHACLTestDataValidationResult @@ -61,6 +65,23 @@ class TestDataState(TestDataValidation, ObjectState): rdf_manifestation: Optional[FileResourceState] = None +class TestDataManifestationHistory(BaseProjectAbleResourceEntity): + test_data_id: PydanticObjectId + in_manifestation: Optional[str] = None + out_manifestation: Optional[str] = None + created_at: Optional[datetime] = Field(default_factory=lambda: datetime.now(tzlocal())) + + class Settings(FileResource.Settings): + name = "test_data_manifestation_history" + + +class TestDataManifestationHistoryOut(BaseEntityOutSchema): + test_data_id: PydanticObjectId + in_manifestation: Optional[str] = None + out_manifestation: Optional[str] = None + created_at: Optional[datetime] = Field(default_factory=lambda: datetime.now(tzlocal())) + + class TestDataFileResource(FileResource, StatefulObjectABC): identifier: Optional[str] = None format: Optional[TestDataFileResourceFormat] = None diff --git a/mapping_workbench/backend/test_data_suite/services/api.py b/mapping_workbench/backend/test_data_suite/services/api.py index 67796a72..117758e3 100644 --- a/mapping_workbench/backend/test_data_suite/services/api.py +++ b/mapping_workbench/backend/test_data_suite/services/api.py @@ -1,5 +1,6 @@ from typing import List +import pymongo from beanie import PydanticObjectId from mapping_workbench.backend.core.models.base_entity import BaseEntityFiltersSchema @@ -9,8 +10,10 @@ from mapping_workbench.backend.mapping_package.models.entity import MappingPackage from mapping_workbench.backend.mapping_package.services.link import unassign_resources_from_mapping_packages, \ ResourceField +from mapping_workbench.backend.project.models.entity import Project from mapping_workbench.backend.test_data_suite.models.entity import TestDataSuite, TestDataFileResource, \ - TestDataFileResourceUpdateIn, TestDataFileResourceCreateIn + TestDataFileResourceUpdateIn, TestDataFileResourceCreateIn, TestDataManifestationHistory, \ + TestDataManifestationHistoryOut from mapping_workbench.backend.test_data_suite.services.transform_test_data import transform_test_data_file_resource from mapping_workbench.backend.user.models.user import User @@ -136,3 +139,19 @@ async def get_test_data_file_resource(id: PydanticObjectId) -> TestDataFileResou async def delete_test_data_file_resource(test_data_file_resource: TestDataFileResource): return await test_data_file_resource.delete() + + +async def get_test_data_transform_history( + test_data_file_resource: TestDataFileResource, + project_id: PydanticObjectId +) -> List[TestDataManifestationHistoryOut]: + Project.link_from_id(project_id) + items: List[TestDataManifestationHistoryOut] = await TestDataManifestationHistory.find( + TestDataManifestationHistory.project == Project.link_from_id(project_id), + TestDataManifestationHistory.test_data_id == test_data_file_resource.id, + projection_model=TestDataManifestationHistoryOut, + fetch_links=False, + sort=[(str(TestDataManifestationHistory.created_at), pymongo.DESCENDING)] + ).to_list() + + return items diff --git a/mapping_workbench/backend/test_data_suite/services/test_data_transform_history.py b/mapping_workbench/backend/test_data_suite/services/test_data_transform_history.py new file mode 100644 index 00000000..a4cedc4b --- /dev/null +++ b/mapping_workbench/backend/test_data_suite/services/test_data_transform_history.py @@ -0,0 +1,17 @@ +from beanie import PydanticObjectId + +from mapping_workbench.backend.project.models.entity import Project +from mapping_workbench.backend.test_data_suite.models.entity import TestDataFileResource, TestDataManifestationHistory + + +async def add_test_data_transform_to_history( + test_data_file_resource: TestDataFileResource, + project_id: PydanticObjectId +): + history_item = TestDataManifestationHistory( + project=Project.link_from_id(project_id), + test_data_id=test_data_file_resource.id, + in_manifestation=test_data_file_resource.content, + out_manifestation=test_data_file_resource.rdf_manifestation + ) + await history_item.create() diff --git a/mapping_workbench/backend/test_data_suite/services/transform_test_data.py b/mapping_workbench/backend/test_data_suite/services/transform_test_data.py index 43cb65ab..0709e356 100644 --- a/mapping_workbench/backend/test_data_suite/services/transform_test_data.py +++ b/mapping_workbench/backend/test_data_suite/services/transform_test_data.py @@ -15,6 +15,8 @@ TestDataSuiteState from mapping_workbench.backend.test_data_suite.services import DATA_SOURCE_PATH_NAME, \ TRANSFORMATION_PATH_NAME, MAPPINGS_PATH_NAME, RESOURCES_PATH_NAME +from mapping_workbench.backend.test_data_suite.services.test_data_transform_history import \ + add_test_data_transform_to_history from mapping_workbench.backend.test_data_suite.services.data import get_test_data_file_resources_for_project, \ get_test_data_file_resources_for_package from mapping_workbench.backend.triple_map_fragment.models.entity import TripleMapFragment, TripleMapFragmentState, \ @@ -119,7 +121,6 @@ async def transform_test_data_file_resource( if not isinstance(rml_mapper, RMLMapperABC): rml_mapper: RMLMapper = RMLMapper(rml_mapper_path=Path(settings.RML_MAPPER_PATH)) - test_data_file_resource.rdf_manifestation = await transform_test_data_file_resource_content( content=test_data_file_resource.content, mappings=mappings, @@ -137,6 +138,11 @@ async def transform_test_data_file_resource( if save: await test_data_file_resource.save() + await add_test_data_transform_to_history( + test_data_file_resource=test_data_file_resource, + project_id=project_id + ) + return test_data_file_resource From 4cb97e3cc86cb5cca21b714bc24913f4f8cb0fa7 Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Thu, 16 Jan 2025 18:18:05 +0200 Subject: [PATCH 26/51] MWB-952: colorfull filter for xpath --- .../mapping-package/state/state-details.js | 1 - .../mapping-package/state/state-pie-chart.js | 4 +- .../app/xpath-validation-report/list-table.js | 2 +- .../app/xpath-validation-report/utils.js | 137 +++++++----------- .../xpath_validation_report_package_state.js | 23 ++- .../xpath_validation_report_test_dataset.js | 18 ++- 6 files changed, 91 insertions(+), 94 deletions(-) diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js index 94eb2dd5..f9fc1b69 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js @@ -10,7 +10,6 @@ import ResultSummaryCoverageXpath from './result-summary-coverage-xpath'; const StateDetail = ({title, value}) => { const theme = useTheme() - console.log(theme) return ( { innerRadius: 60, outerRadius: 100, cy: 100, - cx: 180, + cx: 144, } ]} tooltip={{ @@ -41,7 +41,7 @@ export const StatePieChart = ({items}) => { ); } }} - width={368} + width={300} height={348}/> } diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table.js index 4e43c371..6d2caf90 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table.js @@ -21,8 +21,8 @@ import DialogActions from "@mui/material/DialogActions"; import {Scrollbar} from 'src/components/scrollbar'; import {useHighlighterTheme} from "src/hooks/use-highlighter-theme"; -import TablePagination from "src/sections/components/table-pagination"; import TableSorterHeader from "src/sections/components/table-sorter-header"; +import TablePagination from "src/sections/components/table-pagination-pages"; import {TableFilterHeader} from "src/layouts/app/table-filter-header/table-filter-header"; export const ListTable = (props) => { diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/utils.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/utils.js index b129d93e..a0a05020 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/utils.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/utils.js @@ -1,105 +1,61 @@ -import Stack from "@mui/material/Stack"; -import RadioGroup from "@mui/material/RadioGroup"; -import Paper from "@mui/material/Paper"; import Box from "@mui/material/Box"; -import FormControlLabel from "@mui/material/FormControlLabel"; import Radio from "@mui/material/Radio"; -import Typography from "@mui/material/Typography"; -import Skeleton from "@mui/material/Skeleton"; +import Stack from "@mui/material/Stack"; import Alert from "@mui/material/Alert"; +import Skeleton from "@mui/material/Skeleton"; +import RadioGroup from "@mui/material/RadioGroup"; +import FormControl from '@mui/material/FormControl'; +import FormControlLabel from "@mui/material/FormControlLabel"; +import {useTheme} from '@mui/material/styles'; -export const CoverageFilter = ({onChange,filterState}) => { - return( - - - { + return ( + + + onValueChange(e.target.value)} > - - Filter Coverage: - - } - key="terms_validity_all" - checked={filterState === ""} - label={( - - - All - - - )} - value="" - /> - } - key="terms_validity_valid" - checked={filterState === "true"} - label={( - - - Covered - - - )} - value="true" - /> - } - key="terms_validity_invalid" - checked={filterState === "false"} - label={( - - - Not Covered - - - )} - value="false" - /> - + {values.map(e => } + label={ + {e.label} + {e.count} + }/> + )} + + - + ) } - export const TableSkeleton = ({lines = 5}) => { return new Array(lines).fill("").map((e, i) => - ) + ) } export const TableNoData = () => { return - No Data ! - + direction="row"> + No Data ! + } export const TableErrorFetching = () => { return - Error on fetching data ! - + direction="row"> + Error on fetching data ! + } export const TableLoadWrapper = ({children, data, dataState, lines}) => { @@ -107,4 +63,19 @@ export const TableLoadWrapper = ({children, data, dataState, lines}) => { if (dataState.error) return if (data.length === 0) return return children +} + + +export const ValueChip = ({children, value, color}) => { + const theme = useTheme() + const themeColor = theme.palette?.[color] ?? {} + return ( + {value ?? children} + ) } \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js index 71d0dcde..1f2707c7 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js @@ -1,8 +1,9 @@ import {useState} from "react"; import Paper from '@mui/material/Paper'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; import Grid from '@mui/material/Unstable_Grid2'; -import exportPackage from '../../../utils/export-mapping-package'; import {ListTable} from "./list-table"; import ResultSummaryCoverage from './result-summary-coverage'; @@ -10,12 +11,17 @@ import {CoverageFilter, TableLoadWrapper} from "./utils"; import useItemsSearch from "src/hooks/use-items-search"; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; + const XpathValidationReport = ({validationReport, handleSelectFile, mappingSuiteIdentifier, handleExport}) => { + const FILTER_VALUES = [{label: 'All', value: '', color: 'primary', count: validationReport.length}, + {label: 'Covered', value: true, color: 'info', count: validationReport.filter(e => e.is_covered).length}, + {label: 'Uncovered', value: false, color: 'warning', count: validationReport.filter(e => !e.is_covered).length}] + const [dataState, setDataState] = useState({load: false, error: false}) - const itemsSearch = useItemsSearch(validationReport, sectionApi) + const itemsSearch = useItemsSearch(validationReport, sectionApi, [], {is_covered: ''}) - const handleCoverageFilterChange = e => itemsSearch.handleFiltersChange({is_covered: e.target.value}) + const handleCoverageFilterChange = e => itemsSearch.handleFiltersChange({is_covered: e}) return ( <> @@ -29,8 +35,15 @@ const XpathValidationReport = ({validationReport, handleSelectFile, mappingSuite - + + Assertions + + itemsSearch.handleFiltersChange({is_covered: e.target.value}) + const FILTER_VALUES = [{label: 'All', value: '', color: 'primary', count: validationReport.length}, + {label: 'Covered', value: true, color: 'info', count: validationReport.filter(e => e.is_covered).length}, + {label: 'Uncovered', value: false, color: 'warning', count: validationReport.filter(e => !e.is_covered).length}] + + return ( <> - + + Assertions + + Date: Thu, 16 Jan 2025 21:34:48 +0200 Subject: [PATCH 27/51] added demo config section --- .../backend/core/entrypoints/api/main.py | 8 ++- mapping_workbench/backend/demo/__init__.py | 0 .../backend/demo/entrypoints/api/routes.py | 22 +++++++ .../frontend/src/api/demo-config/index.js | 21 ++++++ .../app/account-button/account-popover.js | 25 +++++++ .../src/pages/app/demo-config/index.js | 65 +++++++++++++++++++ mapping_workbench/frontend/src/paths.js | 7 +- 7 files changed, 144 insertions(+), 4 deletions(-) create mode 100644 mapping_workbench/backend/demo/__init__.py create mode 100644 mapping_workbench/backend/demo/entrypoints/api/routes.py create mode 100644 mapping_workbench/frontend/src/api/demo-config/index.js create mode 100644 mapping_workbench/frontend/src/pages/app/demo-config/index.js diff --git a/mapping_workbench/backend/core/entrypoints/api/main.py b/mapping_workbench/backend/core/entrypoints/api/main.py index f28615c1..4f7f7154 100644 --- a/mapping_workbench/backend/core/entrypoints/api/main.py +++ b/mapping_workbench/backend/core/entrypoints/api/main.py @@ -35,7 +35,8 @@ routes_for_specific as specific_triple_map_fragment_routes from mapping_workbench.backend.triple_map_registry.entrypoints.api import routes as triple_map_registry_routes from mapping_workbench.backend.user.entrypoints.api import routes as user_routes -from mapping_workbench.backend.xsd_schema.entrypoints.api import routes as xsd_schema_router +from mapping_workbench.backend.xsd_schema.entrypoints.api import routes as xsd_schema_routes +from mapping_workbench.backend.demo.entrypoints.api import routes as demo_routes ROOT_API_PATH = "/api/v1" @@ -95,8 +96,9 @@ async def on_startup(): task_manager_routes.router, tasks_routes.router, # Deprecated fields_registry.router, - xsd_schema_router.router, - cm_groups_routes.router + xsd_schema_routes.router, + cm_groups_routes.router, + demo_routes.router ] for secured_router in secured_routers: diff --git a/mapping_workbench/backend/demo/__init__.py b/mapping_workbench/backend/demo/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/mapping_workbench/backend/demo/entrypoints/api/routes.py b/mapping_workbench/backend/demo/entrypoints/api/routes.py new file mode 100644 index 00000000..8ba6f3d4 --- /dev/null +++ b/mapping_workbench/backend/demo/entrypoints/api/routes.py @@ -0,0 +1,22 @@ +from fastapi import APIRouter +from fastapi.responses import JSONResponse +from mapping_workbench.backend.config import settings + +ROUTE_PREFIX = "/demo" +TAG = "demo" + +sub_router = APIRouter() + + +@sub_router.post( + "/reset", + name="demo:reset" +) +async def metadata() -> JSONResponse: + return JSONResponse(content={ + "message": "Resetting the demo data" + }) + + +router = APIRouter() +router.include_router(sub_router, prefix=ROUTE_PREFIX, tags=[TAG]) diff --git a/mapping_workbench/frontend/src/api/demo-config/index.js b/mapping_workbench/frontend/src/api/demo-config/index.js new file mode 100644 index 00000000..4c1f1107 --- /dev/null +++ b/mapping_workbench/frontend/src/api/demo-config/index.js @@ -0,0 +1,21 @@ +import {apiPaths} from "../../paths"; +import {appApi} from "../app"; + +class DemoConfigApi { + get SECTION_TITLE() { + return "Demo Config"; + } + + constructor() { + this.section = "demoConfig"; + this.paths = apiPaths[this.section]; + } + + async reset() { + const endpoint = this.paths.reset; + return appApi.post(endpoint); + } + +} + +export const demoConfigApi = new DemoConfigApi(); diff --git a/mapping_workbench/frontend/src/layouts/app/account-button/account-popover.js b/mapping_workbench/frontend/src/layouts/app/account-button/account-popover.js index 6f0c3614..5b9d6aa9 100644 --- a/mapping_workbench/frontend/src/layouts/app/account-button/account-popover.js +++ b/mapping_workbench/frontend/src/layouts/app/account-button/account-popover.js @@ -11,6 +11,7 @@ import Popover from '@mui/material/Popover'; import SvgIcon from '@mui/material/SvgIcon'; import Typography from '@mui/material/Typography'; import ManageAccountsIcon from '@mui/icons-material/ManageAccounts'; +import DemoConfigIcon from '@mui/icons-material/Tune'; import {RouterLink} from 'src/components/router-link'; import {useAuth} from 'src/hooks/use-auth'; @@ -143,6 +144,30 @@ export const AccountPopover = (props) => { )} /> } + {securityApi.isUserAdmin(auth.user) && + + + + + + + Demo Config + + )} + /> + } { + + const auth = useAuth(); + const router = useRouter(); + + useEffect( + () => { + if (!securityApi.isUserAdmin(auth?.user)) { + router.replace(paths.notFound); + } + }, []); + + usePageView(); + + return ( + <> + + + + + + Demo Config + + + + + + + + + + + ); +}; + +Page.getLayout = (page) => {page}; + +export default Page; diff --git a/mapping_workbench/frontend/src/paths.js b/mapping_workbench/frontend/src/paths.js index e2be5443..16aecb31 100644 --- a/mapping_workbench/frontend/src/paths.js +++ b/mapping_workbench/frontend/src/paths.js @@ -230,6 +230,9 @@ export const paths = { }, authorization: { index: '/app/authorization' + }, + demoConfig: { + index: '/app/demo-config' } }, docs: 'https://material-kit-pro-react-docs.devias.io', @@ -425,7 +428,9 @@ export const apiPaths = { generate_cm_assertions_queries: '/tasks/generate_cm_assertions_queries', transform_test_data: '/tasks/transform_test_data' }, - + demoConfig: { + reset: "/demo/reset" + }, app: { settings: '/app/settings' } From fdf9af4a2df9b70d2ca3ccd15964c22155bd961b Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Fri, 17 Jan 2025 10:49:49 +0200 Subject: [PATCH 28/51] MWB-952: update xpath folder table --- .../state/result-summary-coverage-shacl.js | 2 +- .../state/result-summary-coverage-sparql.js | 2 +- .../state/result-summary-coverage-xpath.js | 8 +- .../mapping-package/state/state-details.js | 4 +- .../state/state-line-progress.js | 6 +- .../app/xpath-validation-report/list-table.js | 80 +++++----- .../result-summary-coverage.js | 7 +- .../app/xpath-validation-report/utils.js | 11 +- .../src/theme/base/create-typography.js | 5 + .../frontend/src/theme/colors.js | 149 +++++++++--------- 10 files changed, 142 insertions(+), 132 deletions(-) diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js index 4e9e018b..be3e0555 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js @@ -38,7 +38,7 @@ const ResultSummaryCoverageShacl = ({validationReport, handleChangeTab}) => { justifyContent='space-between' sx={{borderBottom: `2px solid ${theme.palette.divider}`, pb: 3}}> - Result summary + Result summary Coverage (SHALC) diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js index 878a0725..1bc98381 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js @@ -37,7 +37,7 @@ const ResultSummaryCoverageSparql = ({validationReport, handleChangeTab}) => { justifyContent='space-between' sx={{borderBottom: `2px solid ${theme.palette.divider}`, pb: 3}}> - Result summary + Result summary Coverage (SPARQL) diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js index f478129d..95a740d1 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-xpath.js @@ -24,7 +24,7 @@ const ResultSummaryCoverageXpath = ({item, validationReport, handleChangeTab}) = justifyContent='space-between' sx={{borderBottom: `2px solid ${theme.palette.divider}`, pb: 3}}> - Result summary + Result summary Coverage (XPath) @@ -39,16 +39,16 @@ const ResultSummaryCoverageXpath = ({item, validationReport, handleChangeTab}) = Mapping suite identifier - {item.identifier} + {item.identifier} - XPATHs covered + XPATHs covered {`${coveredReports.length}/${coveredReportPercent}%`} - XPATHs not covered + XPATHs not covered {`${notCoveredReports.length}/${notCoveredReportPercent}%`} diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js index f9fc1b69..f8fbc40f 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js @@ -14,12 +14,12 @@ const StateDetail = ({title, value}) => { - {title} + {title} {value} ) diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-line-progress.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-line-progress.js index 123560aa..a5a25ae2 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-line-progress.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-line-progress.js @@ -3,7 +3,7 @@ import {styled} from '@mui/material/styles'; import getValidationColor from './validation-color'; export const LineProgressDouble = ({value, load, color, endColor}) => { - const BorderLinearProgress = styled(LinearProgress)(({linecolor, endcolor}) => ({ + const BorderLinearProgress = styled(LinearProgress)(({linecolor}) => ({ height: 32, borderRadius: 16, [`&.${linearProgressClasses.root}`]: { @@ -20,7 +20,7 @@ export const LineProgressDouble = ({value, load, color, endColor}) => { return ( + value={parseFloat(value)}/> ) }; @@ -45,7 +45,7 @@ export const LineProgress = ({value, load, color}) => { return ( + value={parseFloat(value)}/> ) } diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table.js index 6d2caf90..cede7d90 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table.js @@ -24,6 +24,8 @@ import {useHighlighterTheme} from "src/hooks/use-highlighter-theme"; import TableSorterHeader from "src/sections/components/table-sorter-header"; import TablePagination from "src/sections/components/table-pagination-pages"; import {TableFilterHeader} from "src/layouts/app/table-filter-header/table-filter-header"; +import validationColor from '../mapping-package/state/validation-color'; +import {ValueChip} from './utils'; export const ListTable = (props) => { const highLighterTheme = useHighlighterTheme() @@ -116,8 +118,7 @@ export const ListTable = (props) => { - + @@ -137,56 +138,55 @@ export const ListTable = (props) => { language="xquery" wrapLines style={highLighterTheme} + customStyle={{borderRadius: 12, border: '1px solid #E4E7EC'}} lineProps={{style: {wordBreak: 'break-all', whiteSpace: 'pre-wrap'}}}> {item.sdk_element_xpath} - { - item.xpath_conditions?.map((xpath_condition, key) => { - return ( - - - - {xpath_condition.xpath_condition || '-'} - - {xpath_condition.meets_xpath_condition ? - : - } - - - ); - }) - } + {item.xpath_conditions?.map((xpath_condition, key) => + + + {xpath_condition.xpath_condition || '-'} + + )} - - - {item.is_covered ? : - } + + {item.is_covered ? + + : + + + } diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js index d9dd36c8..b9c117d4 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js @@ -22,6 +22,7 @@ const ResultSummaryCoverage = ({identifier, validationReport, handleExport, load alignItems='center' justifyContent='space-between'> + Result summary Coverage (XPath) @@ -31,17 +32,17 @@ const ResultSummaryCoverage = ({identifier, validationReport, handleExport, load Mapping suite identifier - {identifier} + {identifier} - XPATHs covered + XPATHs covered {`${coveredReports.length} / ${coveredReportPercent}%`} - XPATHs not covered + XPATHs not covered {`${notCoveredReports.length} / ${notCoveredReportPercent}%`} diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/utils.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/utils.js index a0a05020..bec92c11 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/utils.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/utils.js @@ -66,16 +66,19 @@ export const TableLoadWrapper = ({children, data, dataState, lines}) => { } -export const ValueChip = ({children, value, color}) => { +export const ValueChip = ({children, value, color, style}) => { const theme = useTheme() const themeColor = theme.palette?.[color] ?? {} return ( - {value ?? children} + borderRadius: 5, + ...style + }}>{value ?? children} ) } \ No newline at end of file diff --git a/mapping_workbench/frontend/src/theme/base/create-typography.js b/mapping_workbench/frontend/src/theme/base/create-typography.js index 1bc601ae..e6b5c6f4 100644 --- a/mapping_workbench/frontend/src/theme/base/create-typography.js +++ b/mapping_workbench/frontend/src/theme/base/create-typography.js @@ -1,3 +1,5 @@ +import {neutral} from '../colors'; + export const createTypography = () => { return { fontFamily: '"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"', @@ -71,6 +73,9 @@ export const createTypography = () => { fontWeight: 700, fontSize: '1.125rem', lineHeight: 1.2 + }, + secondary: { + color: neutral[550] } }; }; diff --git a/mapping_workbench/frontend/src/theme/colors.js b/mapping_workbench/frontend/src/theme/colors.js index 67d0b89f..1f825566 100644 --- a/mapping_workbench/frontend/src/theme/colors.js +++ b/mapping_workbench/frontend/src/theme/colors.js @@ -1,107 +1,108 @@ -import { alpha } from '@mui/system/colorManipulator'; +import {alpha} from '@mui/system/colorManipulator'; const withAlphas = (color) => { - return { - ...color, - alpha4: alpha(color.main, 0.04), - alpha8: alpha(color.main, 0.08), - alpha12: alpha(color.main, 0.12), - alpha30: alpha(color.main, 0.30), - alpha50: alpha(color.main, 0.50) - }; + return { + ...color, + alpha4: alpha(color.main, 0.04), + alpha8: alpha(color.main, 0.08), + alpha12: alpha(color.main, 0.12), + alpha30: alpha(color.main, 0.30), + alpha50: alpha(color.main, 0.50) + }; }; export const neutral = { - 0: '#FFF', - 50: '#F8F9FA', - 100: '#F3F4F6', - 200: '#E5E7EB', - 300: '#D2D6DB', - 400: '#9DA4AE', - 500: '#6C737F', - 600: '#4D5761', - 700: '#2F3746', - 800: '#1C2536', - 900: '#111927' + 0: '#FFF', + 50: '#F8F9FA', + 100: '#F3F4F6', + 200: '#E5E7EB', + 300: '#D2D6DB', + 400: '#9DA4AE', + 500: '#6C737F', + 550: '#667085', + 600: '#4D5761', + 700: '#2F3746', + 800: '#1C2536', + 900: '#111927' }; export const blue = withAlphas({ - lightest: '#F5F8FF', - light: '#EBEFFF', - main: '#2970FF', - dark: '#004EEB', - darkest: '#00359E', - contrastText: '#FFFFFF' + lightest: '#F5F8FF', + light: '#EBEFFF', + main: '#2970FF', + dark: '#004EEB', + darkest: '#00359E', + contrastText: '#FFFFFF' }); export const green = withAlphas({ - lightest: '#F6FEF9', - light: '#EDFCF2', - main: '#16B364', - dark: '#087443', - darkest: '#084C2E', - contrastText: '#FFFFFF' + lightest: '#F6FEF9', + light: '#EDFCF2', + main: '#16B364', + dark: '#087443', + darkest: '#084C2E', + contrastText: '#FFFFFF' }); export const indigo = withAlphas({ - lightest: '#F5F7FF', - light: '#EBEEFE', - main: '#6366F1', - dark: '#4338CA', - darkest: '#312E81', - contrastText: '#FFFFFF' + lightest: '#F5F7FF', + light: '#EBEEFE', + main: '#6366F1', + dark: '#4338CA', + darkest: '#312E81', + contrastText: '#FFFFFF' }); export const purple = withAlphas({ - lightest: '#F9F5FF', - light: '#F4EBFF', - main: '#9E77ED', - dark: '#6941C6', - darkest: '#42307D', - contrastText: '#FFFFFF' + lightest: '#F9F5FF', + light: '#F4EBFF', + main: '#9E77ED', + dark: '#6941C6', + darkest: '#42307D', + contrastText: '#FFFFFF' }); export const success = withAlphas({ - lightest: '#F0FDF9', - light: '#3FC79A', - main: '#10B981', - dark: '#0B815A', - darkest: '#134E48', - contrastText: '#FFFFFF' + lightest: '#F0FDF9', + light: '#3FC79A', + main: '#10B981', + dark: '#0B815A', + darkest: '#134E48', + contrastText: '#FFFFFF' }); export const info = withAlphas({ - lightest: '#ECFDFF', - light: '#CFF9FE', - main: '#06AED4', - dark: '#0E7090', - darkest: '#164C63', - contrastText: '#FFFFFF' + lightest: '#ECFDFF', + light: '#CFF9FE', + main: '#06AED4', + dark: '#0E7090', + darkest: '#164C63', + contrastText: '#FFFFFF' }); export const warning = withAlphas({ - lightest: '#FFFAEB', - light: '#FEF0C7', - main: '#F79009', - dark: '#B54708', - darkest: '#7A2E0E', - contrastText: '#FFFFFF' + lightest: '#FFFAEB', + light: '#FEF0C7', + main: '#F79009', + dark: '#B54708', + darkest: '#7A2E0E', + contrastText: '#FFFFFF' }); export const error = withAlphas({ - lightest: '#FEF3F2', - light: '#FEE4E2', - main: '#F04438', - dark: '#B42318', - darkest: '#7A271A', - contrastText: '#FFFFFF' + lightest: '#FEF3F2', + light: '#FEE4E2', + main: '#F04438', + dark: '#B42318', + darkest: '#7A271A', + contrastText: '#FFFFFF' }); export const yellow = withAlphas({ - lightest: '#eeecc4', - light: '#eee655', - main: '#eee409', - dark: '#aba308', - darkest: '#504d02', - contrastText: '#FFFFFF' + lightest: '#eeecc4', + light: '#eee655', + main: '#eee409', + dark: '#aba308', + darkest: '#504d02', + contrastText: '#FFFFFF' }); From 861fdea139418fc11adfd12875d9d288251654c6 Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Fri, 17 Jan 2025 17:54:50 +0200 Subject: [PATCH 29/51] MWB-952: update xpath file table --- .../list-table-file.js | 61 ++++++++++--------- .../xpath_validation_report_file.js | 10 +-- .../xpath_validation_report_test_dataset.js | 6 +- 3 files changed, 40 insertions(+), 37 deletions(-) diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table-file.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table-file.js index 2053c503..48aae7a3 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table-file.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table-file.js @@ -20,9 +20,11 @@ import DialogContentText from "@mui/material/DialogContentText"; import {Scrollbar} from 'src/components/scrollbar'; import {useHighlighterTheme} from "src/hooks/use-highlighter-theme"; -import TablePagination from "src/sections/components/table-pagination"; +import TablePagination from "src/sections/components/table-pagination-pages"; import TableSorterHeader from "src/sections/components/table-sorter-header"; import {TableFilterHeader} from "../../../layouts/app/table-filter-header/table-filter-header"; +import validationColor from '../mapping-package/state/validation-color'; +import {ValueChip} from './utils'; export const ListTable = (props) => { const [descriptionDialog, setDescriptionDialog] = useState({open: false, title: "", text: ""}) @@ -86,8 +88,7 @@ export const ListTable = (props) => { - + @@ -107,6 +108,7 @@ export const ListTable = (props) => { language="xquery" wrapLines style={highLighterTheme} + customStyle={{borderRadius: 12, border: '1px solid #E4E7EC'}} lineProps={{style: {wordBreak: 'break-all', whiteSpace: 'pre-wrap'}}}> {item.sdk_element_xpath} @@ -119,36 +121,37 @@ export const ListTable = (props) => { direction="column" spacing={1} > - - - {xpath_condition.xpath_condition || '-'} - - {xpath_condition.meets_xpath_condition ? - : - } - + + {xpath_condition.xpath_condition || '-'} + ); })} - - {item.is_covered - ? - : } + + {item.is_covered ? + + : + + + } diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_file.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_file.js index 8f7f7e8c..3680ee9c 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_file.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_file.js @@ -1,13 +1,13 @@ import {useEffect, useState} from "react"; -import Card from '@mui/material/Card'; +import Paper from '@mui/material/Paper'; import Grid from '@mui/material/Unstable_Grid2'; import {TableLoadWrapper} from "./utils"; import {ListTable} from "./list-table-file"; import ResultSummaryCoverage from './result-summary-coverage'; -import useItemsSearch from "../../../hooks/use-items-search"; -import {mappingPackageStatesApi as sectionApi} from "../../../api/mapping-packages/states"; +import useItemsSearch from "src/hooks/use-items-search"; +import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; const XpathValidationReportTest = ({sid, suiteId, testId, mappingSuiteIdentifier, handleExport}) => { const [validationReport, setValidationReport] = useState([]) @@ -42,7 +42,7 @@ const XpathValidationReportTest = ({sid, suiteId, testId, mappingSuiteIdentifier validationReport={validationReport}/> - + - + ) diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_test_dataset.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_test_dataset.js index b9ee024b..d80e3dc0 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_test_dataset.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_test_dataset.js @@ -17,7 +17,7 @@ const XpathValidationReportSuite = ({sid, suiteId, mappingSuiteIdentifier, handl useEffect(() => { handleValidationReportsSuiteGet(sid, suiteId) - }, [suiteId]) + }, [sid, suiteId]) const handleValidationReportsSuiteGet = (sid, suiteId) => { setDataState({load: true, error: false}) @@ -32,9 +32,9 @@ const XpathValidationReportSuite = ({sid, suiteId, mappingSuiteIdentifier, handl }) } - const itemsSearch = useItemsSearch(validationReport, sectionApi); + const itemsSearch = useItemsSearch(validationReport, sectionApi, [], {is_covered: ''}); - const handleCoverageFilterChange = e => itemsSearch.handleFiltersChange({is_covered: e.target.value}) + const handleCoverageFilterChange = e => itemsSearch.handleFiltersChange({is_covered: e}) const FILTER_VALUES = [{label: 'All', value: '', color: 'primary', count: validationReport.length}, {label: 'Covered', value: true, color: 'info', count: validationReport.filter(e => e.is_covered).length}, From b68aa3a835174cc1097a75d65fbf0462b58acf47 Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Mon, 20 Jan 2025 13:55:45 +0200 Subject: [PATCH 30/51] MWB-952: update sparql result column --- .../sparql-validation-report/list-table.js | 151 ++++++------------ .../app/sparql-validation-report/utils.js | 12 +- 2 files changed, 54 insertions(+), 109 deletions(-) diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js index 9a92a4dc..48c0c0a6 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js @@ -19,15 +19,43 @@ import Typography from '@mui/material/Typography'; import DialogTitle from "@mui/material/DialogTitle"; import DialogContent from "@mui/material/DialogContent"; import DialogActions from "@mui/material/DialogActions"; +import validationColor from '../mapping-package/state/validation-color'; +import {ValueChip} from '../xpath-validation-report/utils'; import {ResultChip} from "./utils"; import {useDialog} from "src/hooks/use-dialog"; import {Scrollbar} from 'src/components/scrollbar'; import {useHighlighterTheme} from "src/hooks/use-highlighter-theme"; -import TablePagination from "src/sections/components/table-pagination"; -import TableSorterHeader from "src/sections/components/table-sorter-header"; +import TablePagination from "src/sections/components/table-pagination-pages"; import {TableFilterHeader} from "src/layouts/app/table-filter-header/table-filter-header"; +const ResultCell = ({item, onClick}) => { + console.log(item) + const title = item.title + return + {Object.entries(item.result).map(([key, value]) => { + return value.count > 0 + ? + + onClick({title, notices: value.test_datas})} + label={key} + /> + + : null + }) + } + +} + export const ListTable = (props) => { const [descriptionDialog, setDescriptionDialog] = useState({open: false, title: "", description: ""}) const syntaxHighlighterTheme = useHighlighterTheme() @@ -65,39 +93,11 @@ export const ListTable = (props) => { setDescriptionDialog({open: true, title, description}); } - const handleClose = () => { - setDescriptionDialog(e => ({...e, open: false})); - }; - - const SorterHeader = (props) => { - const direction = props.fieldName === sort.column && sort.direction === 'desc' ? 'asc' : 'desc'; - return ( - - ) - } - - const ResultCell = ({title, result, onClick}) => { - return - {result.count - ? - : {result.count}} - - } + const handleClose = () => setDescriptionDialog(e => ({...e, open: false})); const xpathConditionDialog = useDialog() - const openXPathConditionDialog = (data) => { - xpathConditionDialog.handleOpen(data) - } + const openXPathConditionDialog = (data) => xpathConditionDialog.handleOpen(data) return ( <> @@ -133,48 +133,15 @@ export const ListTable = (props) => { title="XPath Condition"/> - - - } - desc/> - - - } - desc/> - - - } - desc/> - - - } - desc/> - - - } - desc/> - - - } - desc/> + + Result @@ -205,8 +172,14 @@ export const ListTable = (props) => { XQuery {item?.xpath_condition?.meets_xpath_condition ? - : - } + + + : + + + } } @@ -215,6 +188,8 @@ export const ListTable = (props) => { language="sparql" wrapLines style={syntaxHighlighterTheme} + customStyle={{borderRadius: 12, border: '1px solid #E4E7EC'}} + lineProps={{ style: { overflowWrap: 'break-word', @@ -225,40 +200,8 @@ export const ListTable = (props) => { - - - - - - - - - - - - - - - - + diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/utils.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/utils.js index c1e55efc..f11c2fe0 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/utils.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/utils.js @@ -26,12 +26,14 @@ export const resultColor = (result) => { } } -export const ResultChip = ({label, color, clickable}) => { +export const ResultChip = ({label, color, fontColor, onClick}) => { + const hover = onClick ? {'&:hover': {filter: 'brightness(85%)'}, cursor: 'pointer'} : {} return ( - + + {label ?? children} + ) } From ec3870a68e1eefe971b06fb60a40596d1bed9109 Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Mon, 20 Jan 2025 14:56:32 +0200 Subject: [PATCH 31/51] MWB-952: update sparql tables --- .../list-table-file.js | 27 +++++--- .../sparql-validation-report/list-table.js | 2 - .../sparql_validation_report_file.js | 13 +++- .../sparql_validation_report_package_state.js | 5 +- .../app/sparql-validation-report/utils.js | 62 ++++++++----------- .../app/xpath-validation-report/utils.js | 1 - 6 files changed, 61 insertions(+), 49 deletions(-) diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table-file.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table-file.js index 7c4219d1..f318bca4 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table-file.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table-file.js @@ -1,3 +1,4 @@ +import {capitalize} from '@mui/material'; import {Prism as SyntaxHighlighter} from 'react-syntax-highlighter'; import {Box} from "@mui/system"; @@ -12,10 +13,12 @@ import TableHead from '@mui/material/TableHead'; import CheckIcon from "@mui/icons-material/Check"; import CloseIcon from "@mui/icons-material/Close"; import Typography from '@mui/material/Typography'; +import validationColor from '../mapping-package/state/validation-color'; +import {ValueChip} from '../xpath-validation-report/utils'; -import {resultColor} from "./utils"; +import {ResultChip, resultColor} from "./utils"; import {Scrollbar} from 'src/components/scrollbar'; -import TablePagination from "src/sections/components/table-pagination"; +import TablePagination from "src/sections/components/table-pagination-pages"; import TableSorterHeader from "src/sections/components/table-sorter-header"; import PropTypes from "prop-types"; @@ -43,7 +46,7 @@ export const ListTableFile = (props) => { sectionApi } = props; - const syntaxHightligterTheme = useHighlighterTheme() + const syntaxHighlighterTheme = useHighlighterTheme() const SorterHeader = (props) => { const direction = props.fieldName === sort.column && sort.direction === 'desc' ? 'asc' : 'desc'; @@ -126,7 +129,11 @@ export const ListTableFile = (props) => { { { - + + {capitalize(item.result)} + diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js index 48c0c0a6..7f8bd530 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js @@ -30,7 +30,6 @@ import TablePagination from "src/sections/components/table-pagination-pages"; import {TableFilterHeader} from "src/layouts/app/table-filter-header/table-filter-header"; const ResultCell = ({item, onClick}) => { - console.log(item) const title = item.title return { wrapLines style={syntaxHighlighterTheme} customStyle={{borderRadius: 12, border: '1px solid #E4E7EC'}} - lineProps={{ style: { overflowWrap: 'break-word', diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js index cce2cf78..f6654f80 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js @@ -1,7 +1,9 @@ import {useEffect, useState} from "react"; +import Stack from '@mui/material/Stack'; import Paper from '@mui/material/Paper'; import Grid from '@mui/material/Unstable_Grid2'; +import Typography from '@mui/material/Typography'; import {ListTableFile} from "./list-table-file"; import {ResultFilter, TableLoadWrapper} from "./utils"; @@ -64,8 +66,15 @@ const SparqlFileReport = ({sid, suiteId, testId, handleExport}) => { - + + Assertions + + { const [dataState, setDataState] = useState({load: false, error: false}) const itemsSearch = useItemsSearch(validationReport, sectionApi); + const handleResultFilterChange = e => itemsSearch.handleFiltersChange({result: e.target.value}) return ( <> diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/utils.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/utils.js index f11c2fe0..15f445e0 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/utils.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/utils.js @@ -1,15 +1,17 @@ import {Box} from "@mui/system"; -import Chip from "@mui/material/Chip"; import Stack from "@mui/material/Stack"; -import Paper from "@mui/material/Paper"; import Radio from "@mui/material/Radio"; import Alert from "@mui/material/Alert"; import Tooltip from "@mui/material/Tooltip"; import Skeleton from "@mui/material/Skeleton"; import Typography from "@mui/material/Typography"; import RadioGroup from "@mui/material/RadioGroup"; +import FormControl from '@mui/material/FormControl'; import TableSortLabel from "@mui/material/TableSortLabel"; import FormControlLabel from "@mui/material/FormControlLabel"; +import validationColor from '../mapping-package/state/validation-color'; + +export const capitalize = (value) => `${value[0].toUpperCase()}${value.slice(1)}` export const resultColor = (result) => { switch (result.toLowerCase()) { @@ -26,10 +28,10 @@ export const resultColor = (result) => { } } -export const ResultChip = ({label, color, fontColor, onClick}) => { - const hover = onClick ? {'&:hover': {filter: 'brightness(85%)'}, cursor: 'pointer'} : {} +export const ResultChip = ({label, color, fontColor, onClick, clickable, children}) => { + const hover = onClick ?? clickable ? {'&:hover': {filter: 'brightness(85%)'}, cursor: 'pointer'} : {} return ( - {label ?? children} @@ -47,12 +49,15 @@ export const ResultFilter = ({currentState, onStateChange}) => { checked={currentState === (value ?? label.toLowerCase())} label={( - - - + + + + )} value={value ?? label.toLowerCase()} @@ -60,37 +65,22 @@ export const ResultFilter = ({currentState, onStateChange}) => { } return ( - + - - - Filter Results: - - - {reportValues.map(value => - )} - - - + + {reportValues.map(value => + )} - + ) } diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/utils.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/utils.js index bec92c11..dd05427c 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/utils.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/utils.js @@ -1,4 +1,3 @@ -import Box from "@mui/material/Box"; import Radio from "@mui/material/Radio"; import Stack from "@mui/material/Stack"; import Alert from "@mui/material/Alert"; From 16719bc640f229935ee14f76ddb548955cecc3a1 Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Mon, 20 Jan 2025 15:17:41 +0200 Subject: [PATCH 32/51] MWB-952: update shacl tables --- .../list-table-file.js | 64 ++++++------ .../app/shacl-validation-report/list-table.js | 97 +++++++------------ .../result-summary-coverage.js | 1 - .../shacl_validation_report_view.js | 2 - .../sparql-validation-report/list-table.js | 16 +-- 5 files changed, 72 insertions(+), 108 deletions(-) diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table-file.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table-file.js index d1e14f80..0ebd990d 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table-file.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table-file.js @@ -9,9 +9,19 @@ import TableRow from '@mui/material/TableRow'; import {Scrollbar} from 'src/components/scrollbar'; import {useHighlighterTheme} from "src/hooks/use-highlighter-theme"; -import TablePagination from 'src/sections/components/table-pagination'; -import {TableFilterHeader} from "../../../layouts/app/table-filter-header/table-filter-header"; +import TablePagination from 'src/sections/components/table-pagination-pages'; +import {TableFilterHeader} from "src/layouts/app/table-filter-header/table-filter-header"; +const LocalHighlighter = ({text, language, theme}) => { + return text ? + {text} + : null +} export const ListTableFile = (props) => { const { @@ -91,49 +101,29 @@ export const ListTableFile = (props) => { return ( - - {item.short_focus_node} - + - - {item.message} - + - - {item.short_result_path} - + - - {item.short_result_severity} - + - - {item.short_source_constraint_component} - + ); diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table.js index d5c6d4f2..a4fa7de5 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table.js @@ -13,14 +13,16 @@ import TableHead from '@mui/material/TableHead'; import DialogTitle from "@mui/material/DialogTitle"; import DialogContent from "@mui/material/DialogContent"; import DialogActions from "@mui/material/DialogActions"; +import validationColor from '../mapping-package/state/validation-color'; +import {ValueChip} from '../xpath-validation-report/utils'; import {ResultChip} from "./utils"; import {Scrollbar} from 'src/components/scrollbar'; import {useHighlighterTheme} from "src/hooks/use-highlighter-theme"; import {Prism as SyntaxHighlighter} from 'react-syntax-highlighter'; -import TablePagination from "src/sections/components/table-pagination"; import TableSorterHeader from "src/sections/components/table-sorter-header"; -import {TableFilterHeader} from "../../../layouts/app/table-filter-header/table-filter-header"; +import TablePagination from "src/sections/components/table-pagination-pages"; +import {TableFilterHeader} from "src/layouts/app/table-filter-header/table-filter-header"; export const ListTable = (props) => { const [descriptionDialog, setDescriptionDialog] = useState({open: false, title: "", text: ""}) @@ -67,20 +69,33 @@ export const ListTable = (props) => { {...props} /> - const ResultCell = ({title, result, onClick}) => { - return ( - - {result.count - ? - : {result.count}} - - ) + + const ResultCell = ({item, onClick}) => { + const title = item.title + return + {Object.entries(item.result).map(([key, value]) => { + return value.count > 0 + ? + + onClick({title, notices: value.test_datas})} + label={key} + /> + + : null + }) + } + } return ( @@ -120,29 +135,8 @@ export const ListTable = (props) => { fieldName="short_result_path" title="Result Path"/> - - } - desc/> - - - } - desc/> - - - } - desc/> - - - } - desc/> + + Result @@ -161,6 +155,7 @@ export const ListTable = (props) => { language="turtle" wrapLines style={syntaxHighlighterTheme} + customStyle={{borderRadius: 12, border: '1px solid #E4E7EC'}} lineProps={{ style: { overflowWrap: 'break-word', @@ -171,28 +166,8 @@ export const ListTable = (props) => { - - - - - - - - - - + diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-summary-coverage.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-summary-coverage.js index 0f6beaab..34d8b6d6 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-summary-coverage.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-summary-coverage.js @@ -43,7 +43,6 @@ export const ResultSummaryCoverage = ({validationReport, handleExport}) => { const itemsDisplay = Object.entries(itemsReduce)?.map(item => { const [itemName, itemCount] = item - console.log(item) const percent = (itemCount / itemsTotal) * 100 ?? 0 return { diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_view.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_view.js index 8991c3f1..962406bf 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_view.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_view.js @@ -13,8 +13,6 @@ const ShaclValidationReportView = ({sid, reportTree, validationReport, handleExp const [selectedPackageState, setSelectedPackageState] = useState() const [selectedTestDataset, setSelectedTestDataset] = useState() - console.log(selectedTestDataset,selectedTestDataset) - const handleSetPackageState = (file) => { setSelectedPackageState(file) setSelectedTestDataset(undefined) diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js index 7f8bd530..075a7958 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js @@ -33,21 +33,23 @@ const ResultCell = ({item, onClick}) => { const title = item.title return {Object.entries(item.result).map(([key, value]) => { return value.count > 0 ? + sx={{p: 2}}/> onClick({title, notices: value.test_datas})} - label={key} - /> + clickable + fontColor='#fff' + onClick={() => onClick({title, notices: value.test_datas})} + label={key} + /> : null }) From 3f81924e730e295c3bc8823b20b1c92db8d2f320 Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Tue, 21 Jan 2025 10:38:52 +0200 Subject: [PATCH 33/51] MWB-952: fix test --- .../cypress/e2e/mappingPackagesStates.feature | 28 ++++--- .../mappingPackagesStatesSteps.js | 6 ++ mapping_workbench/frontend/package.json | 2 +- .../[id]/states/[sid]/view.js | 8 +- .../app/shacl-validation-report/list-table.js | 1 + .../app/shacl-validation-report/utils.js | 76 +++++++++---------- 6 files changed, 69 insertions(+), 52 deletions(-) diff --git a/mapping_workbench/frontend/cypress/e2e/mappingPackagesStates.feature b/mapping_workbench/frontend/cypress/e2e/mappingPackagesStates.feature index d2fac107..1e971bf3 100644 --- a/mapping_workbench/frontend/cypress/e2e/mappingPackagesStates.feature +++ b/mapping_workbench/frontend/cypress/e2e/mappingPackagesStates.feature @@ -10,18 +10,22 @@ Feature: Mapping Packages States Then I get redirected to Mapping Packages list page Then I search for Mapping Package When I open actions menu + + + Scenario: State Details Then I click on View Last State Then I receive Mapping Packages State - Scenario Outline: Reports - Then I click on "" Reports Tab - Then I receive Mapping Packages State "" - Then I click on "" Data - Then I receive Mapping Packages Suite "" - Then I click on "" Data - Then I receive Mapping Packages Test "" - Examples: - | tab_name | - | Xpath | - | Sparql | - | Shacl | \ No newline at end of file + +# Scenario Outline: Reports +# Then I click on "" Reports Tab +# Then I receive Mapping Packages State "" +# Then I click on "" Data +# Then I receive Mapping Packages Suite "" +# Then I click on "" Data +# Then I receive Mapping Packages Test "" +# Examples: +# | tab_name | +# | Xpath | +# | Sparql | +# | Shacl | \ No newline at end of file diff --git a/mapping_workbench/frontend/cypress/e2e/mappingPackagesStates/mappingPackagesStatesSteps.js b/mapping_workbench/frontend/cypress/e2e/mappingPackagesStates/mappingPackagesStatesSteps.js index 439f8b39..f3aa1352 100644 --- a/mapping_workbench/frontend/cypress/e2e/mappingPackagesStates/mappingPackagesStatesSteps.js +++ b/mapping_workbench/frontend/cypress/e2e/mappingPackagesStates/mappingPackagesStatesSteps.js @@ -34,11 +34,17 @@ Then('I search for Mapping Package', () => { Then('I click on View Last State', () => { cy.intercept('GET', appURLPrefix + 'mapping_packages/state/*',).as('getState') + cy.intercept('GET', appURLPrefix + 'package_validator/xpath/state/*',).as('getXpath') + cy.intercept('GET', appURLPrefix + 'package_validator/sparql/state/*',).as('getSparql') + cy.intercept('GET', appURLPrefix + 'package_validator/shacl/state/*',).as('getShacl') cy.get('#view_last_state_button').click() }) Then('I receive Mapping Packages State', () => { cy.wait('@getState').its('response.statusCode').should('eq', 200) + cy.wait('@getXpath').its('response.statusCode').should('eq', 200) + cy.wait('@getSparql').its('response.statusCode').should('eq', 200) + cy.wait('@getShacl').its('response.statusCode').should('eq', 200) }) Then('I click on {string} Reports Tab', (tabName) => { diff --git a/mapping_workbench/frontend/package.json b/mapping_workbench/frontend/package.json index e73b8e14..ba57436f 100644 --- a/mapping_workbench/frontend/package.json +++ b/mapping_workbench/frontend/package.json @@ -126,7 +126,7 @@ "@types/react-slick": "0.23.10", "@types/react-syntax-highlighter": "15.5.6", "babel-plugin-prismjs": "^2.1.0", - "cypress": "^13.13.3", + "cypress": "^13.17.0", "cypress-cucumber-preprocessor": "^4.3.1", "eslint": "9.15.0", "eslint-config-next": "15.0.3", diff --git a/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js b/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js index a7d023dc..f5c039bc 100644 --- a/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js +++ b/mapping_workbench/frontend/src/pages/app/mapping-packages/[id]/states/[sid]/view.js @@ -138,6 +138,12 @@ const Page = () => { const handleExport = (setIsExporting) => exportPackage(sectionApi, id, setIsExporting, item) + const disabledTabs = { + xpath: !validationReport.xpath?.length, + sparql: !validationReport.sparql?.length, + shacl: !validationReport.shacl?.length, + } + return ( <> @@ -194,7 +200,7 @@ const Page = () => { id={tab.value + '_reports_tab'} label={tab.label} value={tab.value} - disabled={!validationReportTree.test_data_suites?.length} + disabled={!validationReportTree.test_data_suites?.length || disabledTabs[tab.value]} /> ))} diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table.js index a4fa7de5..656580cb 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table.js @@ -44,6 +44,7 @@ export const ListTable = (props) => { } = props; const handleOpenDetails = ({title, notices}) => { + console.log('on open details') const description = notices.map((notice, i) => } - -
  • Visit our website - Mapping Workbench -
  • - + A simplified view of the mapping lifecycle is depicted in Figure 1. Next, we provide you with a wizard meant to guide through a series of concrete steps from A to Z of a successful mapping From 5c941f218cd1fb2fe7c8622ce3d4654296ebc7a7 Mon Sep 17 00:00:00 2001 From: Kolea PLESCO Date: Tue, 21 Jan 2025 19:38:11 +0200 Subject: [PATCH 35/51] added extra validations and logs on package import --- .../backend/fields_registry/services/data.py | 6 +-- .../adapters/eforms/importer.py | 14 ++--- .../package_importer/adapters/importer_abc.py | 4 +- .../adapters/standard/importer.py | 2 +- .../backend/task_manager/adapters/task.py | 5 +- .../backend/tasks/models/task_response.py | 5 +- .../backend/tasks/models/task_result.py | 6 +-- .../src/sections/app/tasks/list-table.js | 51 ++++++++++++++++--- 8 files changed, 67 insertions(+), 26 deletions(-) diff --git a/mapping_workbench/backend/fields_registry/services/data.py b/mapping_workbench/backend/fields_registry/services/data.py index 7fe9d943..d51a5b79 100644 --- a/mapping_workbench/backend/fields_registry/services/data.py +++ b/mapping_workbench/backend/fields_registry/services/data.py @@ -7,14 +7,14 @@ async def get_structural_element_by_unique_fields( - sdk_element_id, bt_id, absolute_xpath, project_id: PydanticObjectId, name: str = None + sdk_element_id, absolute_xpath, project_id: PydanticObjectId, bt_id: str = None, name: str = None ) -> StructuralElement: project_link = Project.link_from_id(project_id) return await StructuralElement.find_one( StructuralElement.project == project_link, StructuralElement.sdk_element_id == sdk_element_id, - #StructuralElement.name == name, - StructuralElement.bt_id == bt_id, + # StructuralElement.name == name, + # StructuralElement.bt_id == bt_id, StructuralElement.absolute_xpath == absolute_xpath ) diff --git a/mapping_workbench/backend/package_importer/adapters/eforms/importer.py b/mapping_workbench/backend/package_importer/adapters/eforms/importer.py index f43e45b2..6922a2fe 100644 --- a/mapping_workbench/backend/package_importer/adapters/eforms/importer.py +++ b/mapping_workbench/backend/package_importer/adapters/eforms/importer.py @@ -8,7 +8,7 @@ from mapping_workbench.backend.package_importer.adapters.importer_abc import PackageImporterABC from mapping_workbench.backend.package_importer.models.imported_mapping_suite import ImportedMappingSuite from mapping_workbench.backend.project.models.entity import Project -from mapping_workbench.backend.tasks.models.task_response import TaskResponse +from mapping_workbench.backend.tasks.models.task_response import TaskResponse, TaskResultWarning from mapping_workbench.backend.triple_map_fragment.models.entity import GenericTripleMapFragment from mapping_workbench.backend.user.models.user import User @@ -71,22 +71,24 @@ async def add_mapping_rules_from_mono(self, mono_package: ImportedMappingSuite): for mono_rule in mono_package.conceptual_rules: source_structural_element: StructuralElement = await get_structural_element_by_unique_fields( sdk_element_id=mono_rule.eforms_sdk_id, - bt_id=mono_rule.bt_id, absolute_xpath=mono_rule.absolute_xpath, project_id=self.project.id, + # bt_id=mono_rule.bt_id, # name=mono_rule.field_name ) if not source_structural_element: - m = f"CM(sdk_id, bt_id, xpath) not imported: ({mono_rule.eforms_sdk_id}, {mono_rule.bt_id}, {mono_rule.absolute_xpath})" - mwb_logger.log_all_warning(m) - self.warnings.append(m) continue + if source_structural_element.bt_id != mono_rule.bt_id: + m = f"{mono_rule.eforms_sdk_id}, {source_structural_element.bt_id} <> {mono_rule.bt_id}, {mono_rule.absolute_xpath}" + mwb_logger.log_all_warning(m) + self.warnings.append(TaskResultWarning(message=m, type="CM(sdk_id, sdk_bt_id <> bt_id, xpath) BT ID Mismatch")) + if source_structural_element.name != mono_rule.field_name: m = f"Field[{source_structural_element.sdk_element_id}] has Imported Name ({mono_rule.field_name}) <> Current Name ({source_structural_element.name})" mwb_logger.log_all_warning(m) - self.warnings.append(m) + self.warnings.append(TaskResultWarning(message=m, type="Field Name Mismatch")) # A conceptual mapping rule may have same structural element but different Ontology Fragment rule: ConceptualMappingRule = await ConceptualMappingRule.find_one( diff --git a/mapping_workbench/backend/package_importer/adapters/importer_abc.py b/mapping_workbench/backend/package_importer/adapters/importer_abc.py index 6d517f1d..2c97154a 100644 --- a/mapping_workbench/backend/package_importer/adapters/importer_abc.py +++ b/mapping_workbench/backend/package_importer/adapters/importer_abc.py @@ -22,7 +22,7 @@ from mapping_workbench.backend.sparql_test_suite.services.data import SPARQL_CM_ASSERTIONS_SUITE_TITLE, \ SPARQL_INTEGRATION_TESTS_SUITE_TITLE from mapping_workbench.backend.task_manager.adapters.task_progress import TaskProgress -from mapping_workbench.backend.tasks.models.task_response import TaskResponse +from mapping_workbench.backend.tasks.models.task_response import TaskResponse, TaskResultWarning from mapping_workbench.backend.test_data_suite.models.entity import TestDataSuite, TestDataFileResource, \ TestDataFileResourceFormat from mapping_workbench.backend.triple_map_fragment.models.entity import TripleMapFragmentFormat, \ @@ -32,7 +32,7 @@ class PackageImporterABC(ABC): package: MappingPackage - warnings: List[str] = [] + warnings: List[TaskResultWarning] = [] task_progress: TaskProgress def __init__(self, project: Project, user: User, task_response: TaskResponse = None): diff --git a/mapping_workbench/backend/package_importer/adapters/standard/importer.py b/mapping_workbench/backend/package_importer/adapters/standard/importer.py index 96fbafb1..bf7fc1f5 100644 --- a/mapping_workbench/backend/package_importer/adapters/standard/importer.py +++ b/mapping_workbench/backend/package_importer/adapters/standard/importer.py @@ -50,9 +50,9 @@ async def add_mapping_rules_from_mono(self, mono_package: ImportedMappingSuite): for mono_rule in mono_package.conceptual_rules: source_structural_element: StructuralElement = await get_structural_element_by_unique_fields( sdk_element_id=mono_rule.field_name, - bt_id=mono_rule.bt_id, absolute_xpath=mono_rule.absolute_xpath, project_id=self.project.id, + # bt_id=mono_rule.bt_id, # name=mono_rule.field_name ) diff --git a/mapping_workbench/backend/task_manager/adapters/task.py b/mapping_workbench/backend/task_manager/adapters/task.py index aec17a58..f3711400 100644 --- a/mapping_workbench/backend/task_manager/adapters/task.py +++ b/mapping_workbench/backend/task_manager/adapters/task.py @@ -8,7 +8,8 @@ from pebble import ProcessFuture from mapping_workbench.backend.config import settings -from mapping_workbench.backend.tasks.models.task_response import TaskStatus, TaskProgressData, TaskResponse +from mapping_workbench.backend.tasks.models.task_response import TaskStatus, TaskProgressData, TaskResponse, \ + TaskResultWarning from mapping_workbench.backend.tasks.models.task_result import TaskResult, TaskMetadata, TaskMetadataMeta @@ -162,7 +163,7 @@ def update_exception_message(self, exception_message: str): """ self.task_metadata.exception_message = exception_message - def update_warnings(self, warnings: List[str]): + def update_warnings(self, warnings: List[TaskResultWarning]): """ """ self.task_metadata.warnings = warnings diff --git a/mapping_workbench/backend/tasks/models/task_response.py b/mapping_workbench/backend/tasks/models/task_response.py index 2f2c47cc..3a98cd5d 100644 --- a/mapping_workbench/backend/tasks/models/task_response.py +++ b/mapping_workbench/backend/tasks/models/task_response.py @@ -56,9 +56,12 @@ class TaskProgressData(TaskProgressDataBase): actions: List[TaskProgressAction] = [] actions_count: int = 0 +class TaskResultWarning(BaseModel): + message: str + type: str = None class TaskResultData(TaskProgressDataBase): - warnings: List[str] = [] + warnings: List[TaskResultWarning] = None data: Any = None diff --git a/mapping_workbench/backend/tasks/models/task_result.py b/mapping_workbench/backend/tasks/models/task_result.py index 6dbb0c22..883747fa 100644 --- a/mapping_workbench/backend/tasks/models/task_result.py +++ b/mapping_workbench/backend/tasks/models/task_result.py @@ -4,7 +4,7 @@ from pydantic import BaseModel from mapping_workbench.backend.tasks.models.task_entity import TaskEntity -from mapping_workbench.backend.tasks.models.task_response import TaskStatus, TaskProgressData +from mapping_workbench.backend.tasks.models.task_response import TaskStatus, TaskProgressData, TaskResultWarning class TaskResult: @@ -14,7 +14,7 @@ class TaskResult: started_at: datetime = None finished_at: datetime = None exception_message: str = None - warnings: List[str] = [] + warnings: List[TaskResultWarning] = None task_status: TaskStatus = TaskStatus.FINISHED @@ -37,7 +37,7 @@ class TaskMetadata(BaseModel): started_at: datetime = None finished_at: datetime = None exception_message: str = None - warnings: List[str] = [] + warnings: List[TaskResultWarning] = None progress: TaskProgressData = None meta: TaskMetadataMeta = None, created_by: Optional[str] = None diff --git a/mapping_workbench/frontend/src/sections/app/tasks/list-table.js b/mapping_workbench/frontend/src/sections/app/tasks/list-table.js index ed588948..8d7db33c 100644 --- a/mapping_workbench/frontend/src/sections/app/tasks/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/tasks/list-table.js @@ -30,6 +30,7 @@ import {MenuActionButton, MenuActions} from 'src/components/menu-actions'; import TableSorterHeader from "src/sections/components/table-sorter-header"; import TablePagination from "src/sections/components/table-pagination-pages"; import {mapStatusColor, TaskActions, TaskLine, taskProgressStatus as taskStatuses} from "./task-actions"; +import {Box} from "@mui/system"; export const ListTable = (props) => { @@ -77,6 +78,19 @@ export const ListTable = (props) => { setPopoverShow(e => ({...e, anchor: undefined})) } + const groupedWarnings = (warnings) => { + const result = {}; + + warnings.forEach(warning => { + if (!result[warning.type]) { + result[warning.type] = []; + } + result[warning.type].push(warning.message); + }); + + return result; + } + return ( { - Warning + Warnings + {item.warnings?.length} + - - {item.warnings.map((warning, key) => - - {warning} - + + {Object.entries(groupedWarnings(item.warnings)).map(([type, warnings]) => + + + {type} + {warnings?.length} + + + + + {warnings.map((warning, key) => + + {warning} + + )} + + + + )} - +
    } From 2a6bc55124713daf6c32fe34664ddeb61a28294b Mon Sep 17 00:00:00 2001 From: Kolea PLESCO Date: Tue, 21 Jan 2025 19:44:33 +0200 Subject: [PATCH 36/51] added extra validations and logs on package import --- .../frontend/src/pages/app/fields-and-nodes/overview/import.js | 1 - 1 file changed, 1 deletion(-) diff --git a/mapping_workbench/frontend/src/pages/app/fields-and-nodes/overview/import.js b/mapping_workbench/frontend/src/pages/app/fields-and-nodes/overview/import.js index cfd9a24c..2b3bb87a 100644 --- a/mapping_workbench/frontend/src/pages/app/fields-and-nodes/overview/import.js +++ b/mapping_workbench/frontend/src/pages/app/fields-and-nodes/overview/import.js @@ -42,7 +42,6 @@ const Page = () => { .max(1024), branch_or_tag_name: Yup .string() - .max(20) .required('Branch or Tag name is required') }), onSubmit: async (values, helpers) => { From efe52779e9c7c01469214315b6b1d11a249652f1 Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Thu, 23 Jan 2025 10:08:36 +0200 Subject: [PATCH 37/51] MWB-956: add compare codemirror module --- mapping_workbench/frontend/package.json | 1 + .../components/app/form/codeMirrorDefault.js | 35 ++++++++++++++++++- .../[id]/resource-manager/[fid]/edit.js | 10 ++++-- .../file-manager/file-resource-edit-form.js | 23 +++++++----- 4 files changed, 58 insertions(+), 11 deletions(-) diff --git a/mapping_workbench/frontend/package.json b/mapping_workbench/frontend/package.json index ba57436f..b086f666 100644 --- a/mapping_workbench/frontend/package.json +++ b/mapping_workbench/frontend/package.json @@ -87,6 +87,7 @@ "react": "18.2.0", "react-apexcharts": "1.4.0", "react-beautiful-dnd": "13.1.1", + "react-codemirror-merge": "^4.23.7", "react-dom": "18.2.0", "react-draft-wysiwyg": "1.15.0", "react-dropzone": "14.2.3", diff --git a/mapping_workbench/frontend/src/components/app/form/codeMirrorDefault.js b/mapping_workbench/frontend/src/components/app/form/codeMirrorDefault.js index 4b1b725e..3799ccd9 100644 --- a/mapping_workbench/frontend/src/components/app/form/codeMirrorDefault.js +++ b/mapping_workbench/frontend/src/components/app/form/codeMirrorDefault.js @@ -1,9 +1,10 @@ -import CodeMirror from "@uiw/react-codemirror"; +import CodeMirror, {basicSetup, EditorState, EditorView} from "@uiw/react-codemirror"; import {githubDark, githubLight} from "@uiw/codemirror-themes-all"; import {yaml} from '@codemirror/lang-yaml' import {xml} from '@codemirror/lang-xml' import {json} from '@codemirror/lang-json' // import rdf from '@rdfjs-elements/rdf-editor' +import {MergeView, unifiedMergeView} from '@codemirror/merge' import {turtle} from 'codemirror-lang-turtle'; import {sparql} from 'codemirror-lang-sparql'; @@ -12,6 +13,8 @@ import {useTheme} from "@mui/material/styles"; import FormLabel from "@mui/material/FormLabel"; import FormControl from "@mui/material/FormControl"; import {Box} from "@mui/system"; +import {useEffect, useRef} from 'react'; +import CodeMirrorMerge from 'react-codemirror-merge'; const languageSwitch = (lang) => { @@ -32,6 +35,36 @@ const languageSwitch = (lang) => { } } +const Original = CodeMirrorMerge.Original; +const Modified = CodeMirrorMerge.Modified; + +export const CodeMirrorCompare = ({value, lang, label, style, theme,name}) => { + return ( + + + {label} + + + + + + + + + ) +} + const CodeMirrorDefault = ({value, onChange, lang, label, disabled, style}) => { const theme = useTheme(); diff --git a/mapping_workbench/frontend/src/pages/app/test-data-suites/[id]/resource-manager/[fid]/edit.js b/mapping_workbench/frontend/src/pages/app/test-data-suites/[id]/resource-manager/[fid]/edit.js index 269f8c38..6dd1b456 100644 --- a/mapping_workbench/frontend/src/pages/app/test-data-suites/[id]/resource-manager/[fid]/edit.js +++ b/mapping_workbench/frontend/src/pages/app/test-data-suites/[id]/resource-manager/[fid]/edit.js @@ -22,7 +22,7 @@ import {Layout as AppLayout} from 'src/layouts/app'; import {RouterLink} from 'src/components/router-link'; import {FormTextField} from "src/components/app/form/text-field"; import {ForItemEditForm} from "src/contexts/app/section/for-item-form"; -import CodeMirrorDefault from "src/components/app/form/codeMirrorDefault"; +import CodeMirrorDefault, {CodeMirrorCompare} from "src/components/app/form/codeMirrorDefault"; import {ForItemDataState} from "src/contexts/app/section/for-item-data-state"; import {FileResourceEditForm} from 'src/sections/app/file-manager/file-resource-edit-form'; import {testDataFileResourcesApi as sectionApi} from 'src/api/test-data-suites/file-resources'; @@ -101,7 +101,13 @@ const ExtraForm = (props) => { - formik.setValues('rdf_manifestation', value)}*/} + {/* lang={'TTL'}*/} + {/*/>*/} + formik.setValues('rdf_manifestation', value)} diff --git a/mapping_workbench/frontend/src/sections/app/file-manager/file-resource-edit-form.js b/mapping_workbench/frontend/src/sections/app/file-manager/file-resource-edit-form.js index fa1745f9..4a7268ae 100644 --- a/mapping_workbench/frontend/src/sections/app/file-manager/file-resource-edit-form.js +++ b/mapping_workbench/frontend/src/sections/app/file-manager/file-resource-edit-form.js @@ -18,12 +18,12 @@ import {useRouter} from 'src/hooks/use-router'; import {RouterLink} from 'src/components/router-link'; import {FormTextArea} from "src/components/app/form/text-area"; import {FormTextField} from "src/components/app/form/text-field"; -import {FormCodeTextArea} from "src/components/app/form/code-text-area"; import {toastError, toastLoad, toastSuccess} from "src/components/app-toast"; -import CodeMirrorDefault from "../../../components/app/form/codeMirrorDefault"; +import {CodeMirrorCompare} from "src/components/app/form/codeMirrorDefault"; export const FileResourceEditForm = (props) => { const router = useRouter(); + // const [showCompare, setShowCompare] = useState(false) const { itemctx, collection_id, @@ -201,12 +201,19 @@ export const FileResourceEditForm = (props) => { - formik.setFieldValue('content', value)}/> + + {/* formik.setFieldValue('content', value)}/>*/} + formik.setValues('rdf_manifestation', value)} + lang={formik.values.format} + /> From 1240070b021e4e4d3d98b863ded68c00c28eff00 Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Thu, 23 Jan 2025 15:23:41 +0200 Subject: [PATCH 38/51] MWB-956: add compare button and select time switch --- .../file-collections/file-resources/index.js | 14 ++- .../components/app/form/codeMirrorDefault.js | 16 ++-- .../[id]/resource-manager/[fid]/edit.js | 95 +++++++++++++++---- mapping_workbench/frontend/src/paths.js | 1 + .../file-manager/file-resource-edit-form.js | 87 ++++++++++++----- .../mapping-package-form-select.js | 52 +++++----- 6 files changed, 183 insertions(+), 82 deletions(-) diff --git a/mapping_workbench/frontend/src/api/file-collections/file-resources/index.js b/mapping_workbench/frontend/src/api/file-collections/file-resources/index.js index 967c3816..3c0d6542 100644 --- a/mapping_workbench/frontend/src/api/file-collections/file-resources/index.js +++ b/mapping_workbench/frontend/src/api/file-collections/file-resources/index.js @@ -1,5 +1,6 @@ import {SectionApi} from "src/api/section"; import {appApi} from "src/api/app"; +import {sessionApi} from '../../session'; export class FileResourcesApi extends SectionApi { get FILE_RESOURCE_FORMATS() { @@ -33,8 +34,17 @@ export class FileResourcesApi extends SectionApi { } async getFileResource(id) { - let endpoint = this.paths['file_resource'].replace(':id', id); - let data = await appApi.get(endpoint); + const endpoint = this.paths['file_resource'].replace(':id', id); + const data = await appApi.get(endpoint); + return Promise.resolve(data); + } +// http://localhost:8000/api/v1/test_data_suites/file_resources/678f5c9d607a7f61f94c11c5/transform/history?project=678f5b8d6f271a8aa40e9633 + + async getFileHistory(id) { + const filters = {}; + filters['project'] = sessionApi.getSessionProject(); + const endpoint = this.paths['file_history'].replace(':id', id); + const data = await appApi.get(endpoint, filters); return Promise.resolve(data); } } diff --git a/mapping_workbench/frontend/src/components/app/form/codeMirrorDefault.js b/mapping_workbench/frontend/src/components/app/form/codeMirrorDefault.js index 3799ccd9..66f8005b 100644 --- a/mapping_workbench/frontend/src/components/app/form/codeMirrorDefault.js +++ b/mapping_workbench/frontend/src/components/app/form/codeMirrorDefault.js @@ -1,19 +1,17 @@ -import CodeMirror, {basicSetup, EditorState, EditorView} from "@uiw/react-codemirror"; +import CodeMirror, {EditorState, EditorView} from "@uiw/react-codemirror"; import {githubDark, githubLight} from "@uiw/codemirror-themes-all"; import {yaml} from '@codemirror/lang-yaml' import {xml} from '@codemirror/lang-xml' import {json} from '@codemirror/lang-json' // import rdf from '@rdfjs-elements/rdf-editor' -import {MergeView, unifiedMergeView} from '@codemirror/merge' import {turtle} from 'codemirror-lang-turtle'; import {sparql} from 'codemirror-lang-sparql'; +import {Box} from "@mui/system"; import {useTheme} from "@mui/material/styles"; import FormLabel from "@mui/material/FormLabel"; import FormControl from "@mui/material/FormControl"; -import {Box} from "@mui/system"; -import {useEffect, useRef} from 'react'; import CodeMirrorMerge from 'react-codemirror-merge'; @@ -38,7 +36,8 @@ const languageSwitch = (lang) => { const Original = CodeMirrorMerge.Original; const Modified = CodeMirrorMerge.Modified; -export const CodeMirrorCompare = ({value, lang, label, style, theme,name}) => { +export const CodeMirrorCompare = ({value, previousValue, lang, label, style, name}) => { + const theme = useTheme() return ( { + theme={theme.palette.mode === 'dark' ? githubDark : githubLight} + > - @@ -65,7 +65,7 @@ export const CodeMirrorCompare = ({value, lang, label, style, theme,name}) => { ) } -const CodeMirrorDefault = ({value, onChange, lang, label, disabled, style}) => { +const CodeMirrorDefault = ({value, onChange, lang, label, disabled, style, name}) => { const theme = useTheme(); return ( diff --git a/mapping_workbench/frontend/src/pages/app/test-data-suites/[id]/resource-manager/[fid]/edit.js b/mapping_workbench/frontend/src/pages/app/test-data-suites/[id]/resource-manager/[fid]/edit.js index 6dd1b456..4901b6f4 100644 --- a/mapping_workbench/frontend/src/pages/app/test-data-suites/[id]/resource-manager/[fid]/edit.js +++ b/mapping_workbench/frontend/src/pages/app/test-data-suites/[id]/resource-manager/[fid]/edit.js @@ -1,5 +1,4 @@ import {useCallback, useEffect, useState} from "react"; -import {useFormik} from "formik"; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; @@ -7,9 +6,12 @@ import Chip from '@mui/material/Chip'; import Link from '@mui/material/Link'; import Stack from '@mui/material/Stack'; import Paper from "@mui/material/Paper"; -import SvgIcon from '@mui/material/SvgIcon'; +import Button from '@mui/material/Button'; import Divider from "@mui/material/Divider"; +import SvgIcon from '@mui/material/SvgIcon'; +import MenuItem from '@mui/material/MenuItem'; import Checkbox from "@mui/material/Checkbox"; +import TextField from '@mui/material/TextField'; import Grid from "@mui/material/Unstable_Grid2"; import Typography from '@mui/material/Typography'; import FormControlLabel from "@mui/material/FormControlLabel"; @@ -27,6 +29,8 @@ import {ForItemDataState} from "src/contexts/app/section/for-item-data-state"; import {FileResourceEditForm} from 'src/sections/app/file-manager/file-resource-edit-form'; import {testDataFileResourcesApi as sectionApi} from 'src/api/test-data-suites/file-resources'; import {MappingPackageFormSelect} from 'src/sections/app/mapping-package/components/mapping-package-form-select'; +import {useGlobalState} from '../../../../../../hooks/use-global-state'; +import timeTransformer from '../../../../../../utils/time-transformer'; const useItem = (sectionApi, id) => { @@ -51,13 +55,22 @@ const useItem = (sectionApi, id) => { const ExtraForm = (props) => { const { item, - formik + formik, + compare_items, } = props; + const {timeSetting} = useGlobalState() + + const [showCompare, setShowCompare] = useState(false) + + const handleCompareChange = e => { + formik.setFieldValue('compare_item', e.target.value) + } const handleTransformTestDataChange = useCallback((event) => { formik.setFieldValue('transform_test_data', event.target.checked); }, [formik]); + return ( { - {/* formik.setValues('rdf_manifestation', value)}*/} - {/* lang={'TTL'}*/} - {/*/>*/} - formik.setValues('rdf_manifestation', value)} - lang={'TTL'} - /> + + {compare_items.length && } + + + {showCompare && + {compare_items.map((compare_item) => ( + + {timeTransformer(compare_item.created_at, timeSetting)} + + ))} + } + + + {showCompare ? + formik.setValues('rdf_manifestation', value)} + lang='TTL' + /> : + formik.setValues('rdf_manifestation', value)} + lang='TTL' + />} ) } +const useFileHistory = (sectionApi, id) => { + const [compareItems, setCompareItems] = useState([]) + + useEffect(() => { + id && handleItemHistoryGet(id) + }, [id]) + + const handleItemHistoryGet = () => { + sectionApi.getFileHistory(id) + .then(res => setCompareItems(res)) + .catch(err => console.error(err)) + } + + return compareItems +} + const Page = () => { const router = useRouter(); const {id, fid} = router.query; const formState = useItem(sectionApi, fid); + const compare_items = useFileHistory(sectionApi, fid) const item = formState.item; - const formik = useFormik({ - initialValues: {"rdf_manifestation": item && item.rdf_manifestation} - }); - usePageView(); if (!item) { @@ -139,7 +193,8 @@ const Page = () => { identifier: item.identifier || '', rdf_manifestation: item.rdf_manifestation || '', transform_test_data: false, - mapping_package_id: null + mapping_package_id: null, + compare_items: compare_items } return ( diff --git a/mapping_workbench/frontend/src/paths.js b/mapping_workbench/frontend/src/paths.js index 16aecb31..6293961d 100644 --- a/mapping_workbench/frontend/src/paths.js +++ b/mapping_workbench/frontend/src/paths.js @@ -256,6 +256,7 @@ export const apiPaths = { item: '/test_data_suites/:id', file_resources: '/test_data_suites/:id/file_resources', file_resource: '/test_data_suites/file_resources/:id', + file_history: '/test_data_suites/file_resources/:id/transform/history', assign_mapping_packages: '/test_data_suites/assign_mapping_packages', tasks: { transform_test_data: '/test_data_suites/tasks/transform_test_data', diff --git a/mapping_workbench/frontend/src/sections/app/file-manager/file-resource-edit-form.js b/mapping_workbench/frontend/src/sections/app/file-manager/file-resource-edit-form.js index 4a7268ae..1af09c76 100644 --- a/mapping_workbench/frontend/src/sections/app/file-manager/file-resource-edit-form.js +++ b/mapping_workbench/frontend/src/sections/app/file-manager/file-resource-edit-form.js @@ -1,4 +1,5 @@ import PropTypes from 'prop-types'; +import {useState} from 'react'; import * as Yup from 'yup'; import {useFormik} from 'formik'; @@ -19,11 +20,13 @@ import {RouterLink} from 'src/components/router-link'; import {FormTextArea} from "src/components/app/form/text-area"; import {FormTextField} from "src/components/app/form/text-field"; import {toastError, toastLoad, toastSuccess} from "src/components/app-toast"; -import {CodeMirrorCompare} from "src/components/app/form/codeMirrorDefault"; +import CodeMirrorDefault, {CodeMirrorCompare} from "src/components/app/form/codeMirrorDefault"; +import {useGlobalState} from '../../../hooks/use-global-state'; +import timeTransformer from '../../../utils/time-transformer'; export const FileResourceEditForm = (props) => { const router = useRouter(); - // const [showCompare, setShowCompare] = useState(false) + const [showCompare, setShowCompare] = useState(false) const { itemctx, collection_id, @@ -46,8 +49,9 @@ export const FileResourceEditForm = (props) => { filename: data.filename || '', format: data.format || sectionApi.FILE_RESOURCE_DEFAULT_FORMAT || '', content: data.content || '', - file: null - }, extra_form_fields) + file: null, + compare_item: extra_form_fields.compare_items?.[0] + }, extra_form_fields,) } const initialValues = initFormValues(item); @@ -113,6 +117,12 @@ export const FileResourceEditForm = (props) => { formik.values.file = e.target.files[0]; } + const handleCompareChange = e => { + formik.setFieldValue('compare_item', e.target.value) + } + + const {timeSetting} = useGlobalState() + return (
    { - - {/* formik.setFieldValue('content', value)}/>*/} - formik.setValues('rdf_manifestation', value)} - lang={formik.values.format} - /> + + {extra_form_fields?.compare_items.length && } + + {showCompare && + {extra_form_fields?.compare_items.map((compare_item) => ( + + {timeTransformer(compare_item.created_at,timeSetting)} + + ))} + } + + {showCompare ? + formik.setValues('rdf_manifestation', value)} + lang={formik.values.format} + /> : + formik.setFieldValue('content', value)}/>} @@ -229,13 +263,15 @@ export const FileResourceEditForm = (props) => { - {extra_form && ( - - - {extra_form({item: item, formik: formik})} - - - )} + { + extra_form && ( + + + {extra_form({item, formik, compare_items: extra_form_fields.compare_items})} + + + ) + } { - ); + ) + ; }; FileResourceEditForm.propTypes = { diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/components/mapping-package-form-select/mapping-package-form-select.js b/mapping_workbench/frontend/src/sections/app/mapping-package/components/mapping-package-form-select/mapping-package-form-select.js index ba50a819..76890ed6 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/components/mapping-package-form-select/mapping-package-form-select.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/components/mapping-package-form-select/mapping-package-form-select.js @@ -42,33 +42,31 @@ export const MappingPackageFormSelect = (props) => { }, [mappingPackagesStore.items]); return ( - <> - - -   + + +   + + {mappingPackagesStore.items.map((mapping_package) => ( + + {mapping_package.title} - {mappingPackagesStore.items.map((mapping_package) => ( - - {mapping_package.title} - - ))} - - + ))} + ); }; From bcf1f7a16f0c0d669429e2e83c2c8b092e18d50a Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Thu, 23 Jan 2025 16:00:27 +0200 Subject: [PATCH 39/51] MWB-956: change position for compare --- .../frontend/src/components/app/form/codeMirrorDefault.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mapping_workbench/frontend/src/components/app/form/codeMirrorDefault.js b/mapping_workbench/frontend/src/components/app/form/codeMirrorDefault.js index 66f8005b..ca2cc022 100644 --- a/mapping_workbench/frontend/src/components/app/form/codeMirrorDefault.js +++ b/mapping_workbench/frontend/src/components/app/form/codeMirrorDefault.js @@ -50,8 +50,8 @@ export const CodeMirrorCompare = ({value, previousValue, lang, label, style, nam {label}
    - From 529c6b6a2af71ad05e169d6d690129b48d1a2588 Mon Sep 17 00:00:00 2001 From: Kolea PLESCO Date: Thu, 23 Jan 2025 21:47:36 +0200 Subject: [PATCH 40/51] added extra validations and logs on package import --- .../package_importer/adapters/eforms/importer.py | 10 ++++++++++ .../backend/package_importer/adapters/importer_abc.py | 8 +++++++- .../package_validator/adapters/sparql_validator.py | 4 +++- .../[id]/resource-manager/[fid]/edit.js | 5 +++-- .../app/file-manager/file-resource-edit-form.js | 2 +- 5 files changed, 24 insertions(+), 5 deletions(-) diff --git a/mapping_workbench/backend/package_importer/adapters/eforms/importer.py b/mapping_workbench/backend/package_importer/adapters/eforms/importer.py index 6922a2fe..189f5817 100644 --- a/mapping_workbench/backend/package_importer/adapters/eforms/importer.py +++ b/mapping_workbench/backend/package_importer/adapters/eforms/importer.py @@ -90,6 +90,16 @@ async def add_mapping_rules_from_mono(self, mono_package: ImportedMappingSuite): mwb_logger.log_all_warning(m) self.warnings.append(TaskResultWarning(message=m, type="Field Name Mismatch")) + if not self.is_cm_rule_path_valid(mono_rule.class_path): + m = f"{mono_rule.class_path}" + mwb_logger.log_all_warning(m) + self.warnings.append(TaskResultWarning(message=m, type="Class Path Mismatch")) + + if not self.is_cm_rule_path_valid(mono_rule.property_path): + m = f"{mono_rule.property_path}" + mwb_logger.log_all_warning(m) + self.warnings.append(TaskResultWarning(message=m, type="Property Path Mismatch")) + # A conceptual mapping rule may have same structural element but different Ontology Fragment rule: ConceptualMappingRule = await ConceptualMappingRule.find_one( ConceptualMappingRule.source_structural_element == StructuralElement.link_from_id( diff --git a/mapping_workbench/backend/package_importer/adapters/importer_abc.py b/mapping_workbench/backend/package_importer/adapters/importer_abc.py index 2c97154a..b2c16b25 100644 --- a/mapping_workbench/backend/package_importer/adapters/importer_abc.py +++ b/mapping_workbench/backend/package_importer/adapters/importer_abc.py @@ -1,3 +1,4 @@ +import re from abc import ABC, abstractmethod from itertools import takewhile from pathlib import Path @@ -43,7 +44,6 @@ def __init__(self, project: Project, user: User, task_response: TaskResponse = N self.task_progress = TaskProgress(self.task_response) self.package = None - @abstractmethod async def import_from_mono_mapping_suite(self, mono_package: ImportedMappingSuite): """ @@ -366,6 +366,12 @@ async def add_mapping_package_from_mono(self, mono_package: ImportedMappingSuite self.task_progress.finish_current_action_step() + @classmethod + def is_cm_rule_path_valid(cls, cm_rule_path: str) -> bool: + if not cm_rule_path: + return True + return len(cm_rule_path.split('/')) == len(cm_rule_path.split(" / ")) + @classmethod async def clear_project_data(cls, project: Project): project_link = Project.link_from_id(project.id) diff --git a/mapping_workbench/backend/package_validator/adapters/sparql_validator.py b/mapping_workbench/backend/package_validator/adapters/sparql_validator.py index a9cab445..5cd32e48 100644 --- a/mapping_workbench/backend/package_validator/adapters/sparql_validator.py +++ b/mapping_workbench/backend/package_validator/adapters/sparql_validator.py @@ -22,6 +22,7 @@ class SPARQLValidator(TestDataValidator): rdf_graph: Any = None test_data: Any = None test_data_suite: Any = None + errors: List[str] = None @validate_call def __init__(self, test_data: TestDataState, test_data_suite: TestDataSuiteState = None, **data: Any): @@ -32,6 +33,7 @@ def __init__(self, test_data: TestDataState, test_data_suite: TestDataSuiteState ) self.test_data = test_data self.test_data_suite = test_data_suite + self.errors = [] def validate(self, sparql_queries: List[SPARQLTestState]) -> SPARQLTestDataValidationResult: results = [] @@ -55,7 +57,7 @@ def validate(self, sparql_queries: List[SPARQLTestState]) -> SPARQLTestDataValid except Exception as e: sparql_query_result.error = str(e)[:100] sparql_query_result.result = SPARQLQueryRefinedResultType.ERROR.value - mwb_logger.log_all_error(message="ERROR :: SPARQL Validation :: Stack trace:", stack_trace=str(e)) + mwb_logger.log_all_error(message=f"ERROR :: SPARQL Validation :: Q:\n{sparql_query.content}\nStack trace:", stack_trace=str(e)) results.append(sparql_query_result) diff --git a/mapping_workbench/frontend/src/pages/app/test-data-suites/[id]/resource-manager/[fid]/edit.js b/mapping_workbench/frontend/src/pages/app/test-data-suites/[id]/resource-manager/[fid]/edit.js index 4901b6f4..0c9e809f 100644 --- a/mapping_workbench/frontend/src/pages/app/test-data-suites/[id]/resource-manager/[fid]/edit.js +++ b/mapping_workbench/frontend/src/pages/app/test-data-suites/[id]/resource-manager/[fid]/edit.js @@ -117,7 +117,7 @@ const ExtraForm = (props) => { - {compare_items.length && } @@ -128,6 +128,7 @@ const ExtraForm = (props) => { onChange={handleCompareChange} select value={formik.values.compare_item} + sx={{minWidth: 200}} > {compare_items.map((compare_item) => ( { const {id, fid} = router.query; const formState = useItem(sectionApi, fid); - const compare_items = useFileHistory(sectionApi, fid) + const compare_items = useFileHistory(sectionApi, fid).slice(1) const item = formState.item; usePageView(); diff --git a/mapping_workbench/frontend/src/sections/app/file-manager/file-resource-edit-form.js b/mapping_workbench/frontend/src/sections/app/file-manager/file-resource-edit-form.js index 1af09c76..41c1cef1 100644 --- a/mapping_workbench/frontend/src/sections/app/file-manager/file-resource-edit-form.js +++ b/mapping_workbench/frontend/src/sections/app/file-manager/file-resource-edit-form.js @@ -213,7 +213,7 @@ export const FileResourceEditForm = (props) => { md={12}> - {extra_form_fields?.compare_items.length && } {showCompare && Date: Fri, 24 Jan 2025 16:38:51 +0200 Subject: [PATCH 41/51] MWB-952: update filter for states --- .../app/mapping-package/state/file-list.js | 50 ++-- .../app/shacl-validation-report/list-table.js | 5 +- .../shacl_validation_report_package_state.js | 23 +- .../shacl_validation_report_test_dataset.js | 24 +- .../list-table-file.js | 281 +++++++++--------- .../sparql_validation_report_file.js | 15 +- .../sparql_validation_report_package_state.js | 22 +- .../sparql_validation_report_test_dataset.js | 30 +- .../sparql_validation_report_view.js | 2 + .../app/sparql-validation-report/utils.js | 9 +- .../xpath-validation-report/coverage_files.js | 32 -- .../coverage_report.js | 28 -- .../result-summary-coverage.js | 4 +- 13 files changed, 273 insertions(+), 252 deletions(-) delete mode 100644 mapping_workbench/frontend/src/sections/app/xpath-validation-report/coverage_files.js delete mode 100644 mapping_workbench/frontend/src/sections/app/xpath-validation-report/coverage_report.js diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/file-list.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/file-list.js index 77d141d7..3f369a12 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/file-list.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/file-list.js @@ -8,6 +8,7 @@ import {TreeItem, treeItemClasses} from '@mui/x-tree-view'; import {SimpleTreeView} from '@mui/x-tree-view/SimpleTreeView'; import FolderOpenIcon from '@mui/icons-material/FolderOpen'; import InsertDriveFileOutlinedIcon from '@mui/icons-material/InsertDriveFileOutlined'; +import {Scrollbar} from '../../../../components/scrollbar'; const FileList = ({files, handleFileChange, handleFolderChange, selectedPackageState, selectedTestDataset}) => { const FileIcon = () => @@ -15,37 +16,38 @@ const FileList = ({files, handleFileChange, handleFolderChange, selectedPackageS const ExpandIcon = () => return ( - + handleFolderChange(undefined)}> Test Set Summary - - {files?.map(item => + + {files?.map(item => handleFolderChange(item)}> - {item.test_data_states?.map(child => { - handleFolderChange(item) - handleFileChange(child) - }}> + onClick={() => handleFolderChange(item)}> + {item.test_data_states?.map(child => { + handleFolderChange(item) + handleFileChange(child) + }}> + )} )} - )} - + + ) diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table.js index 656580cb..652be32d 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table.js @@ -13,11 +13,10 @@ import TableHead from '@mui/material/TableHead'; import DialogTitle from "@mui/material/DialogTitle"; import DialogContent from "@mui/material/DialogContent"; import DialogActions from "@mui/material/DialogActions"; -import validationColor from '../mapping-package/state/validation-color'; -import {ValueChip} from '../xpath-validation-report/utils'; import {ResultChip} from "./utils"; import {Scrollbar} from 'src/components/scrollbar'; +import {ValueChip} from '../xpath-validation-report/utils'; import {useHighlighterTheme} from "src/hooks/use-highlighter-theme"; import {Prism as SyntaxHighlighter} from 'react-syntax-highlighter'; import TableSorterHeader from "src/sections/components/table-sorter-header"; @@ -86,7 +85,7 @@ export const ListTable = (props) => { - onClick({title, notices: value.test_datas})} diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js index e90bca71..973d0b72 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js @@ -1,7 +1,10 @@ +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; import {useState} from "react"; import Paper from '@mui/material/Paper'; import Grid from '@mui/material/Unstable_Grid2'; +import {ResultFilter} from '../sparql-validation-report/utils'; import {ListTable} from "./list-table"; import {ResultSummaryCoverage} from './result-summary-coverage'; @@ -9,10 +12,19 @@ import {TableLoadWrapper} from "./utils"; import useItemsSearch from "src/hooks/use-items-search"; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; +const FILTER_VALUES = ['info', 'valid', 'violation', 'warning'].map(value => ({value: value + 'Count', label: value})) + const ShaclPackageStateReport = ({handleSelectFile, mappingSuiteIdentifier, validationReport, handleExport}) => { const [dataState, setDataState] = useState({load: false, error: false}) - const itemsSearch = useItemsSearch(validationReport, sectionApi); + const [resultFilter, setResultFilter] = useState('') + const filteredItems = validationReport.filter((item) => { + return !resultFilter || item.result[resultFilter]?.count > 0 + }) + + const handleResultFilterChange = e => setResultFilter(e.target.value) + + const itemsSearch = useItemsSearch(filteredItems, sectionApi); return ( <> @@ -26,6 +38,15 @@ const ShaclPackageStateReport = ({handleSelectFile, mappingSuiteIdentifier, vali + + Assertions + + ({value: value + 'Count', label: value})) const ShaclTestDatasetReport = ({sid, suiteId, handleSelectFile, handleExport}) => { const [validationReport, setValidationReport] = useState([]) const [dataState, setDataState] = useState({load: true, error: false}) - useEffect(() => { handleValidationReportsGet(sid, suiteId) }, [suiteId]) + const [resultFilter, setResultFilter] = useState('') + const filteredItems = validationReport.filter((item) => { + return !resultFilter || item.result[resultFilter]?.count > 0 + }) + + const handleResultFilterChange = e => setResultFilter(e.target.value) + + const handleValidationReportsGet = (sid, suiteId) => { setDataState({load: true, error: false}) sectionApi.getShaclReportsSuite(sid, suiteId) @@ -46,7 +57,7 @@ const ShaclTestDatasetReport = ({sid, suiteId, handleSelectFile, handleExport}) }) } - const itemsSearch = useItemsSearch(validationReport, sectionApi); + const itemsSearch = useItemsSearch(filteredItems, sectionApi); return ( <> @@ -59,6 +70,15 @@ const ShaclTestDatasetReport = ({sid, suiteId, handleSelectFile, handleExport}) + + Assertions + + { } return ( - <> - - - - - - - - - - - - - - - - - - - - - - - - {items?.map((item, key) => { - return ( - - - - {item.title} - - - - {item?.xpath_condition?.xpath_condition && - <> + +
    + + + + + + + + + + + + + + + + + + + + + {items?.map((item, key) => { + return ( + + + + {item.title} + + + + {item?.xpath_condition?.xpath_condition && + <> + - - - {item?.xpath_condition?.xpath_condition || '-'} - - {item?.meets_xpath_condition ? - : - } - + + {item?.xpath_condition?.xpath_condition || '-'} + + {item?.meets_xpath_condition ? + : + } - - } - - - {item.description} - - - - - - {item.query} - - - - - {capitalize(item.result)} - - - - - - - - - - - - - ); - })} - -
    -
    -
    - - ) - ; +
    + + } + + + {item.description} + + + + + + {item.query} + + + + + {capitalize(item.result)} + + + + + + + + + + + + + ); + })} + + + + + ); }; ListTableFile.propTypes = { diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js index f6654f80..46595441 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js @@ -11,6 +11,7 @@ import useItemsSearch from "src/hooks/use-items-search"; import {ResultSummaryQuery} from './result-summary-coverage'; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; +const FILTER_VALUES = ["valid", "unverifiable", "warning", "invalid", "error", "unknown"].map(e => ({value: e})) const SparqlFileReport = ({sid, suiteId, testId, handleExport}) => { const [validationReport, setValidationReport] = useState([]) @@ -51,10 +52,12 @@ const SparqlFileReport = ({sid, suiteId, testId, handleExport}) => { return resultArray; }) - const itemsSearch = useItemsSearch(validationReport, sectionApi); + const itemsSearch = useItemsSearch(validationReport, sectionApi, [], {result: ''}); const handleResultFilterChange = e => itemsSearch.handleFiltersChange({result: e.target.value}) + console.log(itemsSearch.state.filters) + return ( <> { + alignItems='center' + justifyContent='space-between' + sx={{mx: 3}}> Assertions - { const [dataState, setDataState] = useState({load: false, error: false}) - const itemsSearch = useItemsSearch(validationReport, sectionApi); - const handleResultFilterChange = e => itemsSearch.handleFiltersChange({result: e.target.value}) + const [resultFilter, setResultFilter] = useState('') + + const filteredItems = validationReport.filter((item) => { + return !resultFilter || item.result[resultFilter]?.count > 0 + }) + + const itemsSearch = useItemsSearch(filteredItems, sectionApi, [], {result: ''}); + const handleResultFilterChange = e => setResultFilter(e.target.value) return ( <> @@ -29,6 +38,15 @@ const SparqlValidationReport = ({handleSelectFile, validationReport, handleExpor + + Assertions + + { const [validationReport, setValidationReport] = useState([]) const [dataState, setDataState] = useState({load: true, error: false}) - + const [resultFilter, setResultFilter] = useState('') useEffect(() => { handleValidationReportsGet(sid, suiteId) - }, []) + }, [sid, suiteId]) + + const handleResultFilterChange = e => setResultFilter(e.target.value) + + const filteredItems = validationReport.filter((item) => { + return !resultFilter || item.result[resultFilter]?.count > 0 + }) const handleValidationReportsGet = (sid, suiteId) => { setDataState({load: true, error: false}) @@ -52,7 +65,7 @@ const SparqlTestDatasetReport = ({sid, suiteId, handleSelectFile, handleExport}) return resultArray; }) - const itemsSearch = useItemsSearch(validationReport, sectionApi); + const itemsSearch = useItemsSearch(filteredItems, sectionApi); return ( <> @@ -66,6 +79,15 @@ const SparqlTestDatasetReport = ({sid, suiteId, handleSelectFile, handleExport}) + + Assertions + + { + const [selectedPackageState, setSelectedPackageState] = useState() const [selectedTestDataset, setSelectedTestDataset] = useState() diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/utils.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/utils.js index 15f445e0..7f267bef 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/utils.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/utils.js @@ -39,8 +39,7 @@ export const ResultChip = ({label, color, fontColor, onClick, clickable, childre ) } -export const ResultFilter = ({currentState, onStateChange}) => { - const reportValues = ["valid", "unverifiable", "warning", "invalid", "error", "unknown"] +export const ResultFilter = ({currentState, onStateChange, values}) => { const FilterValue = ({label, value, currentState}) => { return ( @@ -75,9 +74,9 @@ export const ResultFilter = ({currentState, onStateChange}) => { - {reportValues.map(value => - + )}
    diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/coverage_files.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/coverage_files.js deleted file mode 100644 index d48af4bd..00000000 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/coverage_files.js +++ /dev/null @@ -1,32 +0,0 @@ -import FolderIcon from '@mui/icons-material/FolderOpen'; -import FileIcon from '@mui/icons-material/Description'; - -import List from "@mui/material/List"; -import ListItem from "@mui/material/ListItem"; -import Typography from "@mui/material/Typography"; -import ListItemIcon from "@mui/material/ListItemIcon"; -import ListItemText from "@mui/material/ListItemText"; -import ListItemButton from "@mui/material/ListItemButton"; - -const CoverageFiles = ({files, fileIcon, onClick}) => { - return ( - <> - - Test set summary - - - {files.map(file=> - - onClick(file)}> - {fileIcon ? : } - - - )} - - - ) -} - -export default CoverageFiles \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/coverage_report.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/coverage_report.js deleted file mode 100644 index 03b8a8a5..00000000 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/coverage_report.js +++ /dev/null @@ -1,28 +0,0 @@ -import List from "@mui/material/List"; -import ListItem from "@mui/material/ListItem"; - -const CoverageReport = ({validationReport, mappingSuiteIdentifier}) => { - const { coveredReports, notCoveredReports } = validationReport.reduce((acc, report) => { - acc[report.is_covered ? "coveredReports" : "notCoveredReports"].push({ sdk_element_xpath: report.sdk_element_xpath }) - return acc - }, {coveredReports:[], notCoveredReports:[]}) - - const coveredReportPercent = (coveredReports.length/validationReport.length*100).toFixed(2) - const notCoveredReportPercent = (notCoveredReports.length/validationReport.length*100).toFixed(2) - - return( - - - Mapping suite identifier: {mappingSuiteIdentifier} - - - XPATHs covered: {coveredReports.length} / {coveredReportPercent}% - - - XPATHs not covered: {notCoveredReports.length} / {notCoveredReportPercent}% - - - ) -} - -export default CoverageReport \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js index b9c117d4..b5d030e7 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/result-summary-coverage.js @@ -17,7 +17,7 @@ const ResultSummaryCoverage = ({identifier, validationReport, handleExport, load const notCoveredReportPercent = (notCoveredReports.length / validationReport.length * 100).toFixed(2) - return + return @@ -28,7 +28,7 @@ const ResultSummaryCoverage = ({identifier, validationReport, handleExport, load
    - + Mapping suite identifier From c99629fd38a46a09fcd359c0a4a23d670540ea43 Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Fri, 24 Jan 2025 17:40:36 +0200 Subject: [PATCH 42/51] MWB-952: code clean-up --- .../state/result-summary-coverage-shacl.js | 12 +-- .../state/result-summary-coverage-sparql.js | 12 +-- .../state/state-line-progress.js | 2 +- .../app/mapping-package/state/utils.js | 87 +++++++++++++++++ .../mapping-package/state/validation-color.js | 19 +--- .../shacl-validation-report/coverage_files.js | 31 ------- .../result-summary-coverage.js | 34 +------ .../result-summary-table.js | 89 ------------------ .../shacl-validation-report/result-table.js | 7 +- .../shacl_validation_report_package_state.js | 13 +-- .../shacl_validation_report_test_dataset.js | 15 +-- .../coverage_files.js | 32 ------- .../list-table-file.js | 4 +- .../sparql-validation-report/list-table.js | 4 +- .../query-result-table.js | 83 ----------------- .../result-summary-coverage.js | 12 +-- .../result-summary-table.js | 93 ------------------- .../sparql_validation_report_file.js | 22 +---- .../sparql_validation_report_package_state.js | 53 +++++------ .../sparql_validation_report_test_dataset.js | 32 +------ .../app/sparql-validation-report/utils.js | 53 +---------- .../list-table-file.js | 4 +- .../app/xpath-validation-report/list-table.js | 4 +- .../xpath_validation_report_package_state.js | 50 +++++----- 24 files changed, 170 insertions(+), 597 deletions(-) create mode 100644 mapping_workbench/frontend/src/sections/app/mapping-package/state/utils.js delete mode 100644 mapping_workbench/frontend/src/sections/app/shacl-validation-report/coverage_files.js delete mode 100644 mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-summary-table.js delete mode 100644 mapping_workbench/frontend/src/sections/app/sparql-validation-report/coverage_files.js delete mode 100644 mapping_workbench/frontend/src/sections/app/sparql-validation-report/query-result-table.js delete mode 100644 mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-table.js diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js index be3e0555..639436a3 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-shacl.js @@ -7,21 +7,13 @@ import {useTheme} from '@mui/material/styles'; import Typography from '@mui/material/Typography'; import {StatePieChart} from './state-pie-chart'; -import getValidationColor from './validation-color'; +import {getValidationColor, getValidationReportShacl} from './utils'; const ResultSummaryCoverageShacl = ({validationReport, handleChangeTab}) => { const theme = useTheme() if (!validationReport) return null - const {itemsTotal, ...itemsReduce} = - validationReport.map(item => item.result).reduce((acc, report) => { - Object.keys(report).forEach(reportKey => { - acc[reportKey] = (acc[reportKey] ?? 0) + report[reportKey].count - acc["itemsTotal"] = (acc["itemsTotal"] ?? 0) + report[reportKey].count - } - ) - return acc - }, {info: 0, valid: 0, violation: 0, warning: 0}) + const {itemsTotal, ...itemsReduce} = getValidationReportShacl(validationReport) const itemsDisplay = Object.entries(itemsReduce)?.map(item => { const [itemName, itemCount] = item diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js index 1bc98381..e40e1f37 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/result-summary-coverage-sparql.js @@ -6,21 +6,13 @@ import Button from '@mui/material/Button'; import {useTheme} from '@mui/material/styles'; import Typography from '@mui/material/Typography'; import {StatePieChart} from './state-pie-chart'; -import getValidationColor from './validation-color'; +import {getItemsDisplay, getValidationColor, getValidationReportSparql} from './utils'; const ResultSummaryCoverageSparql = ({validationReport, handleChangeTab}) => { const theme = useTheme() if (!validationReport) return null - const {itemsTotal, ...itemsReduce} = - validationReport.map(item => item.result).reduce((acc, report) => { - Object.keys(report).forEach(reportKey => { - acc[reportKey] = (acc[reportKey] ?? 0) + report[reportKey].count - acc["itemsTotal"] = (acc["itemsTotal"] ?? 0) + report[reportKey].count - } - ) - return acc - }, {valid: 0, unverifiable: 0, warning: 0, invalid: 0, error: 0, unknown: 0}) + const {itemsTotal, ...itemsReduce} = getValidationReportSparql(validationReport) const itemsDisplay = Object.entries(itemsReduce)?.map(item => { const [itemName, itemCount] = item diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-line-progress.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-line-progress.js index a5a25ae2..c8058b00 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-line-progress.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-line-progress.js @@ -1,6 +1,6 @@ import LinearProgress, {linearProgressClasses} from '@mui/material/LinearProgress'; import {styled} from '@mui/material/styles'; -import getValidationColor from './validation-color'; +import {getValidationColor} from './utils'; export const LineProgressDouble = ({value, load, color, endColor}) => { const BorderLinearProgress = styled(LinearProgress)(({linecolor}) => ({ diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/utils.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/utils.js new file mode 100644 index 00000000..82a3eb7a --- /dev/null +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/utils.js @@ -0,0 +1,87 @@ +export const getValidationColor = (color) => { + switch (color) { + case 'valid': + return '#90BE6D' + case 'unverifiable': + case 'info': + return '#2D9CDB' + case 'invalid': + case 'violation': + return '#F94144' + case 'error': + return '#F8961E' + case 'warning': + return '#F9C74F' + default: + return '#577590' + } +} + +export const getItemsDisplay = (items, total) => Object.entries(items)?.map(item => { + const [itemName, itemCount] = item + const percent = (itemCount / total) * 100 ?? 0 + + return { + label: `${itemName[0].toUpperCase()}${itemName.slice(1)} (${percent.toFixed(2)}% - ${itemCount})`, + value: itemCount, + itemPercent: percent.toFixed(2), + color: getValidationColor(itemName) + } +}) + + +export const getValidationReportShacl = (items) => items.map(item => item.result).reduce((acc, report) => { + Object.keys(report).forEach(reportKey => { + acc[reportKey] = (acc[reportKey] ?? 0) + report[reportKey].count + acc["itemsTotal"] = (acc["itemsTotal"] ?? 0) + report[reportKey].count + } + ) + return acc +}, {info: 0, valid: 0, violation: 0, warning: 0}) + + +export const getValidationReportSparql = (items) => items.map(item => item.result).reduce((acc, report) => { + Object.keys(report).forEach(reportKey => { + acc[reportKey] = (acc[reportKey] ?? 0) + report[reportKey].count + acc["itemsTotal"] = (acc["itemsTotal"] ?? 0) + report[reportKey].count + } + ) + return acc +}, {valid: 0, unverifiable: 0, warning: 0, invalid: 0, error: 0, unknown: 0}) + + +export const mapShaclResults = (result) => { + return result.results.map(e => { + const resultArray = {} + resultArray["shacl_suite"] = result.shacl_suites?.[0]?.shacl_suite_id + resultArray["short_result_path"] = e.short_result_path + resultArray["result"] = e.result + Object.entries(e.result).forEach(entrie => { + const [key, value] = entrie + resultArray[`${key}Count`] = value.count + }) + return resultArray; + }) +} + + +export const mapSparqlResults = (result) => result.map(e => { + const queryAsArray = e.query.content.split("\n") + const values = queryAsArray.slice(0, 3) + const resultArray = {} + values.forEach(e => { + const res = e.split(": ") + resultArray[res[0].substring(1)] = res[1] + } + ) + resultArray["query"] = queryAsArray.slice(4, queryAsArray.length).join("\n") + resultArray["test_suite"] = e.query.filename + resultArray["result"] = e.result + Object.entries(e.result).forEach(entrie => { + const [key, value] = entrie + resultArray[`${key}Count`] = value.count + }) + resultArray["meets_xpath_condition"] = e.meets_xpath_condition + resultArray["xpath_condition"] = e.query?.cm_rule?.xpath_condition + return resultArray; +}) \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/validation-color.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/validation-color.js index 166e86ec..d29259b2 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/validation-color.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/validation-color.js @@ -1,20 +1,3 @@ -const getValidationColor = (color) => { - switch (color) { - case 'valid': - return '#90BE6D' - case 'unverifiable': - case 'info': - return '#2D9CDB' - case 'invalid': - case 'violation': - return '#F94144' - case 'error': - return '#F8961E' - case 'warning': - return '#F9C74F' - default: - return '#577590' - } -} + export default getValidationColor \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/coverage_files.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/coverage_files.js deleted file mode 100644 index fe59dd24..00000000 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/coverage_files.js +++ /dev/null @@ -1,31 +0,0 @@ -import List from "@mui/material/List"; -import ListItem from "@mui/material/ListItem"; -import Typography from "@mui/material/Typography"; -import ListItemText from "@mui/material/ListItemText"; -import ListItemIcon from "@mui/material/ListItemIcon"; -import FileIcon from '@mui/icons-material/Description'; -import FolderIcon from '@mui/icons-material/FolderOpen'; -import ListItemButton from "@mui/material/ListItemButton"; - -const CoverageFiles = ({files, fileIcon, onClick}) => { - return ( - <> - - Test set summary - - - {files.map(file=> - - onClick(file)}> - {fileIcon ? : } - - - )} - - - ) -} - -export default CoverageFiles \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-summary-coverage.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-summary-coverage.js index 34d8b6d6..43c9d46b 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-summary-coverage.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-summary-coverage.js @@ -4,7 +4,7 @@ import Typography from '@mui/material/Typography'; import ExportButton from '../mapping-package/state/export-button'; import {StatePieChartBig} from '../mapping-package/state/state-pie-chart'; -import getValidationColor from '../mapping-package/state/validation-color'; +import {getValidationColor, getValidationReportShacl} from '../mapping-package/state/utils'; const Pie = ({data, handleExport}) => { return ( @@ -31,15 +31,7 @@ export const ResultSummaryCoverage = ({validationReport, handleExport}) => { if (!validationReport) return null - const {itemsTotal, ...itemsReduce} = - validationReport.map(item => item.result).reduce((acc, report) => { - Object.keys(report).forEach(reportKey => { - acc[reportKey] = (acc[reportKey] ?? 0) + report[reportKey].count - acc["itemsTotal"] = (acc["itemsTotal"] ?? 0) + report[reportKey].count - } - ) - return acc - }, {info: 0, valid: 0, violation: 0, warning: 0}) + const {itemsTotal, ...itemsReduce} = getValidationReportShacl(validationReport) const itemsDisplay = Object.entries(itemsReduce)?.map(item => { const [itemName, itemCount] = item @@ -55,24 +47,4 @@ export const ResultSummaryCoverage = ({validationReport, handleExport}) => { return -} - -export const ResultSummaryQuery = ({validationReport}) => { - const itemsReduce = validationReport.reduce((acc, item) => { - acc[item.result] = (acc[item.result] ?? 0) + 1 - return acc - }, {valid: 0, unverifiable: 0, warning: 0, invalid: 0, error: 0, unknown: 0}) - - const itemsDisplay = Object.entries(itemsReduce)?.map(item => { - const [itemName, itemCount] = item - const percent = (itemCount / validationReport.length) * 100 ?? 0 - return { - label: `${itemName[0].toUpperCase()}${itemName.slice(1)} (${percent.toFixed(2)}% - ${itemCount})`, - value: itemCount, - itemPercent: percent.toFixed(2), - color: getValidationColor(itemName) - } - }) - - return -} +} \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-summary-table.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-summary-table.js deleted file mode 100644 index 3eb48faa..00000000 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-summary-table.js +++ /dev/null @@ -1,89 +0,0 @@ -import {useState} from "react"; - -import Table from '@mui/material/Table'; -import TableBody from '@mui/material/TableBody'; -import TableCell from '@mui/material/TableCell'; -import TableHead from '@mui/material/TableHead'; -import TableRow from '@mui/material/TableRow'; -import Chip from "@mui/material/Chip"; - -import {Scrollbar} from 'src/components/scrollbar'; -import {resultColor, SorterHeader as UtilsSortHeader, sortItems} from "./utils"; - -const ResultSummaryTable = ({items}) => { - const[sort,setSort] = useState({column:"", direction:"desc"}) - - const handleSort = (column) => { - setSort(prevState=> ({ column, - direction: prevState.column === column && prevState.direction === "asc" ? "desc" : "asc" })) - } - - const {itemsTotal, ...itemsReduce} = - items.map(item => item.result).reduce((acc, report) => { - Object.keys(report).forEach(reportKey => { - acc[reportKey] = (acc[reportKey] ?? 0) + report[reportKey].count - acc["itemsTotal"] = (acc["itemsTotal"] ?? 0) + report[reportKey].count - } - ) - return acc - },{info:0, valid:0, violation:0, warning:0}) - - const itemsDisplay = Object.entries(itemsReduce)?.map(item => { - const [itemName, itemCount] = item - return {itemName, itemCount, itemPercent: (itemCount/itemsTotal) * 100 ?? 0 } - }) - - const sortedItems = sortItems(itemsDisplay, sort) - - const SorterHeader = ({title, fieldName}) => - - return ( - - - - - - - - - - - - - - - - - {sortedItems?.map((item, key) => { - return ( - - - - - - {item.itemCount} - - - {`${item.itemPercent.toFixed(2)}%`} - - - - ); - })} - -
    -
    - ); -}; - -export default ResultSummaryTable diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-table.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-table.js index de71ddfb..d02ca8ea 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-table.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-table.js @@ -1,14 +1,15 @@ +import {useState} from "react"; + import Table from '@mui/material/Table'; +import TableRow from '@mui/material/TableRow'; import TableBody from '@mui/material/TableBody'; import TableCell from '@mui/material/TableCell'; import TableHead from '@mui/material/TableHead'; -import TableRow from '@mui/material/TableRow'; -import Typography from '@mui/material/Typography'; +import Typography from '@mui/material/Typography'; import PropTypes from 'prop-types'; import {Scrollbar} from 'src/components/scrollbar'; -import {useState} from "react"; import {SorterHeader as UtilsSortHeader, sortItems} from "./utils"; export const ResultTable = (props) => { diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js index 973d0b72..e57a95de 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js @@ -1,21 +1,19 @@ -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; import {useState} from "react"; +import Stack from '@mui/material/Stack'; import Paper from '@mui/material/Paper'; import Grid from '@mui/material/Unstable_Grid2'; -import {ResultFilter} from '../sparql-validation-report/utils'; +import Typography from '@mui/material/Typography'; import {ListTable} from "./list-table"; -import {ResultSummaryCoverage} from './result-summary-coverage'; -import {TableLoadWrapper} from "./utils"; import useItemsSearch from "src/hooks/use-items-search"; +import {ResultFilter} from '../sparql-validation-report/utils'; +import {ResultSummaryCoverage} from './result-summary-coverage'; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; const FILTER_VALUES = ['info', 'valid', 'violation', 'warning'].map(value => ({value: value + 'Count', label: value})) const ShaclPackageStateReport = ({handleSelectFile, mappingSuiteIdentifier, validationReport, handleExport}) => { - const [dataState, setDataState] = useState({load: false, error: false}) const [resultFilter, setResultFilter] = useState('') const filteredItems = validationReport.filter((item) => { @@ -36,8 +34,6 @@ const ShaclPackageStateReport = ({handleSelectFile, mappingSuiteIdentifier, vali - - diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_test_dataset.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_test_dataset.js index 15c57f7c..ca81397e 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_test_dataset.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_test_dataset.js @@ -4,6 +4,7 @@ import {useEffect, useState} from "react"; import Paper from '@mui/material/Paper'; import Grid from '@mui/material/Unstable_Grid2'; +import {mapShaclResults} from '../mapping-package/state/utils'; import {ResultFilter} from '../sparql-validation-report/utils'; import {ListTable} from "./list-table"; @@ -43,20 +44,6 @@ const ShaclTestDatasetReport = ({sid, suiteId, handleSelectFile, handleExport}) }) } - const mapShaclResults = (result) => { - return result.results.map(e => { - const resultArray = {} - resultArray["shacl_suite"] = result.shacl_suites?.[0]?.shacl_suite_id - resultArray["short_result_path"] = e.short_result_path - resultArray["result"] = e.result - Object.entries(e.result).forEach(entrie => { - const [key, value] = entrie - resultArray[`${key}Count`] = value.count - }) - return resultArray; - }) - } - const itemsSearch = useItemsSearch(filteredItems, sectionApi); return ( diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/coverage_files.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/coverage_files.js deleted file mode 100644 index 598897fe..00000000 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/coverage_files.js +++ /dev/null @@ -1,32 +0,0 @@ -import FileIcon from '@mui/icons-material/Description'; -import FolderIcon from '@mui/icons-material/FolderOpen'; - -import List from "@mui/material/List"; -import ListItem from "@mui/material/ListItem"; -import Typography from "@mui/material/Typography"; -import ListItemIcon from "@mui/material/ListItemIcon"; -import ListItemText from "@mui/material/ListItemText"; -import ListItemButton from "@mui/material/ListItemButton"; - -const CoverageFiles = ({files, fileIcon, onClick}) => { - return ( - <> - - Test set summary - - - {files.map(file=> - - onClick(file)}> - {fileIcon ? : } - - - )} - - - ) -} - -export default CoverageFiles \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table-file.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table-file.js index 464cc056..fc475cd0 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table-file.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table-file.js @@ -12,7 +12,7 @@ import TableHead from '@mui/material/TableHead'; import CheckIcon from "@mui/icons-material/Check"; import CloseIcon from "@mui/icons-material/Close"; import Typography from '@mui/material/Typography'; -import validationColor from '../mapping-package/state/validation-color'; +import {getValidationColor} from '../mapping-package/state/utils'; import {ResultChip} from "./utils"; import {Scrollbar} from 'src/components/scrollbar'; @@ -171,7 +171,7 @@ export const ListTableFile = (props) => { - {capitalize(item.result)} diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js index 075a7958..35fe5704 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js @@ -19,8 +19,8 @@ import Typography from '@mui/material/Typography'; import DialogTitle from "@mui/material/DialogTitle"; import DialogContent from "@mui/material/DialogContent"; import DialogActions from "@mui/material/DialogActions"; -import validationColor from '../mapping-package/state/validation-color'; import {ValueChip} from '../xpath-validation-report/utils'; +import {getValidationColor} from '../mapping-package/state/utils'; import {ResultChip} from "./utils"; import {useDialog} from "src/hooks/use-dialog"; @@ -44,7 +44,7 @@ const ResultCell = ({item, onClick}) => { - onClick({title, notices: value.test_datas})} diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/query-result-table.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/query-result-table.js deleted file mode 100644 index 1de8e602..00000000 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/query-result-table.js +++ /dev/null @@ -1,83 +0,0 @@ -import {useState} from "react"; - -import Chip from "@mui/material/Chip"; -import Table from '@mui/material/Table'; -import TableRow from '@mui/material/TableRow'; -import TableBody from '@mui/material/TableBody'; -import TableCell from '@mui/material/TableCell'; -import TableHead from '@mui/material/TableHead'; - -import {Scrollbar} from 'src/components/scrollbar'; -import {resultColor, SorterHeader, sortItems} from "./utils"; - -export const QueryResultTable = ({items}) => { - const[sort,setSort] = useState({column:"", direction: "desc"}) - - const handleSort = (column) => { - setSort(prevState=> ({ column, - direction: prevState.column === column && prevState.direction === "asc" ? "desc" : "asc" })) - } - - const itemsReduce = items.reduce((acc, item) => { - acc[item.result] = (acc[item.result] ?? 0) + 1 - return acc - },{valid:0, unverifiable:0, warning:0, invalid:0, error:0, unknown:0}) - - const itemsDisplay = Object.entries(itemsReduce)?.map(item => { - const [itemName, itemCount] = item - return {itemName, itemCount, itemPercent: (itemCount/items.length) * 100 ?? 0 } - }) - - const sortedItems = sortItems(itemsDisplay, sort) - - return ( - - - - - - - - - - - - - - - - - {sortedItems?.map((item, key) => { - return ( - - - - - - {item.itemCount} - - - {`${item.itemPercent.toFixed(2)}%`} - - - - ); - })} - -
    -
    - ); -}; \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js index a5f77aef..eee0233f 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-coverage.js @@ -4,7 +4,7 @@ import Typography from '@mui/material/Typography'; import ExportButton from '../mapping-package/state/export-button'; import {StatePieChartBig} from '../mapping-package/state/state-pie-chart'; -import getValidationColor from '../mapping-package/state/validation-color'; +import {getValidationColor, getValidationReportSparql} from '../mapping-package/state/utils'; const Pie = ({data, handleExport}) => { return ( @@ -31,15 +31,7 @@ export const ResultSummaryCoverage = ({validationReport, handleExport}) => { if (!validationReport) return null - const {itemsTotal, ...itemsReduce} = - validationReport.map(item => item.result).reduce((acc, report) => { - Object.keys(report).forEach(reportKey => { - acc[reportKey] = (acc[reportKey] ?? 0) + report[reportKey].count - acc["itemsTotal"] = (acc["itemsTotal"] ?? 0) + report[reportKey].count - } - ) - return acc - }, {valid: 0, unverifiable: 0, warning: 0, invalid: 0, error: 0, unknown: 0}) + const {itemsTotal, ...itemsReduce} = getValidationReportSparql(validationReport) const itemsDisplay = Object.entries(itemsReduce)?.map(item => { const [itemName, itemCount] = item diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-table.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-table.js deleted file mode 100644 index 443bbcac..00000000 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/result-summary-table.js +++ /dev/null @@ -1,93 +0,0 @@ -import {useState} from "react"; - -import Table from '@mui/material/Table'; -import TableBody from '@mui/material/TableBody'; -import TableCell from '@mui/material/TableCell'; -import TableHead from '@mui/material/TableHead'; -import TableRow from '@mui/material/TableRow'; -import Chip from "@mui/material/Chip"; - -import {Scrollbar} from 'src/components/scrollbar'; -import {resultColor, SorterHeader, sortItems} from "./utils"; - -const ResultSummaryTable = ({items}) => { - const[sort,setSort] = useState({column:"", direction:"desc"}) - - const handleSort = (column) => { - setSort(prevState=> ({ column, - direction: prevState.column === column && prevState.direction === "asc" ? "desc" : "asc" })) - } - - const {itemsTotal, ...itemsReduce} = - items.map(item => item.result).reduce((acc, report) => { - Object.keys(report).forEach(reportKey => { - acc[reportKey] = (acc[reportKey] ?? 0) + report[reportKey].count - acc["itemsTotal"] = (acc["itemsTotal"] ?? 0) + report[reportKey].count - } - ) - return acc - },{valid:0,unverifiable:0,warning:0,invalid:0,error:0,unknown:0}) - - const itemsDisplay = Object.entries(itemsReduce)?.map(item => { - const [itemName, itemCount] = item - return {itemName, itemCount, itemPercent: (itemCount/itemsTotal) * 100 ?? 0 } - }) - - const sortedItems = sortItems(itemsDisplay, sort) - - return ( - - - - - - - - - - - - - - - - - {sortedItems?.map((item, key) => { - return ( - - - - - - {item.itemCount} - - - {`${item.itemPercent.toFixed(2)}%`} - - - - ); - })} - -
    -
    - ); -}; - -export default ResultSummaryTable diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js index 46595441..0c1f2397 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js @@ -4,6 +4,7 @@ import Stack from '@mui/material/Stack'; import Paper from '@mui/material/Paper'; import Grid from '@mui/material/Unstable_Grid2'; import Typography from '@mui/material/Typography'; +import {mapSparqlResults} from '../mapping-package/state/utils'; import {ListTableFile} from "./list-table-file"; import {ResultFilter, TableLoadWrapper} from "./utils"; @@ -34,30 +35,9 @@ const SparqlFileReport = ({sid, suiteId, testId, handleExport}) => { }) } - const mapSparqlResults = (result) => result.map(e => { - const queryAsArray = e.query.content.split("\n") - const values = queryAsArray.slice(0, 3) - const resultArray = {} - values.forEach(e => { - const res = e.split(": ") - resultArray[res[0].substring(1)] = res[1] - } - ) - resultArray["query"] = queryAsArray.slice(4, queryAsArray.length).join("\n") - resultArray["query_result"] = e.query_result - resultArray["fields_covered"] = e.fields_covered - resultArray["result"] = e.result - resultArray["meets_xpath_condition"] = e.meets_xpath_condition - resultArray["xpath_condition"] = e.query?.cm_rule?.xpath_condition - return resultArray; - }) - const itemsSearch = useItemsSearch(validationReport, sectionApi, [], {result: ''}); - const handleResultFilterChange = e => itemsSearch.handleFiltersChange({result: e.target.value}) - console.log(itemsSearch.state.filters) - return ( <> { - const [dataState, setDataState] = useState({load: false, error: false}) const [resultFilter, setResultFilter] = useState('') const filteredItems = validationReport.filter((item) => { @@ -35,33 +34,29 @@ const SparqlValidationReport = ({handleSelectFile, validationReport, handleExpor - - - Assertions - - - - + + Assertions + + + ) diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js index 36376b52..bb141500 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js @@ -1,20 +1,19 @@ -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; import {useEffect, useState} from "react"; import Paper from '@mui/material/Paper'; +import Stack from '@mui/material/Stack'; import Grid from '@mui/material/Unstable_Grid2'; +import Typography from '@mui/material/Typography'; import {ListTable} from "./list-table"; import {ResultFilter, TableLoadWrapper} from "./utils"; import useItemsSearch from "src/hooks/use-items-search"; +import {mapSparqlResults} from '../mapping-package/state/utils'; import {ResultSummaryCoverage} from './result-summary-coverage'; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; -const FILTER_VALUES = [{value: "validCount:", label: "valid"}, - {value: "unverifiableCount", label: "unverifiable"}, - {value: "warningCount", label: "warning"}, {value: "invalidCount", label: "invalid"}, - {value: "errorCount", label: "error"}, {value: "unknownCount", label: "unknown"}] +const FILTER_VALUES = ["valid", "unverifiable", "warning", "invalid", "error", "unknown"] + .map(value => ({value: value + 'Count', label: value})) const SparqlTestDatasetReport = ({sid, suiteId, handleSelectFile, handleExport}) => { const [validationReport, setValidationReport] = useState([]) @@ -44,27 +43,6 @@ const SparqlTestDatasetReport = ({sid, suiteId, handleSelectFile, handleExport}) }) } - const mapSparqlResults = (result) => result.map(e => { - const queryAsArray = e.query.content.split("\n") - const values = queryAsArray.slice(0, 3) - const resultArray = {} - values.forEach(e => { - const res = e.split(": ") - resultArray[res[0].substring(1)] = res[1] - } - ) - resultArray["query"] = queryAsArray.slice(4, queryAsArray.length).join("\n") - resultArray["test_suite"] = e.query.filename - resultArray["result"] = e.result - Object.entries(e.result).forEach(entrie => { - const [key, value] = entrie - resultArray[`${key}Count`] = value.count - }) - resultArray["meets_xpath_condition"] = e.meets_xpath_condition - resultArray["xpath_condition"] = e.query?.cm_rule?.xpath_condition - return resultArray; - }) - const itemsSearch = useItemsSearch(filteredItems, sectionApi); return ( diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/utils.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/utils.js index 7f267bef..7f5cd789 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/utils.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/utils.js @@ -2,32 +2,15 @@ import {Box} from "@mui/system"; import Stack from "@mui/material/Stack"; import Radio from "@mui/material/Radio"; import Alert from "@mui/material/Alert"; -import Tooltip from "@mui/material/Tooltip"; import Skeleton from "@mui/material/Skeleton"; import Typography from "@mui/material/Typography"; import RadioGroup from "@mui/material/RadioGroup"; import FormControl from '@mui/material/FormControl'; -import TableSortLabel from "@mui/material/TableSortLabel"; import FormControlLabel from "@mui/material/FormControlLabel"; -import validationColor from '../mapping-package/state/validation-color'; +import {getValidationColor} from '../mapping-package/state/utils'; export const capitalize = (value) => `${value[0].toUpperCase()}${value.slice(1)}` -export const resultColor = (result) => { - switch (result.toLowerCase()) { - case "error": - case "invalid": - return "error" - case "warning": - return "warning" - case "unverifiable": - case "valid": - return "success" - default: - return "info" - } -} - export const ResultChip = ({label, color, fontColor, onClick, clickable, children}) => { const hover = onClick ?? clickable ? {'&:hover': {filter: 'brightness(85%)'}, cursor: 'pointer'} : {} return ( @@ -51,7 +34,7 @@ export const ResultFilter = ({currentState, onStateChange, values}) => { - @@ -83,38 +66,6 @@ export const ResultFilter = ({currentState, onStateChange, values}) => { ) } -export const SorterHeader = ({fieldName, title, sort, onSort}) => { - return - onSort(fieldName)}> - {title ?? fieldName} - - -} - -export const sortItems = (items, sort) => { - const sortColumn = sort.column - if (!sortColumn) { - return items - } else { - return items.sort((a, b) => { - if (typeof a[sortColumn] === "string") - return sort.direction === "asc" ? - a[sortColumn]?.localeCompare(b[sortColumn]) : - b[sortColumn]?.localeCompare(a[sortColumn]) - else - return sort.direction === "asc" ? - a[sortColumn] - b[sortColumn] : - b[sortColumn] - a[sortColumn] - }) - } -} - - export const TableSkeleton = ({lines = 5}) => { return new Array(lines).fill("").map((e, i) => { @@ -128,7 +128,7 @@ export const ListTable = (props) => { customStyle={{ borderRadius: 12, border: '1px solid', - borderColor: validationColor(xpath_condition.meets_xpath_condition ? + borderColor: getValidationColor(xpath_condition.meets_xpath_condition ? 'valid' : 'invalid') }} lineProps={{ diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table.js index cede7d90..040fdf34 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table.js @@ -24,7 +24,7 @@ import {useHighlighterTheme} from "src/hooks/use-highlighter-theme"; import TableSorterHeader from "src/sections/components/table-sorter-header"; import TablePagination from "src/sections/components/table-pagination-pages"; import {TableFilterHeader} from "src/layouts/app/table-filter-header/table-filter-header"; -import validationColor from '../mapping-package/state/validation-color'; +import {getValidationColor} from '../mapping-package/state/utils'; import {ValueChip} from './utils'; export const ListTable = (props) => { @@ -157,7 +157,7 @@ export const ListTable = (props) => { customStyle={{ borderRadius: 12, border: '1px solid', - borderColor: validationColor(xpath_condition.meets_xpath_condition ? + borderColor: getValidationColor(xpath_condition.meets_xpath_condition ? 'valid' : 'invalid') }} lineProps={{ diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js index 1f2707c7..bf322ea1 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/xpath_validation_report_package_state.js @@ -17,7 +17,6 @@ const XpathValidationReport = ({validationReport, handleSelectFile, mappingSuite {label: 'Covered', value: true, color: 'info', count: validationReport.filter(e => e.is_covered).length}, {label: 'Uncovered', value: false, color: 'warning', count: validationReport.filter(e => !e.is_covered).length}] - const [dataState, setDataState] = useState({load: false, error: false}) const itemsSearch = useItemsSearch(validationReport, sectionApi, [], {is_covered: ''}) @@ -33,32 +32,29 @@ const XpathValidationReport = ({validationReport, handleSelectFile, mappingSuite - - - Assertions - - - - + + Assertions + + + From 28023739184efd368bf88867051cd92009a59e82 Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Fri, 24 Jan 2025 18:17:18 +0200 Subject: [PATCH 43/51] MWB-952: more code fixes --- .../app/mapping-package/state/utils.js | 111 +++++++++++++++++- .../shacl-validation-report/result-table.js | 1 - .../shacl_validation_report_file.js | 9 +- .../shacl_validation_report_package_state.js | 55 +++++---- .../shacl_validation_report_test_dataset.js | 13 +- .../shacl_validation_report_view.js | 32 ++--- .../app/shacl-validation-report/utils.js | 18 +-- .../list-table-file.js | 73 ++++++------ .../sparql-validation-report/list-table.js | 4 +- .../sparql_validation_report_file.js | 9 +- .../sparql_validation_report_package_state.js | 16 ++- .../sparql_validation_report_test_dataset.js | 5 +- .../sparql_validation_report_view.js | 32 ++--- .../app/sparql-validation-report/utils.js | 54 ++------- .../xpath_validation_report_view.js | 31 ++--- 15 files changed, 236 insertions(+), 227 deletions(-) diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/utils.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/utils.js index 82a3eb7a..dc67a346 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/utils.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/utils.js @@ -1,3 +1,14 @@ +import FormControl from '@mui/material/FormControl'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Radio from '@mui/material/Radio'; +import RadioGroup from '@mui/material/RadioGroup'; +import Stack from '@mui/material/Stack'; +import Typography from '@mui/material/Typography'; +import {Box} from '@mui/system'; +import {useState} from 'react'; +import {capitalize, ResultChip} from '../../sparql-validation-report/utils'; +import {ValueChip} from '../../xpath-validation-report/utils'; + export const getValidationColor = (color) => { switch (color) { case 'valid': @@ -17,6 +28,22 @@ export const getValidationColor = (color) => { } } +export const getResultColor = (result) => { + switch (result.toLowerCase()) { + case "error": + case "invalid": + case "violation": + return "error" + case "warning": + return "warning" + case "unverifiable": + case "valid": + return "success" + default: + return "info" + } +} + export const getItemsDisplay = (items, total) => Object.entries(items)?.map(item => { const [itemName, itemCount] = item const percent = (itemCount / total) * 100 ?? 0 @@ -84,4 +111,86 @@ export const mapSparqlResults = (result) => result.map(e => { resultArray["meets_xpath_condition"] = e.meets_xpath_condition resultArray["xpath_condition"] = e.query?.cm_rule?.xpath_condition return resultArray; -}) \ No newline at end of file +}) + + +export const ResultFilter = ({currentState, onStateChange, values, count}) => { + + const FilterValue = ({label, value, currentState, count}) => { + return ( + } + checked={currentState === (value ?? label.toLowerCase())} + label={( + + + + + {!!count && {count}} + + + + + )} + value={value ?? label.toLowerCase()} + />) + } + + return ( + + + + {values.map(value => + )} + + + ) +} + +export const useFileNavigation = (reportTree) => { + const [selectedPackageState, setSelectedPackageState] = useState() + const [selectedTestDataset, setSelectedTestDataset] = useState() + + const handleSetPackageState = (file) => { + setSelectedPackageState(file) + setSelectedTestDataset(undefined) + } + + const handleSetTestDataset = (file) => { + setSelectedTestDataset(file) + } + + const handleSetTestAndPackage = (testDataSuite, testData) => { + const packageState = reportTree.test_data_suites.find(tds => tds.oid === testDataSuite) + setSelectedPackageState(packageState) + if (testData) { + setSelectedTestDataset(packageState?.test_data_states.find(ps => ps.oid === testData)); + } else { + setSelectedTestDataset(undefined) + } + } + + return { + selectedPackageState, + selectedTestDataset, + handleSetPackageState, + handleSetTestDataset, + handleSetTestAndPackage + } +} \ No newline at end of file diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-table.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-table.js index d02ca8ea..fd975728 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-table.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/result-table.js @@ -1,4 +1,3 @@ - import {useState} from "react"; import Table from '@mui/material/Table'; diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_file.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_file.js index 8b46c61f..bdb859ba 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_file.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_file.js @@ -33,11 +33,10 @@ const ShaclFileReport = ({sid, suiteId, testId}) => { }) } - const mapShaclFileStates = (states) => { - return states?.results.map(e => ({ - conforms: e.conforms, error: e.error, title: states.shacl_suite.shacl_suite_id - })) - } + const mapShaclFileStates = (states) => states?.results.map(e => ({ + conforms: e.conforms, error: e.error, title: states.shacl_suite.shacl_suite_id + })) + const mapShaclFileResults = (result) => result?.map(e => ({...e.binding})) diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js index e57a95de..a0fb3de5 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js @@ -4,21 +4,19 @@ import Stack from '@mui/material/Stack'; import Paper from '@mui/material/Paper'; import Grid from '@mui/material/Unstable_Grid2'; import Typography from '@mui/material/Typography'; +import {ResultFilter} from '../mapping-package/state/utils'; import {ListTable} from "./list-table"; import useItemsSearch from "src/hooks/use-items-search"; -import {ResultFilter} from '../sparql-validation-report/utils'; import {ResultSummaryCoverage} from './result-summary-coverage'; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; const FILTER_VALUES = ['info', 'valid', 'violation', 'warning'].map(value => ({value: value + 'Count', label: value})) const ShaclPackageStateReport = ({handleSelectFile, mappingSuiteIdentifier, validationReport, handleExport}) => { - const [resultFilter, setResultFilter] = useState('') - const filteredItems = validationReport.filter((item) => { - return !resultFilter || item.result[resultFilter]?.count > 0 - }) + + const filteredItems = validationReport.filter((item) => !resultFilter || item.result[resultFilter]?.count > 0) const handleResultFilterChange = e => setResultFilter(e.target.value) @@ -34,29 +32,30 @@ const ShaclPackageStateReport = ({handleSelectFile, mappingSuiteIdentifier, vali - - Assertions - - - + + Assertions + + + diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_test_dataset.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_test_dataset.js index ca81397e..40d1110d 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_test_dataset.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_test_dataset.js @@ -1,16 +1,15 @@ -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; import {useEffect, useState} from "react"; import Paper from '@mui/material/Paper'; +import Stack from '@mui/material/Stack'; import Grid from '@mui/material/Unstable_Grid2'; -import {mapShaclResults} from '../mapping-package/state/utils'; -import {ResultFilter} from '../sparql-validation-report/utils'; +import Typography from '@mui/material/Typography'; import {ListTable} from "./list-table"; import {TableLoadWrapper} from "./utils"; -import {ResultSummaryCoverage} from './result-summary-coverage'; import useItemsSearch from "src/hooks/use-items-search"; +import {ResultSummaryCoverage} from './result-summary-coverage'; +import {mapShaclResults, ResultFilter} from '../mapping-package/state/utils'; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; const FILTER_VALUES = ['info', 'valid', 'violation', 'warning'].map(value => ({value: value + 'Count', label: value})) @@ -18,19 +17,18 @@ const FILTER_VALUES = ['info', 'valid', 'violation', 'warning'].map(value => ({v const ShaclTestDatasetReport = ({sid, suiteId, handleSelectFile, handleExport}) => { const [validationReport, setValidationReport] = useState([]) const [dataState, setDataState] = useState({load: true, error: false}) + const [resultFilter, setResultFilter] = useState('') useEffect(() => { handleValidationReportsGet(sid, suiteId) }, [suiteId]) - const [resultFilter, setResultFilter] = useState('') const filteredItems = validationReport.filter((item) => { return !resultFilter || item.result[resultFilter]?.count > 0 }) const handleResultFilterChange = e => setResultFilter(e.target.value) - const handleValidationReportsGet = (sid, suiteId) => { setDataState({load: true, error: false}) sectionApi.getShaclReportsSuite(sid, suiteId) @@ -63,6 +61,7 @@ const ShaclTestDatasetReport = ({sid, suiteId, handleSelectFile, handleExport}) sx={{mx: 3}}> Assertions
    diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_view.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_view.js index 962406bf..0ed994b1 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_view.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_view.js @@ -1,36 +1,20 @@ -import {useState} from "react"; - import Grid from '@mui/material/Unstable_Grid2'; import FileList from '../mapping-package/state/file-list'; - +import {useFileNavigation} from '../mapping-package/state/utils'; import ShaclFileReport from "./shacl_validation_report_file"; import ShaclTestDatasetReport from "./shacl_validation_report_test_dataset"; import ShaclPackageStateReport from "./shacl_validation_report_package_state"; const ShaclValidationReportView = ({sid, reportTree, validationReport, handleExport}) => { - const [selectedPackageState, setSelectedPackageState] = useState() - const [selectedTestDataset, setSelectedTestDataset] = useState() - - const handleSetPackageState = (file) => { - setSelectedPackageState(file) - setSelectedTestDataset(undefined) - } - - const handleSetTestDataset = (file) => { - setSelectedTestDataset(file) - } - - const handleSetTestAndPackage = (testDataSuite, testData) => { - const packageState = reportTree.test_data_suites.find(tds => tds.oid === testDataSuite) - setSelectedPackageState(packageState) - if (testData) { - setSelectedTestDataset(packageState?.test_data_states.find(ps => ps.oid === testData)); - } else { - setSelectedTestDataset(undefined) - } - } + const { + selectedPackageState, + selectedTestDataset, + handleSetPackageState, + handleSetTestDataset, + handleSetTestAndPackage + } = useFileNavigation(reportTree) return ( diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/utils.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/utils.js index a2b437a2..3d6c475e 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/utils.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/utils.js @@ -4,28 +4,14 @@ import Alert from "@mui/material/Alert"; import Tooltip from "@mui/material/Tooltip"; import Skeleton from "@mui/material/Skeleton"; import TableSortLabel from "@mui/material/TableSortLabel"; +import {getResultColor} from '../mapping-package/state/utils'; -export const resultColor = (result) => { - switch (result.toLowerCase()) { - case "error": - case "invalid": - case "violation": - return "error" - case "warning": - return "warning" - case "unverifiable": - case "valid": - return "success" - default: - return "info" - } -} export const ResultChip = ({label, color, clickable, onClick}) => { return ( ) diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table-file.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table-file.js index fc475cd0..208a3030 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table-file.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table-file.js @@ -1,7 +1,8 @@ -import {capitalize} from '@mui/material'; +import PropTypes from "prop-types"; import {Prism as SyntaxHighlighter} from 'react-syntax-highlighter'; import {Box} from "@mui/system"; +import {capitalize} from '@mui/material'; import Table from '@mui/material/Table'; import Stack from "@mui/material/Stack"; import Divider from "@mui/material/Divider"; @@ -12,16 +13,14 @@ import TableHead from '@mui/material/TableHead'; import CheckIcon from "@mui/icons-material/Check"; import CloseIcon from "@mui/icons-material/Close"; import Typography from '@mui/material/Typography'; -import {getValidationColor} from '../mapping-package/state/utils'; import {ResultChip} from "./utils"; import {Scrollbar} from 'src/components/scrollbar'; -import TablePagination from "src/sections/components/table-pagination-pages"; +import {getValidationColor} from '../mapping-package/state/utils'; +import {useHighlighterTheme} from "src/hooks/use-highlighter-theme" import TableSorterHeader from "src/sections/components/table-sorter-header"; - -import PropTypes from "prop-types"; -import {useHighlighterTheme} from "../../../hooks/use-highlighter-theme"; -import {TableFilterHeader} from "../../../layouts/app/table-filter-header/table-filter-header"; +import TablePagination from "src/sections/components/table-pagination-pages"; +import {TableFilterHeader} from "src/layouts/app/table-filter-header/table-filter-header"; const Condition = ({text, value}) => { const color = value ? 'green' : 'red' @@ -113,38 +112,40 @@ export const ListTableFile = (props) => { {item?.xpath_condition?.xpath_condition && - <> + <> - - {item?.xpath_condition?.xpath_condition || '-'} - - {item?.meets_xpath_condition ? - : - } + + + {item?.xpath_condition?.xpath_condition || '-'} + + {item?.meets_xpath_condition ? + : + } + - - + + } diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js index 35fe5704..90b03dd9 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js @@ -19,12 +19,12 @@ import Typography from '@mui/material/Typography'; import DialogTitle from "@mui/material/DialogTitle"; import DialogContent from "@mui/material/DialogContent"; import DialogActions from "@mui/material/DialogActions"; -import {ValueChip} from '../xpath-validation-report/utils'; -import {getValidationColor} from '../mapping-package/state/utils'; import {ResultChip} from "./utils"; import {useDialog} from "src/hooks/use-dialog"; import {Scrollbar} from 'src/components/scrollbar'; +import {ValueChip} from '../xpath-validation-report/utils'; +import {getValidationColor} from '../mapping-package/state/utils'; import {useHighlighterTheme} from "src/hooks/use-highlighter-theme"; import TablePagination from "src/sections/components/table-pagination-pages"; import {TableFilterHeader} from "src/layouts/app/table-filter-header/table-filter-header"; diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js index 0c1f2397..1a614c80 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_file.js @@ -4,15 +4,15 @@ import Stack from '@mui/material/Stack'; import Paper from '@mui/material/Paper'; import Grid from '@mui/material/Unstable_Grid2'; import Typography from '@mui/material/Typography'; -import {mapSparqlResults} from '../mapping-package/state/utils'; - import {ListTableFile} from "./list-table-file"; -import {ResultFilter, TableLoadWrapper} from "./utils"; + +import {TableLoadWrapper} from "./utils"; import useItemsSearch from "src/hooks/use-items-search"; import {ResultSummaryQuery} from './result-summary-coverage'; +import {mapSparqlResults, ResultFilter} from '../mapping-package/state/utils'; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; -const FILTER_VALUES = ["valid", "unverifiable", "warning", "invalid", "error", "unknown"].map(e => ({value: e})) +const FILTER_VALUES = ["valid", "unverifiable", "warning", "invalid", "error", "unknown"].map(value => ({value})) const SparqlFileReport = ({sid, suiteId, testId, handleExport}) => { const [validationReport, setValidationReport] = useState([]) @@ -55,6 +55,7 @@ const SparqlFileReport = ({sid, suiteId, testId, handleExport}) => { sx={{mx: 3}}> Assertions
    diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js index d76af617..50702ea9 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js @@ -1,26 +1,23 @@ -import Stack from '@mui/material/Stack'; -import Typography from '@mui/material/Typography'; import {useState} from "react"; +import Stack from '@mui/material/Stack'; import Paper from '@mui/material/Paper'; +import Typography from '@mui/material/Typography'; import Grid from '@mui/material/Unstable_Grid2'; import {ListTable} from "./list-table"; -import {ResultFilter} from "./utils"; +import {ResultFilter} from '../mapping-package/state/utils'; import useItemsSearch from "src/hooks/use-items-search"; import {ResultSummaryCoverage} from './result-summary-coverage'; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; -const FILTER_VALUES = [{value: "validCount:", label: "valid"}, {value: "unverifiableCount", label: "unverifiable"}, - {value: "warningCount", label: "warning"}, {value: "invalidCount", label: "invalid"}, - {value: "errorCount", label: "error"}, {value: "unknownCount", label: "unknown"}] +const FILTER_VALUES = ["valid", "unverifiable", "warning", "invalid", "error", "unknown"] + .map(value => ({value: value + 'Count', label: value})) const SparqlValidationReport = ({handleSelectFile, validationReport, handleExport}) => { const [resultFilter, setResultFilter] = useState('') - const filteredItems = validationReport.filter((item) => { - return !resultFilter || item.result[resultFilter]?.count > 0 - }) + const filteredItems = validationReport.filter((item) => !resultFilter || item.result[resultFilter]?.count > 0) const itemsSearch = useItemsSearch(filteredItems, sectionApi, [], {result: ''}); const handleResultFilterChange = e => setResultFilter(e.target.value) @@ -40,6 +37,7 @@ const SparqlValidationReport = ({handleSelectFile, validationReport, handleExpor sx={{mx: 3}}> Assertions
    diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js index bb141500..b8a8a792 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js @@ -6,10 +6,10 @@ import Grid from '@mui/material/Unstable_Grid2'; import Typography from '@mui/material/Typography'; import {ListTable} from "./list-table"; -import {ResultFilter, TableLoadWrapper} from "./utils"; +import {TableLoadWrapper} from "./utils"; import useItemsSearch from "src/hooks/use-items-search"; -import {mapSparqlResults} from '../mapping-package/state/utils'; import {ResultSummaryCoverage} from './result-summary-coverage'; +import {mapSparqlResults, ResultFilter} from '../mapping-package/state/utils'; import {mappingPackageStatesApi as sectionApi} from "src/api/mapping-packages/states"; const FILTER_VALUES = ["valid", "unverifiable", "warning", "invalid", "error", "unknown"] @@ -63,6 +63,7 @@ const SparqlTestDatasetReport = ({sid, suiteId, handleSelectFile, handleExport}) sx={{mx: 3}}> Assertions diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_view.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_view.js index 42e355a5..602123b7 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_view.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_view.js @@ -1,8 +1,7 @@ -import {useState} from "react"; - import Grid from '@mui/material/Unstable_Grid2'; import FileList from '../mapping-package/state/file-list'; +import {useFileNavigation} from '../mapping-package/state/utils'; import SparqlFileReport from "./sparql_validation_report_file"; import SparqlTestDatasetReport from "./sparql_validation_report_test_dataset"; import SparqlPackageStateReport from "./sparql_validation_report_package_state"; @@ -10,28 +9,13 @@ import SparqlPackageStateReport from "./sparql_validation_report_package_state"; const SparqlValidationReportView = ({sid, reportTree, validationReport, handleExport}) => { - - const [selectedPackageState, setSelectedPackageState] = useState() - const [selectedTestDataset, setSelectedTestDataset] = useState() - - const handleSetPackageState = (file) => { - setSelectedPackageState(file) - setSelectedTestDataset(undefined) - } - - const handleSetTestDataset = (file) => { - setSelectedTestDataset(file) - } - - const handleSetTestAndPackage = (testDataSuite, testData) => { - const packageState = reportTree.test_data_suites.find(tds => tds.oid === testDataSuite) - setSelectedPackageState(packageState) - if (testData) { - setSelectedTestDataset(packageState?.test_data_states.find(ps => ps.oid === testData)); - } else { - setSelectedTestDataset(undefined); - } - } + const { + selectedPackageState, + selectedTestDataset, + handleSetPackageState, + handleSetTestDataset, + handleSetTestAndPackage + } = useFileNavigation(reportTree) return ( `${value[0].toUpperCase()}${value.slice(1)}` export const ResultChip = ({label, color, fontColor, onClick, clickable, children}) => { const hover = onClick ?? clickable ? {'&:hover': {filter: 'brightness(85%)'}, cursor: 'pointer'} : {} return ( - {label ?? children} @@ -22,50 +30,6 @@ export const ResultChip = ({label, color, fontColor, onClick, clickable, childre ) } -export const ResultFilter = ({currentState, onStateChange, values}) => { - - const FilterValue = ({label, value, currentState}) => { - return ( - } - checked={currentState === (value ?? label.toLowerCase())} - label={( - - - - - - - )} - value={value ?? label.toLowerCase()} - />) - } - - return ( - - - - {values.map(value => - )} - - - ) -} - export const TableSkeleton = ({lines = 5}) => { return new Array(lines).fill("").map((e, i) => { - const [selectedPackageState, setSelectedPackageState] = useState() - const [selectedTestDataset, setSelectedTestDataset] = useState() - - const handleSetPackageState = (file) => { - setSelectedPackageState(file) - setSelectedTestDataset(undefined) - } - - const handleSetTestDataset = (file) => { - setSelectedTestDataset(file) - } - - const handleSetTestAndPackage = (testDataSuite, testData) => { - const packageState = reportTree.test_data_suites.find(tds => tds.oid === testDataSuite) - setSelectedPackageState(packageState) - if (testData) { - setSelectedTestDataset(packageState?.test_data_states.find(ps => ps.oid === testData)); - } else { - setSelectedTestDataset(undefined) - } - } + const { + selectedPackageState, + selectedTestDataset, + handleSetPackageState, + handleSetTestDataset, + handleSetTestAndPackage + } = useFileNavigation(reportTree) return ( Date: Fri, 24 Jan 2025 18:40:06 +0200 Subject: [PATCH 44/51] MWB-952: add sort by notices --- .../src/sections/app/mapping-package/state/utils.js | 1 + .../app/shacl-validation-report/list-table.js | 10 +++++++++- .../shacl_validation_report_package_state.js | 2 +- .../shacl_validation_report_test_dataset.js | 6 +++--- .../app/sparql-validation-report/list-table.js | 12 +++++++++++- .../sparql_validation_report_package_state.js | 5 ++++- .../sparql_validation_report_test_dataset.js | 4 +--- 7 files changed, 30 insertions(+), 10 deletions(-) diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/utils.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/utils.js index dc67a346..e12693bf 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/utils.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/utils.js @@ -156,6 +156,7 @@ export const ResultFilter = ({currentState, onStateChange, values, count}) => { currentState={currentState}/> {values.map(value => )} diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table.js index 652be32d..2023bd55 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table.js @@ -13,6 +13,7 @@ import TableHead from '@mui/material/TableHead'; import DialogTitle from "@mui/material/DialogTitle"; import DialogContent from "@mui/material/DialogContent"; import DialogActions from "@mui/material/DialogActions"; +import SorterHeader from 'src/sections/components/table-sorter-header'; import {ResultChip} from "./utils"; import {Scrollbar} from 'src/components/scrollbar'; @@ -38,6 +39,7 @@ export const ListTable = (props) => { onSort, filters, onFilter, + resultFilter, sectionApi, handleSelectFile } = props; @@ -136,7 +138,13 @@ export const ListTable = (props) => { title="Result Path"/> - Result + {!!resultFilter ? + + : 'Result' + } diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js index a0fb3de5..c5f44bc4 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_package_state.js @@ -16,7 +16,7 @@ const FILTER_VALUES = ['info', 'valid', 'violation', 'warning'].map(value => ({v const ShaclPackageStateReport = ({handleSelectFile, mappingSuiteIdentifier, validationReport, handleExport}) => { const [resultFilter, setResultFilter] = useState('') - const filteredItems = validationReport.filter((item) => !resultFilter || item.result[resultFilter]?.count > 0) + const filteredItems = validationReport.filter((item) => !resultFilter || item[resultFilter] > 0) const handleResultFilterChange = e => setResultFilter(e.target.value) diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_test_dataset.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_test_dataset.js index 40d1110d..1e39f482 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_test_dataset.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/shacl_validation_report_test_dataset.js @@ -23,9 +23,7 @@ const ShaclTestDatasetReport = ({sid, suiteId, handleSelectFile, handleExport}) handleValidationReportsGet(sid, suiteId) }, [suiteId]) - const filteredItems = validationReport.filter((item) => { - return !resultFilter || item.result[resultFilter]?.count > 0 - }) + const filteredItems = validationReport.filter((item) => !resultFilter || item[resultFilter] > 0) const handleResultFilterChange = e => setResultFilter(e.target.value) @@ -44,6 +42,7 @@ const ShaclTestDatasetReport = ({sid, suiteId, handleSelectFile, handleExport}) const itemsSearch = useItemsSearch(filteredItems, sectionApi); + return ( <> diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js index 90b03dd9..beea48fd 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js @@ -19,6 +19,7 @@ import Typography from '@mui/material/Typography'; import DialogTitle from "@mui/material/DialogTitle"; import DialogContent from "@mui/material/DialogContent"; import DialogActions from "@mui/material/DialogActions"; +import SorterHeader from '../../components/table-sorter-header'; import {ResultChip} from "./utils"; import {useDialog} from "src/hooks/use-dialog"; @@ -72,6 +73,7 @@ export const ListTable = (props) => { onSort, filters, onFilter, + resultFilter, sectionApi, handleSelectFile } = props; @@ -100,6 +102,8 @@ export const ListTable = (props) => { const openXPathConditionDialog = (data) => xpathConditionDialog.handleOpen(data) + console.log(resultFilter,!!resultFilter) + return ( <> { title="Query"/> - Result + {!!resultFilter ? + + : 'Result' + } diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js index 50702ea9..9c89c03d 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_package_state.js @@ -17,7 +17,9 @@ const FILTER_VALUES = ["valid", "unverifiable", "warning", "invalid", "error", " const SparqlValidationReport = ({handleSelectFile, validationReport, handleExport}) => { const [resultFilter, setResultFilter] = useState('') - const filteredItems = validationReport.filter((item) => !resultFilter || item.result[resultFilter]?.count > 0) + console.log(resultFilter) + + const filteredItems = validationReport.filter((item) => !resultFilter || item[resultFilter] > 0) const itemsSearch = useItemsSearch(filteredItems, sectionApi, [], {result: ''}); const handleResultFilterChange = e => setResultFilter(e.target.value) @@ -52,6 +54,7 @@ const SparqlValidationReport = ({handleSelectFile, validationReport, handleExpor sort={itemsSearch.state.sort} onFilter={itemsSearch.handleFiltersChange} filters={itemsSearch.state.filters} + resultFilter={resultFilter} sectionApi={sectionApi} handleSelectFile={handleSelectFile} /> diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js index b8a8a792..501dbc22 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/sparql_validation_report_test_dataset.js @@ -26,9 +26,7 @@ const SparqlTestDatasetReport = ({sid, suiteId, handleSelectFile, handleExport}) const handleResultFilterChange = e => setResultFilter(e.target.value) - const filteredItems = validationReport.filter((item) => { - return !resultFilter || item.result[resultFilter]?.count > 0 - }) + const filteredItems = validationReport.filter((item) => !resultFilter || item[resultFilter] > 0) const handleValidationReportsGet = (sid, suiteId) => { setDataState({load: true, error: false}) From 8cf9bc8a1dc6298aa17d3695e6570a243bc5842e Mon Sep 17 00:00:00 2001 From: Kolea PLESCO Date: Tue, 28 Jan 2025 00:46:10 +0200 Subject: [PATCH 45/51] Fixed the CM import concurency issue --- .../adapters/eforms/importer.py | 21 +++++++------------ .../adapters/standard/importer.py | 2 -- .../app/fields-and-nodes/overview/import.js | 2 +- .../app/fields-and-nodes/overview/index.js | 2 +- .../src/pages/app/ontology-terms/index.js | 2 -- .../file-manager/file-resource-edit-form.js | 2 +- .../sections/app/mapping-package/details.js | 2 +- .../sections/app/mapping-package/edit-form.js | 2 +- .../mapping-package/state/state-details.js | 2 +- .../app/mapping-package/state/utils.js | 2 ++ .../src/sections/app/project/edit-form.js | 2 +- .../list-table-file.js | 2 +- .../sparql-validation-report/list-table.js | 2 -- 13 files changed, 18 insertions(+), 27 deletions(-) diff --git a/mapping_workbench/backend/package_importer/adapters/eforms/importer.py b/mapping_workbench/backend/package_importer/adapters/eforms/importer.py index 189f5817..8e0b380d 100644 --- a/mapping_workbench/backend/package_importer/adapters/eforms/importer.py +++ b/mapping_workbench/backend/package_importer/adapters/eforms/importer.py @@ -78,6 +78,9 @@ async def add_mapping_rules_from_mono(self, mono_package: ImportedMappingSuite): ) if not source_structural_element: + m = f"{mono_rule.eforms_sdk_id}" + mwb_logger.log_all_warning(m) + self.warnings.append(TaskResultWarning(message=m, type="Not Found SDK Elements")) continue if source_structural_element.bt_id != mono_rule.bt_id: @@ -108,19 +111,12 @@ async def add_mapping_rules_from_mono(self, mono_package: ImportedMappingSuite): ConceptualMappingRule.target_class_path == mono_rule.class_path, ConceptualMappingRule.target_property_path == mono_rule.property_path ) - if rule: - mwb_logger.log_all_info( - f"CM Rule with Ontology Fragment: {rule.target_class_path} | {rule.target_property_path} already exist") - continue - - rule = ConceptualMappingRule( - source_structural_element=StructuralElement.link_from_id(source_structural_element.id) - ) + if not rule: + rule = ConceptualMappingRule( + source_structural_element=StructuralElement.link_from_id(source_structural_element.id) + ) - # rule: ConceptualMappingRule = ConceptualMappingRule() rule.project = self.project_link - if source_structural_element: - rule.source_structural_element = source_structural_element if not rule.refers_to_mapping_package_ids: rule.refers_to_mapping_package_ids = [] @@ -155,8 +151,7 @@ async def add_mapping_rules_from_mono(self, mono_package: ImportedMappingSuite): if mono_rule.feedback_notes: rule.feedback_notes = [ConceptualMappingRuleComment(comment=mono_rule.feedback_notes)] - # await rule.on_update(self.user).save() if rule.id else \ - await rule.on_create(self.user).create() + await rule.on_update(self.user).save() if rule.id else await rule.on_create(self.user).create() sort_order += 1 diff --git a/mapping_workbench/backend/package_importer/adapters/standard/importer.py b/mapping_workbench/backend/package_importer/adapters/standard/importer.py index bf7fc1f5..5548b123 100644 --- a/mapping_workbench/backend/package_importer/adapters/standard/importer.py +++ b/mapping_workbench/backend/package_importer/adapters/standard/importer.py @@ -78,8 +78,6 @@ async def add_mapping_rules_from_mono(self, mono_package: ImportedMappingSuite): ) rule.project = self.project_link - if source_structural_element: - rule.source_structural_element = source_structural_element if not rule.refers_to_mapping_package_ids: rule.refers_to_mapping_package_ids = [] diff --git a/mapping_workbench/frontend/src/pages/app/fields-and-nodes/overview/import.js b/mapping_workbench/frontend/src/pages/app/fields-and-nodes/overview/import.js index 2b3bb87a..7636e8c5 100644 --- a/mapping_workbench/frontend/src/pages/app/fields-and-nodes/overview/import.js +++ b/mapping_workbench/frontend/src/pages/app/fields-and-nodes/overview/import.js @@ -89,7 +89,7 @@ const Page = () => {
    - + diff --git a/mapping_workbench/frontend/src/pages/app/fields-and-nodes/overview/index.js b/mapping_workbench/frontend/src/pages/app/fields-and-nodes/overview/index.js index c0a8af3c..cca1199f 100644 --- a/mapping_workbench/frontend/src/pages/app/fields-and-nodes/overview/index.js +++ b/mapping_workbench/frontend/src/pages/app/fields-and-nodes/overview/index.js @@ -125,7 +125,7 @@ const Page = () => { startIcon={} variant="contained" > - Import eForms XSD + Import eForms SDK diff --git a/mapping_workbench/frontend/src/pages/app/ontology-terms/index.js b/mapping_workbench/frontend/src/pages/app/ontology-terms/index.js index c3ac4251..cc2b8fa8 100644 --- a/mapping_workbench/frontend/src/pages/app/ontology-terms/index.js +++ b/mapping_workbench/frontend/src/pages/app/ontology-terms/index.js @@ -50,8 +50,6 @@ const Page = () => { usePageView(); - console.log(itemsSearch) - return ( <> diff --git a/mapping_workbench/frontend/src/sections/app/file-manager/file-resource-edit-form.js b/mapping_workbench/frontend/src/sections/app/file-manager/file-resource-edit-form.js index 41c1cef1..3acbe46a 100644 --- a/mapping_workbench/frontend/src/sections/app/file-manager/file-resource-edit-form.js +++ b/mapping_workbench/frontend/src/sections/app/file-manager/file-resource-edit-form.js @@ -213,7 +213,7 @@ export const FileResourceEditForm = (props) => { md={12}> - {!!extra_form_fields?.compare_items.length && } {showCompare && { diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/edit-form.js b/mapping_workbench/frontend/src/sections/app/mapping-package/edit-form.js index b521859e..58c827b0 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/edit-form.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/edit-form.js @@ -175,7 +175,7 @@ export const EditForm = (props) => { md={12}> + label="eForms SDK version"/> diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js index f8fbc40f..753bdfa4 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/state-details.js @@ -40,7 +40,7 @@ const StateDetails = ({item, sid, handleChangeTab, validationReport}) => { value={item.title}/> - diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/utils.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/utils.js index e12693bf..65b426e3 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/utils.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/utils.js @@ -109,6 +109,8 @@ export const mapSparqlResults = (result) => result.map(e => { resultArray[`${key}Count`] = value.count }) resultArray["meets_xpath_condition"] = e.meets_xpath_condition + resultArray["fields_covered"] = e?.fields_covered + resultArray["query_result"] = e?.query_result resultArray["xpath_condition"] = e.query?.cm_rule?.xpath_condition return resultArray; }) diff --git a/mapping_workbench/frontend/src/sections/app/project/edit-form.js b/mapping_workbench/frontend/src/sections/app/project/edit-form.js index 26252b8c..671e5f52 100644 --- a/mapping_workbench/frontend/src/sections/app/project/edit-form.js +++ b/mapping_workbench/frontend/src/sections/app/project/edit-form.js @@ -402,7 +402,7 @@ export const EditForm = (props) => { onChange={formik.handleChange} name="import_eform.checked"/> } - label={Import eForms XSD} + label={Import eForms SDK} /> {formik.values.import_eform.checked && diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table-file.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table-file.js index 208a3030..e8f24bbe 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table-file.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table-file.js @@ -183,7 +183,7 @@ export const ListTableFile = (props) => { value={item.fields_covered}/> + value={item?.meets_xpath_condition}/> diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js index beea48fd..09ea22fb 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js @@ -102,8 +102,6 @@ export const ListTable = (props) => { const openXPathConditionDialog = (data) => xpathConditionDialog.handleOpen(data) - console.log(resultFilter,!!resultFilter) - return ( <> Date: Tue, 28 Jan 2025 09:33:14 +0200 Subject: [PATCH 46/51] Fixed the CM import concurency issue --- .../src/sections/app/file-manager/file-resource-edit-form.js | 3 ++- .../app/mapping-package/state/result-summary-coverage-shacl.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/mapping_workbench/frontend/src/sections/app/file-manager/file-resource-edit-form.js b/mapping_workbench/frontend/src/sections/app/file-manager/file-resource-edit-form.js index 3acbe46a..50829481 100644 --- a/mapping_workbench/frontend/src/sections/app/file-manager/file-resource-edit-form.js +++ b/mapping_workbench/frontend/src/sections/app/file-manager/file-resource-edit-form.js @@ -214,7 +214,7 @@ export const FileResourceEditForm = (props) => { {!!extra_form_fields?.compare_items?.length && } + onClick={() => setShowCompare(e => !e)}>{showCompare ? 'Hide Compare' : 'Show Compare'}} {showCompare && { onChange={handleCompareChange} select value={formik.values.compare_item} + sx={{minWidth: 200}} > {extra_form_fields?.compare_items.map((compare_item) => ( { Result summary Coverage (SHALC) + fontWeight='bold'>Coverage (SHACL) diff --git a/mapping_workbench/frontend/src/sections/app/project/edit-form.js b/mapping_workbench/frontend/src/sections/app/project/edit-form.js index 671e5f52..8a80c01f 100644 --- a/mapping_workbench/frontend/src/sections/app/project/edit-form.js +++ b/mapping_workbench/frontend/src/sections/app/project/edit-form.js @@ -402,7 +402,7 @@ export const EditForm = (props) => { onChange={formik.handleChange} name="import_eform.checked"/> } - label={Import eForms SDK} + label={Import eForms XSD} /> {formik.values.import_eform.checked && @@ -411,7 +411,7 @@ export const EditForm = (props) => { md={12}> From fc29a8e6128ce1a9826ca220766457be130b6583 Mon Sep 17 00:00:00 2001 From: Kolea PLESCO Date: Tue, 28 Jan 2025 10:33:49 +0200 Subject: [PATCH 48/51] Updated Sonar github action --- .github/workflows/unit-tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 93d1f97b..a8a73f2e 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -36,6 +36,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + SONAR_SCANNER_OPTS: -Dsonar.working.directory=/tmp/sonar -X - name: Upload coverage to Codecov uses: codecov/codecov-action@v1 From 8a7b340e7da6bd335433536451e4a95469c46d8a Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Tue, 28 Jan 2025 16:53:43 +0200 Subject: [PATCH 49/51] MWB-967: fix search issues --- mapping_workbench/frontend/src/hooks/use-items-search.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mapping_workbench/frontend/src/hooks/use-items-search.js b/mapping_workbench/frontend/src/hooks/use-items-search.js index cd50ce3f..9251a5e0 100644 --- a/mapping_workbench/frontend/src/hooks/use-items-search.js +++ b/mapping_workbench/frontend/src/hooks/use-items-search.js @@ -64,7 +64,7 @@ const useItemsSearch = (items, sectionApi, searchColumns, newFilters, sort) => { }) const handleSearchItems = (search) => { - setState(prevState => ({...prevState, search})) + setState(prevState => ({...prevState, search, page: 0})) } const handleFiltersChange = (filters) => { @@ -72,7 +72,6 @@ const useItemsSearch = (items, sectionApi, searchColumns, newFilters, sort) => { } const handlePageChange = (event, page) => { - console.log() setState(prevState => ({...prevState, page})); } From aa0d18fa321784fad5950c050e25dba095033272 Mon Sep 17 00:00:00 2001 From: Victor Frunze Date: Wed, 29 Jan 2025 17:23:47 +0200 Subject: [PATCH 50/51] MWB-12-33: fix importing formats --- .../frontend/src/api/mapping-packages/index.js | 4 ++++ .../frontend/src/api/test-data-suites/index.js | 2 +- .../frontend/src/api/triple-map-fragments/generic.js | 6 ++++++ .../frontend/src/api/triple-map-fragments/specific.js | 2 ++ mapping_workbench/frontend/src/components/file-dropzone.js | 3 +-- .../sections/app/file-manager/file-collection-uploader.js | 2 +- .../app/generic-triple-map-fragment/file-uploader.js | 5 ++++- .../src/sections/app/mapping-package/package-importer.js | 6 ++---- 8 files changed, 21 insertions(+), 9 deletions(-) diff --git a/mapping_workbench/frontend/src/api/mapping-packages/index.js b/mapping_workbench/frontend/src/api/mapping-packages/index.js index 1b7a5f51..fb11f906 100644 --- a/mapping_workbench/frontend/src/api/mapping-packages/index.js +++ b/mapping_workbench/frontend/src/api/mapping-packages/index.js @@ -32,6 +32,10 @@ class MappingPackagesApi extends SectionApi { return [ACTION.VIEW, ACTION.EDIT]; } + get FILE_UPLOAD_FORMATS() { + return {'application/zip': ['.zip']} + } + constructor() { super("mapping_packages"); this.isProjectResource = true; diff --git a/mapping_workbench/frontend/src/api/test-data-suites/index.js b/mapping_workbench/frontend/src/api/test-data-suites/index.js index 15757e1d..af6ae785 100644 --- a/mapping_workbench/frontend/src/api/test-data-suites/index.js +++ b/mapping_workbench/frontend/src/api/test-data-suites/index.js @@ -25,7 +25,7 @@ class TestDataSuitesApi extends FileCollectionsApi { } get FILE_UPLOAD_FORMATS() { - return {'ZIP': 'application/zip'} + return {'application/zip': ['.zip']} } get MAPPING_PACKAGE_LINK_FIELD() { diff --git a/mapping_workbench/frontend/src/api/triple-map-fragments/generic.js b/mapping_workbench/frontend/src/api/triple-map-fragments/generic.js index 0f96c476..5266d39c 100644 --- a/mapping_workbench/frontend/src/api/triple-map-fragments/generic.js +++ b/mapping_workbench/frontend/src/api/triple-map-fragments/generic.js @@ -6,6 +6,12 @@ class GenericTripleMapFragmentsApi extends TripleMapFragmentsApi { return "Triple Map Fragments"; } + get FILE_UPLOAD_FORMATS() { + return {'TTL': {['text/ttl']: ['.ttl']}, + 'YAML': {['text/yaml']: ['.yaml']} + } + } + get SECTION_ITEM_TITLE() { return "Triple Map Fragment"; } diff --git a/mapping_workbench/frontend/src/api/triple-map-fragments/specific.js b/mapping_workbench/frontend/src/api/triple-map-fragments/specific.js index 70ddcfc8..d0ec55de 100644 --- a/mapping_workbench/frontend/src/api/triple-map-fragments/specific.js +++ b/mapping_workbench/frontend/src/api/triple-map-fragments/specific.js @@ -15,6 +15,8 @@ class SpecificTripleMapFragmentsApi extends TripleMapFragmentsApi { return [ACTION.EDIT, ACTION.DELETE] } + get + constructor() { super("specific_triple_map_fragments"); this.hasMappingPackage = true; diff --git a/mapping_workbench/frontend/src/components/file-dropzone.js b/mapping_workbench/frontend/src/components/file-dropzone.js index 72b8109b..a9797794 100644 --- a/mapping_workbench/frontend/src/components/file-dropzone.js +++ b/mapping_workbench/frontend/src/components/file-dropzone.js @@ -18,8 +18,7 @@ import Typography from '@mui/material/Typography'; import { FileIcon } from 'src/components/file-icon'; import { bytesToSize } from 'src/utils/bytes-to-size'; -export const FileDropzone = (props) => { - const { caption, files = [], onRemove, onRemoveAll, onUpload, disabled, ...other } = props; +export const FileDropzone = ({ caption, files = [], onRemove, onRemoveAll, onUpload, disabled, ...other }) => { const { getRootProps, getInputProps, isDragActive } = useDropzone(other); const hasAnyFiles = files.length > 0; diff --git a/mapping_workbench/frontend/src/sections/app/file-manager/file-collection-uploader.js b/mapping_workbench/frontend/src/sections/app/file-manager/file-collection-uploader.js index e2841c95..b6bec48b 100644 --- a/mapping_workbench/frontend/src/sections/app/file-manager/file-collection-uploader.js +++ b/mapping_workbench/frontend/src/sections/app/file-manager/file-collection-uploader.js @@ -98,7 +98,7 @@ export const FileCollectionUploader = (props) => { { ); } + const acceptedFormat = sectionApi.FILE_UPLOAD_FORMATS?.[format] ?? {'*/*': []} + return ( { /> } + { - const {onClose, open = false, sectionApi} = props; - +export const PackageImporter = ({onClose, open = false, sectionApi}) => { const defaultPackageTypeValue = DEFAULT_PACKAGE_TYPE; const [files, setFiles] = useState([]); @@ -142,7 +140,7 @@ export const PackageImporter = (props) => { Date: Wed, 29 Jan 2025 14:05:09 +0200 Subject: [PATCH 51/51] MWB-12-33: update paginations on project --- .../app/conceptual-mapping-rule/develop/list-table.js | 2 +- .../sections/app/conceptual-mapping-rule/list-table.js | 2 +- .../src/sections/app/fields-registry/list-table.js | 2 +- .../app/file-manager/file-collection-list-table.js | 2 +- .../app/file-manager/test-data-collection-list-table.js | 2 +- .../frontend/src/sections/app/files-form/item-list.js | 6 +++--- .../app/generic-triple-map-fragment/list-table.js | 2 +- .../src/sections/app/mapping-package/list-table.js | 2 +- .../src/sections/app/mapping-package/state/list-table.js | 2 +- .../sections/app/ontology-namespace-custom/list-table.js | 2 +- .../src/sections/app/ontology-namespace/list-table.js | 2 +- .../src/sections/app/ontology-term/list-table.js | 9 +++------ .../frontend/src/sections/app/project/list-table.js | 2 +- .../app/shacl-validation-report/list-table-file.js | 2 +- .../sections/app/shacl-validation-report/list-table.js | 2 +- .../app/sparql-validation-report/list-table-file.js | 2 +- .../sections/app/sparql-validation-report/list-table.js | 2 +- .../frontend/src/sections/app/tasks/list-table.js | 2 +- .../app/xpath-validation-report/list-table-file.js | 2 +- .../sections/app/xpath-validation-report/list-table.js | 2 +- .../frontend/src/sections/components/table-pagination.js | 4 ++-- 21 files changed, 26 insertions(+), 29 deletions(-) diff --git a/mapping_workbench/frontend/src/sections/app/conceptual-mapping-rule/develop/list-table.js b/mapping_workbench/frontend/src/sections/app/conceptual-mapping-rule/develop/list-table.js index c4789f35..52294c84 100644 --- a/mapping_workbench/frontend/src/sections/app/conceptual-mapping-rule/develop/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/conceptual-mapping-rule/develop/list-table.js @@ -24,7 +24,7 @@ import {useHighlighterTheme} from "src/hooks/use-highlighter-theme"; import ConfirmDialog from "src/components/app/dialog/confirm-dialog"; import {MenuActionButton, MenuActions} from 'src/components/menu-actions'; import TableSorterHeader from "src/sections/components/table-sorter-header"; -import TablePagination from "src/sections/components/table-pagination-pages"; +import TablePagination from "src/sections/components/table-pagination"; export const ListTableRow = (props) => { const { diff --git a/mapping_workbench/frontend/src/sections/app/conceptual-mapping-rule/list-table.js b/mapping_workbench/frontend/src/sections/app/conceptual-mapping-rule/list-table.js index b77e7846..2a632743 100644 --- a/mapping_workbench/frontend/src/sections/app/conceptual-mapping-rule/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/conceptual-mapping-rule/list-table.js @@ -55,7 +55,7 @@ import {ChevronButton} from 'src/sections/components/chevron-button'; import {FormCodeTextArea} from "src/components/app/form/code-text-area"; import {ListItemActions} from 'src/components/app/list/list-item-actions'; import TableSorterHeader from 'src/sections/components/table-sorter-header'; -import TablePagination from "src/sections/components/table-pagination-pages"; +import TablePagination from "src/sections/components/table-pagination"; import {ForListItemAction} from 'src/contexts/app/section/for-list-item-action'; import {genericTripleMapFragmentsApi} from "src/api/triple-map-fragments/generic"; import {sparqlTestFileResourcesApi} from "src/api/sparql-test-suites/file-resources"; diff --git a/mapping_workbench/frontend/src/sections/app/fields-registry/list-table.js b/mapping_workbench/frontend/src/sections/app/fields-registry/list-table.js index aa2953c8..c8ea2efe 100644 --- a/mapping_workbench/frontend/src/sections/app/fields-registry/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/fields-registry/list-table.js @@ -24,7 +24,7 @@ import {useHighlighterTheme} from "src/hooks/use-highlighter-theme"; import {ChevronButton} from 'src/sections/components/chevron-button'; import {ListItemActions} from 'src/components/app/list/list-item-actions'; import TableSorterHeader from "src/sections/components/table-sorter-header"; -import TablePagination from "src/sections/components/table-pagination-pages"; +import TablePagination from "src/sections/components/table-pagination"; import {ForListItemAction} from 'src/contexts/app/section/for-list-item-action'; diff --git a/mapping_workbench/frontend/src/sections/app/file-manager/file-collection-list-table.js b/mapping_workbench/frontend/src/sections/app/file-manager/file-collection-list-table.js index 295cb85d..22cad594 100644 --- a/mapping_workbench/frontend/src/sections/app/file-manager/file-collection-list-table.js +++ b/mapping_workbench/frontend/src/sections/app/file-manager/file-collection-list-table.js @@ -32,7 +32,7 @@ import {ChevronButton} from 'src/sections/components/chevron-button'; import {FileUploader} from "src/sections/app/file-manager/file-uploader"; import {MenuActionButton, MenuActions} from 'src/components/menu-actions'; import TableSorterHeader from 'src/sections/components/table-sorter-header'; -import TablePagination from "src/sections/components/table-pagination-pages"; +import TablePagination from "src/sections/components/table-pagination"; import {ForListItemAction} from 'src/contexts/app/section/for-list-item-action'; import {ListFileCollectionActions} from "src/components/app/list/list-file-collection-actions"; import {MappingPackagesBulkAssigner} from "src/sections/app/mapping-package/components/mapping-packages-bulk-assigner"; diff --git a/mapping_workbench/frontend/src/sections/app/file-manager/test-data-collection-list-table.js b/mapping_workbench/frontend/src/sections/app/file-manager/test-data-collection-list-table.js index b5a7ec72..c4dd0244 100644 --- a/mapping_workbench/frontend/src/sections/app/file-manager/test-data-collection-list-table.js +++ b/mapping_workbench/frontend/src/sections/app/file-manager/test-data-collection-list-table.js @@ -32,7 +32,7 @@ import {mappingPackagesApi} from "src/api/mapping-packages"; import {PropertyListItem} from "src/components/property-list-item"; import {ChevronButton} from 'src/sections/components/chevron-button'; import ConfirmDialog from "src/components/app/dialog/confirm-dialog"; -import TablePagination from "src/sections/components/table-pagination-pages"; +import TablePagination from "src/sections/components/table-pagination"; import {MenuActions, MenuActionButton} from 'src/components/menu-actions'; import {ListItemActions} from "src/components/app/list/list-item-actions"; import TableSorterHeader from 'src/sections/components/table-sorter-header'; diff --git a/mapping_workbench/frontend/src/sections/app/files-form/item-list.js b/mapping_workbench/frontend/src/sections/app/files-form/item-list.js index 5f098d88..bbec59d1 100644 --- a/mapping_workbench/frontend/src/sections/app/files-form/item-list.js +++ b/mapping_workbench/frontend/src/sections/app/files-form/item-list.js @@ -6,11 +6,11 @@ import Stack from '@mui/material/Stack'; import Table from '@mui/material/Table'; import TableBody from '@mui/material/TableBody'; +import {ItemListRow} from './item-list-row'; +import {ItemListCard} from './item-list-card'; import {Scrollbar} from 'src/components/scrollbar'; import {TableNoData} from '../shacl-validation-report/utils'; -import {ItemListCard} from './item-list-card'; -import {ItemListRow} from './item-list-row'; -import TablePagination from "../../components/table-pagination-pages"; +import TablePagination from "src/sections/components/table-pagination"; export const ItemList = (props) => { const { diff --git a/mapping_workbench/frontend/src/sections/app/generic-triple-map-fragment/list-table.js b/mapping_workbench/frontend/src/sections/app/generic-triple-map-fragment/list-table.js index 0f61eee5..30106f3f 100644 --- a/mapping_workbench/frontend/src/sections/app/generic-triple-map-fragment/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/generic-triple-map-fragment/list-table.js @@ -31,7 +31,7 @@ import {ChevronButton} from 'src/sections/components/chevron-button'; import CodeMirrorDefault from 'src/components/app/form/codeMirrorDefault'; import {ListItemActions} from 'src/components/app/list/list-item-actions'; import TableSorterHeader from "src/sections/components/table-sorter-header"; -import TablePagination from "src/sections/components/table-pagination-pages"; +import TablePagination from "src/sections/components/table-pagination"; import {genericTripleMapFragmentsApi} from 'src/api/triple-map-fragments/generic'; import {ForListItemAction} from 'src/contexts/app/section/for-list-item-action'; import { diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/list-table.js b/mapping_workbench/frontend/src/sections/app/mapping-package/list-table.js index badf0d0c..c0e3025a 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/list-table.js @@ -31,7 +31,7 @@ import {ChevronButton} from 'src/sections/components/chevron-button'; import {MenuActionButton, MenuActions} from 'src/components/menu-actions'; import {ListItemActions} from 'src/components/app/list/list-item-actions'; import TableSorterHeader from 'src/sections/components/table-sorter-header'; -import TablePagination from "src/sections/components/table-pagination-pages"; +import TablePagination from "src/sections/components/table-pagination"; import {ForListItemAction} from 'src/contexts/app/section/for-list-item-action'; import {MappingPackageProcessForm} from './components/mapping-package-process-form'; import {MappingPackagesBulkActions} from './components/mapping-packages-bulk-actions'; diff --git a/mapping_workbench/frontend/src/sections/app/mapping-package/state/list-table.js b/mapping_workbench/frontend/src/sections/app/mapping-package/state/list-table.js index f5124cf9..57da2a26 100644 --- a/mapping_workbench/frontend/src/sections/app/mapping-package/state/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/mapping-package/state/list-table.js @@ -20,7 +20,7 @@ import exportPackage from "src/utils/export-mapping-package"; import {MenuActionButton, MenuActions} from 'src/components/menu-actions'; import {ListItemActions} from 'src/components/app/list/list-item-actions'; import TableSorterHeader from 'src/sections/components/table-sorter-header'; -import TablePagination from "src/sections/components/table-pagination-pages"; +import TablePagination from "src/sections/components/table-pagination"; import {ForListItemAction} from 'src/contexts/app/section/for-list-item-action'; export const ListTable = (props) => { diff --git a/mapping_workbench/frontend/src/sections/app/ontology-namespace-custom/list-table.js b/mapping_workbench/frontend/src/sections/app/ontology-namespace-custom/list-table.js index 9ff0d767..cd439530 100644 --- a/mapping_workbench/frontend/src/sections/app/ontology-namespace-custom/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/ontology-namespace-custom/list-table.js @@ -9,7 +9,7 @@ import TableHead from '@mui/material/TableHead'; import Typography from '@mui/material/Typography'; import {Scrollbar} from 'src/components/scrollbar'; -import TablePagination from 'src/sections/components/table-pagination-pages'; +import TablePagination from 'src/sections/components/table-pagination'; import {ListItemActions} from 'src/components/app/list/list-item-actions'; import TableSorterHeader from 'src/sections/components/table-sorter-header'; import {toastError, toastLoad, toastSuccess} from "src/components/app-toast"; diff --git a/mapping_workbench/frontend/src/sections/app/ontology-namespace/list-table.js b/mapping_workbench/frontend/src/sections/app/ontology-namespace/list-table.js index 77abe2eb..fedfad3a 100644 --- a/mapping_workbench/frontend/src/sections/app/ontology-namespace/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/ontology-namespace/list-table.js @@ -13,7 +13,7 @@ import {Scrollbar} from 'src/components/scrollbar'; import {MenuActions} from 'src/components/menu-actions'; import {ListItemActions} from 'src/components/app/list/list-item-actions'; import TableSorterHeader from 'src/sections/components/table-sorter-header'; -import TablePagination from "src/sections/components/table-pagination-pages"; +import TablePagination from "src/sections/components/table-pagination"; import {toastError, toastLoad, toastSuccess} from "src/components/app-toast"; import {ForListItemAction} from 'src/contexts/app/section/for-list-item-action'; diff --git a/mapping_workbench/frontend/src/sections/app/ontology-term/list-table.js b/mapping_workbench/frontend/src/sections/app/ontology-term/list-table.js index 05925c08..55df9521 100644 --- a/mapping_workbench/frontend/src/sections/app/ontology-term/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/ontology-term/list-table.js @@ -12,12 +12,9 @@ import Typography from '@mui/material/Typography'; import CardContent from '@mui/material/CardContent'; import {Scrollbar} from 'src/components/scrollbar'; -import {ListItemActions} from 'src/components/app/list/list-item-actions'; -import {ForListItemAction} from 'src/contexts/app/section/for-list-item-action'; -import {MenuActions} from '../../../components/menu-actions'; -import {ChevronButton} from '../../components/chevron-button'; -import TablePagination from "../../components/table-pagination-pages"; -import TableSorterHeader from "../../components/table-sorter-header"; +import {ChevronButton} from 'src/sections/components/chevron-button'; +import TablePagination from "src/sections/components/table-pagination"; +import TableSorterHeader from "src/sections/components/table-sorter-header"; export const ListTable = (props) => { diff --git a/mapping_workbench/frontend/src/sections/app/project/list-table.js b/mapping_workbench/frontend/src/sections/app/project/list-table.js index 5d29b9e9..f140386a 100644 --- a/mapping_workbench/frontend/src/sections/app/project/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/project/list-table.js @@ -25,7 +25,7 @@ import {PropertyListItem} from 'src/components/property-list-item'; import {ChevronButton} from 'src/sections/components/chevron-button'; import {ListItemActions} from 'src/components/app/list/list-item-actions'; import {MenuActionButton, MenuActions} from 'src/components/menu-actions'; -import TablePagination from "src/sections/components/table-pagination-pages"; +import TablePagination from "src/sections/components/table-pagination"; import TableSorterHeader from "src/sections/components/table-sorter-header"; import {ForListItemAction} from 'src/contexts/app/section/for-list-item-action'; diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table-file.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table-file.js index 0ebd990d..00fcc4cc 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table-file.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table-file.js @@ -9,7 +9,7 @@ import TableRow from '@mui/material/TableRow'; import {Scrollbar} from 'src/components/scrollbar'; import {useHighlighterTheme} from "src/hooks/use-highlighter-theme"; -import TablePagination from 'src/sections/components/table-pagination-pages'; +import TablePagination from 'src/sections/components/table-pagination'; import {TableFilterHeader} from "src/layouts/app/table-filter-header/table-filter-header"; const LocalHighlighter = ({text, language, theme}) => { diff --git a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table.js b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table.js index 2023bd55..96d08e76 100644 --- a/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/shacl-validation-report/list-table.js @@ -21,7 +21,7 @@ import {ValueChip} from '../xpath-validation-report/utils'; import {useHighlighterTheme} from "src/hooks/use-highlighter-theme"; import {Prism as SyntaxHighlighter} from 'react-syntax-highlighter'; import TableSorterHeader from "src/sections/components/table-sorter-header"; -import TablePagination from "src/sections/components/table-pagination-pages"; +import TablePagination from "src/sections/components/table-pagination"; import {TableFilterHeader} from "src/layouts/app/table-filter-header/table-filter-header"; export const ListTable = (props) => { diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table-file.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table-file.js index e8f24bbe..b3424fc6 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table-file.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table-file.js @@ -19,7 +19,7 @@ import {Scrollbar} from 'src/components/scrollbar'; import {getValidationColor} from '../mapping-package/state/utils'; import {useHighlighterTheme} from "src/hooks/use-highlighter-theme" import TableSorterHeader from "src/sections/components/table-sorter-header"; -import TablePagination from "src/sections/components/table-pagination-pages"; +import TablePagination from "src/sections/components/table-pagination"; import {TableFilterHeader} from "src/layouts/app/table-filter-header/table-filter-header"; const Condition = ({text, value}) => { diff --git a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js index 09ea22fb..5399ef0d 100644 --- a/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/sparql-validation-report/list-table.js @@ -27,7 +27,7 @@ import {Scrollbar} from 'src/components/scrollbar'; import {ValueChip} from '../xpath-validation-report/utils'; import {getValidationColor} from '../mapping-package/state/utils'; import {useHighlighterTheme} from "src/hooks/use-highlighter-theme"; -import TablePagination from "src/sections/components/table-pagination-pages"; +import TablePagination from "src/sections/components/table-pagination"; import {TableFilterHeader} from "src/layouts/app/table-filter-header/table-filter-header"; const ResultCell = ({item, onClick}) => { diff --git a/mapping_workbench/frontend/src/sections/app/tasks/list-table.js b/mapping_workbench/frontend/src/sections/app/tasks/list-table.js index 8d7db33c..5a123aa5 100644 --- a/mapping_workbench/frontend/src/sections/app/tasks/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/tasks/list-table.js @@ -28,7 +28,7 @@ import {SeverityPill} from "src/components/severity-pill"; import {ChevronButton} from 'src/sections/components/chevron-button'; import {MenuActionButton, MenuActions} from 'src/components/menu-actions'; import TableSorterHeader from "src/sections/components/table-sorter-header"; -import TablePagination from "src/sections/components/table-pagination-pages"; +import TablePagination from "src/sections/components/table-pagination"; import {mapStatusColor, TaskActions, TaskLine, taskProgressStatus as taskStatuses} from "./task-actions"; import {Box} from "@mui/system"; diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table-file.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table-file.js index 6eca1e14..2af8033e 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table-file.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table-file.js @@ -20,7 +20,7 @@ import DialogContentText from "@mui/material/DialogContentText"; import {Scrollbar} from 'src/components/scrollbar'; import {useHighlighterTheme} from "src/hooks/use-highlighter-theme"; -import TablePagination from "src/sections/components/table-pagination-pages"; +import TablePagination from "src/sections/components/table-pagination"; import TableSorterHeader from "src/sections/components/table-sorter-header"; import {TableFilterHeader} from "../../../layouts/app/table-filter-header/table-filter-header"; import {getValidationColor} from '../mapping-package/state/utils'; diff --git a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table.js b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table.js index 040fdf34..afe72a9b 100644 --- a/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table.js +++ b/mapping_workbench/frontend/src/sections/app/xpath-validation-report/list-table.js @@ -22,7 +22,7 @@ import DialogActions from "@mui/material/DialogActions"; import {Scrollbar} from 'src/components/scrollbar'; import {useHighlighterTheme} from "src/hooks/use-highlighter-theme"; import TableSorterHeader from "src/sections/components/table-sorter-header"; -import TablePagination from "src/sections/components/table-pagination-pages"; +import TablePagination from "src/sections/components/table-pagination"; import {TableFilterHeader} from "src/layouts/app/table-filter-header/table-filter-header"; import {getValidationColor} from '../mapping-package/state/utils'; import {ValueChip} from './utils'; diff --git a/mapping_workbench/frontend/src/sections/components/table-pagination.js b/mapping_workbench/frontend/src/sections/components/table-pagination.js index e40cedd5..78b7fe02 100644 --- a/mapping_workbench/frontend/src/sections/components/table-pagination.js +++ b/mapping_workbench/frontend/src/sections/components/table-pagination.js @@ -1,10 +1,10 @@ import MuiTablePagination from '@mui/material/TablePagination' const TablePagination = (props) => { - const {children, ...otherProps} = props + const {children, showTop,...otherProps} = props return ( <> - + {showTop && } {children}