mirror of
https://github.com/tobspr/shapez.io.git
synced 2024-10-27 20:34:29 +00:00
Allow deleting puzzles
This commit is contained in:
parent
2765e6e81d
commit
cc3242011f
@ -159,6 +159,25 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
> button.delete {
|
||||||
|
position: absolute;
|
||||||
|
@include S(top, 5px);
|
||||||
|
@include S(right, 5px);
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: center center;
|
||||||
|
background-size: 70%;
|
||||||
|
background-color: transparent !important;
|
||||||
|
@include S(width, 20px);
|
||||||
|
@include S(height, 20px);
|
||||||
|
padding: 0;
|
||||||
|
opacity: 0.7;
|
||||||
|
|
||||||
|
& {
|
||||||
|
/* @load-async */
|
||||||
|
background-image: uiResource("icons/delete.png") !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
> .stats {
|
> .stats {
|
||||||
grid-column: 2 / 3;
|
grid-column: 2 / 3;
|
||||||
grid-row: 3 / 4;
|
grid-row: 3 / 4;
|
||||||
|
@ -154,6 +154,20 @@ export class ClientAPI {
|
|||||||
return this._request("/v1/puzzles/download/" + puzzleId, {});
|
return this._request("/v1/puzzles/download/" + puzzleId, {});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {number} puzzleId
|
||||||
|
* @returns {Promise<import("../savegame/savegame_typedefs").PuzzleFullData>}
|
||||||
|
*/
|
||||||
|
apiDeletePuzzle(puzzleId) {
|
||||||
|
if (!this.isLoggedIn()) {
|
||||||
|
return Promise.reject("not-logged-in");
|
||||||
|
}
|
||||||
|
return this._request("/v1/puzzles/delete/" + puzzleId, {
|
||||||
|
method: "POST",
|
||||||
|
body: {},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {number} shortKey
|
* @param {number} shortKey
|
||||||
* @returns {Promise<import("../savegame/savegame_typedefs").PuzzleFullData>}
|
* @returns {Promise<import("../savegame/savegame_typedefs").PuzzleFullData>}
|
||||||
|
@ -185,6 +185,7 @@ export class PuzzleMenuState extends TextualGameState {
|
|||||||
for (const puzzle of puzzles) {
|
for (const puzzle of puzzles) {
|
||||||
const elem = document.createElement("div");
|
const elem = document.createElement("div");
|
||||||
elem.classList.add("puzzle");
|
elem.classList.add("puzzle");
|
||||||
|
elem.setAttribute("data-puzzle-id", String(puzzle.id));
|
||||||
|
|
||||||
if (this.activeCategory !== "mine") {
|
if (this.activeCategory !== "mine") {
|
||||||
elem.classList.toggle("completed", puzzle.completed);
|
elem.classList.toggle("completed", puzzle.completed);
|
||||||
@ -255,6 +256,23 @@ export class PuzzleMenuState extends TextualGameState {
|
|||||||
icon.appendChild(canvas);
|
icon.appendChild(canvas);
|
||||||
elem.appendChild(icon);
|
elem.appendChild(icon);
|
||||||
|
|
||||||
|
if (this.activeCategory === "mine") {
|
||||||
|
const deleteButton = document.createElement("button");
|
||||||
|
deleteButton.classList.add("styledButton", "delete");
|
||||||
|
this.trackClicks(
|
||||||
|
deleteButton,
|
||||||
|
() => {
|
||||||
|
this.tryDeletePuzzle(puzzle);
|
||||||
|
},
|
||||||
|
{
|
||||||
|
consumeEvents: true,
|
||||||
|
preventClick: true,
|
||||||
|
preventDefault: true,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
elem.appendChild(deleteButton);
|
||||||
|
}
|
||||||
|
|
||||||
container.appendChild(elem);
|
container.appendChild(elem);
|
||||||
|
|
||||||
this.trackClicks(elem, () => this.playPuzzle(puzzle));
|
this.trackClicks(elem, () => this.playPuzzle(puzzle));
|
||||||
@ -268,6 +286,33 @@ export class PuzzleMenuState extends TextualGameState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {import("../savegame/savegame_typedefs").PuzzleMetadata} puzzle
|
||||||
|
*/
|
||||||
|
tryDeletePuzzle(puzzle) {
|
||||||
|
const signals = this.dialogs.showWarning(
|
||||||
|
T.dialogs.puzzleDelete.title,
|
||||||
|
T.dialogs.puzzleDelete.desc.replace("<title>", puzzle.title),
|
||||||
|
["delete:bad", "cancel:good"]
|
||||||
|
);
|
||||||
|
signals.delete.add(() => {
|
||||||
|
const closeLoading = this.dialogs.showLoadingDialog();
|
||||||
|
|
||||||
|
this.asyncChannel
|
||||||
|
.watch(this.app.clientApi.apiDeletePuzzle(puzzle.id))
|
||||||
|
.then(() => {
|
||||||
|
const element = this.htmlElement.querySelector("[data-puzzle-id='" + puzzle.id + "']");
|
||||||
|
if (element) {
|
||||||
|
element.remove();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
this.dialogs.showWarning(T.global.error, String(err));
|
||||||
|
})
|
||||||
|
.then(closeLoading);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param {*} category
|
* @param {*} category
|
||||||
|
@ -393,6 +393,11 @@ dialogs:
|
|||||||
desc: >-
|
desc: >-
|
||||||
Enter the short key of the puzzle to load it.
|
Enter the short key of the puzzle to load it.
|
||||||
|
|
||||||
|
puzzleDelete:
|
||||||
|
title: Delete Puzzle?
|
||||||
|
desc: >-
|
||||||
|
Are you sure you want to delete '<title>'? This can not be undone!
|
||||||
|
|
||||||
ingame:
|
ingame:
|
||||||
# This is shown in the top left corner and displays useful keybindings in
|
# This is shown in the top left corner and displays useful keybindings in
|
||||||
# every situation
|
# every situation
|
||||||
@ -1400,6 +1405,8 @@ backendErrors:
|
|||||||
bad-payload: The request contains invalid data.
|
bad-payload: The request contains invalid data.
|
||||||
bad-building-placement: Your puzzle contains invalid placed buildings.
|
bad-building-placement: Your puzzle contains invalid placed buildings.
|
||||||
timeout: The request timed out.
|
timeout: The request timed out.
|
||||||
|
too-many-likes-already: The puzzle alreay got too many likes. If you still want to remove it, please contact support@shapez.io!
|
||||||
|
no-permission: You do not have the permission to perform this action.
|
||||||
|
|
||||||
tips:
|
tips:
|
||||||
- The hub will accept any input, not just the current shape!
|
- The hub will accept any input, not just the current shape!
|
||||||
|
Loading…
Reference in New Issue
Block a user