Skip to content

Commit 9957ee5

Browse files
committed
feat: add compact mode
1 parent 8b7312e commit 9957ee5

14 files changed

+261
-42
lines changed

src/components/FiltersPanel/FiltersPanelSectionFilter.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ const classList = computed(() => {
8080
class="filters-panel-section-filter__content__search mb-3"
8181
@update:modelValue="emit('update:search', $event)"
8282
/>
83-
<div class="ps-4">
83+
<div>
8484
<slot />
8585
</div>
8686
</div>

src/components/PathView/PathView.vue

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup>
2-
import { provide, watch } from 'vue'
2+
import { computed, provide, watch } from 'vue'
33
44
import PathViewLabel from './PathViewLabel'
55
import PathViewSearch from './PathViewSearch'
@@ -16,6 +16,15 @@ const props = defineProps({
1616
},
1717
selectMode: {
1818
type: Boolean
19+
},
20+
compact: {
21+
type: Boolean
22+
},
23+
noLabel: {
24+
type: Boolean
25+
},
26+
noSearch: {
27+
type: Boolean
1928
}
2029
})
2130
@@ -26,14 +35,38 @@ watch(
2635
},
2736
{ immediate: true }
2837
)
38+
39+
watch(
40+
() => props.compact,
41+
(compact) => {
42+
provide('compact', compact)
43+
},
44+
{ immediate: true }
45+
)
46+
47+
const classList = computed(() => {
48+
return {
49+
'path-view--compact': props.compact
50+
}
51+
})
2952
</script>
3053

3154
<template>
32-
<div class="path-view d-flex flex-column gap-4">
33-
<path-view-label :label="label" :icon="icon" />
34-
<path-view-search :model-value="query" @update:modelValue="$emit('update:query', $event)" />
55+
<div class="path-view d-flex flex-column" :class="classList">
56+
<path-view-label v-if="!noLabel" :label="label" :icon="icon" />
57+
<path-view-search v-if="!noSearch" :model-value="query" @update:modelValue="$emit('update:query', $event)" />
3558
<div>
3659
<slot v-bind="{ selectMode }" />
3760
</div>
3861
</div>
3962
</template>
63+
64+
<style lang="scss" scoped>
65+
.path-view {
66+
gap: $spacer-lg;
67+
68+
&--compact {
69+
gap: $spacer;
70+
}
71+
}
72+
</style>

