2020-01-29 20:37:25 +01:00
|
|
|
<template>
|
2023-04-08 02:01:42 +02:00
|
|
|
<div class="shaynizk">
|
|
|
|
<div class="form">
|
|
|
|
<MkInput v-model="name" class="_formBlock">
|
|
|
|
<template #label>{{ i18n.ts.name }}</template>
|
|
|
|
</MkInput>
|
|
|
|
<MkSelect v-model="src" class="_formBlock">
|
|
|
|
<template #label>{{ i18n.ts.antennaSource }}</template>
|
|
|
|
<option value="all">{{ i18n.ts._antennaSources.all }}</option>
|
|
|
|
<!--<option value="home">{{ i18n.ts._antennaSources.homeTimeline }}</option>-->
|
|
|
|
<option value="users">
|
|
|
|
{{ i18n.ts._antennaSources.users }}
|
|
|
|
</option>
|
|
|
|
<!--<option value="list">{{ i18n.ts._antennaSources.userList }}</option>-->
|
|
|
|
<!--<option value="group">{{ i18n.ts._antennaSources.userGroup }}</option>-->
|
|
|
|
<option value="instances">
|
|
|
|
{{ i18n.ts._antennaSources.instances }}
|
|
|
|
</option>
|
|
|
|
</MkSelect>
|
|
|
|
<MkSelect
|
|
|
|
v-if="src === 'list'"
|
|
|
|
v-model="userListId"
|
|
|
|
class="_formBlock"
|
|
|
|
>
|
|
|
|
<template #label>{{ i18n.ts.userList }}</template>
|
|
|
|
<option
|
|
|
|
v-for="list in userLists"
|
|
|
|
:key="list.id"
|
|
|
|
:value="list.id"
|
|
|
|
>
|
|
|
|
{{ list.name }}
|
|
|
|
</option>
|
|
|
|
</MkSelect>
|
|
|
|
<MkSelect
|
|
|
|
v-else-if="src === 'group'"
|
|
|
|
v-model="userGroupId"
|
|
|
|
class="_formBlock"
|
|
|
|
>
|
|
|
|
<template #label>{{ i18n.ts.userGroup }}</template>
|
|
|
|
<option
|
|
|
|
v-for="group in userGroups"
|
|
|
|
:key="group.id"
|
|
|
|
:value="group.id"
|
|
|
|
>
|
|
|
|
{{ group.name }}
|
|
|
|
</option>
|
|
|
|
</MkSelect>
|
|
|
|
<MkTextarea
|
|
|
|
v-else-if="src === 'users'"
|
|
|
|
v-model="users"
|
|
|
|
class="_formBlock"
|
|
|
|
>
|
|
|
|
<template #label>{{ i18n.ts.users }}</template>
|
|
|
|
<template #caption
|
|
|
|
>{{ i18n.ts.antennaUsersDescription }}
|
|
|
|
<button class="_textButton" @click="addUser">
|
|
|
|
{{ i18n.ts.addUser }}
|
|
|
|
</button></template
|
|
|
|
>
|
|
|
|
</MkTextarea>
|
|
|
|
<MkTextarea
|
|
|
|
v-else-if="src === 'instances'"
|
|
|
|
v-model="instances"
|
|
|
|
class="_formBlock"
|
|
|
|
>
|
|
|
|
<template #label>{{ i18n.ts.instances }}</template>
|
|
|
|
<template #caption
|
|
|
|
>{{ i18n.ts.antennaInstancesDescription }}
|
|
|
|
<button class="_textButton" @click="addInstance">
|
|
|
|
{{ i18n.ts.addInstance }}
|
|
|
|
</button></template
|
|
|
|
>
|
|
|
|
</MkTextarea>
|
|
|
|
<MkSwitch v-model="withReplies" class="_formBlock">{{
|
|
|
|
i18n.ts.withReplies
|
|
|
|
}}</MkSwitch>
|
|
|
|
<MkTextarea v-model="keywords" class="_formBlock">
|
|
|
|
<template #label>{{ i18n.ts.antennaKeywords }}</template>
|
|
|
|
<template #caption>{{
|
|
|
|
i18n.ts.antennaKeywordsDescription
|
|
|
|
}}</template>
|
|
|
|
</MkTextarea>
|
|
|
|
<MkTextarea v-model="excludeKeywords" class="_formBlock">
|
|
|
|
<template #label>{{ i18n.ts.antennaExcludeKeywords }}</template>
|
|
|
|
<template #caption>{{
|
|
|
|
i18n.ts.antennaKeywordsDescription
|
|
|
|
}}</template>
|
|
|
|
</MkTextarea>
|
|
|
|
<MkSwitch v-model="caseSensitive" class="_formBlock">{{
|
|
|
|
i18n.ts.caseSensitive
|
|
|
|
}}</MkSwitch>
|
|
|
|
<MkSwitch v-model="withFile" class="_formBlock">{{
|
|
|
|
i18n.ts.withFileAntenna
|
|
|
|
}}</MkSwitch>
|
|
|
|
<MkSwitch v-model="notify" class="_formBlock">{{
|
|
|
|
i18n.ts.notifyAntenna
|
|
|
|
}}</MkSwitch>
|
|
|
|
</div>
|
|
|
|
<div class="actions">
|
|
|
|
<MkButton inline primary @click="saveAntenna()"
|
|
|
|
><i class="ph-floppy-disk-back ph-bold ph-lg"></i>
|
|
|
|
{{ i18n.ts.save }}</MkButton
|
|
|
|
>
|
|
|
|
<MkButton
|
|
|
|
v-if="antenna.id != null"
|
|
|
|
inline
|
|
|
|
danger
|
|
|
|
@click="deleteAntenna()"
|
|
|
|
><i class="ph-trash ph-bold ph-lg"></i>
|
|
|
|
{{ i18n.ts.delete }}</MkButton
|
|
|
|
>
|
|
|
|
</div>
|
2020-01-29 20:37:25 +01:00
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
2022-05-25 09:37:15 +02:00
|
|
|
<script lang="ts" setup>
|
2023-04-08 02:01:42 +02:00
|
|
|
import { watch } from "vue";
|
|
|
|
import * as Acct from "calckey-js/built/acct";
|
|
|
|
import MkButton from "@/components/MkButton.vue";
|
|
|
|
import MkInput from "@/components/form/input.vue";
|
|
|
|
import MkTextarea from "@/components/form/textarea.vue";
|
|
|
|
import MkSelect from "@/components/form/select.vue";
|
|
|
|
import MkSwitch from "@/components/form/switch.vue";
|
|
|
|
import * as os from "@/os";
|
|
|
|
import { i18n } from "@/i18n";
|
2020-01-29 20:37:25 +01:00
|
|
|
|
2022-05-25 09:37:15 +02:00
|
|
|
const props = defineProps<{
|
2023-04-08 02:01:42 +02:00
|
|
|
antenna: any;
|
2022-05-25 09:37:15 +02:00
|
|
|
}>();
|
2020-01-29 20:37:25 +01:00
|
|
|
|
2022-05-25 09:37:15 +02:00
|
|
|
const emit = defineEmits<{
|
2023-04-08 02:01:42 +02:00
|
|
|
(ev: "created"): void;
|
|
|
|
(ev: "updated"): void;
|
|
|
|
(ev: "deleted"): void;
|
2022-05-25 09:37:15 +02:00
|
|
|
}>();
|
2020-01-29 20:37:25 +01:00
|
|
|
|
2022-05-25 09:37:15 +02:00
|
|
|
let name: string = $ref(props.antenna.name);
|
|
|
|
let src: string = $ref(props.antenna.src);
|
|
|
|
let userListId: any = $ref(props.antenna.userListId);
|
|
|
|
let userGroupId: any = $ref(props.antenna.userGroupId);
|
2023-04-08 02:01:42 +02:00
|
|
|
let users: string = $ref(props.antenna.users.join("\n"));
|
|
|
|
let instances: string = $ref(props.antenna.instances.join("\n"));
|
|
|
|
let keywords: string = $ref(
|
|
|
|
props.antenna.keywords.map((x) => x.join(" ")).join("\n")
|
|
|
|
);
|
|
|
|
let excludeKeywords: string = $ref(
|
|
|
|
props.antenna.excludeKeywords.map((x) => x.join(" ")).join("\n")
|
|
|
|
);
|
2022-05-25 09:37:15 +02:00
|
|
|
let caseSensitive: boolean = $ref(props.antenna.caseSensitive);
|
|
|
|
let withReplies: boolean = $ref(props.antenna.withReplies);
|
|
|
|
let withFile: boolean = $ref(props.antenna.withFile);
|
|
|
|
let notify: boolean = $ref(props.antenna.notify);
|
|
|
|
let userLists: any = $ref(null);
|
|
|
|
let userGroups: any = $ref(null);
|
2020-01-29 20:37:25 +01:00
|
|
|
|
2023-04-08 02:01:42 +02:00
|
|
|
watch(
|
|
|
|
() => src,
|
|
|
|
async () => {
|
|
|
|
if (src === "list" && userLists === null) {
|
|
|
|
userLists = await os.api("users/lists/list");
|
|
|
|
}
|
2020-02-14 17:03:59 +01:00
|
|
|
|
2023-04-08 02:01:42 +02:00
|
|
|
if (src === "group" && userGroups === null) {
|
|
|
|
const groups1 = await os.api("users/groups/owned");
|
|
|
|
const groups2 = await os.api("users/groups/joined");
|
2020-02-14 17:03:59 +01:00
|
|
|
|
2023-04-08 02:01:42 +02:00
|
|
|
userGroups = [...groups1, ...groups2];
|
|
|
|
}
|
2022-05-25 09:37:15 +02:00
|
|
|
}
|
2023-04-08 02:01:42 +02:00
|
|
|
);
|
2020-01-29 20:37:25 +01:00
|
|
|
|
2022-05-25 09:37:15 +02:00
|
|
|
async function saveAntenna() {
|
|
|
|
const antennaData = {
|
|
|
|
name,
|
|
|
|
src,
|
|
|
|
userListId,
|
|
|
|
userGroupId,
|
|
|
|
withReplies,
|
|
|
|
withFile,
|
|
|
|
notify,
|
|
|
|
caseSensitive,
|
2023-04-08 02:01:42 +02:00
|
|
|
users: users
|
|
|
|
.trim()
|
|
|
|
.split("\n")
|
|
|
|
.map((x) => x.trim()),
|
|
|
|
instances: instances
|
|
|
|
.trim()
|
|
|
|
.split("\n")
|
|
|
|
.map((x) => x.trim()),
|
|
|
|
keywords: keywords
|
|
|
|
.trim()
|
|
|
|
.split("\n")
|
|
|
|
.map((x) => x.trim().split(" ")),
|
|
|
|
excludeKeywords: excludeKeywords
|
|
|
|
.trim()
|
|
|
|
.split("\n")
|
|
|
|
.map((x) => x.trim().split(" ")),
|
2022-05-25 09:37:15 +02:00
|
|
|
};
|
2020-01-29 20:37:25 +01:00
|
|
|
|
2022-05-25 09:37:15 +02:00
|
|
|
if (props.antenna.id == null) {
|
2023-04-08 02:01:42 +02:00
|
|
|
await os.apiWithDialog("antennas/create", antennaData);
|
|
|
|
emit("created");
|
2022-05-25 09:37:15 +02:00
|
|
|
} else {
|
2023-04-08 02:01:42 +02:00
|
|
|
antennaData["antennaId"] = props.antenna.id;
|
|
|
|
await os.apiWithDialog("antennas/update", antennaData);
|
|
|
|
emit("updated");
|
2022-05-25 09:37:15 +02:00
|
|
|
}
|
|
|
|
}
|
2020-01-29 20:37:25 +01:00
|
|
|
|
2022-05-25 09:37:15 +02:00
|
|
|
async function deleteAntenna() {
|
|
|
|
const { canceled } = await os.confirm({
|
2023-04-08 02:01:42 +02:00
|
|
|
type: "warning",
|
|
|
|
text: i18n.t("removeAreYouSure", { x: props.antenna.name }),
|
2022-05-25 09:37:15 +02:00
|
|
|
});
|
|
|
|
if (canceled) return;
|
2020-01-29 20:37:25 +01:00
|
|
|
|
2023-04-08 02:01:42 +02:00
|
|
|
await os.api("antennas/delete", {
|
2022-05-25 09:37:15 +02:00
|
|
|
antennaId: props.antenna.id,
|
|
|
|
});
|
2020-01-29 20:37:25 +01:00
|
|
|
|
2022-05-25 09:37:15 +02:00
|
|
|
os.success();
|
2023-04-08 02:01:42 +02:00
|
|
|
emit("deleted");
|
2022-05-25 09:37:15 +02:00
|
|
|
}
|
2020-01-29 20:37:25 +01:00
|
|
|
|
2022-05-25 09:37:15 +02:00
|
|
|
function addUser() {
|
2023-04-08 02:01:42 +02:00
|
|
|
os.selectUser().then((user) => {
|
2022-05-25 09:37:15 +02:00
|
|
|
users = users.trim();
|
2023-02-12 02:22:05 +01:00
|
|
|
users += `\n@${Acct.toString(user as any)}`;
|
2022-05-25 09:37:15 +02:00
|
|
|
users = users.trim();
|
|
|
|
});
|
|
|
|
}
|
2023-02-12 02:20:17 +01:00
|
|
|
|
|
|
|
function addInstance() {
|
2023-04-08 02:01:42 +02:00
|
|
|
os.selectInstance().then((instance) => {
|
2023-02-12 02:20:17 +01:00
|
|
|
instances = instances.trim();
|
2023-04-08 02:01:42 +02:00
|
|
|
instances += "\n" + instance.host;
|
2023-02-12 02:20:17 +01:00
|
|
|
instances = instances.trim();
|
|
|
|
});
|
|
|
|
}
|
2020-01-29 20:37:25 +01:00
|
|
|
</script>
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
|
.shaynizk {
|
2021-08-07 10:55:16 +02:00
|
|
|
> .form {
|
|
|
|
padding: 32px;
|
|
|
|
}
|
|
|
|
|
|
|
|
> .actions {
|
|
|
|
padding: 24px 32px;
|
|
|
|
border-top: solid 0.5px var(--divider);
|
2020-01-29 20:37:25 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
</style>
|