fix(map): پاپآپ نقشهٔ صفحهٔ پروژه تصویر شاخص را تکرار نمیکند — فقط گالری؛ در نبود گالری قاب تصویر پنهان میشود
This commit is contained in:
@@ -9,6 +9,8 @@ type ProjectImageSliderProps = {
|
|||||||
images: string[]
|
images: string[]
|
||||||
alt: string
|
alt: string
|
||||||
className?: string
|
className?: string
|
||||||
|
/** در نبود تصویر، بهجای جاینگهدار کل قاب پنهان شود (صفحهای که تصویر را جای دیگر نشان میدهد) */
|
||||||
|
hideWhenEmpty?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -16,7 +18,7 @@ type ProjectImageSliderProps = {
|
|||||||
* شمارندهٔ اسلاید و گوشههای گرد هماندازهٔ کارت. همهٔ رویدادهای اشاره روی
|
* شمارندهٔ اسلاید و گوشههای گرد هماندازهٔ کارت. همهٔ رویدادهای اشاره روی
|
||||||
* اسلایدر متوقف میشوند تا کلیک/کشیدن آن، نقشه را جابهجا یا پاپآپ را نبندد.
|
* اسلایدر متوقف میشوند تا کلیک/کشیدن آن، نقشه را جابهجا یا پاپآپ را نبندد.
|
||||||
*/
|
*/
|
||||||
export function ProjectImageSlider({ images, alt, className = '' }: ProjectImageSliderProps) {
|
export function ProjectImageSlider({ images, alt, className = '', hideWhenEmpty = false }: ProjectImageSliderProps) {
|
||||||
const { t } = useLang()
|
const { t } = useLang()
|
||||||
const [index, setIndex] = useState(0)
|
const [index, setIndex] = useState(0)
|
||||||
|
|
||||||
@@ -26,6 +28,7 @@ export function ProjectImageSlider({ images, alt, className = '' }: ProjectImage
|
|||||||
const frame = `relative aspect-[16/10] w-full overflow-hidden rounded-t-2xl bg-char ${className}`
|
const frame = `relative aspect-[16/10] w-full overflow-hidden rounded-t-2xl bg-char ${className}`
|
||||||
|
|
||||||
if (!images.length) {
|
if (!images.length) {
|
||||||
|
if (hideWhenEmpty) return null
|
||||||
return (
|
return (
|
||||||
<div className={frame} onClick={stop} onPointerDown={stop} onMouseDown={stop}>
|
<div className={frame} onClick={stop} onPointerDown={stop} onMouseDown={stop}>
|
||||||
<ProjectImagePlaceholder />
|
<ProjectImagePlaceholder />
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ type ProjectPopupCardProps = {
|
|||||||
project: MapProject
|
project: MapProject
|
||||||
/** تصاویر پروژه — همان آرایهٔ صفحهٔ جزئیات؛ در نبودش جاینگهدار میآید */
|
/** تصاویر پروژه — همان آرایهٔ صفحهٔ جزئیات؛ در نبودش جاینگهدار میآید */
|
||||||
images?: string[]
|
images?: string[]
|
||||||
|
/** در نبود تصویر، قاب تصویر پنهان شود (نه جاینگهدار) — برای صفحهٔ خود پروژه */
|
||||||
|
hideImageWhenEmpty?: boolean
|
||||||
onClose: () => void
|
onClose: () => void
|
||||||
/** دکمههای پایهٔ کارت — هر نما اکشنهای خودش را میدهد (عمودی روی هم) */
|
/** دکمههای پایهٔ کارت — هر نما اکشنهای خودش را میدهد (عمودی روی هم) */
|
||||||
children: ReactNode
|
children: ReactNode
|
||||||
@@ -25,7 +27,7 @@ type ProjectPopupCardProps = {
|
|||||||
* عنوان و توضیح، و در پایه دکمههای عمودی. راستبهچپ، شیشهای تیره و
|
* عنوان و توضیح، و در پایه دکمههای عمودی. راستبهچپ، شیشهای تیره و
|
||||||
* هماندازهٔ کارتهای سایت. سال پروژه عمداً نمایش داده نمیشود.
|
* هماندازهٔ کارتهای سایت. سال پروژه عمداً نمایش داده نمیشود.
|
||||||
*/
|
*/
|
||||||
export function ProjectPopupCard({ project, images = [], onClose, children }: ProjectPopupCardProps) {
|
export function ProjectPopupCard({ project, images = [], hideImageWhenEmpty = false, onClose, children }: ProjectPopupCardProps) {
|
||||||
const { t } = useLang()
|
const { t } = useLang()
|
||||||
const description = project.description.trim() || t('mapProjectDescription')
|
const description = project.description.trim() || t('mapProjectDescription')
|
||||||
|
|
||||||
@@ -36,7 +38,7 @@ export function ProjectPopupCard({ project, images = [], onClose, children }: Pr
|
|||||||
>
|
>
|
||||||
{/* اسلایدر تصویر: لبهتالبه، بدون حاشیه، با فلشهای چپ/راست */}
|
{/* اسلایدر تصویر: لبهتالبه، بدون حاشیه، با فلشهای چپ/راست */}
|
||||||
<div className="relative">
|
<div className="relative">
|
||||||
<ProjectImageSlider images={images} alt={project.name} />
|
<ProjectImageSlider images={images} alt={project.name} hideWhenEmpty={hideImageWhenEmpty} />
|
||||||
|
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ export function ProjectsMapSingle({ location, images = [], className = '' }: Pro
|
|||||||
{popupHost &&
|
{popupHost &&
|
||||||
activeProject &&
|
activeProject &&
|
||||||
createPortal(
|
createPortal(
|
||||||
<ProjectPopupCard project={activeProject} images={images} onClose={closePopup}>
|
<ProjectPopupCard project={activeProject} images={images} hideImageWhenEmpty onClose={closePopup}>
|
||||||
{/* منطق دکمهٔ آدرس دستنخورده است — تنها اکشن این کارت */}
|
{/* منطق دکمهٔ آدرس دستنخورده است — تنها اکشن این کارت */}
|
||||||
<a
|
<a
|
||||||
href={buildNeshanUrl(activeProject)}
|
href={buildNeshanUrl(activeProject)}
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export function ProjectDetail() {
|
|||||||
const mapLocation = project
|
const mapLocation = project
|
||||||
? (findMapProjectByName(project.title) ?? createPlaceholderProject(project.title, project.summary))
|
? (findMapProjectByName(project.title) ?? createPlaceholderProject(project.title, project.summary))
|
||||||
: null
|
: null
|
||||||
const mapImages = project ? [project.image, ...(Array.isArray(project.gallery) ? project.gallery : [])].filter(Boolean) : []
|
const mapImages = project && Array.isArray(project.gallery) ? project.gallery.filter(Boolean) : []
|
||||||
|
|
||||||
// عنوان تب، توضیح متا، OG و JSON-LD از خود پروژه — همارز نسخهٔ سمت سرور (seo_pages.py)
|
// عنوان تب، توضیح متا، OG و JSON-LD از خود پروژه — همارز نسخهٔ سمت سرور (seo_pages.py)
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
Reference in New Issue
Block a user