Port End Session dialogs to DialogV2 for v13/v14
V1 Dialog and Dialog.confirm are deprecated in v13 and removed in v14. Migrate the three sites in macros.js (attendance grid, single-session confirm, multi-session pick) to foundry.applications.api.DialogV2, and drop the jQuery used in their callbacks in favor of querySelector + dataset/value on dialog.element. Use rejectClose: false to preserve the prior null-on-close behavior. Bump version to 0.2.0 and widen compatibility to verified 13, max 14 (min stays at 12 — DialogV2 has been available since v12). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
0df05e0d0b
commit
43c630c1f7
2 changed files with 60 additions and 64 deletions
|
|
@ -2,11 +2,11 @@
|
|||
"id": "seitime-bridge",
|
||||
"title": "Seitime Bridge",
|
||||
"description": "Pushes dnd5e character data from Foundry VTT to a Seitime Frappe site at session end. Companion to the st Frappe app.",
|
||||
"version": "0.1.0",
|
||||
"version": "0.2.0",
|
||||
"compatibility": {
|
||||
"minimum": "12",
|
||||
"verified": "12",
|
||||
"maximum": "13"
|
||||
"verified": "13",
|
||||
"maximum": "14"
|
||||
},
|
||||
"authors": [
|
||||
{ "name": "Vassili" }
|
||||
|
|
|
|||
|
|
@ -101,10 +101,8 @@ async function showAttendanceDialog(proposal) {
|
|||
})
|
||||
.join("");
|
||||
|
||||
return new Promise((resolve) => {
|
||||
new Dialog(
|
||||
{
|
||||
title: "Finalize Attendance",
|
||||
const result = await foundry.applications.api.DialogV2.wait({
|
||||
window: { title: "Finalize Attendance" },
|
||||
content: `
|
||||
<p>Confirm each player's attendance for this session.</p>
|
||||
<table style="width:100%; border-collapse:collapse;">
|
||||
|
|
@ -118,28 +116,29 @@ async function showAttendanceDialog(proposal) {
|
|||
<tbody>${rows}</tbody>
|
||||
</table>
|
||||
`,
|
||||
buttons: {
|
||||
cancel: { label: "Cancel", callback: () => resolve(null) },
|
||||
confirm: {
|
||||
buttons: [
|
||||
{ action: "cancel", label: "Cancel", callback: () => null },
|
||||
{
|
||||
action: "confirm",
|
||||
label: "Confirm",
|
||||
callback: (html) => {
|
||||
const result = [];
|
||||
html.find("select[data-player]").each(function () {
|
||||
result.push({
|
||||
player: $(this).data("player"),
|
||||
status: $(this).val(),
|
||||
default: true,
|
||||
callback: (_event, _button, dialog) => {
|
||||
const out = [];
|
||||
dialog.element.querySelectorAll("select[data-player]").forEach((select) => {
|
||||
out.push({
|
||||
player: select.dataset.player,
|
||||
status: select.value,
|
||||
});
|
||||
});
|
||||
resolve(result);
|
||||
return out;
|
||||
},
|
||||
},
|
||||
},
|
||||
default: "confirm",
|
||||
close: () => resolve(null),
|
||||
},
|
||||
{ width: 560 },
|
||||
).render(true);
|
||||
],
|
||||
position: { width: 560 },
|
||||
rejectClose: false,
|
||||
});
|
||||
|
||||
return result ?? null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -167,15 +166,14 @@ export async function pushAllSnapshots() {
|
|||
async function pickSession(sessions) {
|
||||
if (sessions.length === 1) {
|
||||
const s = sessions[0];
|
||||
const confirmed = await Dialog.confirm({
|
||||
title: "End Session",
|
||||
const confirmed = await foundry.applications.api.DialogV2.confirm({
|
||||
window: { title: "End Session" },
|
||||
content: `
|
||||
<p>End <b>${escapeHtml(s.session_title)}</b>?</p>
|
||||
<p>This will mark it Completed, schedule the next session, and push snapshots for all PCs.</p>
|
||||
`,
|
||||
yes: () => true,
|
||||
no: () => false,
|
||||
defaultYes: true,
|
||||
yes: { default: true },
|
||||
rejectClose: false,
|
||||
});
|
||||
return confirmed ? s.session_id : null;
|
||||
}
|
||||
|
|
@ -187,29 +185,27 @@ async function pickSession(sessions) {
|
|||
)
|
||||
.join("");
|
||||
|
||||
return new Promise((resolve) => {
|
||||
new Dialog({
|
||||
title: "End Session",
|
||||
const value = await foundry.applications.api.DialogV2.wait({
|
||||
window: { title: "End Session" },
|
||||
content: `
|
||||
<p>Multiple scheduled sessions match this Foundry world. Pick one to end:</p>
|
||||
<select id="seitime-session-pick" style="width:100%; margin-bottom:0.5em;">
|
||||
${options}
|
||||
</select>
|
||||
`,
|
||||
buttons: {
|
||||
cancel: { label: "Cancel", callback: () => resolve(null) },
|
||||
end: {
|
||||
buttons: [
|
||||
{ action: "cancel", label: "Cancel", callback: () => null },
|
||||
{
|
||||
action: "end",
|
||||
label: "End Session",
|
||||
callback: (html) => {
|
||||
const value = html.find("#seitime-session-pick").val();
|
||||
resolve(value || null);
|
||||
default: true,
|
||||
callback: (_event, _button, dialog) =>
|
||||
dialog.element.querySelector("#seitime-session-pick")?.value || null,
|
||||
},
|
||||
},
|
||||
},
|
||||
default: "end",
|
||||
close: () => resolve(null),
|
||||
}).render(true);
|
||||
],
|
||||
rejectClose: false,
|
||||
});
|
||||
return value ?? null;
|
||||
}
|
||||
|
||||
function summarizeAttendance(attendance) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue