Skip to content

Commit 8f15c4d

Browse files
improved organization folder organization hierarchy UI
1 parent 8071e6f commit 8f15c4d

File tree

4 files changed

+70
-45
lines changed

4 files changed

+70
-45
lines changed

lib/Controller/OrganizationFolderController.php

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
1010

1111
use OCA\OrganizationFolders\Model\OrganizationFolder;
12-
use OCA\OrganizationFolders\Model\PrincipalFactory;
12+
use OCA\OrganizationFolders\OrganizationProvider\OrganizationProviderManager;
1313
use OCA\OrganizationFolders\Service\ResourceService;
1414
use OCA\OrganizationFolders\Service\OrganizationFolderMemberService;
1515
use OCA\OrganizationFolders\Service\OrganizationFolderService;
@@ -28,7 +28,7 @@ public function __construct(
2828
private OrganizationFolderService $service,
2929
private OrganizationFolderMemberService $memberService,
3030
private ResourceService $resourceService,
31-
private PrincipalFactory $principalFactory,
31+
private OrganizationProviderManager $organizationProviderManager,
3232
private string $userId,
3333
) {
3434
parent::__construct();
@@ -52,10 +52,22 @@ private function getApiObjectFromEntity(OrganizationFolder $organizationFolder,
5252
$result = $organizationFolder->jsonSerialize();
5353
}
5454

55-
$result["organizationPrincipal"] = $this->principalFactory->buildOrganizationMemberPrincipal(
56-
organizationProviderId: $organizationFolder->getOrganizationProvider(),
57-
organizationId: $organizationFolder->getOrganizationId(),
58-
);
55+
try {
56+
$organizationProvider = $this->organizationProviderManager->getOrganizationProvider($organizationFolder->getOrganizationProvider());
57+
$organization = $organizationProvider->getOrganization($organizationFolder->getOrganizationId());
58+
59+
$organizationFullHierarchyNames = [$organization->getFriendlyName()];
60+
61+
while($organization?->getParentOrganizationId() && $organization = $organizationProvider->getOrganization($organization->getParentOrganizationId())) {
62+
$organizationFullHierarchyNames[] = $organization->getFriendlyName();
63+
}
64+
65+
$organizationFullHierarchyNames[] = $organizationProvider->getFriendlyName();
66+
67+
$result["organizationFullHierarchyNames"] = array_reverse($organizationFullHierarchyNames);
68+
} catch (\Throwable $e) {
69+
$result["organizationFullHierarchyNames"] = ["Invalid organization"];
70+
}
5971
}
6072

6173
if ($this->shouldInclude(self::PERMISSIONS_INCLUDE, $includes)) {

src/components/Hierarchy.vue

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<script setup>
2+
import ChevronRight from "vue-material-design-icons/ChevronRight.vue";
3+
4+
const props = defineProps({
5+
hierarchyNames: {
6+
type: Array,
7+
required: true,
8+
},
9+
});
10+
11+
</script>
12+
13+
<template>
14+
<div class="hierarchyNameParts">
15+
<div v-for="(hierarchyNamePart, index) of props.hierarchyNames" :key="hierarchyNamePart">
16+
<p v-tooltip="hierarchyNamePart">
17+
{{ hierarchyNamePart }}
18+
</p>
19+
<ChevronRight v-if="index !== props.hierarchyNames.length - 1" :size="20" />
20+
</div>
21+
</div>
22+
</template>
23+
24+
<style lang="scss" scoped>
25+
.hierarchyNameParts {
26+
display: inline-flex;
27+
max-width: 100%;
28+
overflow-x: clip;
29+
30+
> div {
31+
display: inline-flex;
32+
min-width: 20px;
33+
34+
&:last-child {
35+
flex-shrink: 0;
36+
}
37+
38+
> p {
39+
white-space: nowrap;
40+
overflow: hidden;
41+
42+
&:not(:last-child) {
43+
text-overflow: ellipsis;
44+
}
45+
}
46+
}
47+
}
48+
</style>

src/components/Principal.vue

Lines changed: 2 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup>
2-
import ChevronRight from "vue-material-design-icons/ChevronRight.vue";
2+
import Hierarchy from "./Hierarchy.vue";
33
44
const props = defineProps({
55
principal: {
@@ -11,38 +11,5 @@ const props = defineProps({
1111
</script>
1212

1313
<template>
14-
<div class="fullHierarchyNameParts">
15-
<div v-for="(fullHierarchyNamePart, index) of props.principal.fullHierarchyNames" :key="fullHierarchyNamePart">
16-
<p v-tooltip="fullHierarchyNamePart">
17-
{{ fullHierarchyNamePart }}
18-
</p>
19-
<ChevronRight v-if="index !== props.principal.fullHierarchyNames.length - 1" :size="20" />
20-
</div>
21-
</div>
14+
<Hierarchy :hierarchy-names="props.principal.fullHierarchyNames" />
2215
</template>
23-
24-
<style lang="scss" scoped>
25-
.fullHierarchyNameParts {
26-
display: inline-flex;
27-
max-width: 100%;
28-
overflow-x: clip;
29-
30-
> div {
31-
display: inline-flex;
32-
min-width: 20px;
33-
34-
&:last-child {
35-
flex-shrink: 0;
36-
}
37-
38-
> p {
39-
white-space: nowrap;
40-
overflow: hidden;
41-
42-
&:not(:last-child) {
43-
text-overflow: ellipsis;
44-
}
45-
}
46-
}
47-
}
48-
</style>

src/views/OrganizationFolderSettings.vue

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import Pencil from "vue-material-design-icons/Pencil.vue";
1313
import Section from "../components/Section.vue";
1414
import SectionHeader from "../components/SectionHeader.vue";
1515
import HeaderButtonGroup from "../components/SectionHeaderButtonGroup.vue";
16-
import Principal from "../components/Principal.vue";
16+
import Hierarchy from "../components/Hierarchy.vue";
1717
import ResourceList from "../components/ResourceList.vue";
1818
import CreateResourceButton from "../components/CreateResourceButton.vue";
1919
import MembersList from "../components/MemberList/MembersList.vue";
@@ -141,8 +141,6 @@ const openOrganizationPicker = () => {
141141
const permissionLevelExplanation = t(
142142
"organization_folders",
143143
"Managers have access to the settings of top-level resources with manager inheritance enabled. Admins have access to the settings of all resources, regardless of their inheritance setting.",
144-
{},
145-
{ escape: false }
146144
);
147145
148146
</script>
@@ -178,7 +176,7 @@ const permissionLevelExplanation = t(
178176
<SectionHeader :text="t('organization_folders', 'Organization')"></SectionHeader>
179177
</template>
180178
<div style="display: flex; flex-direction: row; align-items: center;">
181-
<Principal :principal="organizationFolder?.organizationPrincipal" />
179+
<Hierarchy :hierarchy-names="organizationFolder?.organizationFullHierarchyNames" />
182180
<NcActions>
183181
<NcActionButton @click="openOrganizationPicker">
184182
<template #icon>

0 commit comments

Comments
 (0)