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" copyLink: "Copy link"
copyRemoteLink: "Copy remote link" copyRemoteLink: "Copy remote link"
copyLinkRenote: "Copy renote link" copyLinkRenote: "Copy renote link"
clone: "Clone"
delete: "Delete" delete: "Delete"
deleteAndEdit: "Delete and edit" 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." 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="_gaps">
<div class="_buttons"> <div class="_buttons">
<MkButton primary rounded @click="edit"><i class="ti ti-pencil"></i> {{ i18n.ts.edit }}</MkButton> <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> <MkButton danger rounded @click="del"><i class="ti ti-trash"></i> {{ i18n.ts.delete }}</MkButton>
</div> </div>
<MkFolder> <MkFolder>
@ -97,6 +98,13 @@ function edit() {
router.push('/admin/roles/' + role.id + '/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() { async function del() {
const { canceled } = await os.confirm({ const { canceled } = await os.confirm({
type: 'warning', type: 'warning',

View file

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

View file

@ -856,6 +856,17 @@ declare module '../api.js' {
credential?: string | null, credential?: string | null,
): Promise<SwitchCaseResponseType<E, P>>; ): 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. * No description provided.
* *

View file

@ -98,6 +98,8 @@ import type {
AdminResetPasswordResponse, AdminResetPasswordResponse,
AdminResolveAbuseUserReportRequest, AdminResolveAbuseUserReportRequest,
AdminRolesAssignRequest, AdminRolesAssignRequest,
AdminRolesCloneRequest,
AdminRolesCloneResponse,
AdminRolesCreateRequest, AdminRolesCreateRequest,
AdminRolesCreateResponse, AdminRolesCreateResponse,
AdminRolesDeleteRequest, AdminRolesDeleteRequest,
@ -738,6 +740,7 @@ export type Endpoints = {
'admin/reset-password': { req: AdminResetPasswordRequest; res: AdminResetPasswordResponse }; 'admin/reset-password': { req: AdminResetPasswordRequest; res: AdminResetPasswordResponse };
'admin/resolve-abuse-user-report': { req: AdminResolveAbuseUserReportRequest; res: EmptyResponse }; 'admin/resolve-abuse-user-report': { req: AdminResolveAbuseUserReportRequest; res: EmptyResponse };
'admin/roles/assign': { req: AdminRolesAssignRequest; 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/create': { req: AdminRolesCreateRequest; res: AdminRolesCreateResponse };
'admin/roles/delete': { req: AdminRolesDeleteRequest; res: EmptyResponse }; 'admin/roles/delete': { req: AdminRolesDeleteRequest; res: EmptyResponse };
'admin/roles/list': { req: EmptyRequest; res: AdminRolesListResponse }; '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 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 AdminResolveAbuseUserReportRequest = operations['admin___resolve-abuse-user-report']['requestBody']['content']['application/json'];
export type AdminRolesAssignRequest = operations['admin___roles___assign']['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 AdminRolesCreateRequest = operations['admin___roles___create']['requestBody']['content']['application/json'];
export type AdminRolesCreateResponse = operations['admin___roles___create']['responses']['200']['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']; 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']; 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': {
/** /**
* 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 * admin/roles/create
* @description No description provided. * @description No description provided.