Skip to content

Commit cbe279d

Browse files
authored
Merge pull request #3601 from nextcloud/chore/simplify-Typescript
chore: cleanup code after Typescript/Composition API migrations
2 parents b2f9a22 + f9e7c99 commit cbe279d

19 files changed

Lines changed: 1565 additions & 1312 deletions

‎src/FormsSubmit.vue‎

Lines changed: 49 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import type { FormsForm } from './models/Entities.d.ts'
2020
import { subscribe, unsubscribe } from '@nextcloud/event-bus'
2121
import { loadState } from '@nextcloud/initial-state'
2222
import { defineComponent } from 'vue'
23+
import { nextTick, onMounted, onUnmounted } from 'vue'
2324
import NcContent from '@nextcloud/vue/components/NcContent'
2425
import Submit from './views/Submit.vue'
2526
@@ -33,45 +34,14 @@ export default defineComponent({
3334
Submit,
3435
},
3536
36-
data() {
37-
return {
38-
form: loadState(formsAppName, 'form') as FormsForm,
39-
isLoggedIn: loadState(formsAppName, 'isLoggedIn') as boolean,
40-
isEmbedded: loadState(formsAppName, 'isEmbedded', false) as boolean,
41-
shareHash: loadState(formsAppName, 'shareHash') as string,
42-
}
43-
},
44-
45-
unmounted() {
46-
unsubscribe('forms:last-updated:set', this.onSubmitMessageEvent)
47-
},
48-
49-
mounted() {
50-
if (this.isEmbedded) {
51-
subscribe('forms:last-updated:set', this.onSubmitMessageEvent)
52-
53-
// Communicate window size to parent window in iframes
54-
const resizeObserver = new ResizeObserver((entries) => {
55-
this.emitResizeMessage(entries[0].target as HTMLElement)
56-
})
57-
this.$nextTick(() => {
58-
const formEl = document.querySelector('.app-forms-embedded form')
59-
if (formEl) {
60-
resizeObserver.observe(formEl)
61-
}
62-
})
63-
}
64-
},
37+
setup() {
38+
const form = loadState(formsAppName, 'form') as FormsForm
39+
const isLoggedIn = loadState(formsAppName, 'isLoggedIn') as boolean
40+
const isEmbedded = loadState(formsAppName, 'isEmbedded', false) as boolean
41+
const shareHash = loadState(formsAppName, 'shareHash') as string
42+
let resizeObserver: ResizeObserver | undefined
6543
66-
methods: {
67-
onSubmitMessageEvent(event: unknown): void {
68-
const id = Number(event)
69-
if (Number.isFinite(id)) {
70-
this.emitSubmitMessage(id)
71-
}
72-
},
73-
74-
emitSubmitMessage(id: number): void {
44+
const emitSubmitMessage = (id: number): void => {
7545
window.parent?.postMessage(
7646
{
7747
type: 'form-saved',
@@ -81,12 +51,19 @@ export default defineComponent({
8151
},
8252
'*',
8353
)
84-
},
54+
}
55+
56+
const onSubmitMessageEvent = (event: unknown): void => {
57+
const id = Number(event)
58+
if (Number.isFinite(id)) {
59+
emitSubmitMessage(id)
60+
}
61+
}
8562
8663
/**
8764
* @param target Target of which the size should be communicated
8865
*/
89-
emitResizeMessage(target: HTMLElement): void {
66+
const emitResizeMessage = (target: HTMLElement): void => {
9067
const rect = target.getBoundingClientRect()
9168
let height = rect.top + target.scrollHeight
9269
let width = target.scrollWidth
@@ -117,7 +94,38 @@ export default defineComponent({
11794
},
11895
'*',
11996
)
120-
},
97+
}
98+
99+
onMounted(() => {
100+
if (!isEmbedded) {
101+
return
102+
}
103+
104+
subscribe('forms:last-updated:set', onSubmitMessageEvent)
105+
106+
// Communicate window size to parent window in iframes
107+
resizeObserver = new ResizeObserver((entries) => {
108+
emitResizeMessage(entries[0].target as HTMLElement)
109+
})
110+
void nextTick(() => {
111+
const formEl = document.querySelector('.app-forms-embedded form')
112+
if (formEl) {
113+
resizeObserver?.observe(formEl)
114+
}
115+
})
116+
})
117+
118+
onUnmounted(() => {
119+
unsubscribe('forms:last-updated:set', onSubmitMessageEvent)
120+
resizeObserver?.disconnect()
121+
})
122+
123+
return {
124+
form,
125+
isLoggedIn,
126+
isEmbedded,
127+
shareHash,
128+
}
121129
},
122130
})
123131
</script>

‎src/components/AddQuestionMenu.vue‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
import IconPlus from '@material-symbols/svg-400/outlined/add.svg?raw'
6767
import IconChevronLeft from '@material-symbols/svg-400/outlined/chevron_left.svg?raw'
6868
import { t } from '@nextcloud/l10n'
69-
import { defineComponent, ref, toRef, watch } from 'vue'
69+
import { defineComponent, ref, watch } from 'vue'
7070
import NcActionButton from '@nextcloud/vue/components/NcActionButton'
7171
import NcActions from '@nextcloud/vue/components/NcActions'
7272
import NcActionSeparator from '@nextcloud/vue/components/NcActionSeparator'
@@ -103,11 +103,13 @@ export default defineComponent({
103103
setup(props, { emit }) {
104104
const activeQuestionType = ref<string | null>(null)
105105
const openLocal = ref<boolean>(props.open)
106-
const open = toRef(props, 'open')
107106
108-
watch(open, (value: boolean) => {
109-
openLocal.value = value
110-
})
107+
watch(
108+
() => props.open,
109+
(value: boolean) => {
110+
openLocal.value = value
111+
},
112+
)
111113
112114
watch(openLocal, (value: boolean) => {
113115
emit('update:open', value)

‎src/components/Questions/AnswerInput.vue‎

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
</template>
8181

8282
<script lang="ts">
83+
import type { PropType } from 'vue'
8384
import type { FormsOption } from '../../models/Entities.d.ts'
8485
8586
import IconPlus from '@material-symbols/svg-400/outlined/add.svg?raw'
@@ -118,7 +119,7 @@ export default defineComponent({
118119
119120
props: {
120121
answer: {
121-
type: Object,
122+
type: Object as PropType<FormsOption>,
122123
required: true,
123124
},
124125
@@ -180,18 +181,24 @@ export default defineComponent({
180181
const buttonOptionDown = ref<{ $el?: HTMLElement } | null>(null)
181182
const buttonOptionUp = ref<{ $el?: HTMLElement } | null>(null)
182183
const isIMEComposing = ref(false)
183-
const localText = ref((props.answer as FormsOption | undefined)?.text ?? '')
184+
const answer = computed(() => props.answer)
185+
const localText = ref(answer.value.text ?? '')
186+
187+
const getInputTarget = (
188+
event: Event | { target: EventTarget | null },
189+
): HTMLInputElement | null => {
190+
return event.target instanceof HTMLInputElement ? event.target : null
191+
}
184192
185193
const canCreateLocalAnswer = computed(() => {
186-
if ((props.answer as FormsOption).local) {
194+
if (answer.value.local) {
187195
return !!localText.value.trim()
188196
}
189-
return !!(props.answer as FormsOption).text?.trim()
197+
return !!answer.value.text?.trim()
190198
})
191199
192200
const ariaLabel = computed(() => {
193-
const answer = props.answer as FormsOption
194-
if (answer.local) {
201+
if (answer.value.local) {
195202
if (props.optionType === OptionType.Column) {
196203
return t('forms', 'Add a new column')
197204
}
@@ -220,13 +227,11 @@ export default defineComponent({
220227
})
221228
222229
const optionDragMenuId = computed(() => {
223-
const answer = props.answer as FormsOption
224-
return `q${answer.questionId}o${answer.id}o${props.optionType}__drag_menu`
230+
return `q${answer.value.questionId}o${answer.value.id}o${props.optionType}__drag_menu`
225231
})
226232
227233
const placeholder = computed(() => {
228-
const answer = props.answer as FormsOption
229-
if (answer.local) {
234+
if (answer.value.local) {
230235
if (props.optionType === OptionType.Column) {
231236
return t('forms', 'Add a new column')
232237
}
@@ -252,8 +257,7 @@ export default defineComponent({
252257
})
253258
254259
const pseudoIcon = computed(() => {
255-
const answer = props.answer as FormsOption
256-
if (answer.local) {
260+
if (answer.value.local) {
257261
return IconPlus
258262
}
259263
@@ -305,20 +309,19 @@ export default defineComponent({
305309
async function onInput(
306310
event: InputEvent | { target: HTMLInputElement; isComposing?: boolean },
307311
): Promise<void> {
308-
const target = event.target as HTMLInputElement | null
312+
const target = getInputTarget(event)
309313
if (!target) {
310314
return
311315
}
312316
313-
const answer = props.answer as FormsOption
314-
if (answer.local) {
317+
if (answer.value.local) {
315318
localText.value = target.value
316319
return
317320
}
318321
319322
if (!event.isComposing && !isIMEComposing.value && target.value !== '') {
320323
// clone answer
321-
const answerCopy = { ...answer }
324+
const answerCopy = { ...answer.value }
322325
if (!input.value) {
323326
return
324327
}
@@ -339,7 +342,7 @@ export default defineComponent({
339342
* @param e The keyboard event.
340343
*/
341344
const onEnter = (e: KeyboardEvent): void => {
342-
if ((props.answer as FormsOption).local) {
345+
if (answer.value.local) {
343346
void createLocalAnswer(e)
344347
return
345348
}
@@ -363,8 +366,8 @@ export default defineComponent({
363366
return
364367
}
365368
366-
const answer = {
367-
...(props.answer as FormsOption),
369+
const answerValue = {
370+
...answer.value,
368371
text: value,
369372
local: false,
370373
}
@@ -373,7 +376,7 @@ export default defineComponent({
373376
try {
374377
// Forward changes, but use current answer.text to avoid erasing
375378
// any in-between changes while creating the answer
376-
const newAnswer = await createAnswer(answer)
379+
const newAnswer = await createAnswer(answerValue)
377380
if (!input.value) {
378381
return
379382
}
@@ -413,7 +416,7 @@ export default defineComponent({
413416
return
414417
}
415418
416-
if ((props.answer as FormsOption).local) {
419+
if (answer.value.local) {
417420
return
418421
}
419422
@@ -424,7 +427,7 @@ export default defineComponent({
424427
// Dismiss delete key action
425428
e.preventDefault()
426429
void queue.value.add(() => {
427-
emit('delete', props.answer as FormsOption)
430+
emit('delete', props.answer)
428431
queue.value.pause()
429432
queue.value.clear()
430433
})
@@ -543,7 +546,7 @@ export default defineComponent({
543546
const onCompositionEnd = (
544547
event: CompositionEvent & { isComposing?: boolean },
545548
): void => {
546-
const target = event.target as HTMLInputElement | null
549+
const target = getInputTarget(event)
547550
isIMEComposing.value = false
548551
if (!event.isComposing && target) {
549552
void onInput({ target, isComposing: event.isComposing })

‎src/components/Questions/QuestionColor.vue‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ export default defineComponent({
7474
7575
setup(props, { emit }) {
7676
const question = useQuestion(props, { emit })
77+
const values = computed(() => {
78+
return props.values as Array<string | null | undefined>
79+
})
7780
7881
const colorPickerPlaceholder = computed(() => {
7982
return props.readOnly
@@ -82,7 +85,7 @@ export default defineComponent({
8285
})
8386
8487
const pickedColor = computed(() => {
85-
return (props.values[0] as string | null | undefined) ?? ''
88+
return values.value[0] ?? ''
8689
})
8790
8891
const validate = async (): Promise<boolean> => {

0 commit comments

Comments
 (0)