gitlab-org--gitlab-foss/app/assets/javascripts/groups/components/group_item.vue

152 lines
3.4 KiB
Vue
Raw Normal View History

<script>
2017-12-11 07:28:11 -05:00
import { visitUrl } from '../../lib/utils/url_utility';
import tooltip from '../../vue_shared/directives/tooltip';
2017-08-30 01:52:08 -04:00
import identicon from '../../vue_shared/components/identicon.vue';
import eventHub from '../event_hub';
import itemCaret from './item_caret.vue';
import itemTypeIcon from './item_type_icon.vue';
import itemStats from './item_stats.vue';
import itemActions from './item_actions.vue';
export default {
directives: {
tooltip,
},
components: {
2017-08-30 01:52:08 -04:00
identicon,
itemCaret,
itemTypeIcon,
itemStats,
itemActions,
},
props: {
parentGroup: {
type: Object,
required: false,
2017-05-31 16:41:55 -04:00
default: () => ({}),
},
group: {
2017-06-06 10:01:42 -04:00
type: Object,
required: true,
},
2017-05-16 10:29:38 -04:00
},
computed: {
groupDomId() {
return `group-${this.group.id}`;
},
2017-05-16 10:29:38 -04:00
rowClass() {
return {
'is-open': this.group.isOpen,
'has-children': this.hasChildren,
'has-description': this.group.description,
'being-removed': this.group.isBeingRemoved,
2017-05-16 10:29:38 -04:00
};
},
hasChildren() {
return this.group.childrenCount > 0;
2017-05-30 18:22:30 -04:00
},
hasAvatar() {
return this.group.avatarUrl !== null;
},
isGroup() {
return this.group.type === 'group';
},
},
methods: {
onClickRowGroup(e) {
const NO_EXPAND_CLS = 'no-expand';
if (!(e.target.classList.contains(NO_EXPAND_CLS) ||
e.target.parentElement.classList.contains(NO_EXPAND_CLS))) {
if (this.hasChildren) {
eventHub.$emit('toggleChildren', this.group);
} else {
2017-12-11 07:28:11 -05:00
visitUrl(this.group.relativePath);
}
}
2017-07-31 06:34:25 -04:00
},
},
};
</script>
<template>
<li
2017-05-30 18:01:48 -04:00
@click.stop="onClickRowGroup"
:id="groupDomId"
2017-05-16 10:29:38 -04:00
:class="rowClass"
class="group-row"
>
2017-06-07 04:45:48 -04:00
<div
class="group-row-contents">
<item-actions
v-if="isGroup"
:group="group"
:parent-group="parentGroup"
/>
<item-stats
:item="group"
/>
2017-06-07 04:45:48 -04:00
<div
class="folder-toggle-wrap">
<item-caret
:is-group-open="group.isOpen"
/>
<item-type-icon
:item-type="group.type"
:is-group-open="group.isOpen"
/>
</div>
2017-06-07 04:45:48 -04:00
<div
class="avatar-container s40 hidden-xs"
:class="{ 'content-loading': group.isChildrenLoading }"
>
2017-06-07 04:45:48 -04:00
<a
:href="group.relativePath"
class="no-expand"
>
2017-06-07 04:45:48 -04:00
<img
2017-07-31 06:34:25 -04:00
v-if="hasAvatar"
2017-06-07 04:45:48 -04:00
class="avatar s40"
:src="group.avatarUrl"
/>
2017-08-30 01:52:08 -04:00
<identicon
2017-07-31 06:34:25 -04:00
v-else
2017-08-02 05:15:00 -04:00
:entity-id=group.id
:entity-name="group.name"
2017-07-31 06:34:25 -04:00
/>
</a>
</div>
2017-06-07 04:45:48 -04:00
<div
class="title namespace-title">
2017-06-07 04:45:48 -04:00
<a
v-tooltip
:href="group.relativePath"
:title="group.fullName"
class="no-expand"
data-placement="top"
>{{
// ending bracket must be by closing tag to prevent
// link hover text-decoration from over-extending
group.name
}}</a>
<span
v-if="group.permission"
class="user-access-role"
>
{{group.permission}}
</span>
</div>
2017-06-07 04:45:48 -04:00
<div
v-if="group.description"
class="description">
{{group.description}}
</div>
2017-05-16 10:29:38 -04:00
</div>
2017-06-07 04:45:48 -04:00
<group-folder
v-if="group.isOpen && hasChildren"
:parent-group="group"
:groups="group.children"
2017-06-07 04:45:48 -04:00
/>
2017-05-09 19:10:19 -04:00
</li>
</template>