Skip to content

Commit 7b2efe8

Browse files
authored
Fix reports issues (#301)
1 parent 03ca7f4 commit 7b2efe8

File tree

8 files changed

+198
-58
lines changed

8 files changed

+198
-58
lines changed

frontend/src/modules/report/components/report-grid-layout.vue

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,13 @@
6262
:is-resizable="editable"
6363
:is-mirrored="false"
6464
:vertical-compact="true"
65-
:margin="[16, 16]"
65+
:margin="[16, 22]"
6666
:use-css-transforms="true"
6767
>
6868
<grid-item
6969
v-for="item in layout"
7070
:key="item.i"
71+
class="pb-8"
7172
:x="item.x"
7273
:y="item.y"
7374
:w="item.w"
@@ -91,6 +92,7 @@
9192
"
9293
>
9394
<app-widget-cube-renderer
95+
class="panel"
9496
:editable="editable"
9597
:widget="widgets[item.i]"
9698
:chart-options="widgets[item.i]"
@@ -208,7 +210,10 @@ export default {
208210
x: (length * 6) % 12,
209211
y: length + 12, // puts it at the bottom
210212
w: 6,
211-
h: widgetModel.settings.layout.h
213+
h:
214+
widgetModel.settings.chartType === 'number'
215+
? 6
216+
: 21
212217
}
213218
return await WidgetService.create({
214219
title: duplicate
@@ -321,6 +326,19 @@ export default {
321326
.report-grid-layout {
322327
@apply min-h-40 relative;
323328
}
329+
.vue-grid-item > div {
330+
overflow-y: auto;
331+
height: 100%;
332+
333+
.widget-cube {
334+
height: fit-content;
335+
}
336+
337+
.widget-table {
338+
overflow-y: auto;
339+
height: calc(100% - 44px);
340+
}
341+
}
324342
.vue-grid-item:not(.vue-grid-placeholder) {
325343
touch-action: none;
326344
}

frontend/src/modules/report/pages/report-view-page.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77
></div>
88
<div v-else>
99
<div
10-
class="mb-4 h-24 flex items-center flex-shrink-0 fixed top-0 inset-x-0 z-10 bg-gray-50 shadow-sm transition-all ease-in-out duration-300"
10+
class="mb-4 h-24 flex items-center flex-shrink-0 fixed top-0 inset-x-0 z-10 bg-gray-50 shadow-sm transition-all ease-in-out duration-300 justify-center"
1111
:style="
1212
menuCollapsed ? 'left: 64px' : 'left: 260px'
1313
"
1414
>
15-
<div class="max-w-5xl mx-auto w-full">
15+
<div class="max-w-5xl mx-5 w-full">
1616
<router-link
1717
class="text-gray-600 btn-link--md btn-link--secondary p-0 inline-flex items-center mb-2"
1818
:to="{ path: '/reports' }"

frontend/src/modules/widget/components/cube/_query_builder/DimensionSelect.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ export default {
113113
get() {
114114
return this.translatedOptions(this.dimensions).map(
115115
(i) => i.label
116-
)
116+
)?.[0]
117117
},
118118
set(value) {
119119
return this.setDimensions([value])

frontend/src/modules/widget/components/cube/_query_builder/FilterComponent.vue

Lines changed: 133 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,22 @@
2323
:key="filter.id"
2424
class="flex -mx-2 mb-2 items-center"
2525
>
26-
<div class="input-group mx-2">
26+
<div class="flex items-center mx-2">
2727
<div class="grow">
2828
<el-select
2929
v-model="filter.select"
30+
class="first-filter"
3031
clearable
3132
filterable
3233
placeholder="Measure/dimension"
33-
@change="handleFilterChange"
34+
@change="
35+
(value) =>
36+
handleFilterChange(
37+
'first-option',
38+
value,
39+
index
40+
)
41+
"
3442
>
3543
<el-option
3644
v-for="item in computedFilters"
@@ -45,9 +53,17 @@
4553
<div class="grow">
4654
<el-select
4755
v-model="filter.operator"
56+
class="second-filter"
4857
clearable
4958
placeholder="Condition"
50-
@change="handleFilterChange"
59+
@change="
60+
(value) =>
61+
handleFilterChange(
62+
'second-option',
63+
value,
64+
index
65+
)
66+
"
5167
>
5268
<el-option
5369
v-for="actionItem in actionItems"
@@ -61,11 +77,73 @@
6177
</div>
6278

6379
<div class="grow">
80+
<el-select
81+
v-if="filter.select === 'Activities.platform'"
82+
v-model="filter.value"
83+
class="third-filter"
84+
placeholder="Value"
85+
@change="
86+
(value) =>
87+
handleFilterChange(
88+
'third-option',
89+
value,
90+
index
91+
)
92+
"
93+
>
94+
<el-option
95+
v-for="integration of Object.keys(
96+
activeIntegrationsList
97+
)"
98+
:key="platformDetails(integration).name"
99+
:label="platformDetails(integration).name"
100+
:value="integration"
101+
@mouseleave="onSelectMouseLeave"
102+
/>
103+
</el-select>
104+
<el-select
105+
v-else-if="
106+
filter.select === 'Activities.type'
107+
"
108+
v-model="filter.value"
109+
class="third-filter"
110+
placeholder="Value"
111+
@change="
112+
(value) =>
113+
handleFilterChange(
114+
'third-option',
115+
value,
116+
index
117+
)
118+
"
119+
>
120+
<el-option-group
121+
v-for="group in computedActivityTypes"
122+
:key="group.label.key"
123+
:label="group.label.value"
124+
>
125+
<el-option
126+
v-for="item in group.nestedOptions"
127+
:key="item.value"
128+
:label="item.label"
129+
:value="item.value"
130+
/>
131+
</el-option-group>
132+
</el-select>
64133
<el-input
134+
v-else
65135
v-model="filter.value"
136+
class="third-filter"
66137
type="text"
67138
placeholder="Value"
68-
@change="handleFilterChange"
139+
@change="
140+
(value) =>
141+
handleFilterChange(
142+
'third-option',
143+
value,
144+
index
145+
)
146+
"
69147
></el-input>
70148
</div>
71149
</div>
@@ -99,6 +177,11 @@
99177
<script>
100178
import { v4 as uuid } from 'uuid'
101179
import { onSelectMouseLeave } from '@/utils/select'
180+
import { mapGetters, mapActions } from 'vuex'
181+
import { CrowdIntegrations } from '@/integrations/integrations-config'
182+
import { ActivityModel } from '@/modules/activity/activity-model'
183+
184+
const { fields } = ActivityModel
102185
103186
export default {
104187
name: 'FilterComponent',
@@ -219,9 +302,25 @@ export default {
219302
dimension
220303
].includes(d.name)
221304
})
305+
},
306+
computedActivityTypes() {
307+
return fields.type
308+
.dropdownOptions()
309+
.filter((i) =>
310+
Object.keys(this.activeIntegrationsList).includes(
311+
i.label.key
312+
)
313+
)
314+
},
315+
...mapGetters({
316+
activeIntegrationsList: 'integration/activeList'
317+
}),
318+
fields() {
319+
return fields
222320
}
223321
},
224-
created() {
322+
async created() {
323+
await this.doFetchIntegrations()
225324
this.localFilters = this.initFilters() || []
226325
},
227326
methods: {
@@ -237,8 +336,8 @@ export default {
237336
this.localFilters.splice(index, 1)
238337
this.syncFilters()
239338
},
240-
handleFilterChange() {
241-
this.syncFilters()
339+
handleFilterChange(option, value, index) {
340+
this.syncFilters(option, value, index)
242341
},
243342
initFilters() {
244343
if (!this.filters.length) {
@@ -250,7 +349,7 @@ export default {
250349
const filter = f
251350
252351
filter.value = f.values[0]
253-
filter.select = f.member
352+
filter.select = f.member.name
254353
255354
delete filter.member
256355
delete filter.values
@@ -259,7 +358,11 @@ export default {
259358
}
260359
)
261360
},
262-
syncFilters() {
361+
syncFilters(option, value, index) {
362+
const hasChangedFirstOption =
363+
option === 'first-option' &&
364+
this.filters?.[index]?.select !== value
365+
263366
const newFilters = this.localFilters
264367
.filter((filter) => {
265368
return [
@@ -276,28 +379,37 @@ export default {
276379
}
277380
})
278381
382+
if (hasChangedFirstOption) {
383+
this.localFilters[index].value = undefined
384+
}
385+
279386
this.setFilters(newFilters)
280387
},
281388
282-
onSelectMouseLeave
389+
onSelectMouseLeave,
390+
...mapActions({
391+
doFetchIntegrations: 'integration/doFetch'
392+
}),
393+
394+
platformDetails(platform) {
395+
return CrowdIntegrations.getConfig(platform)
396+
}
283397
}
284398
}
285399
</script>
286400
287401
<style lang="scss">
288402
.widget-filter-container {
289-
.input-group {
290-
@apply rounded border border-gray-200 flex items-center;
403+
.first-filter .el-input__wrapper {
404+
@apply rounded-r-none;
291405
}
292-
.el-input,
293-
.el-input:hover,
294-
.el-input.is-focus {
295-
.el-input__wrapper,
296-
&:hover,
297-
&:focus,
298-
&.is-focus {
299-
@apply border-l-0 border-r-0 rounded-none shadow-none outline-none ring-0;
300-
}
406+
407+
.second-filter .el-input__wrapper {
408+
@apply rounded-none;
409+
}
410+
411+
.third-filter .el-input__wrapper {
412+
@apply rounded-l-none;
301413
}
302414
}
303415
</style>

frontend/src/modules/widget/components/cube/_query_builder/Order.vue

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,15 @@
2121
:model-value="element.order"
2222
size="small"
2323
class="radio-button-group"
24-
@input="
24+
@change="
2525
(value) =>
2626
$emit('orderChange', element.id, value)
2727
"
2828
>
29-
<el-radio-button
30-
label="ascending"
31-
:name="element.id"
29+
<el-radio-button label="asc" :name="element.id"
3230
>Asc</el-radio-button
3331
>
34-
<el-radio-button
35-
label="descending"
36-
:name="element.id"
32+
<el-radio-button label="desc" :name="element.id"
3733
>Desc</el-radio-button
3834
>
3935
<el-radio-button label="none" :name="element.id"
@@ -88,7 +84,7 @@ export default {
8884
}
8985
</script>
9086

91-
<style scoped>
87+
<style scoped lang="scss">
9288
.order-element {
9389
@apply flex justify-between items-center w-full;
9490
}

0 commit comments

Comments
 (0)