Skip to content

Commit 0ddfba4

Browse files
committed
feat: add ResourceIndicator extensions
1 parent 5463132 commit 0ddfba4

File tree

5 files changed

+75
-0
lines changed

5 files changed

+75
-0
lines changed

packages/web-pkg/src/composables/piniaStores/extensionRegistry/types.ts

+7
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@ import { Item } from '@ownclouders/web-client'
55
import { FolderView } from '../../../ui'
66
import { Component, Slot } from 'vue'
77
import { StringUnionOrAnyString } from '../../../utils'
8+
import { ResourceIndicator } from '../../../helpers'
89

910
export type ExtensionType = StringUnionOrAnyString<
1011
| 'action'
1112
| 'appMenuItem'
1213
| 'customComponent'
1314
| 'folderView'
15+
| 'resourceIndicator'
1416
| 'search'
1517
| 'sidebarNav'
1618
| 'sidebarPanel'
@@ -67,6 +69,11 @@ export interface AppMenuItemExtension extends Extension {
6769
url?: string
6870
}
6971

72+
export interface ResourceIndicatorExtension extends Extension {
73+
type: 'resourceIndicator'
74+
getResourceIndicators: (Resource) => ResourceIndicator[] | void
75+
}
76+
7077
export type ExtensionPoint<T extends Extension> = {
7178
id: string
7279
extensionType: ExtensionType
+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { Extension, ExtensionPoint, ResourceIndicatorExtension } from './'
2+
import { computed } from 'vue'
3+
4+
export const resourceIndicatorExtensionPoint: ExtensionPoint<ResourceIndicatorExtension> = {
5+
id: 'global.files.resource-indicator',
6+
extensionType: 'resourceIndicator',
7+
multiple: true
8+
}
9+
10+
export const extensionPoints = () => {
11+
return computed<ExtensionPoint<Extension>[]>(() => {
12+
return [resourceIndicatorExtensionPoint]
13+
})
14+
}

packages/web-pkg/src/helpers/statusIndicators.ts

+11
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { ShareTypes } from '@ownclouders/web-client'
22
import { eventBus } from '../services'
33
import { SideBarEventTopics } from '../composables/sideBar'
4+
import { useExtensionRegistry } from '../composables/piniaStores/extensionRegistry'
45
import { Resource } from '@ownclouders/web-client'
56
import { AncestorMetaData } from '../types'
67
import {
@@ -10,6 +11,7 @@ import {
1011
} from '@ownclouders/web-client'
1112
import { User } from '@ownclouders/web-client/graph/generated'
1213
import { IconFillType } from './resource'
14+
import { resourceIndicatorExtensionPoint } from '../extensionPoints'
1315

1416
// dummy to trick gettext string extraction into recognizing strings
1517
const $gettext = (str: string): string => {
@@ -157,5 +159,14 @@ export const getIndicators = ({
157159
}
158160
}
159161

162+
;(useExtensionRegistry().requestExtensions(resourceIndicatorExtensionPoint) || []).forEach(
163+
(extension) => {
164+
const extensionIndicators = extension.getResourceIndicators(resource)
165+
if (extensionIndicators) {
166+
indicators.push(...extensionIndicators)
167+
}
168+
}
169+
)
170+
160171
return indicators
161172
}

packages/web-pkg/src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ export * from './components'
33
export * from './composables'
44
export * from './constants'
55
export * from './errors'
6+
export * from './extensionPoints'
67
export * from './helpers'
78
export * from './http'
89
export * from './observer'

packages/web-pkg/tests/unit/helpers/statusIndicator.spec.ts

+42
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,52 @@ import { Resource, SpaceResource } from '@ownclouders/web-client'
33
import { getIndicators } from '../../../src/helpers/statusIndicators'
44
import { User } from '@ownclouders/web-client/graph/generated'
55
import { AncestorMetaDataValue } from '../../../src/types'
6+
import { ResourceIndicator } from '../../../src/helpers'
7+
import { createTestingPinia } from '@ownclouders/web-test-helpers'
8+
import {
9+
ResourceIndicatorExtension,
10+
useExtensionRegistry
11+
} from '../../../src/composables/piniaStores/extensionRegistry'
612

713
describe('status indicators', () => {
814
const user = mock<User>()
915

16+
createTestingPinia()
17+
18+
describe('indicator extensions', () => {
19+
it('should be requested from the extension registry', () => {
20+
const space = mock<SpaceResource>({ driveType: 'project' })
21+
const resource = mock<Resource>({ id: 'resource' })
22+
23+
const { requestExtensions } = useExtensionRegistry()
24+
vi.mocked(requestExtensions<ResourceIndicatorExtension>).mockReturnValue([
25+
{
26+
id: 'test.files.resource-indicator.stub',
27+
type: 'resourceIndicator',
28+
extensionPointIds: ['global.files.resource-indicator'],
29+
getResourceIndicators: (resource: Resource): ResourceIndicator[] => {
30+
return [
31+
{
32+
id: 'some-id',
33+
accessibleDescription: 'some accessible description',
34+
label: 'some label',
35+
icon: 'check_box_outline_blank',
36+
fillType: 'line',
37+
type: 'some-type',
38+
category: 'system'
39+
}
40+
]
41+
}
42+
} satisfies ResourceIndicatorExtension
43+
])
44+
45+
const indicators = getIndicators({ space, resource, ancestorMetaData: {}, user })
46+
47+
expect(requestExtensions).toHaveBeenCalled()
48+
expect(indicators.some(({ id }) => id === 'some-id')).toBeTruthy()
49+
})
50+
})
51+
1052
describe('locked indicator', () => {
1153
it.each([true, false])('should only be present if the file is locked', (locked) => {
1254
const space = mock<SpaceResource>({ id: 'space' })

0 commit comments

Comments
 (0)