From 8c4ed0b70e658199f058a06de232b7f16f98a2a1 Mon Sep 17 00:00:00 2001 From: Antonio De Lucreziis Date: Mon, 29 Aug 2022 01:31:59 +0200 Subject: [PATCH] Primi prototipi nella pagina di appunti condivisi --- _frontend/src/appunti-condivisi.jsx | 218 ++++++++++++++++++++-- _public/style.css | 271 +++++++++++++++++++++++++++- _public/theme-dark.css | 3 +- _views/appunti-condivisi.html | 12 +- 4 files changed, 480 insertions(+), 24 deletions(-) diff --git a/_frontend/src/appunti-condivisi.jsx b/_frontend/src/appunti-condivisi.jsx index 9820405..0e5142c 100644 --- a/_frontend/src/appunti-condivisi.jsx +++ b/_frontend/src/appunti-condivisi.jsx @@ -1,24 +1,212 @@ import { render } from 'preact' -import { useState } from 'preact/hooks' +import { useEffect, useRef, useState } from 'preact/hooks' -const Counter = ({}) => { - const [value, setValue] = useState(0) +function randomHex(length = 16) { + return Array.from({ length }, () => Math.floor(Math.random() * 16).toString(16)).join('') +} + +const useAutosizeTextarea = () => { + const [rows, setRows] = useState(1) + + const onInput = e => { + const lines = e.target.value.split('\n') + console.log(lines) + + setRows(lines.length) + } + + return { rows, onInput } +} + +const InputTags = ({ tags, setTags, availableTags }) => { + availableTags ??= [] + + const [id] = useState('tags-' + randomHex()) + + const nextRef = useRef() + const [nextText, setNextText] = useState('') + + const onFocus = e => { + if (!e.target.closest('.tags .tag .remove')) { + nextRef.current?.focus() + } + } + + const removeTag = tag => { + setTags(tags => tags.filter(t => t !== tag)) + } + + const addTag = tag => { + setTags(tags => [...tags, tag]) + } + + const onKeyDown = e => { + if (e.key === 'Backspace' && nextText.length === 0) { + removeTag(tags.at(-1)) + } - const increment = () => { - setValue(value => value + 1) + const trimmed = nextText.trim() + if (e.key === 'Enter' && trimmed.length > 0) { + addTag(trimmed) + setNextText('') + } } return ( -

- Counter: {value} -

+
+ {tags.map(tag => ( +
+ {tag} + removeTag(tag)}> + + +
+ ))} + setNextText(e.target.value)} + onKeyDown={onKeyDown} + /> + + {availableTags.map(({ id, label }) => ( + +
+ ) +} + +const App = ({}) => { + const descriptionTextareaProps = useAutosizeTextarea() + + const [tags, setTags] = useState(['Geometria 1', 'Fortuna', 'Frigerio', '2013/2014']) + + const availableTags = [ + ...Array.from({ length: 10 }, (_, i) => { + const year = new Date().getFullYear() - i + + return { id: `${year}/${year + 1}`, label: `Anno Accademico ${year}/${year + 1}` } + }), + { id: 'G1', label: 'Geometria 1' }, + { id: 'G2', label: 'Geometria 2' }, + { id: 'ETI', label: 'Elementi di Teoria degli Insiemi' }, + { id: 'ETA', label: 'Elementi di Topologia Algebrica' }, + { id: 'Analisi 1', label: 'Analisi 1' }, + { id: 'Aritmetica', label: 'Aritmetica' }, + { id: 'Programmazione', label: 'Programmazione' }, + { id: 'Fisica 1', label: 'Fisica 1' }, + { id: 'Steffe 1', label: 'Laboratorio di Comunicazione Mediante Calcolatore' }, + ] + + return ( + <> +
+ Trascina qui un PDF oppure usa il tasto sottostante + +
+
+
+
Nome
+
Tags
+
Stato
+ +
+ +
+ +
+
Appunti di Geometria 1
+
+
Geometria 1
+
Prof. 1
+
2016/2017
+
+
+ +
+ +
+ +
+
+ +
+
+

+ Qui puoi modificare le varie proprietà della dispensa, ricorda che se + carichi un nuovo PDF diverso dal precedente dovrà essere nuovamente + sottoposto a approvazione quindi inizialmente scomparirà dall'elenco + principale. +

+
+
Nome
+ +
Descrizione
+ +
Tags
+ +
PDF
+ + +
+ +
+
+
+
+ +
+ +
+ +
+
Appunti di Geometria 2
+
+
Geometria 2
+
Prof. 2
+
2017/2018
+
Tanti Tag
+
Tanti Tag
+
Tanti Tag
+
Tanti Tag
+
Tanti Tag
+
Tanti Tag
+
+
+ +
+ +
+ +
+ +
+
F1Le SuP3R LeGaLe
+
+
Foo
+
Bar
+
+
+ +
+
+ ) } -render( - <> -

Preact is Working!

- - , - document.querySelector('#app') -) +render(, document.querySelector('#app')) diff --git a/_public/style.css b/_public/style.css index 50dfc32..0652002 100644 --- a/_public/style.css +++ b/_public/style.css @@ -511,6 +511,17 @@ button.icon { width: 2rem; } +button.flat { + border: none; + background: none; + box-shadow: none; +} + +button.flat:hover { + background: var(--bg-darker-2); + box-shadow: none; +} + select { font-family: var(--font-sf); font-weight: var(--font-weight-medium); @@ -539,7 +550,9 @@ select { /* Text Fields */ input[type='text'], -input[type='password'] { +input[type='file'], +input[type='password'], +textarea { border: none; background: none; @@ -560,6 +573,18 @@ input[type='password'] { font-weight: var(--font-weight-normal); } +textarea { + height: unset; + min-height: 2rem; + + padding: 0.5rem; +} + +input[type='file'] { + padding: 0.25rem 0.5rem; + height: unset; +} + input[type='password'] { font-family: caption; } @@ -845,6 +870,250 @@ form .field-set input { height: calc(var(--size) * 1rem); } +/* Appunti Condivisi */ + +.page-appunti-condivisi .main { + padding: 0 1rem 6rem; + max-width: 100ch; +} + +.page-appunti-condivisi .upload-region { + padding: 2rem; + + height: 30vh; + + border: 2px dashed var(--bg-darker-4); + border-radius: 0.5rem; + + display: flex; + align-items: center; + justify-content: center; + + flex-direction: column; + + gap: 1rem; +} + +.page-appunti-condivisi #app { + display: flex; + flex-direction: column; + align-items: center; + + gap: 3rem; +} + +.page-appunti-condivisi .dispense-table { + display: grid; + grid-template-columns: auto 1fr minmax(auto, 50ch) auto; + + background: var(--bg-dark); + border-radius: 4px; + border: 1px solid var(--bg-darker-2); + box-shadow: var(--shadow-1); +} + +.page-appunti-condivisi .dispense-table .pending { + color: royalblue; +} + +.page-appunti-condivisi .dispense-table .rejected { + color: darkred; +} + +.page-appunti-condivisi .dispense-table .header { + font-weight: var(--font-weight-medium); +} + +.page-appunti-condivisi .dispense-table .separator { + grid-column: span 4; + border-bottom: 1px solid var(--bg-darker-2); +} + +.page-appunti-condivisi .dispense-table .edit, +.page-appunti-condivisi .dispense-table .name, +.page-appunti-condivisi .dispense-table .tags, +.page-appunti-condivisi .dispense-table .status { + padding: 1rem 0 1rem 1rem; + + display: flex; + align-items: center; +} + +.page-appunti-condivisi .dispense-table .tags { + flex-wrap: wrap; + gap: 0.25rem; +} + +.page-appunti-condivisi .dispense-table .status { + place-self: center; + + padding: 1rem 1.25rem 1rem 2rem; +} + +.page-appunti-condivisi .dispense-table .expanded { + grid-column: span 4; + + display: grid; + grid-template-columns: auto 1fr; +} + +.page-appunti-condivisi .dispense-table .edit-container { + display: flex; + flex-direction: column; + gap: 1rem; + + padding: 1rem 1rem 1rem 0; +} + +.page-appunti-condivisi .dispense-table .edit-close { + padding: 1rem; +} + +.page-appunti-condivisi .dispense-table .edit-form { + display: grid; + + grid-template-columns: auto 1fr; + gap: 0.5rem 1rem; + + align-items: center; +} + +.page-appunti-condivisi .dispense-table .edit-form > .label { + height: 2rem; + + align-self: flex-start; + + display: flex; + align-items: center; + + font-weight: var(--font-weight-medium); +} + +.page-appunti-condivisi .dispense-table .edit-form > textarea { + resize: vertical; + overflow-y: hidden; +} + +.page-appunti-condivisi .dispense-table .edit-form > .right { + grid-column: span 2; + + display: flex; + justify-content: end; + + padding-top: 0.5rem; +} + +.page-appunti-condivisi .input-tags { + padding: 0.5rem; + min-height: 2rem; + + font-size: 17px; + + background: var(--text-input-bg); + color: var(--fg); + + border-radius: 4px; + border: 1px solid var(--bg-darker-2); + box-shadow: 0 0 8px 0 #00000020; + + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + + align-items: center; +} + +.page-appunti-condivisi .input-tags .tag { + user-select: none; + + height: 1.5rem; + border-radius: calc(1.5rem / 2); + padding: 0 calc(1.5rem / 2); + + background: var(--bg-darker-2); + color: var(--card-date); + + font-size: 15px; + + display: flex; + align-items: center; + justify-content: center; + + gap: 0.25rem; +} + +.page-appunti-condivisi .input-tags .tag .remove { + cursor: pointer; +} + +.page-appunti-condivisi .input-tags .tag .remove:hover { + color: var(--card-content); +} + +.page-appunti-condivisi .input-tags input[type='text'] { + box-shadow: none; + border: none; + background: none; + + height: 1.5rem; + + min-height: unset; + max-width: 10rem; + + display: inline-block; +} + +/* Animazioni */ + +/* Pending hourglass with a bit of overshoot */ +/* @keyframes pending-rotate { + 0% { + transform: rotate(0deg); + } + 25% { + transform: rotate(0deg); + } + 30% { + transform: rotate(-5deg); + } + 45% { + transform: rotate(190deg); + } + 50% { + transform: rotate(180deg); + } + 60% { + transform: rotate(175deg); + } + 75% { + transform: rotate(185deg); + } + 95% { + transform: rotate(370deg); + } + 100% { + transform: rotate(360deg); + } +} */ + +@keyframes pending-rotate { + 0% { + transform: rotate(0deg); + } + 30% { + transform: rotate(0deg); + } + 50% { + transform: rotate(180deg); + } + 80% { + transform: rotate(180deg); + } + 100% { + transform: rotate(360deg); + } +} + @keyframes rotate { 0% { transform: rotate(0deg); diff --git a/_public/theme-dark.css b/_public/theme-dark.css index 2048d8e..9cadfa8 100644 --- a/_public/theme-dark.css +++ b/_public/theme-dark.css @@ -59,7 +59,8 @@ body.dark-mode { filter: drop-shadow(0 0 4px rgba(0, 0, 0, 0.4)); } -.dark-mode input[type] { +.dark-mode input[type], +.dark-mode textarea { background: #4b4342; } diff --git a/_views/appunti-condivisi.html b/_views/appunti-condivisi.html index 9295a90..f2a01d5 100644 --- a/_views/appunti-condivisi.html +++ b/_views/appunti-condivisi.html @@ -3,12 +3,10 @@ {{define "title"}}Condivisione Appunti • PHC{{end}} {{define "body"}} -
-

- - Condivisione Appunti -

-
-
+

+ + Condivisione Appunti +

+
{{end}} \ No newline at end of file