strapi-plugin-copy-any-component 1.0.0
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/INSTALLATION.md +179 -0
- package/QUICK_START.md +88 -0
- package/README.md +165 -0
- package/TESTING.md +193 -0
- package/USAGE.md +121 -0
- package/admin/src/components/ComponentCopyField.jsx +3 -0
- package/admin/src/components/Initializer.jsx +22 -0
- package/admin/src/components/PluginIcon.jsx +22 -0
- package/admin/src/index.js +27 -0
- package/admin/src/pages/HomePage.jsx +995 -0
- package/admin/src/pluginId.js +2 -0
- package/package.json +62 -0
- package/server/src/controllers/controller.ts +22 -0
- package/server/src/controllers/index.ts +5 -0
- package/server/src/index.ts +13 -0
- package/server/src/routes/admin.ts +11 -0
- package/server/src/routes/content-api.ts +19 -0
- package/server/src/routes/index.ts +13 -0
- package/server/src/services/component-copy.js +439 -0
- package/strapi-admin.js +2 -0
- package/strapi-server.js +685 -0
package/USAGE.md
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
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
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { useEffect, useRef } from "react";
|
|
2
|
+
import { PLUGIN_ID } from "../pluginId";
|
|
3
|
+
|
|
4
|
+
const Initializer = ({ setPlugin }) => {
|
|
5
|
+
const ref = useRef(false);
|
|
6
|
+
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
if (!ref.current && setPlugin) {
|
|
9
|
+
try {
|
|
10
|
+
setPlugin({ id: PLUGIN_ID, isReady: true });
|
|
11
|
+
ref.current = true;
|
|
12
|
+
} catch (error) {
|
|
13
|
+
console.error("Plugin initializer error:", error);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}, [setPlugin]);
|
|
17
|
+
|
|
18
|
+
return null;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export { Initializer };
|
|
22
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
const PluginIcon = () => (
|
|
4
|
+
<svg
|
|
5
|
+
width="24"
|
|
6
|
+
height="24"
|
|
7
|
+
viewBox="0 0 24 24"
|
|
8
|
+
fill="none"
|
|
9
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
10
|
+
>
|
|
11
|
+
<path
|
|
12
|
+
d="M8 5H16C17.1 5 18 5.9 18 7V21L12 17L6 21V7C6 5.9 6.9 5 8 5Z"
|
|
13
|
+
stroke="currentColor"
|
|
14
|
+
strokeWidth="2"
|
|
15
|
+
strokeLinecap="round"
|
|
16
|
+
strokeLinejoin="round"
|
|
17
|
+
/>
|
|
18
|
+
</svg>
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
export { PluginIcon };
|
|
22
|
+
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { PLUGIN_ID } from "./pluginId";
|
|
2
|
+
import { PluginIcon } from "./components/PluginIcon";
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
register(app) {
|
|
6
|
+
app.addMenuLink({
|
|
7
|
+
to: `plugins/${PLUGIN_ID}`,
|
|
8
|
+
icon: PluginIcon,
|
|
9
|
+
intlLabel: {
|
|
10
|
+
id: `${PLUGIN_ID}.plugin.name`,
|
|
11
|
+
defaultMessage: "Copy Any Component",
|
|
12
|
+
},
|
|
13
|
+
Component: async () => {
|
|
14
|
+
const component = await import("./pages/HomePage");
|
|
15
|
+
return component.default;
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
app.registerPlugin({
|
|
20
|
+
id: PLUGIN_ID,
|
|
21
|
+
isReady: true,
|
|
22
|
+
name: PLUGIN_ID,
|
|
23
|
+
});
|
|
24
|
+
},
|
|
25
|
+
bootstrap() {},
|
|
26
|
+
};
|
|
27
|
+
|