Skip to content

Commit 015bf26

Browse files
committed
refactor: migrate reference widget related function to Typescript
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
1 parent 2972a7a commit 015bf26

File tree

15 files changed

+327
-247
lines changed

15 files changed

+327
-247
lines changed

src/components/NcRichText/NcReferencePicker/NcCustomPickerElement.vue

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@
88
</template>
99

1010
<script>
11-
import { renderCustomPickerElement, isCustomPickerElementRegistered, destroyCustomPickerElement } from './../../../functions/reference/customPickerElements.js'
11+
import {
12+
renderCustomPickerElement,
13+
isCustomPickerElementRegistered,
14+
destroyCustomPickerElement,
15+
} from '../../../functions/reference/customPickerElements.ts'
1216
1317
export default {
1418
name: 'NcCustomPickerElement',

src/components/NcRichText/NcReferencePicker/NcProviderList.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
</template>
4343

4444
<script>
45-
import { searchProvider } from './../../../functions/reference/providerHelper.js'
45+
import { searchProvider } from '../../../functions/reference/providerHelper.ts'
4646
import { isUrl } from './utils.js'
4747
import NcEmptyContent from '../../NcEmptyContent/index.ts'
4848
import NcHighlight from '../../NcHighlight/index.js'

src/components/NcRichText/NcReferencePicker/NcReferencePicker.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ import NcCustomPickerElement from './NcCustomPickerElement.vue'
3838
import NcProviderList from './NcProviderList.vue'
3939
import NcRawLinkInput from './NcRawLinkInput.vue'
4040
import NcSearch from './NcSearch.vue'
41-
import { isCustomPickerElementRegistered } from './../../../functions/reference/customPickerElements.js'
42-
import { touchProvider } from './../../../functions/reference/providerHelper.js'
41+
import { isCustomPickerElementRegistered } from '../../../functions/reference/customPickerElements.ts'
42+
import { touchProvider } from '../../../functions/reference/providerHelper.ts'
4343
4444
const MODES = {
4545
providerList: 1,

src/components/NcRichText/NcReferencePicker/NcReferencePickerModal.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343

4444
<script>
4545
import NcReferencePicker from './NcReferencePicker.vue'
46-
import { getCustomPickerElementSize, isCustomPickerElementRegistered } from './../../../functions/reference/customPickerElements.js'
46+
import { getCustomPickerElementSize, isCustomPickerElementRegistered } from '../../../functions/reference/customPickerElements.ts'
4747
import NcButton from '../../NcButton/index.ts'
4848
import NcModal from '../../NcModal/index.js'
4949
import { t } from '../../../l10n.js'

src/components/NcRichText/index.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,20 @@ import NcReferenceWidget from './NcReferenceWidget.vue'
1111
import NcReferencePicker from './NcReferencePicker/NcReferencePicker.vue'
1212
import NcReferencePickerModal from './NcReferencePicker/NcReferencePickerModal.vue'
1313
import NcSearch from './NcReferencePicker/NcSearch.vue'
14-
import { getLinkWithPicker } from './../../functions/reference/referencePickerModal.js'
14+
import { getLinkWithPicker } from '../../functions/reference/referencePickerModal.ts'
1515
import {
1616
getProvider,
1717
getProviders,
1818
sortProviders,
1919
searchProvider,
2020
anyLinkProviderId,
21-
} from '../../functions/reference/providerHelper.js'
21+
} from '../../functions/reference/providerHelper.ts'
2222
import {
2323
registerCustomPickerElement,
2424
renderCustomPickerElement,
2525
isCustomPickerElementRegistered,
2626
NcCustomPickerRenderResult,
27-
} from '../../functions/reference/customPickerElements.js'
27+
} from '../../functions/reference/customPickerElements.ts'
2828

2929
export default NcRichText
3030

src/functions/reference/customPickerElements.js

