diff --git a/TODO b/TODO index 1e0b719..3b4f37e 100644 --- a/TODO +++ b/TODO @@ -1,8 +1,9 @@ +- implement pagination to fetch studies 100 -> 200 when we scroll to the end of the study-list +- implement pagination to fetch instances 100 -> 200 when we scroll to the end of the instance-list (displaying 2000 instances in one go sometimes takes 10 seconds !) + + - add a "reset" button (on Windows, to reload the config after you have changed it without going to the Services -> Orthanc -> Restart) - show ohif-vr and ohif-tmtv buttons only when relevant (analyse the content of the study) -- handle the EnableLabels "permission" - -- use DatePicker in remote modality study list - predefined filters in config file to display below Studies: - "Today": {"StudyDate": "$today"} @@ -12,7 +13,8 @@ UI improvements: - Admin theme including responsive tables (including multiline): https://github.com/lekoala/admini - tags: https://github.com/lekoala/bootstrap5-tags - +- when opening the series view I would prefer to see an image and it’s labels over a list of instance numbers and paired SOPInstanceUIDs: + https://discourse.orthanc-server.org/t/beginner-questions-from-horos-user/5322 - modification: - configuration to hide DICOM UID options and select the right one directly for a given setup. @@ -20,8 +22,6 @@ UI improvements: - show attachments -- support dicom-web plugin (QIDO-RS UI) - - support neuro plugin (download nifti) - TagsTree: allow click on "null" tags to open /instances/../content/group,element in new window @@ -53,12 +53,7 @@ UI improvements: } - configure other viewers url (ex: radiant://?n=pstv&v=0020000D&v=%22StudyInstanceUID%22 or osirix or horos ...) -- make table sortable and faster search by maintaining a cache DB (SQLite in each Orthanc instance handled by the oe2 plugin) - - only for studies. with a few indexed tags (the ones from the UI table) - - plugin monitors /changes route to see changes from all orthancs (instead of reacting to change events) - - to monitor deleted studies, react to change event + call other oe2 plugin API ? (need to list all orthanc urls somewhere) - - from OHIF doc for their study list: When the Study List is opened, the application queries the PACS for 101 studies by default. If there are greater than 100 studies - returned, the default sort for the study list is dictated by the image archive that hosts these studies for the viewer and study list sorting will be disabled. If there are less than or equal to 100 studies returned, they will be sorted by study date (most recent to oldest) and study list sorting will be enabled. Whenever a query returns greater than 100 studies, use filters to narrow results below 100 studies to enable Study List sorting. +- make table sortable - orthanc-share should generate QR code with publication links diff --git a/WebApplication/src/components/SideBar.vue b/WebApplication/src/components/SideBar.vue index 35cb770..00d6c5b 100644 --- a/WebApplication/src/components/SideBar.vue +++ b/WebApplication/src/components/SideBar.vue @@ -3,7 +3,7 @@ import UploadHandler from "./UploadHandler.vue" import JobsList from "./JobsList.vue"; import LanguagePicker from "./LanguagePicker.vue"; -import { mapState } from "vuex" +import { mapState, mapGetters } from "vuex" import { orthancApiUrl, oe2ApiUrl } from "../globalConfigurations"; import api from "../orthancApi" import SourceType from "../helpers/source-type"; @@ -37,6 +37,9 @@ export default { studiesSourceType: state => state.studies.sourceType, studiesRemoteSource: state => state.studies.remoteSource, }), + ...mapGetters([ + 'configuration/hasExtendedFind', // -> this['configuration/hasExtendedFind'] + ]), customLogoUrl() { if (this.hasCustomLogo && this.configuration.customLogoUrl) { return this.customLogoUrl; @@ -121,10 +124,12 @@ export default { this.labelsStudyCount[label] = null; } } - if (this.uiOptions.EnableLabelsCount) { - for (const [k, v] of Object.entries(this.labelsStudyCount)) { - if (v == null) { - this.labelsStudyCount[k] = await api.getLabelStudyCount(k); + if (this['configuration/hasExtendedFind']) { + if (this.uiOptions.EnableLabelsCount) { + for (const [k, v] of Object.entries(this.labelsStudyCount)) { + if (v == null) { + this.labelsStudyCount[k] = await api.getLabelStudyCount(k); + } } } } diff --git a/WebApplication/src/components/StudyList.vue b/WebApplication/src/components/StudyList.vue index 61cc0ea..4e27292 100644 --- a/WebApplication/src/components/StudyList.vue +++ b/WebApplication/src/components/StudyList.vue @@ -96,6 +96,7 @@ export default { }), ...mapGetters([ 'studies/isFilterEmpty', // -> this['studies/isFilterEmpty'] + 'configuration/hasExtendedFind', // -> this['configuration/hasExtendedFind'] 'configuration/hasExtendedChanges', // -> this['configuration/hasExtendedChanges'] ]), notShowingAllResults() { @@ -648,7 +649,7 @@ export default { await this.$store.dispatch('studies/clearStudies'); if (this.uiOptions.StudyListContentIfNoSearch == "empty") { return; - } else if (this.uiOptions.StudyListContentIfNoSearch == "most-recents" && this['configuration/hasExtendedChanges']) { + } else if (this.uiOptions.StudyListContentIfNoSearch == "most-recents" && this['configuration/hasExtendedFind']) { const studies = await api.getMostRecentStudies((this.filterLabels.length > 0 ? this.filterLabels[0] : null)); for (const study of studies) { this.$store.dispatch('studies/addStudy', { studyId: study["ID"], study: study, reloadStats: false });