accept tags as well

This commit is contained in:
tavo 2024-09-22 18:22:29 -06:00
parent 0d40858bf9
commit 0736dfeb63
8 changed files with 45 additions and 9 deletions

View file

@ -35,6 +35,7 @@ CREATE TABLE sites (
code VARCHAR(2),
title VARCHAR(35) NOT NULL,
slogan VARCHAR(100),
tags TEXT,
banner TEXT,
raw JSONB NOT NULL,
auth INTEGER,

View file

@ -154,6 +154,15 @@ function initializeEventListeners() {
}
});
document.getElementById('buyModeDirectoryInput').addEventListener('input', function() {
const input = this.value.trim();
const sanitizedDirectory = sanitizeDirectoryTitle(input);
const previewElement = document.getElementById('checkdir-preview');
previewElement.style.display = "block"
previewElement.innerHTML = `Su sitio se publicará en:<br><a href="#">https://conex.one/${sanitizedDirectory}</a>`;
});
document.getElementById("continueToEditModeButton").addEventListener('click', () =>
editMode(extractSitePath(document.getElementById("editModeDirectoryInput").value))
);
@ -372,15 +381,12 @@ function loadLanguage(lang) {
fetch(`./lang/${lang}.json`)
.then(response => response.json())
.then(translations => {
// Find all elements with a 'data-translate' attribute
document.querySelectorAll('[data-translate]').forEach(element => {
const translationKey = element.getAttribute('data-translate');
// Check if the element is an input field (update placeholder)
if (element.tagName.toLowerCase() === 'input' || element.tagName.toLowerCase() === 'textarea') {
element.placeholder = translations[translationKey];
} else {
// Update text content for non-input elements
element.innerText = translations[translationKey];
}
});
@ -401,10 +407,25 @@ function dashboardMode() {
function buyMode() {
localStorage.removeItem('conex_data');
title = document.getElementById('buyModeDirectoryInput').value.trim();
directory = sanitizeDirectoryTitle(title);
let tagsInput = document.getElementById('buyModeTagsInput').value.trim();
let tags = tagsInput
.split(/[\s,]+/)
.map(tag => tag.trim().toLowerCase().replace(/[^a-z0-9]/g, ''))
.filter(tag => tag.length > 0);
const tagsString = tags.join(' ');
const dataToSave = {
title: document.getElementById('buyModeDirectoryInput').value.trim(),
title: title,
directory: directory,
tags: tagsString
};
localStorage.setItem('conex_data', JSON.stringify(dataToSave));
loadEditorState();
closeDialog();

View file

@ -36,7 +36,7 @@
<input type="file" id="uploadBannerBtn" class="tool-button-input" accept="image/*">
<label for="uploadBannerBtn" class="tool-button">
<img src="/static/svg/image.svg" alt="Edit Icon" class="icon">
<span class="loader"></span>
<span class="loader" style="border: 0.2em solid #fff"></span>
</label>
</div>
<img id="banner" src="/static/svg/banner.svg" class="banner-image"/>
@ -103,7 +103,10 @@
<p data-translate="buyDialogParagraph"></p>
<div class="message success-message" id="checkdir-success-message"></div>
<div class="message error-message" id="checkdir-error-message"></div>
<div class="message neutral-message" id="checkdir-preview"></div>
<input class="input-dialog" type="text" id="buyModeDirectoryInput" maxlength="35" placeholder="Mi Sitio"><br>
<p data-translate="buyDialogTags"></p>
<input class="input-dialog" type="text" id="buyModeTagsInput" data-translate="buyModeTagsInput" placeholder=""><br>
<button id="continueToBuyModeButton" class="right">
<span data-translate="continueToBuyModeButton"></span>
</button>

View file

@ -8,6 +8,8 @@
"continueEditingModeButton": "Continuar editando",
"buyDialogHeader": "Diseñar un nuevo sitio web",
"buyDialogParagraph": "Ingresa el nombre del sitio y revisa el enlace en el que se publicará una vez adquirido.",
"buyDialogTags": "Las etiquetas son palabras clave que ayudan a las personas a encontrar tu sitio, por ejemplo, las etiquetas de una página web relacionada al turismo: vacaciones, paseos, viajes, destinos, tours",
"buyModeTagsInput": "vacaciones paseos viajes destinos tours",
"updateContentDialogHeader": "Actualizar mi sitio",
"updateContentDialogParagraph": "Para actualizar el sitio web, requerimos confirmar que el sitio es suyo. Para esto, enviaremos un correo electrónico a la cuenta de correo con la que compró este sitio web, con un código temporal de 6 dígitos que expirará en 5 minutos luego de ser enviado. Por favor, presione el botón para enviar el código y luego compruebe su identidad digitándolo en la casilla.",
"tempCodePlaceholder": "Código de 6 dígitos enviado a su correo",

View file

@ -52,6 +52,7 @@ paypal.Buttons({
banner: savedData.banner,
title: savedData.title,
slogan: savedData.slogan,
tags: savedData.tags,
editor_data: savedData.editor_data
};

View file

@ -466,10 +466,15 @@ a {
color: #721c24;
}
.neutral-message {
background-color: #d1ecf1;
color: #0c5460;
}
.loader {
width: 1.5em;
height: 1.5em;
border: 0.2em solid #FFF;
border: 0.2em solid var(--color);
border-bottom-color: transparent;
border-radius: 50%;
display: inline-block;

View file

@ -57,6 +57,7 @@ func RegisterSitePayment(db *sql.DB, capture Capture, cart ConexData) error {
directory string
title string
slogan string
tags string
banner string
editorData json.RawMessage
)
@ -79,6 +80,7 @@ func RegisterSitePayment(db *sql.DB, capture Capture, cart ConexData) error {
directory = cart.Directory
title = cart.Title
slogan = cart.Slogan
tags = cart.Tags
banner = cart.Banner
editorData = cart.EditorData
@ -90,12 +92,12 @@ func RegisterSitePayment(db *sql.DB, capture Capture, cart ConexData) error {
if newSite == sql.ErrNoRows {
if err := db.QueryRow(`
INSERT INTO sites
(folder, status, due, name, sur, email, phone, code, title, slogan, banner, raw)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
(folder, status, due, name, sur, email, phone, code, title, slogan, tags, banner, raw)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)
RETURNING id
`, directory, wstatus, due,
name, surname, email, phone, country, title, slogan,
banner, editorData).Scan(&pkey); err != nil {
tags, banner, editorData).Scan(&pkey); err != nil {
return fmt.Errorf("%s: %v", errDBRegisterSite, err)
}
} else {

View file

@ -54,6 +54,7 @@ type ConexData struct {
Banner string `json:"banner"`
Title string `json:"title"`
Slogan string `json:"slogan"`
Tags string `json:"tags"`
EditorData json.RawMessage `json:"editor_data"`
}