feat(frontend): Add Clone Button To Role Page

This commit is contained in:
Lilly Schramm 2025-06-20 20:27:40 +02:00
parent ebf21b474a
commit 6d98c9068c
7 changed files with 96 additions and 0 deletions

View file

@ -51,6 +51,7 @@ copyContent: "Copy contents"
copyLink: "Copy link"
copyRemoteLink: "Copy remote link"
copyLinkRenote: "Copy renote link"
clone: "Clone"
delete: "Delete"
deleteAndEdit: "Delete and edit"
deleteAndEditConfirm: "Are you sure you want to redraft this note? This means you will lose all reactions, renotes, and replies to it."

View file

@ -9,6 +9,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<div class="_gaps">
<div class="_buttons">
<MkButton primary rounded @click="edit"><i class="ti ti-pencil"></i> {{ i18n.ts.edit }}</MkButton>
<MkButton secondary rounded @click="clone"><i class="ti ti-copy"></i> {{ i18n.ts.clone }}</MkButton>
<MkButton danger rounded @click="del"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton>
</div>
<MkFolder>
@ -97,6 +98,13 @@ function edit() {
router.push('/admin/roles/' + role.id + '/edit');
}
async function clone() {
const newRole = await misskeyApi('admin/roles/clone', {
roleId: role.id,
});
router.push('/admin/roles/' + newRole.id + '/edit');
}
async function del() {
const { canceled } = await os.confirm({
type: 'warning',

View file

@ -326,6 +326,12 @@ type AdminResolveAbuseUserReportRequest = operations['admin___resolve-abuse-user
// @public (undocumented)
type AdminRolesAssignRequest = operations['admin___roles___assign']['requestBody']['content']['application/json'];
// @public (undocumented)
type AdminRolesCloneRequest = operations['admin___roles___clone']['requestBody']['content']['application/json'];
// @public (undocumented)
type AdminRolesCloneResponse = operations['admin___roles___clone']['responses']['200']['content']['application/json'];
// @public (undocumented)
type AdminRolesCreateRequest = operations['admin___roles___create']['requestBody']['content']['application/json'];
@ -1585,6 +1591,8 @@ declare namespace entities {
AdminResetPasswordResponse,
AdminResolveAbuseUserReportRequest,
AdminRolesAssignRequest,
AdminRolesCloneRequest,
AdminRolesCloneResponse,
AdminRolesCreateRequest,
AdminRolesCreateResponse,
AdminRolesDeleteRequest,

View file

@ -856,6 +856,17 @@ declare module '../api.js' {
credential?: string | null,
): Promise<SwitchCaseResponseType<E, P>>;
/**
* No description provided.
*
* **Credential required**: *Yes* / **Permission**: *write:admin:roles*
*/
request<E extends 'admin/roles/clone', P extends Endpoints[E]['req']>(
endpoint: E,
params: P,
credential?: string | null,
): Promise<SwitchCaseResponseType<E, P>>;
/**
* No description provided.
*

View file

@ -98,6 +98,8 @@ import type {
AdminResetPasswordResponse,
AdminResolveAbuseUserReportRequest,
AdminRolesAssignRequest,
AdminRolesCloneRequest,
AdminRolesCloneResponse,
AdminRolesCreateRequest,
AdminRolesCreateResponse,
AdminRolesDeleteRequest,
@ -738,6 +740,7 @@ export type Endpoints = {
'admin/reset-password': { req: AdminResetPasswordRequest; res: AdminResetPasswordResponse };
'admin/resolve-abuse-user-report': { req: AdminResolveAbuseUserReportRequest; res: EmptyResponse };
'admin/roles/assign': { req: AdminRolesAssignRequest; res: EmptyResponse };
'admin/roles/clone': { req: AdminRolesCloneRequest; res: AdminRolesCloneResponse };
'admin/roles/create': { req: AdminRolesCreateRequest; res: AdminRolesCreateResponse };
'admin/roles/delete': { req: AdminRolesDeleteRequest; res: EmptyResponse };
'admin/roles/list': { req: EmptyRequest; res: AdminRolesListResponse };

View file

@ -101,6 +101,8 @@ export type AdminResetPasswordRequest = operations['admin___reset-password']['re
export type AdminResetPasswordResponse = operations['admin___reset-password']['responses']['200']['content']['application/json'];
export type AdminResolveAbuseUserReportRequest = operations['admin___resolve-abuse-user-report']['requestBody']['content']['application/json'];
export type AdminRolesAssignRequest = operations['admin___roles___assign']['requestBody']['content']['application/json'];
export type AdminRolesCloneRequest = operations['admin___roles___clone']['requestBody']['content']['application/json'];
export type AdminRolesCloneResponse = operations['admin___roles___clone']['responses']['200']['content']['application/json'];
export type AdminRolesCreateRequest = operations['admin___roles___create']['requestBody']['content']['application/json'];
export type AdminRolesCreateResponse = operations['admin___roles___create']['responses']['200']['content']['application/json'];
export type AdminRolesDeleteRequest = operations['admin___roles___delete']['requestBody']['content']['application/json'];

View file

@ -711,6 +711,15 @@ export type paths = {
*/
post: operations['admin___roles___assign'];
};
'/admin/roles/clone': {
/**
* admin/roles/clone
* @description No description provided.
*
* **Credential required**: *Yes* / **Permission**: *write:admin:roles*
*/
post: operations['admin___roles___clone'];
};
'/admin/roles/create': {
/**
* admin/roles/create
@ -10385,6 +10394,60 @@ export type operations = {
};
};
};
/**
* admin/roles/clone
* @description No description provided.
*
* **Credential required**: *Yes* / **Permission**: *write:admin:roles*
*/
admin___roles___clone: {
requestBody: {
content: {
'application/json': {
/** Format: misskey:id */
roleId: string;
};
};
};
responses: {
/** @description OK (with results) */
200: {
content: {
'application/json': components['schemas']['Role'];
};
};
/** @description Client error */
400: {
content: {
'application/json': components['schemas']['Error'];
};
};
/** @description Authentication error */
401: {
content: {
'application/json': components['schemas']['Error'];
};
};
/** @description Forbidden error */
403: {
content: {
'application/json': components['schemas']['Error'];
};
};
/** @description I'm Ai */
418: {
content: {
'application/json': components['schemas']['Error'];
};
};
/** @description Internal server error */
500: {
content: {
'application/json': components['schemas']['Error'];
};
};
};
};
/**
* admin/roles/create
* @description No description provided.