diff --git a/web/admin-gui/src/assets/base.css b/web/admin-gui/src/assets/base.css index 146a21f..213fdee 100644 --- a/web/admin-gui/src/assets/base.css +++ b/web/admin-gui/src/assets/base.css @@ -65,7 +65,8 @@ a, input, label, button, -span { +span, +li { font-family: 'Hind', sans-serif; color: var(--neutral-dark); } @@ -99,6 +100,26 @@ span { border-radius: var(--radius); } +.label-input .tags { + display: flex; + flex-wrap: wrap; + gap: 8px; + + margin: 0; + padding: 8px; +} + +.label-input .tags li { + background-color: var(--neutral-verylight); + border-radius: var(--radius); + + padding: 4px 16px; +} + +.label-input .tags li::marker { + content: ''; +} + .label-input-error input { border: solid 1.75px var(--error); } diff --git a/web/admin-gui/src/utils/database.ts b/web/admin-gui/src/utils/database.ts index 14955d2..078a4d3 100644 --- a/web/admin-gui/src/utils/database.ts +++ b/web/admin-gui/src/utils/database.ts @@ -1,12 +1,13 @@ import { useAuthStore } from "@/stores/AuthStore" export interface Article { - idName: string, + titleID: string, + title: string, date: number, content: { html: string }, - pageId: string, + tags: Array, online: boolean } @@ -24,7 +25,7 @@ export async function getArticle(id: string) : Promise
{ } export async function postArticle(article: Article) : Promise { - return await fetch(`${baseURL}/articles/${article.idName}`, { + return await fetch(`${baseURL}/articles/${article.titleID}`, { method: 'POST', headers: { "Authorization": `Bearer ${useAuthStore().token}` }, body: JSON.stringify(article) diff --git a/web/admin-gui/src/views/ArticlesEdit.vue b/web/admin-gui/src/views/ArticlesEdit.vue index 72aae0c..b36ea2e 100644 --- a/web/admin-gui/src/views/ArticlesEdit.vue +++ b/web/admin-gui/src/views/ArticlesEdit.vue @@ -4,7 +4,7 @@ import Editor from '@tinymce/tinymce-vue'; import { onMounted, ref, type Ref } from 'vue'; import { useRoute } from 'vue-router'; -let article: Ref
= ref() +const article: Ref
= ref() const editorData: Ref = ref('') onMounted(async () => { diff --git a/web/admin-gui/src/views/ArticlesNew.vue b/web/admin-gui/src/views/ArticlesNew.vue index 242f9b8..fac7325 100644 --- a/web/admin-gui/src/views/ArticlesNew.vue +++ b/web/admin-gui/src/views/ArticlesNew.vue @@ -7,33 +7,42 @@ const router = useRouter() const defaultData = `

Bienvenue

Vous êtes en mode édition d'article.

Celui-ci semble encore neuf ! Supprimez ces lignes et laissez libre cours à votre imagination :)

Pour plus d'infos, rendez-vous sur la page d'aide.

` const title = ref('') -const page = ref('') +const rawTags = ref('') +const tags: Ref = ref([]) -function isIdValid(): boolean { - const regex = /^[a-zA-Z0-9]+$/ - return regex.test(title.value) +const regexAccents = /[\u0300-\u036f]/g +const regexSymbols = /([-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/])+/g + +function updateTags(): void { + tags.value = rawTags.value.split(/[,\s]+/g) + tags.value = tags.value.filter(x => x !== '') +} + +function generateTitleID(title: string): string { + return title.toLowerCase().normalize('NFD') + .replace(regexAccents, '') + .replace(regexSymbols, '') + .replace(/\s/g, '-') + .replace(/-$/g, '') } function isFormEmpty(): boolean { - return title.value === '' || page.value === '' -} - -function isFormValid(): boolean { - return isIdValid() && !isFormEmpty() + return title.value === '' || rawTags.value === '' } function createArticle() { const article: Article = { - idName: title.value, + titleID: generateTitleID(title.value), + title: title.value, date: new Date().getTime(), content: { html: defaultData }, online: false, - pageId: page.value + tags: tags.value } postArticle(article) - router.push(`/articles/edit/${article.idName}`) + router.push(`/articles/edit/${article.titleID}`) } @@ -42,21 +51,23 @@ function createArticle() {

Créer un nouvel article

-
- - -

⚠️ Doit être unique et composé de caractères alphanumériques, sans espaces ! -

+
+ +
- - + + +

Spéparez les mots-clés par des virgules ou espaces.

+
    +
  • {{ tag }}
  • +
Annuler - +
@@ -73,7 +84,7 @@ main { display: flex; gap: 8px; width: 100%; - margin: 32px 0; + margin: 16px 0; } .buttons-group a,