strapi-plugin-copy-any-component 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +70 -119
- package/package.json +3 -7
- package/INSTALLATION.md +0 -179
- package/QUICK_START.md +0 -88
- package/TESTING.md +0 -193
- package/USAGE.md +0 -121
- package/server/src/controllers/controller.ts +0 -22
- package/server/src/controllers/index.ts +0 -5
- package/server/src/index.ts +0 -13
- package/server/src/routes/admin.ts +0 -11
- package/server/src/routes/content-api.ts +0 -19
- package/server/src/routes/index.ts +0 -13
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Copy Any Component Plugin for Strapi 5
|
|
2
2
|
|
|
3
|
-
[](https://www.npmjs.com/package/strapi-plugin-copy-any-component)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
5
|
|
|
6
6
|
A powerful Strapi plugin that allows you to copy and reorder components (sections) between pages using an intuitive drag-and-drop interface. **No code required!** Works with any content type and dynamic zone.
|
|
@@ -14,146 +14,98 @@ A powerful Strapi plugin that allows you to copy and reorder components (section
|
|
|
14
14
|
- ⚙️ **Zero-Code Configuration**: Configure via admin panel - settings persist across restarts
|
|
15
15
|
- 📸 **Media Support**: Properly handles media files and images
|
|
16
16
|
- 💾 **Draft/Publish System**: Changes are saved as drafts, publish when ready
|
|
17
|
-
- ✅ **Detailed Feedback**: See exactly what fields and media were copied
|
|
18
|
-
- 🌐 **Universal**: Works with any content type (Page, Article, Blog, etc.) and any dynamic zone field
|
|
19
17
|
|
|
20
|
-
##
|
|
21
|
-
|
|
22
|
-
This plugin works with **any content type** and **any dynamic zone**! The plugin automatically:
|
|
23
|
-
|
|
24
|
-
- Detects all custom content types (Page, Article, Blog, LandingPage, etc.)
|
|
25
|
-
- Finds all fields containing dynamic zones (sections, blocks, content, etc.)
|
|
26
|
-
- Provides a dropdown interface in the admin panel for easy selection
|
|
27
|
-
|
|
28
|
-
### Admin Panel Configuration (No Code Required!)
|
|
29
|
-
|
|
30
|
-
1. Go to the plugin page
|
|
31
|
-
2. Click the **⚙️ Content Type Settings** button in the top right
|
|
32
|
-
3. Select your desired **Content Type** and **Dynamic Zone**
|
|
33
|
-
4. Click **💾 Save**
|
|
18
|
+
## 📦 Installation
|
|
34
19
|
|
|
35
|
-
|
|
20
|
+
```bash
|
|
21
|
+
npm install strapi-plugin-copy-any-component
|
|
22
|
+
```
|
|
36
23
|
|
|
37
|
-
|
|
24
|
+
That's it! The plugin will be automatically detected by Strapi.
|
|
38
25
|
|
|
39
|
-
|
|
40
|
-
- **[INSTALLATION.md](./INSTALLATION.md)** - Detaylı kurulum rehberi
|
|
41
|
-
- **[USAGE.md](./USAGE.md)** - Kullanım rehberi ve örnekler
|
|
42
|
-
- **[TESTING.md](./TESTING.md)** - Test rehberi
|
|
26
|
+
> **Note:** No need to add anything to `config/plugins.ts` - Strapi automatically picks up plugins installed via npm.
|
|
43
27
|
|
|
44
|
-
|
|
28
|
+
### Set Permissions
|
|
45
29
|
|
|
46
|
-
|
|
47
|
-
- 📋 **Component Copying**: Copy components from one page to another
|
|
48
|
-
- 🔄 **Component Reordering**: Reorder components within a page
|
|
49
|
-
- 🔍 **Auto-Detection**: Automatically detects all content types and dynamic zones
|
|
50
|
-
- ⚙️ **Zero-Code Configuration**: Configure via admin panel - settings persist across restarts
|
|
51
|
-
- 📸 **Media Support**: Properly handles media files and images
|
|
52
|
-
- 💾 **Draft/Publish System**: Changes are saved as drafts, publish when ready
|
|
53
|
-
- ✅ **Detailed Feedback**: See exactly what fields and media were copied
|
|
54
|
-
- 🌐 **Universal**: Works with any content type (Page, Article, Blog, etc.) and any dynamic zone field
|
|
30
|
+
After installation, you need to enable permissions:
|
|
55
31
|
|
|
56
|
-
|
|
32
|
+
1. Go to **Settings > Users & Permissions > Roles** in Strapi admin
|
|
33
|
+
2. Select your role (e.g., Super Admin, Editor)
|
|
34
|
+
3. Find **Copy Any Component** section
|
|
35
|
+
4. Enable all permissions:
|
|
36
|
+
- Access Component Copy pages
|
|
37
|
+
- Copy components
|
|
38
|
+
- Update page sections
|
|
39
|
+
- Publish pages
|
|
40
|
+
5. Save
|
|
57
41
|
|
|
58
|
-
###
|
|
42
|
+
### Restart Strapi
|
|
59
43
|
|
|
60
44
|
```bash
|
|
61
|
-
npm
|
|
45
|
+
npm run develop
|
|
62
46
|
```
|
|
63
47
|
|
|
64
|
-
### Manual Install
|
|
65
|
-
|
|
66
|
-
1. **Install the plugin:**
|
|
67
|
-
```bash
|
|
68
|
-
npm install @strapi/plugin-copy-any-component
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
2. **Register the plugin** in `config/plugins.ts`:
|
|
72
|
-
```typescript
|
|
73
|
-
export default () => ({
|
|
74
|
-
'copy-any-component': {
|
|
75
|
-
enabled: true,
|
|
76
|
-
resolve: './node_modules/@strapi/plugin-copy-any-component',
|
|
77
|
-
// Optional: Set defaults (can be changed via admin panel)
|
|
78
|
-
config: {
|
|
79
|
-
contentType: 'api::page.page',
|
|
80
|
-
dynamicZoneField: 'sections',
|
|
81
|
-
},
|
|
82
|
-
},
|
|
83
|
-
});
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
3. **Set permissions:**
|
|
87
|
-
- Go to **Settings > Users & Permissions > Roles** in Strapi admin
|
|
88
|
-
- Enable permissions for **Copy Any Component** section:
|
|
89
|
-
- Access Component Copy pages
|
|
90
|
-
- Copy components
|
|
91
|
-
- Update page sections
|
|
92
|
-
- Publish pages
|
|
93
|
-
|
|
94
|
-
4. **Restart Strapi:**
|
|
95
|
-
```bash
|
|
96
|
-
npm run develop
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
### Configuration
|
|
100
|
-
|
|
101
|
-
The plugin can be configured in two ways:
|
|
102
|
-
|
|
103
|
-
1. **Via Admin Panel (Recommended)**: No code required! Settings persist automatically.
|
|
104
|
-
2. **Via Config File**: Edit `config/plugins.ts` as shown above.
|
|
105
|
-
|
|
106
|
-
For detailed installation instructions, see [INSTALLATION.md](./INSTALLATION.md).
|
|
107
|
-
|
|
108
48
|
## 🚀 Usage
|
|
109
49
|
|
|
110
|
-
For detailed usage instructions, see [USAGE.md](./USAGE.md).
|
|
111
|
-
|
|
112
|
-
### Basic Usage
|
|
113
|
-
|
|
114
50
|
1. Go to **Plugins > Copy Any Component** in Strapi admin panel
|
|
115
|
-
2.
|
|
116
|
-
3. **
|
|
117
|
-
4. Drag components from Source
|
|
118
|
-
5. Reorder
|
|
119
|
-
6. Click **Publish** to save
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
51
|
+
2. Click **⚙️ Content Type Settings** to select your content type and dynamic zone
|
|
52
|
+
3. Select **Source Page** (left) and **Target Page** (right)
|
|
53
|
+
4. Drag components from Source to Target
|
|
54
|
+
5. Reorder by dragging within Target
|
|
55
|
+
6. Click **Publish** to save
|
|
56
|
+
|
|
57
|
+
## 🔧 Optional Configuration
|
|
58
|
+
|
|
59
|
+
If you want to set default content type, add to `config/plugins.ts`:
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
export default () => ({
|
|
63
|
+
'copy-any-component': {
|
|
64
|
+
enabled: true,
|
|
65
|
+
config: {
|
|
66
|
+
contentType: 'api::page.page',
|
|
67
|
+
dynamicZoneField: 'sections',
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
```
|
|
127
72
|
|
|
128
|
-
##
|
|
73
|
+
## Requirements
|
|
129
74
|
|
|
130
|
-
|
|
75
|
+
- Strapi 5.0.0 or higher
|
|
76
|
+
- Node.js 18.x or higher
|
|
131
77
|
|
|
132
|
-
|
|
133
|
-
- `GET /admin/plugins/copy-any-component/pages/:pageId/sections` - Get page sections
|
|
134
|
-
- `GET /admin/plugins/copy-any-component/content-types` - List available content types
|
|
135
|
-
- `PUT /admin/plugins/copy-any-component/config` - Update plugin configuration
|
|
136
|
-
- `POST /admin/plugins/copy-any-component/pages/:sourcePageId/copy-to/:targetPageId` - Copy sections
|
|
137
|
-
- `PUT /admin/plugins/copy-any-component/pages/:pageId/sections` - Update page sections (reorder)
|
|
138
|
-
- `POST /admin/plugins/copy-any-component/pages/:pageId/publish` - Publish page
|
|
78
|
+
## ⚠️ Troubleshooting
|
|
139
79
|
|
|
140
|
-
###
|
|
80
|
+
### `flushSync` Error
|
|
141
81
|
|
|
142
|
-
|
|
143
|
-
|
|
82
|
+
If you see:
|
|
83
|
+
```
|
|
84
|
+
SyntaxError: The requested module 'react-dom' does not provide an export named 'flushSync'
|
|
85
|
+
```
|
|
144
86
|
|
|
145
|
-
|
|
87
|
+
Update your project's React version in `package.json`:
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"dependencies": {
|
|
91
|
+
"react": "^18.2.0",
|
|
92
|
+
"react-dom": "^18.2.0"
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
```
|
|
146
96
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
-
|
|
150
|
-
|
|
151
|
-
|
|
97
|
+
Then run:
|
|
98
|
+
```bash
|
|
99
|
+
rm -rf node_modules package-lock.json
|
|
100
|
+
npm install
|
|
101
|
+
npm run develop
|
|
102
|
+
```
|
|
152
103
|
|
|
153
|
-
|
|
104
|
+
### Plugin not visible
|
|
154
105
|
|
|
155
|
-
-
|
|
156
|
-
-
|
|
106
|
+
- Check permissions in Settings > Roles
|
|
107
|
+
- Restart Strapi: `npm run develop`
|
|
108
|
+
- Clear cache: `rm -rf .cache dist`
|
|
157
109
|
|
|
158
110
|
## License
|
|
159
111
|
|
|
@@ -161,5 +113,4 @@ MIT
|
|
|
161
113
|
|
|
162
114
|
## Support
|
|
163
115
|
|
|
164
|
-
For issues
|
|
165
|
-
|
|
116
|
+
For issues, please open an issue on [GitHub](https://github.com/metehankasapp/strapi-plugin-copy-any-component/issues).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "strapi-plugin-copy-any-component",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "A powerful Strapi plugin that allows you to copy and reorder components (sections) between pages using an intuitive drag-and-drop interface. Works with any content type and dynamic zone - no code required!",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"strapi",
|
|
@@ -36,12 +36,8 @@
|
|
|
36
36
|
"strapi-admin.js",
|
|
37
37
|
"strapi-server.js",
|
|
38
38
|
"admin",
|
|
39
|
-
"server",
|
|
40
|
-
"README.md"
|
|
41
|
-
"INSTALLATION.md",
|
|
42
|
-
"USAGE.md",
|
|
43
|
-
"QUICK_START.md",
|
|
44
|
-
"TESTING.md"
|
|
39
|
+
"server/src/services",
|
|
40
|
+
"README.md"
|
|
45
41
|
],
|
|
46
42
|
"scripts": {
|
|
47
43
|
"test": "echo \"Error: no test specified\" && exit 1"
|
package/INSTALLATION.md
DELETED
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
# Component Copy Plugin - Kurulum Rehberi
|
|
2
|
-
|
|
3
|
-
Bu rehber, Component Copy plugin'ini başka bir Strapi projesinde kullanmak için gerekli adımları içerir.
|
|
4
|
-
|
|
5
|
-
## Önkoşullar
|
|
6
|
-
|
|
7
|
-
- Strapi 5.0.0 veya üzeri
|
|
8
|
-
- Node.js 20.x veya üzeri
|
|
9
|
-
- Mevcut bir Page content type'ı (sections dynamic zone ile)
|
|
10
|
-
|
|
11
|
-
## Kurulum Adımları
|
|
12
|
-
|
|
13
|
-
### 1. Plugin'i Kopyalayın
|
|
14
|
-
|
|
15
|
-
Plugin klasörünü hedef Strapi projenizin `src/plugins/` dizinine kopyalayın:
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
# Mevcut projeden
|
|
19
|
-
cp -r /path/to/source/strapi/src/plugins/my-simple-plugin /path/to/target/strapi/src/plugins/
|
|
20
|
-
|
|
21
|
-
# veya Git kullanarak
|
|
22
|
-
git clone <repository-url> /path/to/target/strapi/src/plugins/my-simple-plugin
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
### 2. Plugin'i Kaydedin
|
|
26
|
-
|
|
27
|
-
Hedef projede `config/plugins.ts` dosyasını düzenleyin:
|
|
28
|
-
|
|
29
|
-
```typescript
|
|
30
|
-
export default () => ({
|
|
31
|
-
'my-simple-plugin': {
|
|
32
|
-
enabled: true,
|
|
33
|
-
resolve: './src/plugins/my-simple-plugin',
|
|
34
|
-
},
|
|
35
|
-
});
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
Eğer `config/plugins.js` kullanıyorsanız:
|
|
39
|
-
|
|
40
|
-
```javascript
|
|
41
|
-
module.exports = {
|
|
42
|
-
'my-simple-plugin': {
|
|
43
|
-
enabled: true,
|
|
44
|
-
resolve: './src/plugins/my-simple-plugin',
|
|
45
|
-
},
|
|
46
|
-
};
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
### 3. Gerekli Content Type'ı Kontrol Edin
|
|
50
|
-
|
|
51
|
-
Plugin, `api::page.page` content type'ını kullanır. Bu content type'ın şu özelliklere sahip olması gerekir:
|
|
52
|
-
|
|
53
|
-
- **Dynamic Zone**: `sections` adında bir dynamic zone field
|
|
54
|
-
- **Slug**: Sayfaları tanımlamak için slug field'ı
|
|
55
|
-
|
|
56
|
-
Eğer farklı bir content type kullanıyorsanız, plugin kodunu düzenlemeniz gerekebilir.
|
|
57
|
-
|
|
58
|
-
#### Örnek Page Schema:
|
|
59
|
-
|
|
60
|
-
```json
|
|
61
|
-
{
|
|
62
|
-
"kind": "collectionType",
|
|
63
|
-
"collectionName": "pages",
|
|
64
|
-
"info": {
|
|
65
|
-
"singularName": "page",
|
|
66
|
-
"pluralName": "pages",
|
|
67
|
-
"displayName": "Page"
|
|
68
|
-
},
|
|
69
|
-
"attributes": {
|
|
70
|
-
"title": {
|
|
71
|
-
"type": "string",
|
|
72
|
-
"required": true
|
|
73
|
-
},
|
|
74
|
-
"slug": {
|
|
75
|
-
"type": "uid",
|
|
76
|
-
"targetField": "title",
|
|
77
|
-
"required": true
|
|
78
|
-
},
|
|
79
|
-
"sections": {
|
|
80
|
-
"type": "dynamiczone",
|
|
81
|
-
"components": [
|
|
82
|
-
// Component listesi buraya gelecek
|
|
83
|
-
]
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
### 4. İzinleri Ayarlayın
|
|
90
|
-
|
|
91
|
-
Strapi admin panelinde şu adımları izleyin:
|
|
92
|
-
|
|
93
|
-
1. **Settings > Users & Permissions > Roles** sayfasına gidin
|
|
94
|
-
2. İlgili role'ü seçin (örn: Authenticated, Public)
|
|
95
|
-
3. **My Simple Plugin** bölümünü bulun
|
|
96
|
-
4. Şu izinleri etkinleştirin:
|
|
97
|
-
- `find` - Sayfaları listelemek için
|
|
98
|
-
- `getPageSections` - Section'ları görmek için
|
|
99
|
-
- `copySections` - Component'leri kopyalamak için
|
|
100
|
-
- `updatePageSections` - Section'ları güncellemek için
|
|
101
|
-
- `publish` - Sayfaları yayınlamak için
|
|
102
|
-
|
|
103
|
-
### 5. Strapi'yi Yeniden Başlatın
|
|
104
|
-
|
|
105
|
-
```bash
|
|
106
|
-
npm run develop
|
|
107
|
-
# veya production için
|
|
108
|
-
npm run build
|
|
109
|
-
npm run start
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### 6. Plugin'i Kullanın
|
|
113
|
-
|
|
114
|
-
1. Strapi admin panelinde **Plugins** menüsüne gidin
|
|
115
|
-
2. **Component Copy** seçeneğini bulun
|
|
116
|
-
3. Plugin arayüzünü kullanarak component'leri kopyalayın
|
|
117
|
-
|
|
118
|
-
## Farklı Content Type Kullanımı
|
|
119
|
-
|
|
120
|
-
Eğer `page` yerine farklı bir content type kullanıyorsanız (örneğin `article`, `post`), plugin kodunda aşağıdaki dosyaları güncellemeniz gerekir:
|
|
121
|
-
|
|
122
|
-
1. `server/src/services/component-copy.js` - Tüm `api::page.page` referanslarını değiştirin
|
|
123
|
-
2. `strapi-server.js` - Controller'lardaki `api::page.page` referanslarını değiştirin
|
|
124
|
-
3. `admin/src/pages/HomePage.jsx` - API endpoint'lerini kontrol edin (genellikle değişmez)
|
|
125
|
-
|
|
126
|
-
**Örnek değişiklik:**
|
|
127
|
-
|
|
128
|
-
```javascript
|
|
129
|
-
// Eski
|
|
130
|
-
await strapi.entityService.findOne("api::page.page", pageId, ...)
|
|
131
|
-
|
|
132
|
-
// Yeni (article için)
|
|
133
|
-
await strapi.entityService.findOne("api::article.article", pageId, ...)
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
## Sorun Giderme
|
|
137
|
-
|
|
138
|
-
### Plugin görünmüyor
|
|
139
|
-
|
|
140
|
-
- `config/plugins.ts` dosyasının doğru yapılandırıldığından emin olun
|
|
141
|
-
- Strapi'yi yeniden başlatın
|
|
142
|
-
- `dist` klasörünü temizleyin: `rm -rf dist .cache`
|
|
143
|
-
|
|
144
|
-
### "Page not found" hatası
|
|
145
|
-
|
|
146
|
-
- Page content type'ının doğru şekilde oluşturulduğundan emin olun
|
|
147
|
-
- Slug field'ının mevcut olduğunu kontrol edin
|
|
148
|
-
- Sections dynamic zone'ın tanımlı olduğunu doğrulayın
|
|
149
|
-
|
|
150
|
-
### Component'ler kopyalanmıyor
|
|
151
|
-
|
|
152
|
-
- İzinlerin doğru ayarlandığından emin olun
|
|
153
|
-
- Browser console'da hata mesajlarını kontrol edin
|
|
154
|
-
- Network tab'inde API isteklerinin başarılı olduğunu doğrulayın
|
|
155
|
-
|
|
156
|
-
### Media dosyaları kopyalanmıyor
|
|
157
|
-
|
|
158
|
-
- Media library'de dosyaların mevcut olduğundan emin olun
|
|
159
|
-
- Media field'larının populate edildiğinden emin olun
|
|
160
|
-
- Component schema'larında media field'larının doğru tanımlandığını kontrol edin
|
|
161
|
-
|
|
162
|
-
## Önemli Notlar
|
|
163
|
-
|
|
164
|
-
1. **Bootstrap Fonksiyonu**: Mevcut projedeki `src/index.ts` dosyasında bootstrap kodu varsa, bu kod hedef projede çalışmayabilir. Bootstrap kodunu yalnızca test/development için kullanıyorsanız, production'da kaldırmak isteyebilirsiniz.
|
|
165
|
-
|
|
166
|
-
2. **Component'ler**: Plugin, dynamic zone içindeki tüm component'leri destekler. Kendi component'lerinizi kullanabilirsiniz.
|
|
167
|
-
|
|
168
|
-
3. **Performance**: Çok sayıda component'i kopyalarken performans etkilenebilir. Büyük component'ler için dikkatli olun.
|
|
169
|
-
|
|
170
|
-
4. **Backup**: Component kopyalama işleminden önce veritabanınızı yedeklemeyi unutmayın.
|
|
171
|
-
|
|
172
|
-
## Destek
|
|
173
|
-
|
|
174
|
-
Sorun yaşarsanız:
|
|
175
|
-
1. Browser console'da hata mesajlarını kontrol edin
|
|
176
|
-
2. Strapi log'larını inceleyin
|
|
177
|
-
3. Plugin'in doğru kurulduğundan emin olun
|
|
178
|
-
4. İzinlerin ayarlandığını doğrulayın
|
|
179
|
-
|
package/QUICK_START.md
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
# Component Copy Plugin - Hızlı Başlangıç
|
|
2
|
-
|
|
3
|
-
## ✅ Kurulum Checklist
|
|
4
|
-
|
|
5
|
-
Başka bir Strapi projesinde plugin'i kullanmak için şu adımları izleyin:
|
|
6
|
-
|
|
7
|
-
### 1. Plugin'i Kopyalayın
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
# Mevcut projeden plugin klasörünü kopyalayın
|
|
11
|
-
cp -r /path/to/source/strapi/src/plugins/my-simple-plugin /path/to/target/strapi/src/plugins/
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
### 2. Plugin'i Kaydedin
|
|
15
|
-
|
|
16
|
-
`config/plugins.ts` dosyasına ekleyin:
|
|
17
|
-
|
|
18
|
-
```typescript
|
|
19
|
-
export default () => ({
|
|
20
|
-
'my-simple-plugin': {
|
|
21
|
-
enabled: true,
|
|
22
|
-
resolve: './src/plugins/my-simple-plugin',
|
|
23
|
-
},
|
|
24
|
-
});
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
### 3. İzinleri Ayarlayın
|
|
28
|
-
|
|
29
|
-
Strapi admin panelinde:
|
|
30
|
-
- **Settings > Users & Permissions > Roles**
|
|
31
|
-
- İlgili role seçin (Authenticated, Public, vb.)
|
|
32
|
-
- **My Simple Plugin** bölümündeki tüm izinleri etkinleştirin:
|
|
33
|
-
- `find`
|
|
34
|
-
- `getPageSections`
|
|
35
|
-
- `copySections`
|
|
36
|
-
- `updatePageSections`
|
|
37
|
-
- `publish`
|
|
38
|
-
|
|
39
|
-
### 4. Strapi'yi Yeniden Başlatın
|
|
40
|
-
|
|
41
|
-
```bash
|
|
42
|
-
# Development
|
|
43
|
-
npm run develop
|
|
44
|
-
|
|
45
|
-
# Production
|
|
46
|
-
npm run build
|
|
47
|
-
npm run start
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
### 5. Plugin'i Kullanın
|
|
51
|
-
|
|
52
|
-
- Admin panelinde **Plugins > Component Copy** menüsüne gidin
|
|
53
|
-
- Component'leri kopyalayın ve sıralayın
|
|
54
|
-
|
|
55
|
-
## ⚠️ Önemli Notlar
|
|
56
|
-
|
|
57
|
-
1. **Page Content Type Gerekli**: Plugin `api::page.page` content type'ını kullanır. Bu content type'ın:
|
|
58
|
-
- `sections` adında bir dynamic zone field'ı olmalıdır
|
|
59
|
-
- `slug` field'ı olmalıdır
|
|
60
|
-
|
|
61
|
-
2. **Farklı Content Type**: Eğer farklı bir content type kullanıyorsanız, plugin kodunda `api::page.page` referanslarını değiştirmeniz gerekir.
|
|
62
|
-
|
|
63
|
-
3. **Bootstrap Kodu**: Mevcut projedeki `src/index.ts` dosyasındaki bootstrap kodu bu plugin'e özel değildir. İsterseniz hedef projede kullanmayabilirsiniz.
|
|
64
|
-
|
|
65
|
-
4. **Component'ler**: Plugin herhangi bir dynamic zone component'ini destekler. Kendi component'lerinizi kullanabilirsiniz.
|
|
66
|
-
|
|
67
|
-
## 🔧 Farklı Content Type Kullanımı
|
|
68
|
-
|
|
69
|
-
Eğer `page` yerine başka bir content type kullanıyorsanız:
|
|
70
|
-
|
|
71
|
-
1. `server/src/services/component-copy.js` dosyasında tüm `api::page.page` referanslarını değiştirin
|
|
72
|
-
2. `strapi-server.js` dosyasında controller'lardaki `api::page.page` referanslarını değiştirin
|
|
73
|
-
|
|
74
|
-
**Örnek:**
|
|
75
|
-
```javascript
|
|
76
|
-
// Eski
|
|
77
|
-
api::page.page
|
|
78
|
-
|
|
79
|
-
// Yeni (örneğin article için)
|
|
80
|
-
api::article.article
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
## 📚 Daha Fazla Bilgi
|
|
84
|
-
|
|
85
|
-
- **Detaylı Kurulum**: [INSTALLATION.md](./INSTALLATION.md)
|
|
86
|
-
- **Kullanım Rehberi**: [USAGE.md](./USAGE.md)
|
|
87
|
-
- **Genel Bilgiler**: [README.md](./README.md)
|
|
88
|
-
|
package/TESTING.md
DELETED
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
# Copy Any Component Plugin - Test Rehberi
|
|
2
|
-
|
|
3
|
-
Bu rehber, plugin'i test etmek için adım adım talimatlar içerir.
|
|
4
|
-
|
|
5
|
-
## 1. Temel Test
|
|
6
|
-
|
|
7
|
-
### Adım 1: Strapi'yi Başlatın
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
npm run develop
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
### Adım 2: Admin Panelinde Plugin'e Erişin
|
|
14
|
-
|
|
15
|
-
1. Strapi admin panelinde giriş yapın
|
|
16
|
-
2. Sol menüden **Plugins > Copy Any Component 🎨** seçeneğine tıklayın
|
|
17
|
-
|
|
18
|
-
### Adım 3: Sayfaları Kontrol Edin
|
|
19
|
-
|
|
20
|
-
- Source Page (sol panel) ve Target Page (sağ panel) dropdown'larından sayfaları görebilmelisiniz
|
|
21
|
-
- Eğer sayfa yoksa, önce Content Manager'da birkaç sayfa oluşturun
|
|
22
|
-
|
|
23
|
-
### Adım 4: Component Kopyalama Testi
|
|
24
|
-
|
|
25
|
-
1. **Source Page** seçin (örneğin: "Ana Sayfa")
|
|
26
|
-
2. **Target Page** seçin (örneğin: "Hakkımızda")
|
|
27
|
-
3. Source Page panelinden bir component'i seçin
|
|
28
|
-
4. Component'i sürükleyip Target Page paneline bırakın
|
|
29
|
-
5. Başarı mesajını görmelisiniz
|
|
30
|
-
6. Target Page panelinde yeni component görünmeli
|
|
31
|
-
|
|
32
|
-
### Adım 5: Kopyalanan Component'i Kontrol Edin
|
|
33
|
-
|
|
34
|
-
1. Content Manager > Pages > Target Page'e gidin
|
|
35
|
-
2. Sayfayı düzenle modunda açın
|
|
36
|
-
3. Kopyalanan component'in tüm field'larının doğru kopyalandığını kontrol edin:
|
|
37
|
-
- Text field'lar
|
|
38
|
-
- Media dosyaları
|
|
39
|
-
- Nested component'ler (button, form-field, vb.)
|
|
40
|
-
- Relation field'lar
|
|
41
|
-
|
|
42
|
-
### Adım 6: Publish Testi
|
|
43
|
-
|
|
44
|
-
1. Plugin arayüzüne geri dönün
|
|
45
|
-
2. **Publish** butonuna tıklayın
|
|
46
|
-
3. Başarı mesajını görmelisiniz
|
|
47
|
-
4. Frontend'de değişikliklerin göründüğünü kontrol edin
|
|
48
|
-
|
|
49
|
-
## 2. Farklı Component Tipleri Testi
|
|
50
|
-
|
|
51
|
-
Her component tipini test edin:
|
|
52
|
-
|
|
53
|
-
- ✅ **Hero Section** - Basit component
|
|
54
|
-
- ✅ **CTA Section** - Button component'leri içeren
|
|
55
|
-
- ✅ **Stats Section** - Relation (siteSettings) içeren
|
|
56
|
-
- ✅ **Form Section** - Nested form-field component'leri içeren
|
|
57
|
-
- ✅ **Gallery Section** - Media array içeren
|
|
58
|
-
- ✅ **Accordion Section** - Nested accordion-item component'leri içeren
|
|
59
|
-
- ✅ **Pricing Section** - Nested pricing-plan component'leri içeren
|
|
60
|
-
- ✅ **Timeline Section** - Nested timeline-item component'leri içeren
|
|
61
|
-
|
|
62
|
-
Her bir component tipinde:
|
|
63
|
-
- Tüm field'ların kopyalandığını doğrulayın
|
|
64
|
-
- Nested component'lerin kopyalandığını doğrulayın
|
|
65
|
-
- Media dosyalarının referanslarının korunduğunu doğrulayın
|
|
66
|
-
|
|
67
|
-
## 3. Aynı Sayfada Kopyalama Testi
|
|
68
|
-
|
|
69
|
-
1. Aynı sayfayı hem Source hem de Target olarak seçin
|
|
70
|
-
2. Bir component'i kopyalayın
|
|
71
|
-
3. Component'in duplicate (çoğaltıldığını) doğrulayın
|
|
72
|
-
4. Publish edin ve sonucu kontrol edin
|
|
73
|
-
|
|
74
|
-
## 4. Component Sıralama Testi
|
|
75
|
-
|
|
76
|
-
1. Target Page panelinde component'leri seçin
|
|
77
|
-
2. Component'leri sürükleyerek sıralayın
|
|
78
|
-
3. Değişikliklerin otomatik kaydedildiğini kontrol edin
|
|
79
|
-
4. Publish edin ve sonucu kontrol edin
|
|
80
|
-
|
|
81
|
-
## 5. Farklı Content Type Testi (OPSİYONEL)
|
|
82
|
-
|
|
83
|
-
Eğer farklı bir content type kullanmak istiyorsanız:
|
|
84
|
-
|
|
85
|
-
### Adım 1: Config'i Güncelleyin
|
|
86
|
-
|
|
87
|
-
`config/plugins.ts` dosyasını düzenleyin:
|
|
88
|
-
|
|
89
|
-
```typescript
|
|
90
|
-
export default () => ({
|
|
91
|
-
'copy-any-component': {
|
|
92
|
-
enabled: true,
|
|
93
|
-
resolve: './src/plugins/my-simple-plugin',
|
|
94
|
-
config: {
|
|
95
|
-
contentType: 'api::article.article', // Farklı content type
|
|
96
|
-
dynamicZoneField: 'blocks', // Farklı field name
|
|
97
|
-
},
|
|
98
|
-
},
|
|
99
|
-
});
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
### Adım 2: Strapi'yi Yeniden Başlatın
|
|
103
|
-
|
|
104
|
-
```bash
|
|
105
|
-
npm run develop
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
### Adım 3: Yeni Content Type ile Test Edin
|
|
109
|
-
|
|
110
|
-
1. Content Manager'da yeni content type'dan kayıtlar oluşturun
|
|
111
|
-
2. Plugin arayüzünde yeni kayıtları görebilmelisiniz
|
|
112
|
-
3. Component kopyalama işlemini test edin
|
|
113
|
-
|
|
114
|
-
## 6. Hata Senaryoları Testi
|
|
115
|
-
|
|
116
|
-
### Test 1: İzin Hatası
|
|
117
|
-
|
|
118
|
-
1. Gerekli izinleri kapatın (Settings > Users & Permissions > Roles)
|
|
119
|
-
2. Component kopyalamayı deneyin
|
|
120
|
-
3. Uygun hata mesajını görmelisiniz
|
|
121
|
-
|
|
122
|
-
### Test 2: Geçersiz Sayfa ID
|
|
123
|
-
|
|
124
|
-
1. Network tab'ını açın
|
|
125
|
-
2. Component kopyalama işlemini başlatın
|
|
126
|
-
3. API request'ini düzenleyip geçersiz ID gönderin
|
|
127
|
-
4. Uygun hata mesajını görmelisiniz
|
|
128
|
-
|
|
129
|
-
## 7. Performance Testi
|
|
130
|
-
|
|
131
|
-
1. Çok sayıda component içeren bir sayfa oluşturun (10+ component)
|
|
132
|
-
2. Tüm component'leri tek tek kopyalayın
|
|
133
|
-
3. İşlemlerin makul bir sürede tamamlandığını kontrol edin
|
|
134
|
-
|
|
135
|
-
## 8. Browser Console Testi
|
|
136
|
-
|
|
137
|
-
1. Browser Developer Tools'u açın (F12)
|
|
138
|
-
2. Console tab'ına geçin
|
|
139
|
-
3. Component kopyalama işlemini yapın
|
|
140
|
-
4. Herhangi bir JavaScript hatası olmadığını doğrulayın
|
|
141
|
-
5. Network tab'ında API isteklerinin başarılı olduğunu kontrol edin
|
|
142
|
-
|
|
143
|
-
## 9. Detaylı Bilgi Modal Testi
|
|
144
|
-
|
|
145
|
-
1. Bir component'i kopyalayın
|
|
146
|
-
2. Başarı mesajına tıklayın
|
|
147
|
-
3. Detaylı bilgi modal'ının açıldığını kontrol edin
|
|
148
|
-
4. Şu bilgileri doğrulayın:
|
|
149
|
-
- Kopyalanan field sayısı
|
|
150
|
-
- Media dosyaları
|
|
151
|
-
- Kaldırılan sistem field'ları (id, createdAt, vb.)
|
|
152
|
-
|
|
153
|
-
## 10. Frontend Render Testi
|
|
154
|
-
|
|
155
|
-
1. Component'leri kopyalayın ve publish edin
|
|
156
|
-
2. Frontend'de sayfayı açın
|
|
157
|
-
3. Tüm component'lerin doğru render edildiğini kontrol edin:
|
|
158
|
-
- Stil'ler doğru mu?
|
|
159
|
-
- İçerik doğru mu?
|
|
160
|
-
- Media dosyaları görünüyor mu?
|
|
161
|
-
- Nested component'ler çalışıyor mu?
|
|
162
|
-
|
|
163
|
-
## Beklenen Sonuçlar
|
|
164
|
-
|
|
165
|
-
✅ **Başarılı Senaryolar:**
|
|
166
|
-
- Component'ler sorunsuz kopyalanır
|
|
167
|
-
- Tüm field'lar korunur
|
|
168
|
-
- Media referansları korunur
|
|
169
|
-
- Nested component'ler kopyalanır
|
|
170
|
-
- Publish işlemi başarılı olur
|
|
171
|
-
|
|
172
|
-
❌ **Hata Senaryoları:**
|
|
173
|
-
- İzin hatası mesajı gösterilir
|
|
174
|
-
- Geçersiz sayfa hatası gösterilir
|
|
175
|
-
- Network hataları uygun şekilde handle edilir
|
|
176
|
-
|
|
177
|
-
## Sorun Giderme
|
|
178
|
-
|
|
179
|
-
### Component'ler görünmüyor
|
|
180
|
-
- Sayfaların publish edildiğinden emin olun
|
|
181
|
-
- Browser cache'ini temizleyin
|
|
182
|
-
- Strapi'yi yeniden başlatın
|
|
183
|
-
|
|
184
|
-
### Component kopyalanmıyor
|
|
185
|
-
- Browser console'da hata var mı kontrol edin
|
|
186
|
-
- Network tab'ında API isteklerini kontrol edin
|
|
187
|
-
- İzinlerin doğru ayarlandığını kontrol edin
|
|
188
|
-
|
|
189
|
-
### Field'lar kayboluyor
|
|
190
|
-
- Browser console log'larını kontrol edin
|
|
191
|
-
- Component schema'sını kontrol edin
|
|
192
|
-
- Media field'larının doğru populate edildiğinden emin olun
|
|
193
|
-
|
package/USAGE.md
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
# Component Copy Plugin - Kullanım Rehberi
|
|
2
|
-
|
|
3
|
-
## Temel Kullanım
|
|
4
|
-
|
|
5
|
-
### 1. Plugin'e Erişim
|
|
6
|
-
|
|
7
|
-
Strapi admin panelinde sol menüden **Plugins > Component Copy** seçeneğine tıklayın.
|
|
8
|
-
|
|
9
|
-
### 2. Sayfa Seçimi
|
|
10
|
-
|
|
11
|
-
- **Source Page (Kaynak Sayfa)**: Component'leri kopyalamak istediğiniz sayfayı seçin
|
|
12
|
-
- **Target Page (Hedef Sayfa)**: Component'lerin kopyalanacağı sayfayı seçin
|
|
13
|
-
|
|
14
|
-
### 3. Component Kopyalama
|
|
15
|
-
|
|
16
|
-
1. Source Page panelinden bir component'i seçin
|
|
17
|
-
2. Component'i sürükleyip Target Page paneline bırakın
|
|
18
|
-
3. Component belirtilen pozisyona kopyalanacaktır
|
|
19
|
-
|
|
20
|
-
### 4. Component Sıralama
|
|
21
|
-
|
|
22
|
-
Target Page panelinde component'leri sürükleyerek sıralayabilirsiniz:
|
|
23
|
-
- Component'i tutun ve istediğiniz pozisyona sürükleyin
|
|
24
|
-
- Component otomatik olarak yeni pozisyonuna taşınacaktır
|
|
25
|
-
|
|
26
|
-
### 5. Değişiklikleri Kaydetme
|
|
27
|
-
|
|
28
|
-
1. Yaptığınız değişiklikler otomatik olarak draft olarak kaydedilir
|
|
29
|
-
2. Değişiklikleri yayınlamak için **Publish** butonuna tıklayın
|
|
30
|
-
3. Başarılı olduğunda bir onay mesajı görüntülenecektir
|
|
31
|
-
|
|
32
|
-
## Özellikler
|
|
33
|
-
|
|
34
|
-
### Aynı Sayfada Kopyalama
|
|
35
|
-
|
|
36
|
-
Aynı sayfayı hem source hem de target olarak seçebilirsiniz:
|
|
37
|
-
- Bu durumda component'ler duplicate (çoğaltılır) olur
|
|
38
|
-
- Aynı sayfa içinde component'leri çoğaltabilirsiniz
|
|
39
|
-
|
|
40
|
-
### Detaylı Bilgi Görüntüleme
|
|
41
|
-
|
|
42
|
-
Component kopyalandıktan sonra:
|
|
43
|
-
- Başarı mesajına tıklayarak detaylı bilgi modal'ını açabilirsiniz
|
|
44
|
-
- Hangi alanların kopyalandığını görebilirsiniz
|
|
45
|
-
- Hangi alanların kopyalanamadığını (örn: sistem alanları) görebilirsiniz
|
|
46
|
-
- Media dosyalarının kopyalanma durumunu görebilirsiniz
|
|
47
|
-
|
|
48
|
-
### Component Önizleme
|
|
49
|
-
|
|
50
|
-
Her component için:
|
|
51
|
-
- Component tipi (badge olarak gösterilir)
|
|
52
|
-
- Component içeriğinin önizlemesi (title, description vb.)
|
|
53
|
-
- Drag handle (sürükleme için)
|
|
54
|
-
|
|
55
|
-
## Kullanım Senaryoları
|
|
56
|
-
|
|
57
|
-
### Senaryo 1: Yeni Sayfaya Component Kopyalama
|
|
58
|
-
|
|
59
|
-
1. Source Page: "Ana Sayfa"
|
|
60
|
-
2. Target Page: "Hakkımızda"
|
|
61
|
-
3. Ana Sayfa'dan Hero Section'ı sürükle
|
|
62
|
-
4. Hakkımızda sayfasına bırak
|
|
63
|
-
5. Publish et
|
|
64
|
-
|
|
65
|
-
### Senaryo 2: Aynı Sayfada Component Çoğaltma
|
|
66
|
-
|
|
67
|
-
1. Source Page: "İletişim"
|
|
68
|
-
2. Target Page: "İletişim" (aynı sayfa)
|
|
69
|
-
3. Form Section'ı sürükle
|
|
70
|
-
4. Aynı sayfanın sonuna bırak
|
|
71
|
-
5. Publish et
|
|
72
|
-
|
|
73
|
-
### Senaryo 3: Component Sıralama
|
|
74
|
-
|
|
75
|
-
1. Target Page'i seç
|
|
76
|
-
2. Component'leri istediğiniz sıraya göre sürükle
|
|
77
|
-
3. Değişiklikler otomatik kaydedilir
|
|
78
|
-
4. Publish et
|
|
79
|
-
|
|
80
|
-
## İpuçları
|
|
81
|
-
|
|
82
|
-
1. **Çoklu Kopyalama**: Şu anda bir seferde bir component kopyalanabilir. Birden fazla component için işlemi tekrarlayın.
|
|
83
|
-
|
|
84
|
-
2. **Undo**: Şu anda geri alma özelliği yok. Değişikliklerden önce yedek alın.
|
|
85
|
-
|
|
86
|
-
3. **Publish**: Draft olarak kaydedilen değişiklikler yayınlanana kadar frontend'de görünmez.
|
|
87
|
-
|
|
88
|
-
4. **Media Dosyaları**: Media dosyaları referans olarak kopyalanır, yeni dosya oluşturulmaz.
|
|
89
|
-
|
|
90
|
-
5. **Relations**: Single type relation'lar (örneğin siteSettings) kopyalanır ancak target sayfada mevcut relation kullanılır.
|
|
91
|
-
|
|
92
|
-
## Kısıtlamalar
|
|
93
|
-
|
|
94
|
-
1. **System Fields**: `id`, `documentId`, `createdAt`, `updatedAt`, `createdBy`, `updatedBy`, `publishedAt`, `locale` gibi sistem alanları otomatik olarak kaldırılır.
|
|
95
|
-
|
|
96
|
-
2. **Complex Relations**: Çok karmaşık relation'lar kopyalanmayabilir. Test edin.
|
|
97
|
-
|
|
98
|
-
3. **Validation**: Component schema'larındaki validation kurallarına uygun veriler gerekir.
|
|
99
|
-
|
|
100
|
-
4. **Permissions**: Gerekli izinlere sahip olmanız gerekir.
|
|
101
|
-
|
|
102
|
-
## Sorun Giderme
|
|
103
|
-
|
|
104
|
-
### Component kopyalanmıyor
|
|
105
|
-
|
|
106
|
-
- İzinleri kontrol edin
|
|
107
|
-
- Browser console'da hata var mı bakın
|
|
108
|
-
- Network tab'inde API isteği başarılı mı kontrol edin
|
|
109
|
-
|
|
110
|
-
### Modal açılmıyor
|
|
111
|
-
|
|
112
|
-
- Tarayıcı cache'ini temizleyin
|
|
113
|
-
- Sayfayı yenileyin (F5)
|
|
114
|
-
- Strapi'yi yeniden başlatın
|
|
115
|
-
|
|
116
|
-
### Component'ler görünmüyor
|
|
117
|
-
|
|
118
|
-
- Sayfaların yayınlandığından emin olun
|
|
119
|
-
- Dynamic zone'ın doğru yapılandırıldığını kontrol edin
|
|
120
|
-
- Component'lerin populate edildiğinden emin olun
|
|
121
|
-
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { Core } from "@strapi/strapi";
|
|
2
|
-
|
|
3
|
-
const controller = ({ strapi }: { strapi: Core.Strapi }) => ({
|
|
4
|
-
async hello(ctx) {
|
|
5
|
-
ctx.body = {
|
|
6
|
-
message: "Hello from my plugin! 👋",
|
|
7
|
-
timestamp: new Date().toISOString(),
|
|
8
|
-
plugin: "copy-any-component",
|
|
9
|
-
};
|
|
10
|
-
},
|
|
11
|
-
|
|
12
|
-
async greet(ctx) {
|
|
13
|
-
const { name } = ctx.params;
|
|
14
|
-
ctx.body = {
|
|
15
|
-
message: `Merhaba, ${name}! 🎉`,
|
|
16
|
-
timestamp: new Date().toISOString(),
|
|
17
|
-
};
|
|
18
|
-
},
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
export default controller;
|
|
22
|
-
|
package/server/src/index.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import controllers from "./controllers";
|
|
2
|
-
import routes from "./routes";
|
|
3
|
-
|
|
4
|
-
export default {
|
|
5
|
-
register({ strapi }) {
|
|
6
|
-
// Register plugin
|
|
7
|
-
},
|
|
8
|
-
bootstrap({ strapi }) {
|
|
9
|
-
strapi.log.info("🚀 My Simple Plugin loaded successfully!");
|
|
10
|
-
},
|
|
11
|
-
controllers,
|
|
12
|
-
routes,
|
|
13
|
-
};
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
export default [
|
|
2
|
-
{
|
|
3
|
-
method: "GET",
|
|
4
|
-
path: "/hello",
|
|
5
|
-
handler: "controller.hello",
|
|
6
|
-
config: {
|
|
7
|
-
policies: [],
|
|
8
|
-
},
|
|
9
|
-
},
|
|
10
|
-
{
|
|
11
|
-
method: "GET",
|
|
12
|
-
path: "/greet/:name",
|
|
13
|
-
handler: "controller.greet",
|
|
14
|
-
config: {
|
|
15
|
-
policies: [],
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
];
|
|
19
|
-
|