Lines changed: 0 additions & 79 deletions
This file was deleted.
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
/**
2+
* SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
3+
* SPDX-License-Identifier: AGPL-3.0-or-later
4+
*/
5+
6+
import logger from '../../utils/logger'
7+
8+
window._vue_richtext_custom_picker_elements ??= {}
9+
window._registerCustomPickerElement ??= registerCustomPickerElement
10+
11+
/**
12+
* Representation of the render callback result
13+
* It contains a dom element and an object (Vue instance or other fancy things)
14+
*/
15+
export class NcCustomPickerRenderResult {
16+
17+
public element: HTMLElement
18+
public object: object
19+
20+
/**
21+
* @param element - The HTML element
22+
* @param object - The object
23+
*/
24+
constructor(element: HTMLElement, object: object) {
25+
this.element = element
26+
this.object = object
27+
}
28+
29+
}
30+
31+
interface CustomPickerElementProps {
32+
providerId: number
33+
accessible: boolean
34+
}
35+
36+
type CustomPickerElementRegistrationCallback = (el: HTMLElement, options: CustomPickerElementProps) => void
37+
type CustomPickerElementDestroyCallback = (el: HTMLElement, result: NcCustomPickerRenderResult) => void
38+
39+
export interface CustomPickerElement {
40+
id: string
41+
size: 'small' | 'normal' | 'large' | 'full'
42+
43+
callback: CustomPickerElementRegistrationCallback
44+
onDestroy: CustomPickerElementDestroyCallback
45+
}
46+
47+
/**
48+
* @param id - Id of the element to check
49+
*/
50+
export function isCustomPickerElementRegistered(id: string): boolean {
51+
return !!window._vue_richtext_custom_picker_elements[id]
52+
}
53+
54+
/**
55+
* @param id - Id of the element to get
56+
*/
57+
export function getCustomPickerElementSize(id: string): 'small' | 'normal' | 'large' | 'full' | null {
58+
const size = window._vue_richtext_custom_picker_elements[id]?.size
59+
if (['small', 'normal', 'large', 'full'].includes(size)) {
60+
return size
61+
}
62+
return null
63+
}
64+
65+
/**
66+
* @param id - Id of element to register
67+
* @param callback - Render callback
68+
* @param onDestroy - Cleanup callback
69+
* @param size - Size of the element
70+
*/
71+
export function registerCustomPickerElement(
72+
id: string,
73+
callback: CustomPickerElementRegistrationCallback,
74+
onDestroy: CustomPickerElementDestroyCallback = () => {},
75+
size: CustomPickerElement['size'] = 'large',
76+
) {
77+
if (window._vue_richtext_custom_picker_elements[id]) {
78+
logger.error(`Custom reference picker element for id ${id} already registered`)
79+
return
80+
}
81+
82+
window._vue_richtext_custom_picker_elements[id] = {
83+
id,
84+
callback,
85+
onDestroy,
86+
size,
87+
}
88+
}
89+
90+
/**
91+
* @param el - element to render to
92+
* @param options - Element options
93+
*/
94+
export function renderCustomPickerElement(el: HTMLElement, options: CustomPickerElementProps) {
95+
const { providerId, accessible } = options
96+
if (!window._vue_richtext_custom_picker_elements[providerId]) {
97+
logger.error(`Custom reference picker element for reference provider ID ${providerId} not registered`)
98+
return
99+
}
100+
101+
return window._vue_richtext_custom_picker_elements[providerId]
102+
.callback(el, { providerId, accessible })
103+
}
104+
105+
/**
106+
* @param providerId - Provider id of element to destroy
107+
* @param el - The element to destroy element from
108+
* @param renderResult - The render result
109+
*/
110+
export function destroyCustomPickerElement(providerId: string, el: HTMLElement, renderResult: NcCustomPickerRenderResult) {
111+
if (!window._vue_richtext_custom_picker_elements[providerId]) {
112+
return
113+
}
114+
115+
window._vue_richtext_custom_picker_elements[providerId]
116+
.onDestroy(el, renderResult)
117+
}

src/functions/reference/index.js

Lines changed: 0 additions & 38 deletions
This file was deleted.

src/functions/reference/index.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/**
2+
* SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
3+
* SPDX-License-Identifier: AGPL-3.0-or-later
4+
*/
5+
6+
export {
7+
type ReferenceWidgetProps,
8+
type ReferenceWidgetRenderProperties,
9+
10+
registerWidget,
11+
renderWidget,
12+
isWidgetRegistered,
13+
hasInteractiveView,
14+
} from './widgets.ts'
15+
16+
export { getLinkWithPicker } from './referencePickerModal.ts'
17+
18+
export {
19+
type ReferenceProvider,
20+
21+
getProvider,
22+
getProviders,
23+
sortProviders,
24+
searchProvider,
25+
anyLinkProviderId,
26+
} from './providerHelper.ts'
27+
28+
export {
29+
type CustomPickerElement,
30+
registerCustomPickerElement,
31+
renderCustomPickerElement,
32+
isCustomPickerElementRegistered,
33+
NcCustomPickerRenderResult,
34+
} from './customPickerElements.ts'

0 commit comments

Comments
 (0)