Просмотр исходного кода

External Link configurabile

Sviluppo_Carrello_Immagini
Lorenzo Pollutri 13 часов назад
Родитель
Сommit
413ec37343
4 измененных файлов: 39 добавлений и 4 удалений
  1. +5
    -0
      README.md
  2. +20
    -3
      app/admin/page.tsx
  3. +11
    -1
      components/PublicGrid.tsx
  4. +3
    -0
      lib/config.ts

+ 5
- 0
README.md Просмотреть файл

@@ -34,3 +34,8 @@ You can check out [the Next.js GitHub repository](https://github.com/vercel/next
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.

Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.

## Configurazione

Per configruare usare il file lib/config.ts
Per disattivare l'utilizzo di external link, settare a false la variabile EXTERNAL_LINK_ENABLED a false;

+ 20
- 3
app/admin/page.tsx Просмотреть файл

@@ -2,6 +2,7 @@
import { useState, useEffect } from 'react';
import { Card, Portal, MediaItem } from '@/types';
import { EXTERNAL_LINK_ENABLED } from '@/lib/config';
const isVideoUrl = (url: string) => /\.(mp4|webm|mov|m4v|ogv)(\?|$)/i.test(url);
const isPdfFile = (file: File) =>
@@ -498,12 +499,28 @@ export default function AdminDashboard() {
<select value={isEditing.cardType || 'INFO_PAGE'} onChange={e => setIsEditing({...isEditing, cardType: e.target.value as any})} className={inputClasses}>
<option value="INFO_PAGE">Info Page</option>
<option value="IMAGE_GALLERY">Image Gallery</option>
<option value="EXTERNAL_LINK">External Link</option>
{EXTERNAL_LINK_ENABLED && <option value="EXTERNAL_LINK">External Link</option>}
</select>
</div>
<div>
<label className="block text-sm font-semibold text-gray-800 mb-1">Short Description</label>
<textarea value={isEditing.shortDescription || ''} onChange={e => setIsEditing({...isEditing, shortDescription: e.target.value})} className={`${inputClasses} h-24 resize-none`} placeholder="Brief summary..." />
{isEditing.cardType === 'EXTERNAL_LINK' ? (
<>
<label className="block text-sm font-semibold text-gray-800 mb-1">URL</label>
<input
type="url"
value={isEditing.shortDescription || ''}
onChange={e => setIsEditing({ ...isEditing, shortDescription: e.target.value })}
className={inputClasses}
placeholder="https://esempio.it/pagina"
/>
<p className="text-xs text-gray-500 mt-1">Aprendo la card, il testo sarà cliccabile e porterà a questo indirizzo.</p>
</>
) : (
<>
<label className="block text-sm font-semibold text-gray-800 mb-1">Short Description</label>
<textarea value={isEditing.shortDescription || ''} onChange={e => setIsEditing({ ...isEditing, shortDescription: e.target.value })} className={`${inputClasses} h-24 resize-none`} placeholder="Brief summary..." />
</>
)}
</div>
<div className="bg-gray-50 p-3 rounded-lg border border-gray-200 space-y-3">
<label className="flex items-start gap-3 cursor-pointer">


+ 11
- 1
components/PublicGrid.tsx Просмотреть файл

@@ -525,7 +525,17 @@ export default function PublicGrid({ cards, maxCols = 5 }: { cards: Card[], maxC
{activeCard.title}
</h2>
)}
{activeCard.fullContent ? (
{activeCard.cardType === 'EXTERNAL_LINK' && activeCard.shortDescription ? (
<a
href={activeCard.shortDescription}
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center gap-2 text-blue-600 hover:text-blue-800 underline break-all text-lg font-medium"
>
<span>{activeCard.shortDescription}</span>
<span aria-hidden>↗</span>
</a>
) : activeCard.fullContent ? (
<div className="prose max-w-none text-gray-700" dangerouslySetInnerHTML={{ __html: activeCard.fullContent }} />
) : activeCard.shortDescription ? (
<p className="text-gray-500 italic text-lg">{activeCard.shortDescription}</p>


+ 3
- 0
lib/config.ts Просмотреть файл

@@ -0,0 +1,3 @@
// Feature flags compilati nel bundle. Modifica e ricostruisci (npm run build) per applicare.

export const EXTERNAL_LINK_ENABLED = true;

Загрузка…
Отмена
Сохранить