src/components/PathView/PathViewEntry.vue

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import { computed, inject, ref } from 'vue'
33
44
import PathViewEntryName from './PathViewEntryName'
5+
import { compact } from 'lodash';
56
67
const props = defineProps({
78
collapse: {
@@ -20,6 +21,10 @@ const props = defineProps({
2021
type: Boolean,
2122
default: null
2223
},
24+
compact: {
25+
type: Boolean,
26+
default: null
27+
},
2328
documents: {
2429
type: Number,
2530
default: 0
@@ -39,54 +44,75 @@ const active = ref(false)
3944
const classList = computed(() => {
4045
return {
4146
'path-view-entry--active': active.value,
42-
'path-view-entry--selected': props.selected
47+
'path-view-entry--selected': props.selected,
48+
'path-view-entry--compact': compactOrInjected.value
4349
}
4450
})
4551
4652
const selectModeOrInjected = computed(() => props.selectMode ?? inject('selectMode', false))
53+
const compactOrInjected = computed(() => props.compact ?? inject('compact', false))
4754
</script>
4855
4956
<template>
5057
<div class="path-view-entry" :class="classList">
5158
<div
52-
class="d-flex align-items-center path-view-entry__header px-3 py-2"
59+
class="d-flex align-items-center path-view-entry__header"
5360
@mouseenter="active = true"
5461
@mouseleave="active = false"
5562
>
5663
<path-view-entry-name
5764
:collapse="collapse"
65+
:compact="compactOrInjected"
5866
:selected="selected"
5967
:indeterminate="indeterminate"
6068
:name="name"
6169
:select-mode="selectModeOrInjected"
6270
@update:collapse="$emit('update:collapse', $event)"
6371
@update:selected="$emit('update:selected', $event)"
64-
@update:indeterminate="$emit('update:indeterminate', $event)">
72+
@update:indeterminate="$emit('update:indeterminate', $event)"
73+
>
6574
<slot name="name" />
6675
</path-view-entry-name>
6776
<path-view-entry-stats
6877
class="ms-auto"
78+
:compact="compactOrInjected"
6979
:documents="documents"
7080
:directories="directories"
7181
:size="size"
7282
:active="active"
7383
/>
7484
</div>
75-
<b-collapse :model-value="!collapse" class="ps-3">
85+
<b-collapse :model-value="!collapse" class="path-view-entry__subdirectories">
7686
<slot />
7787
</b-collapse>
7888
</div>
7989
</template>
8090
8191
<style lang="scss" scoped>
8292
.path-view-entry {
83-
&--active > &__header {
93+
&__header {
8494
border-radius: var(--bs-border-radius);
95+
padding: $spacer-sm $spacer;
96+
97+
.path-view-entry--compact & {
98+
padding: 2px 0;
99+
}
100+
}
101+
102+
&:deep(.path-view-entry__subdirectories) {
103+
padding-left: $spacer;
104+
}
105+
106+
&--compact:deep(.path-view-entry__subdirectories) {
107+
padding-left: $spacer-xs;
108+
}
109+
110+
&--active:not(&--compact) > &__header {
85111
background: var(--bs-tertiary-bg-subtle);
86112
}
87113
88-
&--selected,
89-
&:has(.path-view-entry--selected) {
114+
&--selected:not(&--compact) &__header,
115+
&:not(&--compact):has(.path-view-entry--selected) &__header {
90116
box-shadow: 0 0 0 1px var(--bs-primary) inset;
91117
}
92118
}

src/components/PathView/PathViewEntryMore.vue

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup>
2-
import { computed } from 'vue'
2+
import { computed, inject } from 'vue'
33
44
import IconButton from '@/components/IconButton'
55
@@ -15,6 +15,10 @@ const props = defineProps({
1515
total: {
1616
type: Number,
1717
default: 0
18+
},
19+
compact: {
20+
type: Boolean,
21+
default: null
1822
}
1923
})
2024
@@ -25,15 +29,19 @@ const nextPageSize = computed(() => {
2529
const directoriesLeft = computed(() => {
2630
return Math.max(0, props.total - props.page * props.perPage)
2731
})
32+
33+
const compactOrInjected = computed(() => props.compact ?? inject('compact', false))
34+
const size = computed(() => (compactOrInjected.value ? 'sm' : 'md'))
2835
</script>
2936
3037
<template>
3138
<icon-button
3239
v-if="directoriesLeft > 0"
3340
icon-left="caret-down"
3441
icon-left-variant="primary"
35-
class="py-2 px-3 shadow-sm"
42+
class="shadow-sm"
3643
variant="outline-tertiary"
44+
:size="size"
3745
>
3846
<slot>
3947
{{ $t('pathViewEntryMore.label', { nextPageSize, directoriesLeft }, directoriesLeft) }}

src/components/PathView/PathViewEntryName.vue

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup>
2-
import { computed } from 'vue'
2+
import { computed, inject } from 'vue'
33
import { PhosphorIcon } from '@icij/murmur-next'
44
import { PhFolder, PhFolderOpen } from '@phosphor-icons/vue'
55
@@ -10,6 +10,10 @@ const props = defineProps({
1010
collapse: {
1111
type: Boolean
1212
},
13+
compact: {
14+
type: Boolean,
15+
default: null
16+
},
1317
selected: {
1418
type: Boolean
1519
},
@@ -27,9 +31,14 @@ const props = defineProps({
2731
const icon = computed(() => (props.collapse ? PhFolder : PhFolderOpen))
2832
2933
const classList = computed(() => ({
30-
'path-view-entry-name--collapse': props.collapse
34+
'path-view-entry-name--collapse': props.collapse,
35+
'path-view-entry-name--compact': compactOrInjected.value,
36+
'path-view-entry-name--selected': props.selected
3137
}))
3238
39+
const selectModeOrInjected = computed(() => props.selectMode ?? inject('selectMode', false))
40+
const compactOrInjected = computed(() => props.compact ?? inject('compact', false))
41+
3342
const emit = defineEmits(['update:collapse'])
3443
3544
const toggle = () => {
@@ -41,18 +50,27 @@ const toggle = () => {
4150
<div class="path-view-entry-name d-flex gap-2 align-items-center flex-truncate w-100" :class="classList">
4251
<path-view-entry-name-caret :collapse="collapse" class="flex-shrink-0" @click="toggle" />
4352
<path-view-entry-name-checkbox
44-
v-if="selectMode"
53+
v-if="selectModeOrInjected"
4554
class="flex-shrink-0"
4655
:model-value="selected"
4756
:indeterminate="indeterminate"
4857
@update:modelValue="emit('update:selected', $event)"
4958
@update:indeterminate="emit('update:indeterminate', $event)"
5059
/>
51-
<slot v-bind="{ toggle, icon, name }">
52-
<div class="text-truncate" @click="toggle">
53-
<phosphor-icon :name="icon" class="path-view-entry-name__icon" />
60+
<slot v-bind="{ toggle, icon, name, compactOrInjected }">
61+
<div class="path-view-entry-name__value text-truncate" @click="toggle">
62+
<phosphor-icon v-if="!compactOrInjected" :name="icon" />
5463
{{ name }}
5564
</div>
5665
</slot>
5766
</div>
5867
</template>
68+
69+
<style lang="scss" scoped>
70+
.path-view-entry-name {
71+
&--compact.path-view-entry-name--selected {
72+
font-weight: 500;
73+
color: var(--bs-action-text-emphasis);
74+
}
75+
}
76+
</style>

src/components/PathView/PathViewEntryStats.vue

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
<script setup>
2+
import { computed, inject } from 'vue'
3+
24
import PathViewEntryStatsDocuments from './PathViewEntryStatsDocuments'
35
import PathViewEntryStatsDirectories from './PathViewEntryStatsDirectories'
46
import PathViewEntryStatsSize from './PathViewEntryStatsSize'
57
6-
defineProps({
8+
const props = defineProps({
79
documents: {
810
type: Number,
911
default: 0
@@ -18,21 +20,37 @@ defineProps({
1820
},
1921
active: {
2022
type: Boolean
23+
},
24+
compact: {
25+
type: Boolean,
26+
default: null
27+
}
28+
})
29+
30+
const compactOrInjected = computed(() => props.compact ?? inject('compact', false))
31+
32+
const classList = computed(() => {
33+
return {
34+
'path-view-entry-stats--active': props.active,
35+
'path-view-entry-stats--compact': compactOrInjected.value
2136
}
2237
})
2338
</script>
2439
2540
<template>
26-
<div class="path-view-entry-stats d-flex gap-2 text-nowrap">
27-
<path-view-entry-stats-documents :value="documents" :active="active" />
28-
<path-view-entry-stats-directories :value="directories" />
29-
<path-view-entry-stats-size :value="size" class="ms-auto" />
41+
<div class="path-view-entry-stats d-flex gap-2 text-nowrap" :class="classList">
42+
<path-view-entry-stats-documents :value="documents" :active="active" :compact="compactOrInjected" />
43+
<template v-if="!compactOrInjected">
44+
<path-view-entry-stats-directories :value="directories" />
45+
<path-view-entry-stats-size :value="size" class="ms-auto" />
46+
</template>
3047
</div>
3148
</template>
3249
3350
<style>
34-
.path-view-entry-stats {
51+
.path-view-entry-stats:not(.path-view-entry-stats--compact) {
3552
max-width: 260px;
3653
width: 100%;
54+
font-variant-numeric: tabular-nums;
3755
}
3856
</style>

0 commit comments

Comments
 (0)