Skip to content

Commit e262a27

Browse files
committed
fix(files): use correct types for the Settings
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
1 parent 66d5faf commit e262a27

6 files changed

Lines changed: 79 additions & 79 deletions

File tree

apps/files/src/eventbus.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
*/
55

66
import type { IFileListFilter, Node, View } from '@nextcloud/files'
7-
import type { SearchScope } from './types.ts'
7+
import type { SearchScope, UserConfig } from './types.ts'
88

99
declare module '@nextcloud/event-bus' {
1010
export interface NextcloudEvents {
1111
// mapping of 'event name' => 'event type'
12-
'files:config:updated': { key: string, value: boolean }
12+
'files:config:updated': { key: string, value: UserConfig[string] }
1313
'files:view-config:updated': { key: string, value: string | number | boolean, view: string }
1414

1515
'files:favorites:removed': Node

apps/files/src/main.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { getCSPNonce } from '@nextcloud/auth'
77
import { PiniaVuePlugin } from 'pinia'
88
import Vue from 'vue'
99
import FilesApp from './FilesApp.vue'
10-
import SettingsModel from './models/Setting.js'
10+
import SettingsModel from './models/Setting.ts'
1111
import router from './router/router.ts'
1212
import RouterService from './services/RouterService.ts'
1313
import SettingsService from './services/Settings.js'

apps/files/src/models/Setting.js

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

apps/files/src/models/Setting.ts

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/**
2+
* SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
3+
* SPDX-License-Identifier: AGPL-3.0-or-later
4+
*/
5+
6+
export interface SettingData {
7+
el: () => HTMLElement
8+
open?: () => void
9+
close?: () => void
10+
order?: number
11+
}
12+
13+
export default class Setting {
14+
#name: string
15+
#options: Required<SettingData>
16+
17+
/**
18+
* Create a new files app setting
19+
*
20+
* @param name - The name of this setting
21+
* @param options - The setting options
22+
* @param options.el - Function that returns an unmounted dom element to be added
23+
* @param options.open - Callback for when setting is added
24+
* @param options.close - Callback for when setting is closed
25+
* @param options.order - The order of this setting, lower numbers are shown first
26+
* @since 19.0.0
27+
*/
28+
constructor(name: string, options: SettingData) {
29+
this.#name = name
30+
this.#options = {
31+
open: () => {},
32+
close: () => {},
33+
order: 0,
34+
...options,
35+
}
36+
37+
if (typeof this.#options.el !== 'function') {
38+
throw new Error('Setting must have an `el` function that returns a DOM element')
39+
}
40+
41+
if (typeof this.#name !== 'string') {
42+
throw new Error('Setting must have a `name` string')
43+
}
44+
45+
if (typeof this.#options.order !== 'number') {
46+
throw new Error('Setting must have an `order` number')
47+
}
48+
}
49+
50+
get name() {
51+
return this.#name
52+
}
53+
54+
get el() {
55+
return this.#options.el
56+
}
57+
58+
get open() {
59+
return this.#options.open
60+
}
61+
62+
get close() {
63+
return this.#options.close
64+
}
65+
66+
get order() {
67+
return this.#options.order
68+
}
69+
}

apps/files/src/store/userconfig.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { ref, set } from 'vue'
1616
const initialUserConfig = loadState<UserConfig>('files', 'config', {
1717
crop_image_previews: true,
1818
default_view: 'files',
19+
folder_tree: true,
1920
grid_view: false,
2021
show_files_extensions: true,
2122
show_hidden: false,
@@ -36,7 +37,7 @@ export const useUserConfigStore = defineStore('userconfig', () => {
3637
* @param key The config key
3738
* @param value The new value
3839
*/
39-
function onUpdate(key: string, value: boolean): void {
40+
function onUpdate<Key extends string>(key: Key, value: UserConfig[Key]): void {
4041
set(userConfig.value, key, value)
4142
}
4243

@@ -46,7 +47,7 @@ export const useUserConfigStore = defineStore('userconfig', () => {
4647
* @param key The config key
4748
* @param value The new value
4849
*/
49-
async function update(key: string, value: boolean): Promise<void> {
50+
async function update<Key extends string>(key: Key, value: UserConfig[Key]): Promise<void> {
5051
// only update if a user is logged in (not the case for public shares)
5152
if (getCurrentUser() !== null) {
5253
await axios.put(generateUrl('/apps/files/api/v1/config/{key}', { key }), {

apps/files/src/types.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,14 @@ export interface UserConfig {
5454

5555
crop_image_previews: boolean
5656
default_view: 'files' | 'personal'
57+
folder_tree: boolean
5758
grid_view: boolean
58-
show_files_extensions: boolean
59-
show_hidden: boolean
60-
show_mime_column: boolean
6159
sort_favorites_first: boolean
6260
sort_folders_first: boolean
6361

62+
show_files_extensions: boolean
63+
show_hidden: boolean
64+
show_mime_column: boolean
6465
show_dialog_deletion: boolean
6566
show_dialog_file_extension: boolean
6667
}

0 commit comments

Comments
 (0)