127 lines
3.6 KiB
HTML
127 lines
3.6 KiB
HTML
<script>
|
|
function copyTheme() {
|
|
const appClasses = [...document.getElementById('app').classList];
|
|
const appTheme = appClasses.find((c) => c.startsWith('theme--'));
|
|
for (const element of document.getElementsByClassName('theme--copy')) {
|
|
element.classList.replace('theme--copy', appTheme);
|
|
}
|
|
}
|
|
|
|
function setupForm() {
|
|
const button = document.getElementById('top-button');
|
|
const input = document.getElementById('top-input');
|
|
const spinner = document.getElementById('top-spinner');
|
|
const errorBox = document.getElementById('top-error');
|
|
const errorContent = document.getElementById('top-error-content');
|
|
input.oninput = () => {
|
|
if (input.value === '') {
|
|
button.classList.add('v-btn--disabled');
|
|
button.disabled = true;
|
|
} else {
|
|
button.classList.remove('v-btn--disabled');
|
|
button.disabled = false;
|
|
}
|
|
};
|
|
button.onclick = async () => {
|
|
button.classList.add('v-btn--disabled');
|
|
button.disabled = true;
|
|
input.disabled = true;
|
|
spinner.style = '';
|
|
errorBox.style = 'display: none;';
|
|
try {
|
|
await createNewTop(input.value);
|
|
} catch (error) {
|
|
errorBox.style = '';
|
|
errorContent.textContent = error.message;
|
|
}
|
|
button.classList.remove('v-btn--disabled');
|
|
button.disabled = false;
|
|
input.disabled = false;
|
|
spinner.style = 'display: none;';
|
|
};
|
|
}
|
|
|
|
async function getNextTopNumber() {
|
|
const result = await graphql(
|
|
'query { pages { list(tags: ["top"]) { path } } }'
|
|
);
|
|
const topNumbers = result.data.pages.list
|
|
.map((page) => page.path)
|
|
.map((path) => path.split('/'))
|
|
.map((pathSegments) => pathSegments[pathSegments.length - 1])
|
|
.map((lastSegment) => Number(lastSegment))
|
|
.filter((topNumber) => !!topNumber);
|
|
return Math.max(...topNumbers) + 1;
|
|
}
|
|
|
|
async function insertNextTopNumbers() {
|
|
const nextTopNumber = await getNextTopNumber();
|
|
for (const element of document.getElementsByClassName('next-top-number')) {
|
|
element.textContent = nextTopNumber;
|
|
}
|
|
}
|
|
|
|
async function createNewTop(title) {
|
|
const nextTopNumber = await getNextTopNumber();
|
|
const templateResult = await graphql(`
|
|
query {
|
|
pages {
|
|
single(id: 477) {
|
|
content
|
|
description
|
|
editor
|
|
isPublished
|
|
isPrivate
|
|
locale
|
|
tags {
|
|
tag
|
|
}
|
|
title
|
|
}
|
|
}
|
|
}
|
|
`);
|
|
if (templateResult.errors && templateResult.errors.length !== 0) {
|
|
throw new Error(templateResult.errors[0].message);
|
|
}
|
|
const template = templateResult.data.pages.single;
|
|
template.tags = template.tags.map((tag) => tag.tag);
|
|
template.path = `verein/topictreff/top/${nextTopNumber}`;
|
|
template.title = `TOP ${nextTopNumber} - ${title}`;
|
|
|
|
const pageData = Object.entries(template)
|
|
.map(([key, value]) => `${key}: ${JSON.stringify(value)}`)
|
|
.map((data) => {
|
|
console.log(data);
|
|
return data;
|
|
})
|
|
.join(', ');
|
|
const result = await graphql(`
|
|
mutation {
|
|
pages {
|
|
create(${pageData}) {
|
|
responseResult {
|
|
succeeded
|
|
errorCode
|
|
message
|
|
}
|
|
}
|
|
}
|
|
}
|
|
`);
|
|
const response = result.data.pages.create.responseResult;
|
|
if (response.succeeded) {
|
|
window.location = '/e/' + template.path;
|
|
} else {
|
|
throw new Error(response.message);
|
|
console.log({ response });
|
|
}
|
|
}
|
|
|
|
isElementLoaded('.contents').then(() => {
|
|
copyTheme();
|
|
setupForm();
|
|
insertNextTopNumbers();
|
|
});
|
|
</script>
|