Merge pull request #562 from specklesystems/dim/various

Dim/various
This commit is contained in:
Dimitrie Stefanescu
2022-01-31 12:48:17 +00:00
committed by GitHub
20 changed files with 442 additions and 391 deletions
+2 -2
View File
@@ -7,6 +7,7 @@
floating
:class="`grey ${$vuetify.theme.dark ? 'darken-4' : 'lighten-4'} elevation-1`"
:width="navWidth"
style="z-index: 100"
>
<div v-show="$route.meta.resizableNavbar" class="nav-resizer"></div>
<main-nav :expanded="drawer" @hide-drawer="drawer = false" />
@@ -101,8 +102,7 @@ export default {
}
`,
result({ data }) {
console.log(data)
if (!data) return
if (!data || !data.userStreamAdded) return
if (this.$route.params.streamId === data.userStreamAdded.id) return
this.$eventHub.$emit('notification', {
text: `You've got a new stream!`,
@@ -4,7 +4,6 @@
small
class="ma-1 caption white--text no-hover"
:color="color"
:size="size"
>
{{ shortName }}
</v-chip>
@@ -12,10 +11,6 @@
<script>
export default {
props: {
size: {
type: Number,
default: 30
},
applicationName: {
type: String,
default: '?'
@@ -1,6 +1,10 @@
<template lang="html">
<div style="height: 100%; position: relative" class="transparent">
<div id="rendererparent" ref="rendererparent"></div>
<div
id="rendererparent"
ref="rendererparent"
:class="`background-${$vuetify.theme.dark ? 'dark' : 'light'}`"
></div>
</div>
</template>
<script>
@@ -86,6 +90,19 @@ export default {
width: 100%;
height: 100%;
}
.background-light {
background: #8e9eab;
background: -webkit-linear-gradient(to top right, #eeeeee, #c8e8ff);
background: linear-gradient(to top right, #ffffff, #c8e8ff);
}
.background-dark {
background: #141e30;
background: -webkit-linear-gradient(to top, #243b55, #141e30);
background: linear-gradient(to top, #243b55, #141e30);
}
#renderer {
position: absolute;
top: 0;
@@ -0,0 +1,106 @@
<template>
<div>
<v-card class="mx-2 mb-2 rounded-lg">
<v-toolbar
v-ripple
class="transparent"
flat
style="cursor: pointer"
@click.stop="expanded = !expanded"
>
<v-app-bar-nav-icon>
<user-avatar
:id="commit.authorId"
:avatar="commit.authorAvatar"
:name="commit.authorName"
/>
</v-app-bar-nav-icon>
<source-app-avatar :application-name="commit.sourceApplication" />
<v-spacer />
<v-btn
v-if="$route.params.resourceId !== resource.id"
v-tooltip="'Remove'"
small
icon
@click.stop="$emit('remove', resource)"
>
<v-icon x-small>mdi-close</v-icon>
</v-btn>
<v-btn v-tooltip="'Toggle visibility'" small icon @click.stop="toggleVisibility()">
<v-icon class="grey--text" style="font-size: 12px">
{{ visible ? 'mdi-eye' : 'mdi-eye-off' }}
</v-icon>
</v-btn>
<v-btn v-tooltip="'Isolate objects'" small icon @click.stop="isolate()">
<v-icon x-small :class="`${isolated ? 'primary--text' : ''}`">mdi-filter</v-icon>
</v-btn>
<v-btn small icon @click.stop="expanded = !expanded">
<v-icon x-small>{{ expanded ? 'mdi-minus' : 'mdi-plus' }}</v-icon>
</v-btn>
</v-toolbar>
<v-expand-transition>
<div v-show="expanded" class="px-1 pb-2">
<div class="caption my-2 px-2">
{{ commit.message }}
<v-divider class="my-2" />
<timeago :datetime="commit.createdAt"></timeago>
,
{{ new Date(commit.createdAt).toLocaleString() }}
</div>
<v-divider class="mx-2 my-2" />
<object-properties
:obj="{
referencedId:
resource.type === 'commit'
? resource.data.commit.referencedObject
: resource.data.object.id
}"
:stream-id="resource.data.id"
/>
</div>
</v-expand-transition>
</v-card>
</div>
</template>
<script>
export default {
components: {
SourceAppAvatar: () => import('@/cleanup/components/common/SourceAppAvatar'),
UserAvatar: () => import('@/cleanup/components/common/UserAvatar'),
ObjectProperties: () => import('@/cleanup/components/viewer/ObjectProperties')
},
props: ['resource'],
data() {
return {
expanded: true
}
},
computed: {
commit() {
return this.resource.data.commit
},
isolated() {
return (
this.$store.state.isolateValues.indexOf(this.resource.data.commit.referencedObject) !== -1
)
},
visible() {
return this.$store.state.hideValues.indexOf(this.resource.data.commit.referencedObject) === -1
}
},
methods: {
isolate() {
let id = this.resource.data.commit.referencedObject
if (this.isolated)
this.$store.commit('unisolateObjects', { filterKey: '__parents', filterValues: [id] })
else this.$store.commit('isolateObjects', { filterKey: '__parents', filterValues: [id] })
},
toggleVisibility() {
let id = this.resource.data.commit.referencedObject
if (this.visible)
this.$store.commit('hideObjects', { filterKey: '__parents', filterValues: [id] })
else this.$store.commit('showObjects', { filterKey: '__parents', filterValues: [id] })
}
}
}
</script>
@@ -43,19 +43,9 @@
<filter-category-active :filter="activeFilter" />
</div>
<div v-if="activeFilter && activeFilter.data.type === 'number'">
<filter-numeric-active :filter="activeFilter" :prevent-first-set="preventFirstSet"/>
<filter-numeric-active :filter="activeFilter" :prevent-first-set="preventFirstSet" />
</div>
<div v-show="activeFilter === null">
<div v-if="topFilters.length !== 0">
<v-subheader>Reccommended filters:</v-subheader>
<div v-for="(filter, index) in topFilters" :key="index">
<filter-row-select
v-if="filter"
:filter="filter"
@active-toggle="(e) => (activeFilter = e)"
/>
</div>
</div>
<div class="">
<v-text-field
v-model="filterSearch"
@@ -65,8 +55,19 @@
append-icon="mdi-magnify"
hide-details
class="my-2"
style="position: sticky; top: 122px; z-index: 6"
style="position: sticky; top: 128px; z-index: 6"
/>
<div v-if="topFilters.length !== 0 && !filterSearch">
<v-subheader>Reccommended filters:</v-subheader>
<div v-for="(filter, index) in topFilters" :key="index">
<filter-row-select
v-if="filter"
:filter="filter"
@active-toggle="(e) => (activeFilter = e)"
/>
</div>
</div>
<v-subheader>{{ filterSearch ? 'Matching' : 'Other' }} filters:</v-subheader>
<div v-for="filter in matchingFilters" :key="filter.targetKey">
<filter-row-select :filter="filter" @active-toggle="(e) => (activeFilter = e)" />
</div>
@@ -95,7 +96,7 @@ export default {
},
data() {
return {
expand: true,
expand: false,
revitFilters: ['type', 'family', 'level'],
allFilters: [],
activeFilter: null,
@@ -0,0 +1,83 @@
<template>
<div>
<v-card class="mx-2 mb-2 rounded-lg">
<v-toolbar
v-ripple
class="transparent"
flat
style="cursor: pointer"
@click.stop="expanded = !expanded"
>
<v-app-bar-nav-icon style="pointer-events: none">
<v-icon large>mdi-cube-outline</v-icon>
</v-app-bar-nav-icon>
<v-spacer />
<v-btn
v-if="$route.params.resourceId !== resource.id"
v-tooltip="'Remove'"
small
icon
@click.stop="$emit('remove', resource)"
>
<v-icon x-small>mdi-close</v-icon>
</v-btn>
<v-btn v-tooltip="'Toggle visibility'" small icon @click.stop="toggleVisibility()">
<v-icon class="grey--text" style="font-size: 12px">
{{ visible ? 'mdi-eye' : 'mdi-eye-off' }}
</v-icon>
</v-btn>
<v-btn v-tooltip="'Isolate objects'" small icon @click.stop="isolate()">
<v-icon x-small :class="`${isolated ? 'primary--text' : ''}`">mdi-filter</v-icon>
</v-btn>
<v-btn small icon @click.stop="expanded = !expanded">
<v-icon x-small>{{ expanded ? 'mdi-minus' : 'mdi-plus' }}</v-icon>
</v-btn>
</v-toolbar>
<v-expand-transition>
<div v-show="expanded" class="px-1">
<object-properties
:obj="{
referencedId: resource.data.object.id
}"
:stream-id="resource.data.id"
/>
</div>
</v-expand-transition>
</v-card>
</div>
</template>
<script>
export default {
components: {
ObjectProperties: () => import('@/cleanup/components/viewer/ObjectProperties')
},
props: ['resource'],
data() {
return {
expanded: true
}
},
computed: {
isolated() {
return this.$store.state.isolateValues.indexOf(this.resource.data.object.id) !== -1
},
visible() {
return this.$store.state.hideValues.indexOf(this.resource.data.object.id) === -1
}
},
methods: {
isolate() {
let id = this.resource.data.object.id
if (this.isolated)
this.$store.commit('unisolateObjects', { filterKey: '__parents', filterValues: [id] })
else this.$store.commit('isolateObjects', { filterKey: '__parents', filterValues: [id] })
},
toggleVisibility() {
let id = this.resource.data.object.id
if (this.visible)
this.$store.commit('hideObjects', { filterKey: '__parents', filterValues: [id] })
else this.$store.commit('showObjects', { filterKey: '__parents', filterValues: [id] })
}
}
}
</script>
@@ -15,9 +15,9 @@
block
plain
:class="`grey ${$vuetify.theme.dark ? 'darken-3' : 'lighten-2'}`"
@click="currItems += maxItems"
@click.stop="currItems += maxItems"
>
Load More ({{ kvps.length - currItems }})
Show More ({{ kvps.length - currItems }})
</v-btn>
</div>
</div>
@@ -45,11 +45,11 @@ export default {
loading: false,
ignoredProps: [
'__closure',
'displayMesh',
'displayValue',
// 'displayMesh',
// 'displayValue',
'__importedUrl',
// '__parents', // TODO: uncomment before release
'totalChildrenCount'
'__parents'
// 'totalChildrenCount'
]
}
},
@@ -108,9 +108,10 @@ export default {
!this.realObject.speckle_type?.includes('Objects')
)
extras.push('visibility')
// if (value)
this.kvps.push({
key,
key: this.cleanKey(key),
originalKey: key,
value,
type,
extras,
@@ -119,6 +120,11 @@ export default {
refId: value?.referencedId
})
}
},
cleanKey(key) {
if (key === 'totalChildrenCount') return 'children count'
if (key === 'speckle_type') return 'type'
return key
}
}
}
@@ -1,20 +1,27 @@
<template>
<v-row no-gutters class="my-1 property-row rounded-lg">
<v-row
no-gutters
:class="`my-1 py-1 property-row rounded-lg ${$vuetify.theme.dark ? 'black-bg' : 'white-bg'} ${
prop.type === 'object' || prop.type === 'array' ? (expanded ? 'border-blue' : 'border') : ''
} ${prop.type === 'object' || prop.type === 'array' ? 'hover-cursor property-row-hover' : 'normal-cursor'}`"
@click.stop="prop.type === 'object' || prop.type === 'array' ? (expanded = !expanded) : null"
>
<v-col cols="1" class="text-center">
<v-icon small style="font-size: 12px" :class="`${$vuetify.theme.dark ? 'grey--text' : ''}`">
{{ icon }}
</v-icon>
</v-col>
<v-col
v-tooltip="prop.key"
v-tooltip="prop.originalKey"
cols="5"
:class="`caption ${
prop.type === 'object' || prop.type === 'array' ? 'hover-cursor' : ''
} text-truncate px-1 ${$vuetify.theme.dark ? 'grey--text' : ''}`"
style="line-height: 24px"
@click="prop.type === 'object' || prop.type === 'array' ? (expanded = !expanded) : null"
>
{{ prop.key.startsWith('@') ? prop.key.substring(1) : prop.key }}
<span :class="`${expanded ? 'font-weight-bold' : ''}`">
{{ prop.key.startsWith('@') ? prop.key.substring(1) : prop.key }}
</span>
</v-col>
<v-col
v-if="prop.type !== 'object' && prop.type !== 'array'"
@@ -45,9 +52,8 @@
class="mr-1"
target="_blank"
:href="`/streams/${streamId}/objects/${refId}`"
@xxxxclick="toggleVisibility()"
>
<v-icon class="grey--text" style="font-size: 11px">mdi-open-in-new</v-icon>
<v-icon class="grey--text" style="font-size: 12px">mdi-open-in-new</v-icon>
</v-btn>
<v-btn
v-if="prop.extras.includes('visibility')"
@@ -55,9 +61,9 @@
x-small
icon
class="mr-1"
@click="toggleVisibility()"
@click.stop="toggleVisibility()"
>
<v-icon class="grey--text" style="font-size: 11px">
<v-icon class="grey--text" style="font-size: 12px">
{{ visible ? 'mdi-eye' : 'mdi-eye-off' }}
</v-icon>
</v-btn>
@@ -67,15 +73,15 @@
x-small
icon
class="mr-1"
@click="toggleFilter()"
@click.stop="toggleFilter()"
>
<v-icon :class="`${isolated ? 'primary--text' : 'grey--text'}`" style="font-size: 11px">
<v-icon :class="`${isolated ? 'primary--text' : 'grey--text'}`" style="font-size: 12px">
{{ !isolated ? 'mdi-filter' : 'mdi-filter' }}
</v-icon>
</v-btn>
<v-btn v-tooltip="'Expand/collapse property'" x-small icon @click="expanded = !expanded">
<v-icon :class="`${expanded ? 'primary--text' : 'grey--text'}`" style="font-size: 11px">
{{ expanded ? 'mdi-minus-box' : 'mdi-plus-box' }}
<v-btn v-tooltip="'Expand/collapse property'" x-small icon @click.stop="expanded = !expanded">
<v-icon :class="`${expanded ? 'grey--text' : 'primary--text'}`" style="font-size: 12px">
{{ expanded ? 'mdi-minus' : 'mdi-plus' }}
</v-icon>
</v-btn>
</v-col>
@@ -169,11 +175,32 @@ export default {
.hover-cursor:hover {
cursor: pointer;
}
.normal-cursor:hover {
cursor: auto !important;
}
.border-blue {
border: solid rgba(131, 131, 131, 0.753);
border-width: 0px 0px 0px 2px;
}
.border {
border: solid #047ffb;
/* border: solid #047efb; */
border-width: 0px 0px 0px 2px;
}
.property-row {
transition: all 0.3s ease;
background: rgba(120, 120, 120, 0.05);
padding: 0 0px 0 4px;
}
.property-row:hover {
background: rgba(120, 120, 120, 0.09);
.white-bg {
background: white;
}
.black-bg {
background: rgb(30, 30, 30);
}
.property-row-hover:hover {
/* border: 1px solid rgba(120, 120, 120, 0.1); */
background: rgba(120, 120, 120, 0.03);
}
</style>
@@ -1,32 +1,25 @@
<template>
<v-list dense nav class="py-0 mb-3">
<v-list-item
:class="`px-2 list-overlay-${$vuetify.theme.dark ? 'dark' : 'light'} elevation-2`"
style="position: sticky; top: 82px"
@click="expand = !expand && props.length !== 0"
>
<v-list-item-action>
<v-icon small :class="`${props.length !== 0 ? '' : 'grey--text'}`">mdi-mouse</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
Selection
<span class="caption grey--text">({{ objects.length }})</span>
</v-list-item-title>
</v-list-item-content>
<v-list-item-action class="pa-0 ma-0">
<div
class="overflow-hidden"
:style="`width: ${
$vuetify.breakpoint.xs ? '90%' : '300px'
}; height: 100%; position: absolute; padding-top: 72px`"
>
<!-- <v-card class="px-2"> -->
<perfect-scrollbar style="height: 100%" :options="{ suppressScrollX: true }">
<div class="d-flex align-center" style="pointer-events: auto">
<span class="caption">Selection Info</span>
<v-spacer />
<v-btn
v-show="objects.length > 1"
v-tooltip="'Open selection in a new window'"
:disabled="objects.length === 0 && isolated"
small
icon
target="_blank"
:href="getSelectionUrl()"
>
<v-icon small>mdi-open-in-new</v-icon>
<v-icon x-small>mdi-open-in-new</v-icon>
</v-btn>
</v-list-item-action>
<v-list-item-action class="pa-0 ma-0">
<v-btn
v-tooltip="'Isolate selected objects'"
:disabled="objects.length === 0 && !isolated"
@@ -34,33 +27,29 @@
icon
@click.stop="isolateSelection()"
>
<v-icon small :class="`${!isolated ? 'primary--text' : ''}`">mdi-filter</v-icon>
<v-icon x-small :class="`${!isolated ? 'primary--text' : ''}`">mdi-filter</v-icon>
</v-btn>
</v-list-item-action>
<v-list-item-action class="pa-0 ma-0">
<v-btn small icon :disabled="props.length === 0" @click.stop="expand = !expand">
<v-icon>{{ expand ? 'mdi-chevron-up' : 'mdi-chevron-down' }}</v-icon>
<v-btn
v-show="$vuetify.breakpoint.xs"
v-tooltip="'Isolate selected objects'"
small
icon
@click.stop="$emit('clear-selection')"
>
<v-icon x-small>mdi-close</v-icon>
</v-btn>
</v-list-item-action>
</v-list-item>
<v-expand-transition>
<div v-show="expand" class="mt-3">
<div v-for="prop in props" :key="prop.value.id">
<object-properties-row :prop="prop" :stream-id="streamId" :ref-id="prop.refId" />
</div>
<v-subheader v-show="props.length === 1" class="caption grey--text">
<v-icon
small
style="font-size: 12px"
:class="`${$vuetify.theme.dark ? 'grey--text' : ''} ml-0 mr-2`"
>
mdi-help
</v-icon>
Hint: hold shift to select multiple objects.
</v-subheader>
</div>
</v-expand-transition>
</v-list>
<div v-for="prop in props" :key="prop.value.id" style="width: 99%">
<v-card class="transparent elevation-3 rounded-lg mb-3" style="pointer-events: auto">
<object-properties-row :prop="prop" :stream-id="streamId" :ref-id="prop.refId" />
</v-card>
</div>
<div v-show="props.length === 1 && !$vuetify.breakpoint.xs" class="caption grey--text">
Hint: hold shift to select multiple objects.
</div>
</perfect-scrollbar>
<!-- </v-card> -->
</div>
</template>
<script>
export default {
@@ -1,138 +0,0 @@
<template>
<v-list dense nav class="mt-0 py-0 mb-3">
<v-list-item
v-if="!resource.data.error"
:class="`px-2 list-overlay-${$vuetify.theme.dark ? 'dark' : 'light'} elevation-0`"
style="position: sticky; top: 82px"
@click="expand = !expand"
>
<v-list-item-action>
<v-icon v-if="resource.type === 'commit'" small>mdi-source-commit</v-icon>
<v-icon v-if="resource.type === 'object'" small>mdi-cube-outline</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
{{ resource.type === 'commit' ? resource.data.commit.message : 'Object' }}
</v-list-item-title>
</v-list-item-content>
<v-list-item-action
v-if="isMultiple"
class="pa-0 ma-0"
@click.stop="$emit('remove', resource)"
>
<v-btn
v-if="$route.params.resourceId !== resource.id"
v-tooltip="'Remove'"
small
icon
@click.stop="$emit('remove', resource)"
>
<v-icon x-small>mdi-close</v-icon>
</v-btn>
</v-list-item-action>
<v-list-item-action v-if="isMultiple" class="pa-0 ma-0">
<v-btn v-tooltip="'Isolate objects'" small icon @click.stop="isolate()">
<v-icon x-small :class="`${isolated ? 'primary--text' : ''}`">mdi-filter</v-icon>
</v-btn>
</v-list-item-action>
<v-list-item-action class="pa-0 ma-0">
<v-btn small icon @click.stop="expand = !expand">
<v-icon>{{ expand ? 'mdi-chevron-up' : 'mdi-chevron-down' }}</v-icon>
</v-btn>
</v-list-item-action>
</v-list-item>
<v-list-item v-else class="warning" dark>
<v-list-item-action>
<v-icon small>mdi-alert</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title v-tooltip="resource.id">
Failed to load resource {{ resource.id }}.
</v-list-item-title>
</v-list-item-content>
<v-list-item-action class="pa-0 ma-0" @click.stop="$emit('remove', resource)">
<v-btn
v-if="$route.params.resourceId !== resource.id"
v-tooltip="'Dismiss'"
small
icon
@click.stop="$emit('remove', resource)"
>
<v-icon x-small>mdi-close</v-icon>
</v-btn>
</v-list-item-action>
</v-list-item>
<div v-if="!resource.data.error">
<v-expand-transition>
<div v-show="expand" class="mt-3">
<!-- <div v-if="isMultiple && resource.type === 'commit'">TODO: info</div> -->
<object-properties
:obj="{
referencedId:
resource.type === 'commit'
? resource.data.commit.referencedObject
: resource.data.object.id
}"
:stream-id="resource.data.id"
/>
</div>
</v-expand-transition>
</div>
<div v-else>
<v-expand-transition>
<v-alert v-show="expand" type="warning" dense class="text-truncate">
{{ resource.data.message }}
</v-alert>
</v-expand-transition>
</div>
</v-list>
</template>
<script>
export default {
components: {
ObjectProperties: () => import('@/cleanup/components/viewer/ObjectProperties')
},
props: {
resource: { type: Object, default: () => null },
isMultiple: { type: Boolean, default: false },
expandInitial: { type: Boolean, default: true }
},
data() {
return {
expand: this.expandInitial
}
},
computed: {
isolated() {
let id =
this.resource.type === 'commit'
? this.resource.data.commit.referencedObject
: this.resource.data.object.id
return this.$store.state.isolateValues.indexOf(id) !== -1
}
},
methods: {
isolate() {
let id =
this.resource.type === 'commit'
? this.resource.data.commit.referencedObject
: this.resource.data.object.id
if (this.isolated)
this.$store.commit('unisolateObjects', { filterKey: '__parents', filterValues: [id] })
else this.$store.commit('isolateObjects', { filterKey: '__parents', filterValues: [id] })
}
}
}
</script>
<style scoped>
.list-overlay-dark {
background: rgba(40, 40, 40, 0.5);
z-index: 5;
}
.list-overlay-light {
background: rgba(235, 235, 235, 0.5);
z-index: 5;
}
</style>
@@ -1,46 +1,53 @@
<template>
<div>
<v-list v-if="resources.length > 1" dense nav class="mt-0 py-0 mb-3">
<v-list-item
:class="`px-2 list-overlay-${$vuetify.theme.dark ? 'dark' : 'light'} elevation-3`"
style="position: sticky; top: 82px"
@click="expand = !expand"
>
<v-list-item-action>
<v-icon small>
{{
resources.length < 10
? 'mdi-numeric-' + resources.length + '-box-multiple'
: 'mdi-numeric-9-plus-box-multiple'
}}
</v-icon>
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>Loaded Resources</v-list-item-title>
</v-list-item-content>
<v-list-item-action class="pa-0 ma-0">
<v-btn small icon @click.stop="expand = !expand">
<v-icon>{{ expand ? 'mdi-chevron-up' : 'mdi-chevron-down' }}</v-icon>
</v-btn>
</v-list-item-action>
</v-list-item>
</v-list>
<div class="mb-2">
<v-expand-transition>
<div v-show="expand" class="mt-3">
<resource
<div v-show="expand" class="">
<div v-for="(resource, index) in resources" :key="index">
<commit-info-resource
v-if="resource.type === 'commit'"
:resource="resource"
@remove="
(e) => {
$emit('remove', e)
removedResources.push(e)
}
"
></commit-info-resource>
<object-info-resource
v-if="resource.type === 'object'"
:resource="resource"
@remove="
(e) => {
$emit('remove', e)
removedResources.push(e)
}
"
></object-info-resource>
</div>
<div class="px-2 mb-2">
<v-btn
v-tooltip="'Overlay another commit or object'"
block
rounded
class="primary"
@click="$emit('show-add-overlay')"
>
add
</v-btn>
</div>
<!-- <resource
v-for="(resource, index) in resources"
:key="index"
:resource="resource"
:is-multiple="resources.length !== 0"
:expand-initial="resources.length === 0"
:is-multiple="resources.length > 1"
:expand-initial="resources.length === 1 || true"
@remove="
(e) => {
$emit('remove', e)
removedResources.push(e)
}
"
/>
/> -->
<div v-show="removedResources.length !== 0" class="px-3 caption pb-5">
Removed resources:
<span v-for="(res, index) in removedResources" :key="index" v-tooltip="'Click to re-add'">
@@ -69,7 +76,8 @@
<script>
export default {
components: {
Resource: () => import('@/cleanup/components/viewer/Resource')
CommitInfoResource: () => import('@/cleanup/components/viewer/CommitInfoResource'),
ObjectInfoResource: () => import('@/cleanup/components/viewer/ObjectInfoResource')
},
props: {
resources: { type: Array, default: () => [] }
@@ -35,16 +35,6 @@
>
<v-icon small>mdi-scissors-cutting</v-icon>
</v-btn>
<v-btn
v-tooltip="'Overlay another commit or object'"
color="primary"
:small="small"
rounded
class="mr-2"
@click="$emit('show-add-overlay')"
>
<v-icon>mdi-plus</v-icon>
</v-btn>
</v-card>
</div>
</template>
@@ -115,7 +115,6 @@ export default {
}
},
async mounted() {
console.log(this.streamId)
let res = await this.$apollo.query({
query: gql`
query {
@@ -1,13 +1,7 @@
<template>
<div>
<v-row v-if="stream" dense>
<v-col
v-for="commit in stream.branch.commits.items"
:key="commit.id + 'card'"
cols="12"
sm="6"
md="4"
>
<v-row v-if="commits.length != 0" dense>
<v-col v-for="commit in commits" :key="commit.id + 'card'" cols="12" sm="6" md="4">
<v-card @click.stop="$emit('add-resource', commit.id)">
<preview-image
:height="180"
@@ -53,83 +47,52 @@ export default {
SourceAppAvatar: () => import('@/cleanup/components/common/SourceAppAvatar')
},
props: ['streamId', 'branchName'],
apollo: {
stream: {
query: gql`
query($streamId: String!, $branchName: String!, $cursor: String) {
stream(id: $streamId) {
id
branch(name: $branchName) {
name
commits(cursor: $cursor, limit: 2) {
totalCount
cursor
items {
sourceApplication
id
createdAt
authorId
branchName
message
referencedObject
}
}
}
}
}
`,
variables() {
return { streamId: this.streamId, branchName: this.branchName }
},
skip() {
return !this.streamId
}
data() {
return {
skip: true,
cursor: new Date().toISOString(),
commits: []
}
},
data() {
return {}
async mounted() {
this.fetchBranchCommits()
},
async mounted() {},
methods: {
infiniteHandler($state) {
this.$apollo.queries.stream.fetchMore({
variables: {
cursor: this.stream.branch.commits.cursor,
streamId: this.streamId,
branchName: this.branchName
},
// Transform the previous result with new data
updateQuery: (previousResult, { fetchMoreResult }) => {
const newItems = fetchMoreResult.stream.branch.commits.items
if (newItems.length === 0) $state.complete()
else $state.loaded()
let allItems = [...previousResult.stream.branch.commits.items]
for (const commit of newItems) {
if (allItems.findIndex((c) => c.id === commit.id) === -1) allItems.push(commit)
}
return {
stream: {
__typename: previousResult.stream.__typename,
name: previousResult.stream.name,
id: previousResult.stream.id,
branch: {
id: fetchMoreResult.stream.branch.id,
name: fetchMoreResult.stream.branch.name,
description: fetchMoreResult.stream.branch.description,
__typename: previousResult.stream.branch.__typename,
commits: {
__typename: previousResult.stream.branch.commits.__typename,
cursor: fetchMoreResult.stream.branch.commits.cursor,
totalCount: fetchMoreResult.stream.branch.commits.totalCount,
items: allItems
async fetchBranchCommits() {
let res = await this.$apollo.query({
query: gql`
query {
stream(id: "${this.streamId}") {
id
branch(name: "${this.branchName}") {
name
commits( cursor: "${this.cursor}", limit: 2) {
totalCount
cursor
items {
sourceApplication
id
createdAt
authorId
branchName
message
referencedObject
}
}
}
}
}
}
`
})
let items = res.data.stream.branch.commits.items
this.cursor = res.data.stream.branch.commits.cursor
items.forEach((item) => this.commits.push(item))
return items
},
async infiniteHandler($state) {
let items = await this.fetchBranchCommits()
if (items.length === 0) $state.complete()
else $state.loaded()
}
}
}
@@ -162,6 +162,7 @@ export default {
this.showDelete = false
this.$eventHub.$emit('notification', { text: 'Branch deleted' })
this.$router.push(`/streams/` + this.$route.params.streamId)
this.$eventHub.$emit('branch-refresh')
},
async updateBranch() {
if (!this.$refs.form.validate()) return
@@ -26,8 +26,8 @@
{{ serverInfo.version }}
</div>
<div class="flex-grow-1 text-right">
<v-btn icon small @click="$emit('hide-drawer')">
<v-icon>mdi-chevron-left</v-icon>
<v-btn v-tooltip="'Close sidebar'" icon small @click="$emit('hide-drawer')">
<v-icon x-small>mdi-close</v-icon>
</v-btn>
</div>
</v-card>
@@ -50,33 +50,22 @@
</v-list-item>
</v-list>
<!-- Selection info -->
<v-scroll-y-transition>
<transition-group>
<object-selection
v-show="selectionData.length !== 0"
:key="'one'"
:objects="selectionData"
:stream-id="$route.params.streamId"
/>
<v-divider v-if="isMultiple && selectionData.length !== 0" :key="'two'" class="my-4" />
</transition-group>
</v-scroll-y-transition>
<!-- Loaded resources -->
<resource-group
:resources="resources"
@remove="removeResource"
@add-resource="addResource"
@show-add-overlay="showAddOverlay = true"
/>
<v-divider v-if="isMultiple" class="my-4" />
<!-- <v-divider v-if="isMultiple" class="my-4" /> -->
<!-- Views display -->
<views-display v-if="views.length !== 0" :views="views" />
<views-display v-if="views.length !== 0" :views="views" class="mt-4" />
<!-- Filters display -->
<filters
class="mt-4"
:props="objectProperties"
:source-application="
resources
@@ -110,6 +99,28 @@
<div style="height: 100vh; width: 100%; top: -64px; left: 0px; position: absolute">
<viewer @load-progress="captureProgress" @selection="captureSelect" />
</div>
<div
style="
height: 100vh;
width: 100%;
top: -64px;
left: 22px;
position: absolute;
z-index: 10;
pointer-events: none;
"
>
<object-selection
v-show="selectionData.length !== 0"
:key="'one'"
:objects="selectionData"
:stream-id="$route.params.streamId"
@clear-selection="selectionData = []"
/>
</div>
<!-- Viewer controls -->
<div
:style="`width: 100%; bottom: 12px; left: 0px; position: ${
$isMobile() ? 'fixed' : 'absolute'
@@ -118,6 +129,7 @@
>
<viewer-controls @show-add-overlay="showAddOverlay = true" />
</div>
<!-- Progress bar -->
<div v-if="!loadedModel" style="width: 20%; top: 45%; left: 40%; position: absolute">
<v-progress-linear
@@ -148,7 +160,12 @@
</h2>
</error-placeholder>
</div>
<v-dialog v-model="showAddOverlay" width="800" :fullscreen="$vuetify.breakpoint.smAndDown">
<v-dialog
v-model="showAddOverlay"
width="800"
:fullscreen="$vuetify.breakpoint.smAndDown"
style="z-index: 10000"
>
<stream-overlay-viewer
:stream-id="$route.params.streamId"
@add-resource="addResource"
@@ -331,7 +348,6 @@ export default {
if (!val && this.filterToSet) {
setTimeout(() => {
this.$store.commit('setFilterDirect', { filter: this.filterToSet })
// window.__viewer.applyFilter(this.filterToSet)
this.filterToSet = null
}, 200)
}
@@ -358,7 +374,6 @@ export default {
window.__viewer.cameraHandler.activeCam.name === 'ortho' ? 1 : 0,
controls._zoom
]
console.log(c)
let fullQuery = { ...this.$route.query }
delete fullQuery.c
this.$router
@@ -369,7 +384,6 @@ export default {
.catch(() => {})
}, 1000)
)
// TODO: check query params for filter and camera pos and set them
}, 300)
},
methods: {
@@ -4,7 +4,7 @@
<v-col cols="12">
<v-card :to="`/streams/${$route.params.streamId}/commits/${stream.commits.items[0].id}`">
<preview-image
:height="320"
:height="420"
:url="`/preview/${$route.params.streamId}/commits/${stream.commits.items[0].id}`"
></preview-image>
<list-item-commit
@@ -19,9 +19,9 @@
<v-col cols="12" style="height: 20px"></v-col>
<v-col
cols="12"
:xl="loggedIn ? 4 : 12"
class="pa-0 ma-0"
:order="`${$vuetify.breakpoint.xlOnly ? 'last' : ''}`"
xl="4"
:order="`${$vuetify.breakpoint.xl ? 'last' : ''}`"
:class="`${$vuetify.breakpoint.xl ? 'pl-4' : ''}`"
>
<v-card class="transparent elevation-0">
<v-toolbar class="transparent elevation-0">
@@ -37,7 +37,7 @@
cols="12"
sm="4"
md="4"
:xl="loggedIn ? 12 : 4"
xl="12"
>
<v-card :to="`/streams/${$route.params.streamId}/branches/${branch.name}`">
<preview-image
@@ -56,16 +56,11 @@
:color="`grey ${$vuetify.theme.dark ? 'darken-1' : 'lighten-1'}`"
></v-badge>
</v-toolbar>
<!-- <list-item-commit
:commit="branch.commits.items[0]"
:stream-id="$route.params.streamId"
></list-item-commit> -->
</v-card>
</v-col>
</v-row>
</v-card>
</v-col>
<v-col v-if="loggedIn" cols="12" xl="8">
<v-card class="transparent elevation-0">
<v-toolbar class="transparent elevation-0">
@@ -74,7 +69,7 @@
</v-toolbar>
<v-card-title class="caption" style="margin-top: -30px">Recent activity log</v-card-title>
</v-card>
<div xxstyle="margin-top: -42px" class="mr-0">
<div class="mr-0">
<stream-activity></stream-activity>
</div>
</v-col>
@@ -41,16 +41,16 @@
</router-link>
</div>
<div class="text-truncate flex-shrink-0 hidden-xs-only">
<user-avatar
<!-- <user-avatar
:id="stream.commit.authorId"
:avatar="stream.commit.authorAvatar"
:name="stream.commit.authorName"
:size="20"
/>
<span class="caption mr-1">
/> -->
<!-- <span class="caption mr-1">
<timeago :datetime="stream.commit.createdAt"></timeago>
</span>
<source-app-avatar :application-name="stream.commit.sourceApplication" />
</span> -->
<!-- <source-app-avatar :application-name="stream.commit.sourceApplication" /> -->
<commit-received-receipts :commit-id="stream.commit.id" :stream-id="stream.id" />
<v-btn
v-if="stream && stream.role !== 'stream:reviewer' && stream.commit.authorId === $userId()"
@@ -1,10 +1,9 @@
<template>
<v-chip
small
v-tooltip="`Source Application: ${applicationName ? applicationName : 'unknown'}`"
x-small
class="ma-1 caption white--text no-hover"
:color="color"
:size="size"
v-tooltip="`Source Application: ${applicationName ? applicationName : 'unknown'}`"
>
{{ shortName }}
</v-chip>
@@ -12,10 +11,6 @@
<script>
export default {
props: {
size: {
type: Number,
default: 30
},
applicationName: {
type: String,
default: '?'