Merge expand and collapse in results [SCI-10620]

This commit is contained in:
Anton 2025-04-01 11:56:59 +02:00
parent 2e5ed1bcb2
commit a141e42a7b
3 changed files with 48 additions and 16 deletions

View file

@ -251,6 +251,7 @@ export default {
} else { } else {
$(resultId).collapse('show'); $(resultId).collapse('show');
} }
this.$emit('result:collapsed');
}); });
}, },
computed: { computed: {
@ -370,6 +371,8 @@ export default {
}; };
axios.put(this.userSettingsUrl, { settings: [settings] }); axios.put(this.userSettingsUrl, { settings: [settings] });
this.$emit('result:collapsed');
}, },
dragEnter(e) { dragEnter(e) {
if (!this.urls.upload_attachment_url) return; if (!this.urls.upload_attachment_url) return;

View file

@ -3,17 +3,19 @@
<ResultsToolbar <ResultsToolbar
ref="resultsToolbar" ref="resultsToolbar"
:sort="sort" :sort="sort"
:results="results"
:canCreate="canCreate == 'true'" :canCreate="canCreate == 'true'"
:archived="archived == 'true'" :archived="archived == 'true'"
:active_url="active_url" :active_url="active_url"
:archived_url="archived_url" :archived_url="archived_url"
:headerSticked="headerSticked" :headerSticked="headerSticked"
:moduleName="moduleName" :moduleName="moduleName"
:resultsCollapsed="resultsCollapsed"
@setSort="setSort" @setSort="setSort"
@setFilters="setFilters" @setFilters="setFilters"
@newResult="createResult" @newResult="createResult"
@expandAll="expandAll" @expandAll="expandResults"
@collapseAll="collapseAll" @collapseAll="collapseResults"
class="my-4" class="my-4"
/> />
<div class="results-list"> <div class="results-list">
@ -32,6 +34,7 @@
@result:deleted="removeResult" @result:deleted="removeResult"
@result:restored="removeResult" @result:restored="removeResult"
@result:drag_enter="dragEnter" @result:drag_enter="dragEnter"
@result:collapsed="checkResultsState"
/> />
</div> </div>
<clipboardPasteModal v-if="showClipboardPasteModal" <clipboardPasteModal v-if="showClipboardPasteModal"
@ -77,7 +80,8 @@ export default {
nextPageUrl: null, nextPageUrl: null,
loadingPage: false, loadingPage: false,
activeDragResult: null, activeDragResult: null,
userSettingsUrl: null userSettingsUrl: null,
resultsCollapsed: false
}; };
}, },
mounted() { mounted() {
@ -143,15 +147,27 @@ export default {
} }
); );
}, },
expandAll() { checkResultsState() {
$('.result-wrapper .collapse').collapse('show'); this.resultsCollapsed = this.$refs.results.every((result) => result.isCollapsed);
this.toggleCollapsed(false);
}, },
collapseAll() { collapseResults() {
$('.result-wrapper .collapse').collapse('hide'); $('.result-wrapper .collapse').collapse('hide');
this.toggleCollapsed(true); this.updateResultStateSettings(true);
this.$refs.results.forEach((result) => { result.isCollapsed = true; });
this.resultsCollapsed = true;
}, },
toggleCollapsed(newState) { expandResults() {
$('.result-wrapper .collapse').collapse('show');
this.updateResultStateSettings(false);
this.$refs.results.forEach((result) => { result.isCollapsed = false; });
this.resultsCollapsed = false;
},
updateResultStateSettings(newState) {
const updatedData = this.results.reduce((acc, currentResult) => {
acc[currentResult.id] = newState;
return acc;
}, {});
this.results = this.results.map((result) => ({ this.results = this.results.map((result) => ({
...result, ...result,
attributes: { attributes: {
@ -159,6 +175,13 @@ export default {
collapsed: newState collapsed: newState
} }
})); }));
const settings = {
key: 'result_states',
data: updatedData
};
axios.put(this.userSettingsUrl, { settings: [settings] });
}, },
removeResult(result_id) { removeResult(result_id) {
this.results = this.results.filter((r) => r.id != result_id); this.results = this.results.filter((r) => r.id != result_id);

View file

@ -34,12 +34,16 @@
</ul> </ul>
</div> </div>
<div class="result-toolbar__right flex items-center [&_.sn-icon-filter]:!text-sn-blue"> <div class="result-toolbar__right flex items-center [&_.sn-icon-filter]:!text-sn-blue">
<button class="btn btn-secondary mr-3" @click="collapseResults" tabindex="0"> <template v-if="results.length > 0">
{{ i18n.t('my_modules.results.collapse_label') }} <button :title="i18n.t('protocols.steps.collapse_label')" v-if="!resultsCollapsed" class="btn btn-secondary icon-btn xl:!px-4" @click="collapseResults" tabindex="0">
</button> <i class="sn-icon sn-icon-collapse-all"></i>
<button class="btn btn-secondary mr-3" @click="expandResults" tabindex="0"> <span class="tw-hidden xl:inline">{{ i18n.t("protocols.steps.collapse_label") }}</span>
{{ i18n.t('my_modules.results.expand_label') }} </button>
</button> <button v-else :title="i18n.t('protocols.steps.expand_label')" class="btn btn-secondary icon-btn xl:!px-4" @click="expandResults" tabindex="0">
<i class="sn-icon sn-icon-expand-all"></i>
<span class="tw-hidden xl:inline">{{ i18n.t("protocols.steps.expand_label") }}</span>
</button>
</template>
<FilterDropdown :filters="filters" @applyFilters="setFilters" /> <FilterDropdown :filters="filters" @applyFilters="setFilters" />
<MenuDropdown <MenuDropdown
@ -75,7 +79,9 @@ export default {
headerSticked: { type: Boolean, required: true }, headerSticked: { type: Boolean, required: true },
active_url: { type: String, required: true }, active_url: { type: String, required: true },
archived_url: { type: String, required: true }, archived_url: { type: String, required: true },
moduleName: { type: String, required: true } moduleName: { type: String, required: true },
results: { type: Array, required: true },
resultsCollapsed: { type: Boolean, required: true }
}, },
data() { data() {
return { return {