Skip to content

Commit f31b05d

Browse files
committed
feat(settings): add setting type inference
1 parent 405876d commit f31b05d

File tree

6 files changed

+79
-17
lines changed

6 files changed

+79
-17
lines changed

src/modules/mindmap/components/modals/Settings/Setting.vue

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
<template>
22
<div class="setting">
3-
<BaseSelect
4-
:value="setting.value"
5-
:options="setting.options"
6-
:reduce="(s) => s.value"
7-
:label="(s) => s.label"
8-
@input="change" />
3+
<component :is="component" :setting="setting" @change="change" />
94

105
<label class="setting__label" v-text="setting.label"></label>
116
</div>
@@ -14,6 +9,9 @@
149
<script>
1510
import { Mindmap } from '../../../types/mindmap'
1611
12+
import Toggle from './Types/Toggle.vue'
13+
import Select from './Types/Select.vue'
14+
1715
export default {
1816
props: {
1917
setting: {
@@ -22,6 +20,25 @@ export default {
2220
},
2321
},
2422
23+
components: {
24+
Toggle,
25+
Select,
26+
},
27+
28+
computed: {
29+
component() {
30+
if (typeof this.setting.value === 'boolean') {
31+
return Toggle
32+
}
33+
34+
if (Array.isArray(this.setting.options)) {
35+
return Select
36+
}
37+
38+
return null
39+
},
40+
},
41+
2542
methods: {
2643
change(value) {
2744
this.setting.set(value)
@@ -36,7 +53,6 @@ export default {
3653
justify-content: space-between;
3754
align-items: center;
3855
gap: 8px;
39-
width: 100%;
4056
}
4157
4258
.setting__label {
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<template>
2+
<BaseSelect
3+
:value="setting.value"
4+
:options="setting.options"
5+
:reduce="(s) => s.value"
6+
:label="(s) => s.label"
7+
@input="$emit('change', $event)" />
8+
</template>
9+
10+
<script>
11+
import Setting from '../../../../types/setting'
12+
13+
export default {
14+
props: {
15+
setting: {
16+
type: Setting,
17+
required: true,
18+
},
19+
},
20+
}
21+
</script>
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<template>
2+
<BaseToggle
3+
:value="setting.value"
4+
:description="setting.description"
5+
:disabled="setting.disabled"
6+
@input="$emit('change', $event)" />
7+
</template>
8+
9+
<script>
10+
import Setting from '../../../../types/setting'
11+
12+
export default {
13+
props: {
14+
setting: {
15+
type: Setting,
16+
required: true,
17+
},
18+
},
19+
}
20+
</script>

src/modules/mindmap/components/modals/Settings/index.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,13 @@ export default {
4949
.settings {
5050
display: flex;
5151
flex-direction: column;
52-
justify-content: center;
53-
align-items: flex-start;
52+
justify-content: stretch;
53+
gap: 16px;
5454
min-width: 250px;
5555
}
5656
5757
.settings__title {
58-
margin: 0 0 15px 0;
58+
margin: 0 0 16px 0;
5959
font-weight: bold;
6060
font-size: 20px;
6161
}

src/modules/mindmap/types/setting.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { Mindmap } from './mindmap'
1010
* @property {string} label
1111
* @property {any} value
1212
* @property {string[]} [options]
13-
* @property {SettingRunner} changed
13+
* @property {SettingRunner} [changed]
1414
*/
1515

1616
export default class Setting {
@@ -19,9 +19,9 @@ export default class Setting {
1919
constructor(mindmap, settingLike) {
2020
this.mindmap = mindmap
2121

22-
this.id = settingLike.id || ''
23-
this.label = settingLike.label || ''
24-
this.value = settingLike.value || null
22+
this.id = settingLike.id
23+
this.label = settingLike.label
24+
this.value = settingLike.value
2525
this.options = settingLike.options || []
2626

2727
this.#change = settingLike.changed || null

src/modules/mindmap/types/settings-manager.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,24 @@ export default class SettingsManager {
2626

2727
const setting = new Setting(this.mindmap, settingsLike)
2828
this.settings[setting.id] = setting
29-
setting.changed()
3029
}
3130

3231
get(key) {
3332
const setting = this.settings[key]
34-
if (!setting) return
33+
if (!setting) {
34+
console.warn('trying to get unknown setting', key)
35+
return null
36+
}
3537

3638
return setting.value
3739
}
3840

3941
set(key, value) {
4042
const setting = this.settings[key]
41-
if (!setting) return
43+
if (!setting) {
44+
console.warn('trying to set unknown setting', key)
45+
return
46+
}
4247

4348
setting.value = value
4449
setting.changed()

0 commit comments

Comments
 (0)