# ๐Ÿš€ ็”ปๅปŠ็ป„ไปถๅฟซ้€Ÿไฝฟ็”จๆŒ‡ๅ— ## ๐Ÿ“ฆ 5ๅˆ†้’Ÿๅฟซ้€Ÿ้›†ๆˆ ### 1๏ธโƒฃ **ๅฏผๅ…ฅ็ป„ไปถ** ```typescript import { StageGalleryModalComponent, GalleryConfig } from '@/modules/project/components/stage-gallery-modal'; @Component({ imports: [StageGalleryModalComponent] }) export class YourComponent { showGallery = false; galleryConfig: GalleryConfig | null = null; } ``` ### 2๏ธโƒฃ **ๅ‡†ๅค‡ๆ•ฐๆฎ** ```typescript openGallery() { this.galleryConfig = { spaceId: '็ฉบ้—ดID', spaceName: 'ๅฎขๅŽ…', stageId: '้˜ถๆฎตID', stageName: 'ๆธฒๆŸ“', files: [ { id: 'ๆ–‡ไปถID', name: 'ๆ–‡ไปถๅ.jpg', url: 'ๆ–‡ไปถURL', size: 1024000, // ๅฏ้€‰ uploadTime: new Date() // ๅฏ้€‰ } ], canEdit: true // ๆ˜ฏๅฆๆ˜พ็คบๅˆ ้™คๅ’ŒไธŠไผ ๆŒ‰้’ฎ }; this.showGallery = true; } ``` ### 3๏ธโƒฃ **ๆทปๅŠ ๅˆฐๆจกๆฟ** ```html ``` ### 4๏ธโƒฃ **ๅค„็†ไบ‹ไปถ๏ผˆๅฏ้€‰๏ผ‰** ```typescript onDelete(event: { file: any; event: Event }) { console.log('ๅˆ ้™ค:', event.file.name); // ไฝ ็š„ๅˆ ้™ค้€ป่พ‘ } onUpload(event: Event) { const input = event.target as HTMLInputElement; console.log('ไธŠไผ :', input.files); // ไฝ ็š„ไธŠไผ ้€ป่พ‘ } onPreview(file: any) { console.log('้ข„่งˆ:', file.name); // ไฝ ็š„้ข„่งˆ้€ป่พ‘๏ผˆ้žๅ›พ็‰‡ๆ–‡ไปถ๏ผ‰ } ``` --- ## โœจ ๅฐฑ่ฟ™ไนˆ็ฎ€ๅ•๏ผ ็”ปๅปŠไผš่‡ชๅŠจๅค„็†๏ผš - โœ… ๅ›พ็‰‡ๅ’Œๆ–‡ๆกฃ็š„้ข„่งˆ - โœ… ๅคงๅ›พๅ…จๅฑๆŸฅ็œ‹ - โœ… ๅทฆๅณๅˆ‡ๆขๅ›พ็‰‡ - โœ… ๅ“ๅบ”ๅผๅธƒๅฑ€ - โœ… ็ฒพ็พŽๅŠจ็”ป --- ## ๐ŸŽจ ่ง†่ง‰ๆ•ˆๆžœ ### ๆกŒ้ข็ซฏ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ [๐Ÿ ] ๆธฒๆŸ“ - ๅฎขๅŽ… [ร—] โ”‚ โ† ๆธๅ˜็ดซ่‰ฒๅคด้ƒจ โ”‚ ๐Ÿ“ 6 ไธชๆ–‡ไปถ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ [ๅ›พ1] [ๅ›พ2] [ๅ›พ3] [ๅ›พ4] โ”‚ โ† ่‡ช้€‚ๅบ”็ฝ‘ๆ ผ โ”‚ [ๅ›พ5] [ๅ›พ6] [PDF] [ๅ›พ7] โ”‚ โ† ้˜ดๅฝฑ + hover โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ [๐Ÿ“ค ไธŠไผ ๆ–‡ไปถ] โ”‚ โ† ๆธๅ˜ๆŒ‰้’ฎ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ### ๆ‰‹ๆœบ็ซฏ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ [๐Ÿ ] ๆธฒๆŸ“ [ร—] โ”‚ โ”‚ ๐Ÿ“ 6 ไธชๆ–‡ไปถ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ [ๅ›พ1] [ๅ›พ2] โ”‚ โ† 2ๅˆ—ๅธƒๅฑ€ โ”‚ [ๅ›พ3] [ๅ›พ4] โ”‚ โ”‚ [ๅ›พ5] [ๅ›พ6] โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ [๐Ÿ“ค ไธŠไผ ๆ–‡ไปถ] โ”‚ โ† ๅ…จๅฎฝๆŒ‰้’ฎ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` --- ## ๐ŸŽฏ ๆ ธๅฟƒ็‰นๆ€ง ### **ๅŠŸ่ƒฝ** - ๐Ÿ–ผ๏ธ ๅ›พ็‰‡ๅคงๅ›พ้ข„่งˆ๏ผˆ็‚นๅ‡ปๆŸฅ็œ‹๏ผ‰ - โฌ…๏ธโžก๏ธ ๅทฆๅณๅˆ‡ๆขๅ›พ็‰‡ - ๐Ÿ—‘๏ธ ๅˆ ้™คๆ–‡ไปถ๏ผˆๅธฆ็กฎ่ฎค๏ผ‰ - ๐Ÿ“ค ไธŠไผ ๆ–‡ไปถ - ๐Ÿ“ ๆ–‡ๆกฃ้ข„่งˆ๏ผˆPDFใ€DWG็ญ‰๏ผ‰ ### **่ฎพ่ฎก** - ๐ŸŒˆ ๆธๅ˜็ดซ่‰ฒไธป้ข˜ - โœจ ็Žป็’ƒๆ‹Ÿๆ€ๆ•ˆๆžœ - ๐ŸŽฌ ๆต็•…ๅŠจ็”ป - ๐Ÿ“ฑ ๅฎŒๅ…จๅ“ๅบ”ๅผ ### **ไฝ“้ชŒ** - ๐Ÿ‘† ๅคงๆŒ‰้’ฎๆ˜“ๆ“ไฝœ - ๐Ÿ“Š ไฟกๆฏๆธ…ๆ™ฐๅฎŒๆ•ด - ๐Ÿš€ ๆ€ง่ƒฝไผ˜ๅŒ– - ๐ŸŽฏ ่ง†่ง‰ๅ้ฆˆ --- ## ๐Ÿ“ฑ ่‡ช้€‚ๅบ”่ฏดๆ˜Ž | ๅฑๅน•ๅฐบๅฏธ | ๅˆ—ๆ•ฐ | ้—ด่ท | ็‰นๆฎŠๅค„็† | |----------|------|------|----------| | **ๆกŒ้ข** (>1024px) | ่‡ช้€‚ๅบ” | 24px | hoverๆ˜พ็คบๅˆ ้™ค | | **ๅนณๆฟ** (768-1024px) | 3ๅˆ— | 20px | ๅง‹็ปˆๆ˜พ็คบๅˆ ้™ค | | **ๆ‰‹ๆœบ** (<768px) | 2ๅˆ— | 12px | ๅ…จๅฎฝๆŒ‰้’ฎ | --- ## ๐Ÿ’ก ไฝฟ็”จๅปบ่ฎฎ ### โœ… **ๆŽจ่ๅšๆณ•** ```typescript // 1. ไฝฟ็”จ ChangeDetectionStrategy.OnPush @Component({ changeDetection: ChangeDetectionStrategy.OnPush }) // 2. ่ฐƒ็”จ markForCheck ๆ›ดๆ–ฐ่ง†ๅ›พ this.galleryConfig = newConfig; this.cdr.markForCheck(); // 3. ๅ…ณ้—ญๆ—ถๆธ…็†็Šถๆ€ closeGallery() { this.showGallery = false; this.galleryConfig = null; } ``` ### โŒ **้ฟๅ…ๅšๆณ•** ```typescript // 1. ไธ่ฆๅœจ config ไธญไฝฟ็”จๅคๆ‚ๅฏน่ฑก // โŒ ้”™่ฏฏ files: this.allFiles // ๅผ•็”จ // โœ… ๆญฃ็กฎ files: [...this.allFiles] // ๆ‹ท่ด // 2. ไธ่ฆๅฟ˜่ฎฐๅค„็†ๅ…ณ้—ญไบ‹ไปถ // โŒ ้”™่ฏฏ // โœ… ๆญฃ็กฎ ``` --- ## ๐Ÿ”— ๆ›ดๅคšๆ–‡ๆกฃ - ๐Ÿ“„ **ๅฎŒๆ•ดๆ–‡ๆกฃ**: `NEW_GALLERY_COMPONENT.md` - ๐ŸŽจ **่ฎพ่ฎก่ง„่Œƒ**: ๆŸฅ็œ‹ SCSS ไธญ็š„ๆณจ้‡Š - ๐Ÿ› **้—ฎ้ข˜ๅ้ฆˆ**: ่”็ณปๅผ€ๅ‘ๅ›ข้˜Ÿ --- ## ๐ŸŽ‰ ๅผ€ๅง‹ไฝฟ็”จๅง๏ผ ๅช้œ€4ๆญฅ๏ผŒๅณๅฏๆ‹ฅๆœ‰็ฒพ็พŽ็š„ๅ›พ็‰‡็”ปๅปŠ๏ผ ```typescript // 1. ๅฏผๅ…ฅ import { StageGalleryModalComponent, GalleryConfig } from '@/components/stage-gallery-modal'; // 2. ้…็ฝฎ galleryConfig: GalleryConfig = { /* ... */ }; // 3. ไฝฟ็”จ // 4. ๅฎŒๆˆ๏ผ ``` --- **ๅฟซ้€ŸไธŠๆ‰‹ๆ—ถ้—ด**: ~5ๅˆ†้’Ÿ **้›†ๆˆ้šพๅบฆ**: โญโญโ˜†โ˜†โ˜† (็ฎ€ๅ•) **่ง†่ง‰ๆ•ˆๆžœ**: โญโญโญโญโญ (็ฒพ็พŽ)