mirror of
https://codeberg.org/yeentown/barkey
synced 2024-12-05 04:27:26 +00:00
bff813042e
* refactor(frontend): noteSearchAvailableをaccountsに移動 * feat: searchページでのクエリの受取りとtypeによる表示タブの変更 * user検索でsearchの親から受け取った値を基に入力値を初期化 * feat(frontend): ノート検索で親(search)からの情報を基にユーザー情報を取得 * feat(frontend): ユーザーのノートを検索するページに遷移するボタン * feat(frontend): ノート検索にホスト名指定のオプション追加 also 🎨 * style: ただ照会部分を囲っただけ(可読性確保のために) * refactor: remove unneed import defineProps and withDefaults are compiler micro when using `<script setup>` FYI: https://vuejs.org/api/sfc-script-setup.html#defineprops-defineemits:~:text=defineProps%20and%20defineEmits%20are%20compiler%20macros%20only%20usable%20inside%20%3Cscript%20setup%3E.%20They%20do%20not%20need%20to%20be%20imported%2C%20and%20are%20compiled%20away%20when%20%3Cscript%20setup%3E%20is%20processed. * Update CHANGELOG * Fix: ノート検索の初期値が常にホスト指定になってしまう * notesSearchAvailableをaccountに持たせるのをやめる * SDPX-Licence-Identifier * Fix: Vitest fails due to instance.policies being undefined * Add Storybook for search * Fix(storybook): ノート検索が利用できないと出てしまう問題 * storybookでユーザー選択ができないのを修正 * feat: ノート検索で自分を選択可能に & 🎨 * feat(background): api/metaで検索可能なノートのスコープを参照できるように * globalのノートが検索不可能な場合、検索オプションを表示しないように * Update CHANGELOG.md * config.meilisearch.scopeがstring[]を取ることがあるので修正 * meilisearchを利用かつscopeがlocalの場合、リモートユーザーのメニューで「このユーザーのノートを検索」を出さないように * hostが空文字の時の挙動を修正 * ローカルのみしかノートがインデックスされていない場合、リモートユーザーも選択できなくした
87 lines
2 KiB
Vue
87 lines
2 KiB
Vue
<!--
|
|
SPDX-FileCopyrightText: syuilo and misskey-project
|
|
SPDX-License-Identifier: AGPL-3.0-only
|
|
-->
|
|
|
|
<script lang="ts">
|
|
import { VNode, defineComponent, h, ref, watch } from 'vue';
|
|
import MkRadio from './MkRadio.vue';
|
|
|
|
export default defineComponent({
|
|
props: {
|
|
modelValue: {
|
|
required: false,
|
|
},
|
|
},
|
|
setup(props, context) {
|
|
const value = ref(props.modelValue);
|
|
watch(value, () => {
|
|
context.emit('update:modelValue', value.value);
|
|
});
|
|
watch(() => props.modelValue, v => {
|
|
value.value = v;
|
|
});
|
|
if (!context.slots.default) return null;
|
|
let options = context.slots.default();
|
|
const label = context.slots.label && context.slots.label();
|
|
const caption = context.slots.caption && context.slots.caption();
|
|
|
|
// なぜかFragmentになることがあるため
|
|
if (options.length === 1 && options[0].props == null) options = options[0].children as VNode[];
|
|
|
|
// vnodeのうちv-if=falseなものを除外する(trueになるものはoptionなど他typeになる)
|
|
options = options.filter(vnode => !(typeof vnode.type === 'symbol' && vnode.type.description === 'v-cmt' && vnode.children === 'v-if'));
|
|
|
|
return () => h('div', {
|
|
class: 'novjtcto',
|
|
}, [
|
|
...(label ? [h('div', {
|
|
class: 'label',
|
|
}, label)] : []),
|
|
h('div', {
|
|
class: 'body',
|
|
}, options.map(option => h(MkRadio, {
|
|
key: option.key as string,
|
|
value: option.props?.value,
|
|
disabled: option.props?.disabled,
|
|
modelValue: value.value,
|
|
'onUpdate:modelValue': _v => value.value = _v,
|
|
}, () => option.children)),
|
|
),
|
|
...(caption ? [h('div', {
|
|
class: 'caption',
|
|
}, caption)] : []),
|
|
]);
|
|
},
|
|
});
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
.novjtcto {
|
|
> .label {
|
|
font-size: 0.85em;
|
|
padding: 0 0 8px 0;
|
|
user-select: none;
|
|
|
|
&:empty {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
> .body {
|
|
display: flex;
|
|
gap: 12px;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
> .caption {
|
|
font-size: 0.85em;
|
|
padding: 8px 0 0 0;
|
|
color: var(--fgTransparentWeak);
|
|
|
|
&:empty {
|
|
display: none;
|
|
}
|
|
}
|
|
}
|
|
</style>
|