@emailmaker/filemanager 0.10.80 → 0.10.81
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/assets/image-editor/images/samples/sample4.json +871 -871
- package/assets/image-editor/images/stickers/beach/0.svg +25 -25
- package/assets/image-editor/images/stickers/beach/1.svg +14 -14
- package/assets/image-editor/images/stickers/beach/10.svg +34 -34
- package/assets/image-editor/images/stickers/beach/11.svg +27 -27
- package/assets/image-editor/images/stickers/beach/12.svg +10 -10
- package/assets/image-editor/images/stickers/beach/13.svg +25 -25
- package/assets/image-editor/images/stickers/beach/14.svg +16 -16
- package/assets/image-editor/images/stickers/beach/15.svg +14 -14
- package/assets/image-editor/images/stickers/beach/16.svg +44 -44
- package/assets/image-editor/images/stickers/beach/17.svg +35 -35
- package/assets/image-editor/images/stickers/beach/18.svg +32 -32
- package/assets/image-editor/images/stickers/beach/19.svg +23 -23
- package/assets/image-editor/images/stickers/beach/2.svg +14 -14
- package/assets/image-editor/images/stickers/beach/20.svg +24 -24
- package/assets/image-editor/images/stickers/beach/21.svg +11 -11
- package/assets/image-editor/images/stickers/beach/3.svg +26 -26
- package/assets/image-editor/images/stickers/beach/4.svg +25 -25
- package/assets/image-editor/images/stickers/beach/5.svg +22 -22
- package/assets/image-editor/images/stickers/beach/6.svg +20 -20
- package/assets/image-editor/images/stickers/beach/7.svg +32 -32
- package/assets/image-editor/images/stickers/beach/8.svg +28 -28
- package/assets/image-editor/images/stickers/beach/9.svg +18 -18
- package/assets/image-editor/images/stickers/categories/beach.svg +17 -17
- package/assets/image-editor/images/stickers/categories/clouds.svg +14 -14
- package/assets/image-editor/images/stickers/categories/doodles.svg +12 -12
- package/assets/image-editor/images/stickers/categories/emoticon.svg +9 -9
- package/assets/image-editor/images/stickers/categories/landmark.svg +19 -19
- package/assets/image-editor/images/stickers/categories/speech-bubble.svg +5 -5
- package/assets/image-editor/images/stickers/categories/star.svg +5 -5
- package/assets/image-editor/images/stickers/categories/transportation.svg +17 -17
- package/assets/image-editor/images/stickers/doodles/0.svg +201 -201
- package/assets/image-editor/images/stickers/doodles/1.svg +255 -255
- package/assets/image-editor/images/stickers/doodles/10.svg +160 -160
- package/assets/image-editor/images/stickers/doodles/11.svg +393 -393
- package/assets/image-editor/images/stickers/doodles/12.svg +293 -293
- package/assets/image-editor/images/stickers/doodles/13.svg +251 -251
- package/assets/image-editor/images/stickers/doodles/14.svg +370 -370
- package/assets/image-editor/images/stickers/doodles/15.svg +194 -194
- package/assets/image-editor/images/stickers/doodles/16.svg +383 -383
- package/assets/image-editor/images/stickers/doodles/17.svg +346 -346
- package/assets/image-editor/images/stickers/doodles/18.svg +286 -286
- package/assets/image-editor/images/stickers/doodles/19.svg +241 -241
- package/assets/image-editor/images/stickers/doodles/2.svg +227 -227
- package/assets/image-editor/images/stickers/doodles/20.svg +330 -330
- package/assets/image-editor/images/stickers/doodles/21.svg +200 -200
- package/assets/image-editor/images/stickers/doodles/22.svg +308 -308
- package/assets/image-editor/images/stickers/doodles/23.svg +518 -518
- package/assets/image-editor/images/stickers/doodles/24.svg +207 -207
- package/assets/image-editor/images/stickers/doodles/25.svg +260 -260
- package/assets/image-editor/images/stickers/doodles/26.svg +380 -380
- package/assets/image-editor/images/stickers/doodles/27.svg +222 -222
- package/assets/image-editor/images/stickers/doodles/28.svg +164 -164
- package/assets/image-editor/images/stickers/doodles/29.svg +271 -271
- package/assets/image-editor/images/stickers/doodles/3.svg +272 -272
- package/assets/image-editor/images/stickers/doodles/30.svg +283 -283
- package/assets/image-editor/images/stickers/doodles/31.svg +257 -257
- package/assets/image-editor/images/stickers/doodles/32.svg +276 -276
- package/assets/image-editor/images/stickers/doodles/33.svg +198 -198
- package/assets/image-editor/images/stickers/doodles/34.svg +314 -314
- package/assets/image-editor/images/stickers/doodles/35.svg +236 -236
- package/assets/image-editor/images/stickers/doodles/36.svg +273 -273
- package/assets/image-editor/images/stickers/doodles/37.svg +284 -284
- package/assets/image-editor/images/stickers/doodles/38.svg +167 -167
- package/assets/image-editor/images/stickers/doodles/39.svg +381 -381
- package/assets/image-editor/images/stickers/doodles/4.svg +216 -216
- package/assets/image-editor/images/stickers/doodles/40.svg +198 -198
- package/assets/image-editor/images/stickers/doodles/41.svg +259 -259
- package/assets/image-editor/images/stickers/doodles/42.svg +371 -371
- package/assets/image-editor/images/stickers/doodles/43.svg +198 -198
- package/assets/image-editor/images/stickers/doodles/44.svg +174 -174
- package/assets/image-editor/images/stickers/doodles/45.svg +178 -178
- package/assets/image-editor/images/stickers/doodles/46.svg +211 -211
- package/assets/image-editor/images/stickers/doodles/47.svg +195 -195
- package/assets/image-editor/images/stickers/doodles/48.svg +293 -293
- package/assets/image-editor/images/stickers/doodles/49.svg +191 -191
- package/assets/image-editor/images/stickers/doodles/5.svg +179 -179
- package/assets/image-editor/images/stickers/doodles/50.svg +323 -323
- package/assets/image-editor/images/stickers/doodles/51.svg +308 -308
- package/assets/image-editor/images/stickers/doodles/52.svg +162 -162
- package/assets/image-editor/images/stickers/doodles/53.svg +263 -263
- package/assets/image-editor/images/stickers/doodles/54.svg +175 -175
- package/assets/image-editor/images/stickers/doodles/55.svg +177 -177
- package/assets/image-editor/images/stickers/doodles/56.svg +160 -160
- package/assets/image-editor/images/stickers/doodles/57.svg +115 -115
- package/assets/image-editor/images/stickers/doodles/58.svg +327 -327
- package/assets/image-editor/images/stickers/doodles/59.svg +197 -197
- package/assets/image-editor/images/stickers/doodles/6.svg +388 -388
- package/assets/image-editor/images/stickers/doodles/60.svg +414 -414
- package/assets/image-editor/images/stickers/doodles/61.svg +287 -287
- package/assets/image-editor/images/stickers/doodles/62.svg +193 -193
- package/assets/image-editor/images/stickers/doodles/63.svg +329 -329
- package/assets/image-editor/images/stickers/doodles/64.svg +150 -150
- package/assets/image-editor/images/stickers/doodles/65.svg +275 -275
- package/assets/image-editor/images/stickers/doodles/66.svg +174 -174
- package/assets/image-editor/images/stickers/doodles/67.svg +343 -343
- package/assets/image-editor/images/stickers/doodles/68.svg +242 -242
- package/assets/image-editor/images/stickers/doodles/69.svg +160 -160
- package/assets/image-editor/images/stickers/doodles/7.svg +194 -194
- package/assets/image-editor/images/stickers/doodles/70.svg +365 -365
- package/assets/image-editor/images/stickers/doodles/71.svg +454 -454
- package/assets/image-editor/images/stickers/doodles/72.svg +162 -162
- package/assets/image-editor/images/stickers/doodles/73.svg +393 -393
- package/assets/image-editor/images/stickers/doodles/74.svg +206 -206
- package/assets/image-editor/images/stickers/doodles/75.svg +275 -275
- package/assets/image-editor/images/stickers/doodles/76.svg +350 -350
- package/assets/image-editor/images/stickers/doodles/77.svg +323 -323
- package/assets/image-editor/images/stickers/doodles/78.svg +316 -316
- package/assets/image-editor/images/stickers/doodles/79.svg +503 -503
- package/assets/image-editor/images/stickers/doodles/8.svg +185 -185
- package/assets/image-editor/images/stickers/doodles/80.svg +235 -235
- package/assets/image-editor/images/stickers/doodles/81.svg +184 -184
- package/assets/image-editor/images/stickers/doodles/82.svg +246 -246
- package/assets/image-editor/images/stickers/doodles/83.svg +125 -125
- package/assets/image-editor/images/stickers/doodles/84.svg +168 -168
- package/assets/image-editor/images/stickers/doodles/85.svg +138 -138
- package/assets/image-editor/images/stickers/doodles/86.svg +223 -223
- package/assets/image-editor/images/stickers/doodles/87.svg +475 -475
- package/assets/image-editor/images/stickers/doodles/88.svg +172 -172
- package/assets/image-editor/images/stickers/doodles/89.svg +199 -199
- package/assets/image-editor/images/stickers/doodles/9.svg +368 -368
- package/assets/image-editor/images/stickers/doodles/90.svg +298 -298
- package/assets/image-editor/images/stickers/doodles/91.svg +176 -176
- package/assets/image-editor/images/stickers/doodles/92.svg +152 -152
- package/assets/image-editor/images/stickers/doodles/93.svg +206 -206
- package/assets/image-editor/images/stickers/doodles/94.svg +202 -202
- package/assets/image-editor/images/stickers/doodles/95.svg +114 -114
- package/assets/image-editor/images/stickers/doodles/96.svg +149 -149
- package/assets/image-editor/images/stickers/doodles/97.svg +197 -197
- package/assets/image-editor/images/stickers/doodles/98.svg +397 -397
- package/assets/image-editor/images/stickers/doodles/99.svg +502 -502
- package/assets/image-editor/images/stickers/emoticons/afro-1.svg +122 -122
- package/assets/image-editor/images/stickers/emoticons/afro.svg +85 -85
- package/assets/image-editor/images/stickers/emoticons/agent.svg +114 -114
- package/assets/image-editor/images/stickers/emoticons/alien-1.svg +60 -60
- package/assets/image-editor/images/stickers/emoticons/alien.svg +64 -64
- package/assets/image-editor/images/stickers/emoticons/angel.svg +47 -47
- package/assets/image-editor/images/stickers/emoticons/angry-1.svg +83 -83
- package/assets/image-editor/images/stickers/emoticons/angry-2.svg +48 -48
- package/assets/image-editor/images/stickers/emoticons/angry-3.svg +45 -45
- package/assets/image-editor/images/stickers/emoticons/angry-4.svg +52 -52
- package/assets/image-editor/images/stickers/emoticons/angry-5.svg +62 -62
- package/assets/image-editor/images/stickers/emoticons/angry.svg +78 -78
- package/assets/image-editor/images/stickers/emoticons/arguing.svg +49 -49
- package/assets/image-editor/images/stickers/emoticons/arrogant.svg +98 -98
- package/assets/image-editor/images/stickers/emoticons/asian-1.svg +52 -52
- package/assets/image-editor/images/stickers/emoticons/asian.svg +54 -54
- package/assets/image-editor/images/stickers/emoticons/avatar.svg +49 -49
- package/assets/image-editor/images/stickers/emoticons/baby-1.svg +51 -51
- package/assets/image-editor/images/stickers/emoticons/baby-2.svg +54 -54
- package/assets/image-editor/images/stickers/emoticons/baby.svg +66 -66
- package/assets/image-editor/images/stickers/emoticons/bully.svg +68 -68
- package/assets/image-editor/images/stickers/emoticons/burglar.svg +75 -75
- package/assets/image-editor/images/stickers/emoticons/businessman.svg +52 -52
- package/assets/image-editor/images/stickers/emoticons/cheeky-1.svg +83 -83
- package/assets/image-editor/images/stickers/emoticons/cheeky.svg +73 -73
- package/assets/image-editor/images/stickers/emoticons/clown.svg +75 -75
- package/assets/image-editor/images/stickers/emoticons/confused-1.svg +74 -74
- package/assets/image-editor/images/stickers/emoticons/confused-2.svg +55 -55
- package/assets/image-editor/images/stickers/emoticons/confused-3.svg +45 -45
- package/assets/image-editor/images/stickers/emoticons/confused.svg +66 -66
- package/assets/image-editor/images/stickers/emoticons/creepy.svg +60 -60
- package/assets/image-editor/images/stickers/emoticons/crying-1.svg +55 -55
- package/assets/image-editor/images/stickers/emoticons/crying-2.svg +83 -83
- package/assets/image-editor/images/stickers/emoticons/crying-3.svg +53 -53
- package/assets/image-editor/images/stickers/emoticons/crying.svg +59 -59
- package/assets/image-editor/images/stickers/emoticons/dazed-1.svg +63 -63
- package/assets/image-editor/images/stickers/emoticons/dazed-2.svg +51 -51
- package/assets/image-editor/images/stickers/emoticons/dazed-3.svg +55 -55
- package/assets/image-editor/images/stickers/emoticons/dazed.svg +56 -56
- package/assets/image-editor/images/stickers/emoticons/dead-1.svg +61 -61
- package/assets/image-editor/images/stickers/emoticons/dead-2.svg +80 -80
- package/assets/image-editor/images/stickers/emoticons/dead-3.svg +66 -66
- package/assets/image-editor/images/stickers/emoticons/dead-4.svg +54 -54
- package/assets/image-editor/images/stickers/emoticons/dead-5.svg +52 -52
- package/assets/image-editor/images/stickers/emoticons/dead-6.svg +53 -53
- package/assets/image-editor/images/stickers/emoticons/dead.svg +54 -54
- package/assets/image-editor/images/stickers/emoticons/desperate-1.svg +47 -47
- package/assets/image-editor/images/stickers/emoticons/desperate.svg +75 -75
- package/assets/image-editor/images/stickers/emoticons/detective.svg +75 -75
- package/assets/image-editor/images/stickers/emoticons/dissapointment.svg +70 -70
- package/assets/image-editor/images/stickers/emoticons/doctor.svg +61 -61
- package/assets/image-editor/images/stickers/emoticons/drunk.svg +55 -55
- package/assets/image-editor/images/stickers/emoticons/dumb.svg +50 -50
- package/assets/image-editor/images/stickers/emoticons/emo-1.svg +104 -104
- package/assets/image-editor/images/stickers/emoticons/emo-2.svg +111 -111
- package/assets/image-editor/images/stickers/emoticons/emo.svg +56 -56
- package/assets/image-editor/images/stickers/emoticons/emoticon.svg +84 -84
- package/assets/image-editor/images/stickers/emoticons/evil.svg +59 -59
- package/assets/image-editor/images/stickers/emoticons/faint-1.svg +75 -75
- package/assets/image-editor/images/stickers/emoticons/faint.svg +84 -84
- package/assets/image-editor/images/stickers/emoticons/flirt-1.svg +81 -81
- package/assets/image-editor/images/stickers/emoticons/flirt-2.svg +68 -68
- package/assets/image-editor/images/stickers/emoticons/flirt.svg +71 -71
- package/assets/image-editor/images/stickers/emoticons/flirty.svg +60 -60
- package/assets/image-editor/images/stickers/emoticons/gangster.svg +54 -54
- package/assets/image-editor/images/stickers/emoticons/geek-1.svg +76 -76
- package/assets/image-editor/images/stickers/emoticons/geek.svg +69 -69
- package/assets/image-editor/images/stickers/emoticons/gentleman-1.svg +82 -82
- package/assets/image-editor/images/stickers/emoticons/gentleman-2.svg +58 -58
- package/assets/image-editor/images/stickers/emoticons/gentleman-3.svg +54 -54
- package/assets/image-editor/images/stickers/emoticons/gentleman-4.svg +59 -59
- package/assets/image-editor/images/stickers/emoticons/gentleman.svg +57 -57
- package/assets/image-editor/images/stickers/emoticons/ginger.svg +55 -55
- package/assets/image-editor/images/stickers/emoticons/girl-1.svg +70 -70
- package/assets/image-editor/images/stickers/emoticons/girl.svg +73 -73
- package/assets/image-editor/images/stickers/emoticons/goofy-1.svg +46 -46
- package/assets/image-editor/images/stickers/emoticons/goofy-2.svg +79 -79
- package/assets/image-editor/images/stickers/emoticons/goofy-3.svg +79 -79
- package/assets/image-editor/images/stickers/emoticons/goofy-4.svg +46 -46
- package/assets/image-editor/images/stickers/emoticons/goofy.svg +79 -79
- package/assets/image-editor/images/stickers/emoticons/grubby-1.svg +114 -114
- package/assets/image-editor/images/stickers/emoticons/grubby.svg +165 -165
- package/assets/image-editor/images/stickers/emoticons/happy-1.svg +49 -49
- package/assets/image-editor/images/stickers/emoticons/happy-10.svg +62 -62
- package/assets/image-editor/images/stickers/emoticons/happy-11.svg +55 -55
- package/assets/image-editor/images/stickers/emoticons/happy-12.svg +53 -53
- package/assets/image-editor/images/stickers/emoticons/happy-13.svg +58 -58
- package/assets/image-editor/images/stickers/emoticons/happy-14.svg +62 -62
- package/assets/image-editor/images/stickers/emoticons/happy-15.svg +49 -49
- package/assets/image-editor/images/stickers/emoticons/happy-16.svg +49 -49
- package/assets/image-editor/images/stickers/emoticons/happy-2.svg +71 -71
- package/assets/image-editor/images/stickers/emoticons/happy-3.svg +74 -74
- package/assets/image-editor/images/stickers/emoticons/happy-4.svg +77 -77
- package/assets/image-editor/images/stickers/emoticons/happy-5.svg +52 -52
- package/assets/image-editor/images/stickers/emoticons/happy-6.svg +54 -54
- package/assets/image-editor/images/stickers/emoticons/happy-7.svg +58 -58
- package/assets/image-editor/images/stickers/emoticons/happy-8.svg +42 -42
- package/assets/image-editor/images/stickers/emoticons/happy-9.svg +45 -45
- package/assets/image-editor/images/stickers/emoticons/happy.svg +48 -48
- package/assets/image-editor/images/stickers/emoticons/harry-potter.svg +68 -68
- package/assets/image-editor/images/stickers/emoticons/heisenberg.svg +80 -80
- package/assets/image-editor/images/stickers/emoticons/hipster-1.svg +118 -118
- package/assets/image-editor/images/stickers/emoticons/hipster-2.svg +49 -49
- package/assets/image-editor/images/stickers/emoticons/hipster.svg +48 -48
- package/assets/image-editor/images/stickers/emoticons/in-love-1.svg +62 -62
- package/assets/image-editor/images/stickers/emoticons/in-love-2.svg +48 -48
- package/assets/image-editor/images/stickers/emoticons/in-love-3.svg +49 -49
- package/assets/image-editor/images/stickers/emoticons/in-love-4.svg +50 -50
- package/assets/image-editor/images/stickers/emoticons/in-love-5.svg +49 -49
- package/assets/image-editor/images/stickers/emoticons/in-love-6.svg +53 -53
- package/assets/image-editor/images/stickers/emoticons/in-love.svg +57 -57
- package/assets/image-editor/images/stickers/emoticons/japan.svg +79 -79
- package/assets/image-editor/images/stickers/emoticons/jew.svg +83 -83
- package/assets/image-editor/images/stickers/emoticons/joyful-1.svg +72 -72
- package/assets/image-editor/images/stickers/emoticons/joyful-2.svg +45 -45
- package/assets/image-editor/images/stickers/emoticons/joyful.svg +47 -47
- package/assets/image-editor/images/stickers/emoticons/kiss-1.svg +48 -48
- package/assets/image-editor/images/stickers/emoticons/kiss-2.svg +59 -59
- package/assets/image-editor/images/stickers/emoticons/kiss-3.svg +53 -53
- package/assets/image-editor/images/stickers/emoticons/kiss-4.svg +59 -59
- package/assets/image-editor/images/stickers/emoticons/kiss.svg +67 -67
- package/assets/image-editor/images/stickers/emoticons/laughing-1.svg +54 -54
- package/assets/image-editor/images/stickers/emoticons/laughing-2.svg +57 -57
- package/assets/image-editor/images/stickers/emoticons/laughing-3.svg +55 -55
- package/assets/image-editor/images/stickers/emoticons/laughing.svg +56 -56
- package/assets/image-editor/images/stickers/emoticons/listening.svg +55 -55
- package/assets/image-editor/images/stickers/emoticons/love.svg +74 -74
- package/assets/image-editor/images/stickers/emoticons/manly.svg +75 -75
- package/assets/image-editor/images/stickers/emoticons/miserly-1.svg +90 -90
- package/assets/image-editor/images/stickers/emoticons/miserly.svg +82 -82
- package/assets/image-editor/images/stickers/emoticons/nerd-1.svg +88 -88
- package/assets/image-editor/images/stickers/emoticons/nerd-2.svg +73 -73
- package/assets/image-editor/images/stickers/emoticons/nerd-3.svg +60 -60
- package/assets/image-editor/images/stickers/emoticons/nerd-4.svg +70 -70
- package/assets/image-editor/images/stickers/emoticons/nerd.svg +88 -88
- package/assets/image-editor/images/stickers/emoticons/ninja.svg +51 -51
- package/assets/image-editor/images/stickers/emoticons/pirate-1.svg +92 -92
- package/assets/image-editor/images/stickers/emoticons/pirate-2.svg +48 -48
- package/assets/image-editor/images/stickers/emoticons/pirate.svg +286 -286
- package/assets/image-editor/images/stickers/emoticons/punk-1.svg +134 -134
- package/assets/image-editor/images/stickers/emoticons/punk-2.svg +153 -153
- package/assets/image-editor/images/stickers/emoticons/punk.svg +82 -82
- package/assets/image-editor/images/stickers/emoticons/rapper.svg +51 -51
- package/assets/image-editor/images/stickers/emoticons/relieved.svg +56 -56
- package/assets/image-editor/images/stickers/emoticons/rich-1.svg +59 -59
- package/assets/image-editor/images/stickers/emoticons/rich-2.svg +93 -93
- package/assets/image-editor/images/stickers/emoticons/rich.svg +88 -88
- package/assets/image-editor/images/stickers/emoticons/rockstar.svg +177 -177
- package/assets/image-editor/images/stickers/emoticons/sad-1.svg +43 -43
- package/assets/image-editor/images/stickers/emoticons/sad-2.svg +49 -49
- package/assets/image-editor/images/stickers/emoticons/sad-3.svg +49 -49
- package/assets/image-editor/images/stickers/emoticons/sad-4.svg +49 -49
- package/assets/image-editor/images/stickers/emoticons/sad-5.svg +45 -45
- package/assets/image-editor/images/stickers/emoticons/sad-6.svg +47 -47
- package/assets/image-editor/images/stickers/emoticons/sad.svg +47 -47
- package/assets/image-editor/images/stickers/emoticons/scared-1.svg +79 -79
- package/assets/image-editor/images/stickers/emoticons/scared-2.svg +59 -59
- package/assets/image-editor/images/stickers/emoticons/scared-3.svg +52 -52
- package/assets/image-editor/images/stickers/emoticons/scared.svg +45 -45
- package/assets/image-editor/images/stickers/emoticons/sceptic-1.svg +59 -59
- package/assets/image-editor/images/stickers/emoticons/sceptic-2.svg +80 -80
- package/assets/image-editor/images/stickers/emoticons/sceptic-3.svg +59 -59
- package/assets/image-editor/images/stickers/emoticons/sceptic-4.svg +46 -46
- package/assets/image-editor/images/stickers/emoticons/sceptic-5.svg +43 -43
- package/assets/image-editor/images/stickers/emoticons/sceptic-6.svg +42 -42
- package/assets/image-editor/images/stickers/emoticons/sceptic-7.svg +50 -50
- package/assets/image-editor/images/stickers/emoticons/sceptic.svg +44 -44
- package/assets/image-editor/images/stickers/emoticons/secret.svg +48 -48
- package/assets/image-editor/images/stickers/emoticons/shocked-1.svg +67 -67
- package/assets/image-editor/images/stickers/emoticons/shocked-2.svg +44 -44
- package/assets/image-editor/images/stickers/emoticons/shocked-3.svg +48 -48
- package/assets/image-editor/images/stickers/emoticons/shocked.svg +46 -46
- package/assets/image-editor/images/stickers/emoticons/sick-1.svg +55 -55
- package/assets/image-editor/images/stickers/emoticons/sick-2.svg +48 -48
- package/assets/image-editor/images/stickers/emoticons/sick-3.svg +49 -49
- package/assets/image-editor/images/stickers/emoticons/sick-4.svg +52 -52
- package/assets/image-editor/images/stickers/emoticons/sick.svg +52 -52
- package/assets/image-editor/images/stickers/emoticons/silent.svg +43 -43
- package/assets/image-editor/images/stickers/emoticons/skeleton.svg +64 -64
- package/assets/image-editor/images/stickers/emoticons/smile.svg +43 -43
- package/assets/image-editor/images/stickers/emoticons/smiling-1.svg +47 -47
- package/assets/image-editor/images/stickers/emoticons/smiling.svg +75 -75
- package/assets/image-editor/images/stickers/emoticons/smoked.svg +131 -131
- package/assets/image-editor/images/stickers/emoticons/smug-1.svg +74 -74
- package/assets/image-editor/images/stickers/emoticons/smug-2.svg +82 -82
- package/assets/image-editor/images/stickers/emoticons/smug-3.svg +71 -71
- package/assets/image-editor/images/stickers/emoticons/smug-4.svg +50 -50
- package/assets/image-editor/images/stickers/emoticons/smug-5.svg +64 -64
- package/assets/image-editor/images/stickers/emoticons/smug-6.svg +82 -82
- package/assets/image-editor/images/stickers/emoticons/smug.svg +96 -96
- package/assets/image-editor/images/stickers/emoticons/sporty.svg +68 -68
- package/assets/image-editor/images/stickers/emoticons/stunned.svg +72 -72
- package/assets/image-editor/images/stickers/emoticons/superhero-1.svg +60 -60
- package/assets/image-editor/images/stickers/emoticons/superhero-2.svg +47 -47
- package/assets/image-editor/images/stickers/emoticons/superhero-3.svg +48 -48
- package/assets/image-editor/images/stickers/emoticons/superhero-4.svg +52 -52
- package/assets/image-editor/images/stickers/emoticons/superhero.svg +45 -45
- package/assets/image-editor/images/stickers/emoticons/surprised-1.svg +47 -47
- package/assets/image-editor/images/stickers/emoticons/surprised.svg +58 -58
- package/assets/image-editor/images/stickers/emoticons/thinking.svg +43 -43
- package/assets/image-editor/images/stickers/emoticons/tired-1.svg +78 -78
- package/assets/image-editor/images/stickers/emoticons/tired-2.svg +65 -65
- package/assets/image-editor/images/stickers/emoticons/tired-3.svg +59 -59
- package/assets/image-editor/images/stickers/emoticons/tired.svg +83 -83
- package/assets/image-editor/images/stickers/emoticons/tough-1.svg +65 -65
- package/assets/image-editor/images/stickers/emoticons/tough.svg +158 -158
- package/assets/image-editor/images/stickers/emoticons/trendy.svg +57 -57
- package/assets/image-editor/images/stickers/emoticons/vampire-1.svg +56 -56
- package/assets/image-editor/images/stickers/emoticons/vampire.svg +59 -59
- package/assets/image-editor/images/stickers/emoticons/wink-1.svg +54 -54
- package/assets/image-editor/images/stickers/emoticons/wink-2.svg +64 -64
- package/assets/image-editor/images/stickers/emoticons/wink.svg +73 -73
- package/assets/image-editor/images/stickers/emoticons/winking-1.svg +52 -52
- package/assets/image-editor/images/stickers/emoticons/winking.svg +43 -43
- package/assets/image-editor/images/stickers/emoticons/yawning-1.svg +62 -62
- package/assets/image-editor/images/stickers/emoticons/yawning-2.svg +51 -51
- package/assets/image-editor/images/stickers/emoticons/yawning-3.svg +51 -51
- package/assets/image-editor/images/stickers/emoticons/yawning.svg +73 -73
- package/assets/image-editor/images/stickers/emoticons/yelling.svg +80 -80
- package/assets/image-editor/images/stickers/emoticons/zombie.svg +65 -65
- package/assets/image-editor/images/stickers/landmarks/0.svg +38 -38
- package/assets/image-editor/images/stickers/landmarks/1.svg +46 -46
- package/assets/image-editor/images/stickers/landmarks/10.svg +18 -18
- package/assets/image-editor/images/stickers/landmarks/11.svg +81 -81
- package/assets/image-editor/images/stickers/landmarks/12.svg +77 -77
- package/assets/image-editor/images/stickers/landmarks/13.svg +42 -42
- package/assets/image-editor/images/stickers/landmarks/14.svg +78 -78
- package/assets/image-editor/images/stickers/landmarks/15.svg +84 -84
- package/assets/image-editor/images/stickers/landmarks/16.svg +87 -87
- package/assets/image-editor/images/stickers/landmarks/17.svg +60 -60
- package/assets/image-editor/images/stickers/landmarks/18.svg +30 -30
- package/assets/image-editor/images/stickers/landmarks/19.svg +36 -36
- package/assets/image-editor/images/stickers/landmarks/2.svg +28 -28
- package/assets/image-editor/images/stickers/landmarks/20.svg +137 -137
- package/assets/image-editor/images/stickers/landmarks/21.svg +63 -63
- package/assets/image-editor/images/stickers/landmarks/22.svg +26 -26
- package/assets/image-editor/images/stickers/landmarks/23.svg +52 -52
- package/assets/image-editor/images/stickers/landmarks/24.svg +56 -56
- package/assets/image-editor/images/stickers/landmarks/25.svg +40 -40
- package/assets/image-editor/images/stickers/landmarks/26.svg +34 -34
- package/assets/image-editor/images/stickers/landmarks/27.svg +32 -32
- package/assets/image-editor/images/stickers/landmarks/28.svg +19 -19
- package/assets/image-editor/images/stickers/landmarks/29.svg +23 -23
- package/assets/image-editor/images/stickers/landmarks/3.svg +36 -36
- package/assets/image-editor/images/stickers/landmarks/30.svg +36 -36
- package/assets/image-editor/images/stickers/landmarks/31.svg +27 -27
- package/assets/image-editor/images/stickers/landmarks/32.svg +25 -25
- package/assets/image-editor/images/stickers/landmarks/33.svg +29 -29
- package/assets/image-editor/images/stickers/landmarks/34.svg +72 -72
- package/assets/image-editor/images/stickers/landmarks/35.svg +18 -18
- package/assets/image-editor/images/stickers/landmarks/36.svg +45 -45
- package/assets/image-editor/images/stickers/landmarks/37.svg +46 -46
- package/assets/image-editor/images/stickers/landmarks/38.svg +44 -44
- package/assets/image-editor/images/stickers/landmarks/39.svg +23 -23
- package/assets/image-editor/images/stickers/landmarks/4.svg +33 -33
- package/assets/image-editor/images/stickers/landmarks/40.svg +25 -25
- package/assets/image-editor/images/stickers/landmarks/41.svg +69 -69
- package/assets/image-editor/images/stickers/landmarks/42.svg +75 -75
- package/assets/image-editor/images/stickers/landmarks/43.svg +44 -44
- package/assets/image-editor/images/stickers/landmarks/44.svg +65 -65
- package/assets/image-editor/images/stickers/landmarks/45.svg +19 -19
- package/assets/image-editor/images/stickers/landmarks/46.svg +47 -47
- package/assets/image-editor/images/stickers/landmarks/47.svg +544 -544
- package/assets/image-editor/images/stickers/landmarks/48.svg +162 -162
- package/assets/image-editor/images/stickers/landmarks/49.svg +70 -70
- package/assets/image-editor/images/stickers/landmarks/5.svg +36 -36
- package/assets/image-editor/images/stickers/landmarks/50.svg +52 -52
- package/assets/image-editor/images/stickers/landmarks/51.svg +110 -110
- package/assets/image-editor/images/stickers/landmarks/52.svg +41 -41
- package/assets/image-editor/images/stickers/landmarks/53.svg +74 -74
- package/assets/image-editor/images/stickers/landmarks/54.svg +36 -36
- package/assets/image-editor/images/stickers/landmarks/55.svg +84 -84
- package/assets/image-editor/images/stickers/landmarks/56.svg +93 -93
- package/assets/image-editor/images/stickers/landmarks/57.svg +67 -67
- package/assets/image-editor/images/stickers/landmarks/58.svg +101 -101
- package/assets/image-editor/images/stickers/landmarks/59.svg +47 -47
- package/assets/image-editor/images/stickers/landmarks/6.svg +59 -59
- package/assets/image-editor/images/stickers/landmarks/60.svg +134 -134
- package/assets/image-editor/images/stickers/landmarks/61.svg +79 -79
- package/assets/image-editor/images/stickers/landmarks/62.svg +43 -43
- package/assets/image-editor/images/stickers/landmarks/63.svg +83 -83
- package/assets/image-editor/images/stickers/landmarks/64.svg +99 -99
- package/assets/image-editor/images/stickers/landmarks/65.svg +79 -79
- package/assets/image-editor/images/stickers/landmarks/66.svg +37 -37
- package/assets/image-editor/images/stickers/landmarks/67.svg +82 -82
- package/assets/image-editor/images/stickers/landmarks/68.svg +216 -216
- package/assets/image-editor/images/stickers/landmarks/69.svg +17 -17
- package/assets/image-editor/images/stickers/landmarks/7.svg +16 -16
- package/assets/image-editor/images/stickers/landmarks/70.svg +45 -45
- package/assets/image-editor/images/stickers/landmarks/71.svg +37 -37
- package/assets/image-editor/images/stickers/landmarks/72.svg +28 -28
- package/assets/image-editor/images/stickers/landmarks/73.svg +25 -25
- package/assets/image-editor/images/stickers/landmarks/74.svg +23 -23
- package/assets/image-editor/images/stickers/landmarks/75.svg +88 -88
- package/assets/image-editor/images/stickers/landmarks/76.svg +25 -25
- package/assets/image-editor/images/stickers/landmarks/77.svg +23 -23
- package/assets/image-editor/images/stickers/landmarks/78.svg +63 -63
- package/assets/image-editor/images/stickers/landmarks/79.svg +25 -25
- package/assets/image-editor/images/stickers/landmarks/8.svg +52 -52
- package/assets/image-editor/images/stickers/landmarks/80.svg +29 -29
- package/assets/image-editor/images/stickers/landmarks/81.svg +44 -44
- package/assets/image-editor/images/stickers/landmarks/82.svg +83 -83
- package/assets/image-editor/images/stickers/landmarks/83.svg +65 -65
- package/assets/image-editor/images/stickers/landmarks/84.svg +31 -31
- package/assets/image-editor/images/stickers/landmarks/85.svg +30 -30
- package/assets/image-editor/images/stickers/landmarks/86.svg +26 -26
- package/assets/image-editor/images/stickers/landmarks/87.svg +132 -132
- package/assets/image-editor/images/stickers/landmarks/88.svg +93 -93
- package/assets/image-editor/images/stickers/landmarks/89.svg +91 -91
- package/assets/image-editor/images/stickers/landmarks/9.svg +70 -70
- package/assets/image-editor/images/stickers/landmarks/90.svg +65 -65
- package/assets/image-editor/images/stickers/landmarks/91.svg +36 -36
- package/assets/image-editor/images/stickers/landmarks/92.svg +66 -66
- package/assets/image-editor/images/stickers/landmarks/93.svg +65 -65
- package/assets/image-editor/images/stickers/landmarks/94.svg +28 -28
- package/assets/image-editor/images/stickers/landmarks/95.svg +31 -31
- package/assets/image-editor/images/stickers/landmarks/96.svg +25 -25
- package/assets/image-editor/images/stickers/landmarks/97.svg +31 -31
- package/assets/image-editor/images/stickers/landmarks/98.svg +52 -52
- package/assets/image-editor/images/stickers/landmarks/99.svg +56 -56
- package/assets/image-editor/images/stickers/transportation/0.svg +26 -26
- package/assets/image-editor/images/stickers/transportation/1.svg +10 -10
- package/assets/image-editor/images/stickers/transportation/10.svg +16 -16
- package/assets/image-editor/images/stickers/transportation/11.svg +30 -30
- package/assets/image-editor/images/stickers/transportation/12.svg +22 -22
- package/assets/image-editor/images/stickers/transportation/13.svg +24 -24
- package/assets/image-editor/images/stickers/transportation/14.svg +19 -19
- package/assets/image-editor/images/stickers/transportation/15.svg +23 -23
- package/assets/image-editor/images/stickers/transportation/16.svg +25 -25
- package/assets/image-editor/images/stickers/transportation/17.svg +34 -34
- package/assets/image-editor/images/stickers/transportation/18.svg +29 -29
- package/assets/image-editor/images/stickers/transportation/19.svg +24 -24
- package/assets/image-editor/images/stickers/transportation/2.svg +27 -27
- package/assets/image-editor/images/stickers/transportation/20.svg +25 -25
- package/assets/image-editor/images/stickers/transportation/21.svg +22 -22
- package/assets/image-editor/images/stickers/transportation/3.svg +18 -18
- package/assets/image-editor/images/stickers/transportation/4.svg +24 -24
- package/assets/image-editor/images/stickers/transportation/5.svg +15 -15
- package/assets/image-editor/images/stickers/transportation/6.svg +25 -25
- package/assets/image-editor/images/stickers/transportation/7.svg +17 -17
- package/assets/image-editor/images/stickers/transportation/8.svg +28 -28
- package/assets/image-editor/images/stickers/transportation/9.svg +23 -23
- package/debug-script.js +445 -445
- package/{file-manager-IconsTab-_YE67Dr8.js → file-manager-IconsTab-DBlHkjOe.js} +2 -2
- package/{file-manager-index-BOQvCJ_s.js → file-manager-index-C27hSl1b.js} +3 -3
- package/file-manager.esm.js +1 -1
- package/file-manager.js +45489 -45423
- package/{fm-icons-tab.0b3920cbbaa6c052568d.js → fm-icons-tab.4e78e0d23b307449840c.js} +2 -2
- package/hooks/useProxyDisplayFallback.d.ts +1 -1
- package/mockServiceWorker.js +344 -344
- package/notification.d.ts +636 -636
- package/package.json +30 -30
- package/sample-files.json +104 -104
- package/suppress-resize-observer-errors.js +60 -60
- package/test-pixie-loading.html +108 -108
package/debug-script.js
CHANGED
|
@@ -1,446 +1,446 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Отладочный скрипт для проверки и исправления циклических зависимостей в папках
|
|
3
|
-
*/
|
|
4
|
-
document.addEventListener('DOMContentLoaded', () => {
|
|
5
|
-
const debugContainer = document.createElement('div');
|
|
6
|
-
debugContainer.style.padding = '20px';
|
|
7
|
-
debugContainer.style.margin = '20px';
|
|
8
|
-
debugContainer.style.background = '#f0f0f0';
|
|
9
|
-
debugContainer.style.border = '1px solid #ddd';
|
|
10
|
-
debugContainer.style.borderRadius = '5px';
|
|
11
|
-
|
|
12
|
-
const heading = document.createElement('h1');
|
|
13
|
-
heading.textContent = 'Отладка структуры папок файлового менеджера';
|
|
14
|
-
debugContainer.appendChild(heading);
|
|
15
|
-
|
|
16
|
-
// Кнопка для проверки наличия сервера
|
|
17
|
-
const checkServerButton = document.createElement('button');
|
|
18
|
-
checkServerButton.textContent = 'Проверить состояние сервера';
|
|
19
|
-
checkServerButton.style.padding = '10px 15px';
|
|
20
|
-
checkServerButton.style.margin = '10px 0';
|
|
21
|
-
checkServerButton.style.background = '#722ed1';
|
|
22
|
-
checkServerButton.style.color = 'white';
|
|
23
|
-
checkServerButton.style.border = 'none';
|
|
24
|
-
checkServerButton.style.borderRadius = '4px';
|
|
25
|
-
checkServerButton.style.cursor = 'pointer';
|
|
26
|
-
debugContainer.appendChild(checkServerButton);
|
|
27
|
-
|
|
28
|
-
// Кнопка для проверки циклических зависимостей
|
|
29
|
-
const checkButton = document.createElement('button');
|
|
30
|
-
checkButton.textContent = 'Проверить и исправить циклические зависимости';
|
|
31
|
-
checkButton.style.padding = '10px 15px';
|
|
32
|
-
checkButton.style.margin = '10px 0 10px 10px';
|
|
33
|
-
checkButton.style.background = '#1890ff';
|
|
34
|
-
checkButton.style.color = 'white';
|
|
35
|
-
checkButton.style.border = 'none';
|
|
36
|
-
checkButton.style.borderRadius = '4px';
|
|
37
|
-
checkButton.style.cursor = 'pointer';
|
|
38
|
-
debugContainer.appendChild(checkButton);
|
|
39
|
-
|
|
40
|
-
// Кнопка для тестирования создания папки
|
|
41
|
-
const testCreateFolderButton = document.createElement('button');
|
|
42
|
-
testCreateFolderButton.textContent = 'Тест создания папки';
|
|
43
|
-
testCreateFolderButton.style.padding = '10px 15px';
|
|
44
|
-
testCreateFolderButton.style.margin = '10px 0 10px 10px';
|
|
45
|
-
testCreateFolderButton.style.background = '#52c41a';
|
|
46
|
-
testCreateFolderButton.style.color = 'white';
|
|
47
|
-
testCreateFolderButton.style.border = 'none';
|
|
48
|
-
testCreateFolderButton.style.borderRadius = '4px';
|
|
49
|
-
testCreateFolderButton.style.cursor = 'pointer';
|
|
50
|
-
debugContainer.appendChild(testCreateFolderButton);
|
|
51
|
-
|
|
52
|
-
// Лог результатов
|
|
53
|
-
const resultLog = document.createElement('div');
|
|
54
|
-
resultLog.style.marginTop = '20px';
|
|
55
|
-
resultLog.style.padding = '15px';
|
|
56
|
-
resultLog.style.background = '#fff';
|
|
57
|
-
resultLog.style.border = '1px solid #ddd';
|
|
58
|
-
resultLog.style.borderRadius = '4px';
|
|
59
|
-
resultLog.style.height = '400px';
|
|
60
|
-
resultLog.style.overflowY = 'auto';
|
|
61
|
-
resultLog.style.fontFamily = 'monospace';
|
|
62
|
-
debugContainer.appendChild(resultLog);
|
|
63
|
-
|
|
64
|
-
document.getElementById('root').appendChild(debugContainer);
|
|
65
|
-
|
|
66
|
-
// Функция добавления записи в лог
|
|
67
|
-
function logMessage(message, type = 'info') {
|
|
68
|
-
const logEntry = document.createElement('div');
|
|
69
|
-
logEntry.style.margin = '5px 0';
|
|
70
|
-
logEntry.style.padding = '5px';
|
|
71
|
-
|
|
72
|
-
switch (type) {
|
|
73
|
-
case 'error':
|
|
74
|
-
logEntry.style.color = '#ff4d4f';
|
|
75
|
-
logEntry.style.fontWeight = 'bold';
|
|
76
|
-
break;
|
|
77
|
-
case 'success':
|
|
78
|
-
logEntry.style.color = '#52c41a';
|
|
79
|
-
break;
|
|
80
|
-
case 'warning':
|
|
81
|
-
logEntry.style.color = '#faad14';
|
|
82
|
-
break;
|
|
83
|
-
default:
|
|
84
|
-
logEntry.style.color = '#222';
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
logEntry.textContent = `[${new Date().toLocaleTimeString()}] ${message}`;
|
|
88
|
-
resultLog.appendChild(logEntry);
|
|
89
|
-
resultLog.scrollTop = resultLog.scrollHeight;
|
|
90
|
-
console.log(`[DEBUG] ${message}`);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Обработчик кнопки проверки сервера
|
|
94
|
-
checkServerButton.addEventListener('click', () => {
|
|
95
|
-
resultLog.innerHTML = '';
|
|
96
|
-
logMessage('Проверка состояния сервера...');
|
|
97
|
-
|
|
98
|
-
if (window.server) {
|
|
99
|
-
logMessage('Сервер инициализирован!', 'success');
|
|
100
|
-
logMessage(`Версия Mirage: ${window.server.miragejs.VERSION || 'неизвестна'}`);
|
|
101
|
-
logMessage('Доступные модели:');
|
|
102
|
-
|
|
103
|
-
// Перечисляем доступные модели
|
|
104
|
-
try {
|
|
105
|
-
const models = window.server.db._collections;
|
|
106
|
-
for (const modelName in models) {
|
|
107
|
-
logMessage(`- ${modelName}: ${models[modelName].length} записей`);
|
|
108
|
-
}
|
|
109
|
-
} catch (error) {
|
|
110
|
-
logMessage(`Ошибка при получении моделей: ${error.message}`, 'error');
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// Проверяем доступ к API через fetch
|
|
114
|
-
logMessage('Проверка доступа к API...');
|
|
115
|
-
|
|
116
|
-
fetch('/api/folders')
|
|
117
|
-
.then(response => {
|
|
118
|
-
if (response.ok) {
|
|
119
|
-
logMessage('API /api/folders доступен', 'success');
|
|
120
|
-
return response.json();
|
|
121
|
-
} else {
|
|
122
|
-
throw new Error(`HTTP ошибка ${response.status}`);
|
|
123
|
-
}
|
|
124
|
-
})
|
|
125
|
-
.then(data => {
|
|
126
|
-
logMessage(`Получено ${data.folders?.length || 0} папок`);
|
|
127
|
-
})
|
|
128
|
-
.catch(error => {
|
|
129
|
-
logMessage(`Ошибка при доступе к API: ${error.message}`, 'error');
|
|
130
|
-
});
|
|
131
|
-
} else {
|
|
132
|
-
logMessage('Сервер не найден в глобальном объекте window!', 'error');
|
|
133
|
-
logMessage('Проверяем доступность API напрямую...');
|
|
134
|
-
|
|
135
|
-
// Пробуем получить доступ к API даже если server не найден
|
|
136
|
-
fetch('/api/folders')
|
|
137
|
-
.then(response => {
|
|
138
|
-
if (response.ok) {
|
|
139
|
-
logMessage('API /api/folders доступен несмотря на отсутствие объекта server', 'success');
|
|
140
|
-
} else {
|
|
141
|
-
throw new Error(`HTTP ошибка ${response.status}`);
|
|
142
|
-
}
|
|
143
|
-
})
|
|
144
|
-
.catch(error => {
|
|
145
|
-
logMessage(`API недоступен: ${error.message}`, 'error');
|
|
146
|
-
logMessage('Возможно, сервер не запущен или не настроен правильно', 'warning');
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
// Обработчик кнопки проверки циклических зависимостей
|
|
152
|
-
checkButton.addEventListener('click', async () => {
|
|
153
|
-
resultLog.innerHTML = '';
|
|
154
|
-
logMessage('Начинаем проверку структуры папок...');
|
|
155
|
-
|
|
156
|
-
try {
|
|
157
|
-
// Загружаем папки с сервера
|
|
158
|
-
logMessage('Загрузка списка папок...');
|
|
159
|
-
const foldersResponse = await fetch('/api/folders');
|
|
160
|
-
|
|
161
|
-
if (!foldersResponse.ok) {
|
|
162
|
-
throw new Error(`Ошибка при загрузке папок: ${foldersResponse.status}`);
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
const foldersData = await foldersResponse.json();
|
|
166
|
-
const folders = foldersData.folders || [];
|
|
167
|
-
|
|
168
|
-
logMessage(`Загружено ${folders.length} папок`, 'success');
|
|
169
|
-
|
|
170
|
-
// Проверка на прямые циклические зависимости (папка сама себе родитель)
|
|
171
|
-
const directCycles = folders.filter(folder => folder.id === folder.parentId && folder.parentId !== null);
|
|
172
|
-
|
|
173
|
-
if (directCycles.length > 0) {
|
|
174
|
-
logMessage(`Обнаружено ${directCycles.length} папок с прямыми циклическими зависимостями:`, 'error');
|
|
175
|
-
directCycles.forEach(folder => {
|
|
176
|
-
logMessage(`- Папка "${folder.name}" (ID: ${folder.id}) является родителем самой себя`, 'error');
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
// Исправляем прямые циклические зависимости
|
|
180
|
-
logMessage('Исправление прямых циклических зависимостей...');
|
|
181
|
-
|
|
182
|
-
for (const folder of directCycles) {
|
|
183
|
-
logMessage(`Исправление папки "${folder.name}" (ID: ${folder.id})...`);
|
|
184
|
-
|
|
185
|
-
// Сбрасываем parentId на null
|
|
186
|
-
const fixResponse = await fetch(`/api/folders/${folder.id}`, {
|
|
187
|
-
method: 'PATCH',
|
|
188
|
-
headers: {
|
|
189
|
-
'Content-Type': 'application/json'
|
|
190
|
-
},
|
|
191
|
-
body: JSON.stringify({
|
|
192
|
-
parentId: null
|
|
193
|
-
})
|
|
194
|
-
}).catch(error => {
|
|
195
|
-
// Если API не поддерживает PATCH, симулируем изменение через консоль
|
|
196
|
-
logMessage(`API метод PATCH не поддерживается: ${error.message}`, 'warning');
|
|
197
|
-
logMessage(`Симуляция исправления: window.server.db.folders.update(${folder.id}, { parentId: null })`, 'info');
|
|
198
|
-
|
|
199
|
-
// Выполняем прямую модификацию в консоли, если доступно
|
|
200
|
-
if (window.server && window.server.db && window.server.db.folders) {
|
|
201
|
-
const updatedFolder = window.server.db.folders.update(folder.id, { parentId: null });
|
|
202
|
-
return { ok: true, json: () => updatedFolder };
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
return { ok: false };
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
if (fixResponse.ok) {
|
|
209
|
-
logMessage(`Папка "${folder.name}" исправлена`, 'success');
|
|
210
|
-
} else {
|
|
211
|
-
logMessage(`Не удалось исправить папку "${folder.name}"`, 'error');
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
} else {
|
|
215
|
-
logMessage('Прямых циклических зависимостей не обнаружено', 'success');
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
// Ищем непрямые циклические зависимости
|
|
219
|
-
logMessage('Проверка на непрямые циклические зависимости...');
|
|
220
|
-
|
|
221
|
-
// Функция для проверки циклических зависимостей
|
|
222
|
-
function findCyclicDependencies(folders) {
|
|
223
|
-
const cyclicFolders = [];
|
|
224
|
-
|
|
225
|
-
for (const folder of folders) {
|
|
226
|
-
if (!folder.parentId) continue;
|
|
227
|
-
|
|
228
|
-
const visited = new Set();
|
|
229
|
-
let currentId = folder.parentId;
|
|
230
|
-
|
|
231
|
-
while (currentId) {
|
|
232
|
-
if (visited.has(currentId)) {
|
|
233
|
-
// Цикл обнаружен
|
|
234
|
-
cyclicFolders.push(folder);
|
|
235
|
-
break;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
if (currentId === folder.id) {
|
|
239
|
-
// Прямой цикл (уже обработан выше)
|
|
240
|
-
break;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
visited.add(currentId);
|
|
244
|
-
|
|
245
|
-
const parentFolder = folders.find(f => f.id === currentId);
|
|
246
|
-
if (!parentFolder) break;
|
|
247
|
-
|
|
248
|
-
currentId = parentFolder.parentId;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
return cyclicFolders;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
const cyclicFolders = findCyclicDependencies(folders);
|
|
256
|
-
|
|
257
|
-
if (cyclicFolders.length > 0) {
|
|
258
|
-
logMessage(`Обнаружено ${cyclicFolders.length} папок с непрямыми циклическими зависимостями:`, 'error');
|
|
259
|
-
|
|
260
|
-
cyclicFolders.forEach(folder => {
|
|
261
|
-
logMessage(`- Папка "${folder.name}" (ID: ${folder.id}) имеет циклическую зависимость через родителя ${folder.parentId}`, 'error');
|
|
262
|
-
});
|
|
263
|
-
|
|
264
|
-
// Исправляем непрямые циклические зависимости
|
|
265
|
-
logMessage('Исправление непрямых циклических зависимостей...');
|
|
266
|
-
|
|
267
|
-
for (const folder of cyclicFolders) {
|
|
268
|
-
logMessage(`Исправление папки "${folder.name}" (ID: ${folder.id})...`);
|
|
269
|
-
|
|
270
|
-
// Сбрасываем parentId на null
|
|
271
|
-
const fixResponse = await fetch(`/api/folders/${folder.id}`, {
|
|
272
|
-
method: 'PATCH',
|
|
273
|
-
headers: {
|
|
274
|
-
'Content-Type': 'application/json'
|
|
275
|
-
},
|
|
276
|
-
body: JSON.stringify({
|
|
277
|
-
parentId: null
|
|
278
|
-
})
|
|
279
|
-
}).catch(error => {
|
|
280
|
-
// Если API не поддерживает PATCH, симулируем изменение
|
|
281
|
-
logMessage(`API метод PATCH не поддерживается: ${error.message}`, 'warning');
|
|
282
|
-
logMessage(`Симуляция исправления: window.server.db.folders.update(${folder.id}, { parentId: null })`, 'info');
|
|
283
|
-
|
|
284
|
-
// Выполняем прямую модификацию, если доступно
|
|
285
|
-
if (window.server && window.server.db && window.server.db.folders) {
|
|
286
|
-
const updatedFolder = window.server.db.folders.update(folder.id, { parentId: null });
|
|
287
|
-
return { ok: true, json: () => updatedFolder };
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
return { ok: false };
|
|
291
|
-
});
|
|
292
|
-
|
|
293
|
-
if (fixResponse.ok) {
|
|
294
|
-
logMessage(`Папка "${folder.name}" исправлена`, 'success');
|
|
295
|
-
} else {
|
|
296
|
-
logMessage(`Не удалось исправить папку "${folder.name}"`, 'error');
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
} else {
|
|
300
|
-
logMessage('Непрямых циклических зависимостей не обнаружено', 'success');
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
// Финальная проверка после исправлений
|
|
304
|
-
logMessage('Выполняем повторную проверку после исправлений...');
|
|
305
|
-
|
|
306
|
-
const finalCheckResponse = await fetch('/api/folders');
|
|
307
|
-
const finalFoldersData = await finalCheckResponse.json();
|
|
308
|
-
const finalFolders = finalFoldersData.folders || [];
|
|
309
|
-
|
|
310
|
-
const remainingDirectCycles = finalFolders.filter(folder => folder.id === folder.parentId && folder.parentId !== null);
|
|
311
|
-
const remainingIndirectCycles = findCyclicDependencies(finalFolders);
|
|
312
|
-
|
|
313
|
-
if (remainingDirectCycles.length === 0 && remainingIndirectCycles.length === 0) {
|
|
314
|
-
logMessage('Все циклические зависимости успешно устранены!', 'success');
|
|
315
|
-
} else {
|
|
316
|
-
logMessage(`Осталось нерешенных проблем: ${remainingDirectCycles.length + remainingIndirectCycles.length}`, 'warning');
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
// Визуализация итоговой структуры папок
|
|
320
|
-
logMessage('Итоговая структура папок:');
|
|
321
|
-
|
|
322
|
-
// Строим карту отношений родитель-дети
|
|
323
|
-
const folderMap = {};
|
|
324
|
-
finalFolders.forEach(folder => {
|
|
325
|
-
if (!folderMap[folder.id]) {
|
|
326
|
-
folderMap[folder.id] = {
|
|
327
|
-
...folder,
|
|
328
|
-
children: []
|
|
329
|
-
};
|
|
330
|
-
} else {
|
|
331
|
-
folderMap[folder.id] = {
|
|
332
|
-
...folderMap[folder.id],
|
|
333
|
-
...folder
|
|
334
|
-
};
|
|
335
|
-
}
|
|
336
|
-
});
|
|
337
|
-
|
|
338
|
-
// Создаем связи родитель-дети
|
|
339
|
-
finalFolders.forEach(folder => {
|
|
340
|
-
if (folder.parentId && folderMap[folder.parentId]) {
|
|
341
|
-
folderMap[folder.parentId].children.push(folderMap[folder.id]);
|
|
342
|
-
}
|
|
343
|
-
});
|
|
344
|
-
|
|
345
|
-
// Корневые папки (без родителя)
|
|
346
|
-
const rootFolders = finalFolders.filter(folder => !folder.parentId);
|
|
347
|
-
|
|
348
|
-
// Рекурсивная функция для вывода структуры папок
|
|
349
|
-
function printFolderStructure(folder, level = 0) {
|
|
350
|
-
const indent = ' '.repeat(level);
|
|
351
|
-
logMessage(`${indent}└─ ${folder.name} (ID: ${folder.id})`);
|
|
352
|
-
|
|
353
|
-
const children = finalFolders.filter(f => f.parentId === folder.id);
|
|
354
|
-
children.forEach(child => {
|
|
355
|
-
printFolderStructure(child, level + 1);
|
|
356
|
-
});
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
rootFolders.forEach(folder => {
|
|
360
|
-
printFolderStructure(folder);
|
|
361
|
-
});
|
|
362
|
-
|
|
363
|
-
} catch (error) {
|
|
364
|
-
logMessage(`Ошибка при выполнении проверки: ${error.message}`, 'error');
|
|
365
|
-
console.error('Ошибка при отладке:', error);
|
|
366
|
-
}
|
|
367
|
-
});
|
|
368
|
-
|
|
369
|
-
// Обработчик кнопки тестирования создания папки
|
|
370
|
-
testCreateFolderButton.addEventListener('click', async () => {
|
|
371
|
-
resultLog.innerHTML = '';
|
|
372
|
-
logMessage('Тестирование создания папки...');
|
|
373
|
-
|
|
374
|
-
try {
|
|
375
|
-
// Генерируем уникальное имя папки для тестирования
|
|
376
|
-
const testFolderName = `Тестовая папка ${new Date().toLocaleTimeString()}`;
|
|
377
|
-
logMessage(`Создаем папку "${testFolderName}" в корневом каталоге...`);
|
|
378
|
-
|
|
379
|
-
// Отправляем запрос на создание папки
|
|
380
|
-
const response = await fetch('/api/folders', {
|
|
381
|
-
method: 'POST',
|
|
382
|
-
headers: {
|
|
383
|
-
'Content-Type': 'application/json'
|
|
384
|
-
},
|
|
385
|
-
body: JSON.stringify({
|
|
386
|
-
name: testFolderName,
|
|
387
|
-
parentId: null
|
|
388
|
-
})
|
|
389
|
-
});
|
|
390
|
-
|
|
391
|
-
// Анализируем ответ
|
|
392
|
-
logMessage(`Статус ответа: ${response.status} ${response.statusText}`);
|
|
393
|
-
const responseData = await response.json();
|
|
394
|
-
|
|
395
|
-
// Выводим подробную информацию о структуре ответа
|
|
396
|
-
logMessage('Структура ответа сервера:');
|
|
397
|
-
const responseStructure = JSON.stringify(responseData, null, 2);
|
|
398
|
-
|
|
399
|
-
const responseDetails = document.createElement('pre');
|
|
400
|
-
responseDetails.style.backgroundColor = '#f5f5f5';
|
|
401
|
-
responseDetails.style.padding = '10px';
|
|
402
|
-
responseDetails.style.borderRadius = '4px';
|
|
403
|
-
responseDetails.style.fontSize = '12px';
|
|
404
|
-
responseDetails.style.overflow = 'auto';
|
|
405
|
-
responseDetails.style.maxHeight = '200px';
|
|
406
|
-
responseDetails.textContent = responseStructure;
|
|
407
|
-
resultLog.appendChild(responseDetails);
|
|
408
|
-
|
|
409
|
-
if (response.ok) {
|
|
410
|
-
logMessage(`Папка "${testFolderName}" успешно создана!`, 'success');
|
|
411
|
-
|
|
412
|
-
// Проверяем структуру ответа
|
|
413
|
-
if (responseData.folder) {
|
|
414
|
-
logMessage(`ID новой папки: ${responseData.folder.id}`, 'success');
|
|
415
|
-
logMessage('Формат ответа: { folder: {...} }', 'info');
|
|
416
|
-
} else if (responseData.id) {
|
|
417
|
-
logMessage(`ID новой папки: ${responseData.id}`, 'success');
|
|
418
|
-
logMessage('Формат ответа: {...}', 'info');
|
|
419
|
-
} else {
|
|
420
|
-
logMessage('Некорректный формат ответа: отсутствует ID папки', 'error');
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
// Загружаем список папок для проверки
|
|
424
|
-
logMessage('Проверяем, что папка появилась в списке...');
|
|
425
|
-
const foldersResponse = await fetch('/api/folders');
|
|
426
|
-
const foldersData = await foldersResponse.json();
|
|
427
|
-
const folders = foldersData.folders || [];
|
|
428
|
-
|
|
429
|
-
// Ищем созданную папку в списке
|
|
430
|
-
const folderId = responseData.folder ? responseData.folder.id : responseData.id;
|
|
431
|
-
const createdFolder = folders.find(folder => folder.id === folderId);
|
|
432
|
-
|
|
433
|
-
if (createdFolder) {
|
|
434
|
-
logMessage(`Папка "${createdFolder.name}" найдена в списке!`, 'success');
|
|
435
|
-
} else {
|
|
436
|
-
logMessage('Папка не найдена в списке после создания!', 'error');
|
|
437
|
-
}
|
|
438
|
-
} else {
|
|
439
|
-
logMessage(`Ошибка при создании папки: ${responseData.error || 'Неизвестная ошибка'}`, 'error');
|
|
440
|
-
}
|
|
441
|
-
} catch (error) {
|
|
442
|
-
logMessage(`Ошибка при тестировании: ${error.message}`, 'error');
|
|
443
|
-
console.error('Ошибка при тестировании создания папки:', error);
|
|
444
|
-
}
|
|
445
|
-
});
|
|
1
|
+
/**
|
|
2
|
+
* Отладочный скрипт для проверки и исправления циклических зависимостей в папках
|
|
3
|
+
*/
|
|
4
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
5
|
+
const debugContainer = document.createElement('div');
|
|
6
|
+
debugContainer.style.padding = '20px';
|
|
7
|
+
debugContainer.style.margin = '20px';
|
|
8
|
+
debugContainer.style.background = '#f0f0f0';
|
|
9
|
+
debugContainer.style.border = '1px solid #ddd';
|
|
10
|
+
debugContainer.style.borderRadius = '5px';
|
|
11
|
+
|
|
12
|
+
const heading = document.createElement('h1');
|
|
13
|
+
heading.textContent = 'Отладка структуры папок файлового менеджера';
|
|
14
|
+
debugContainer.appendChild(heading);
|
|
15
|
+
|
|
16
|
+
// Кнопка для проверки наличия сервера
|
|
17
|
+
const checkServerButton = document.createElement('button');
|
|
18
|
+
checkServerButton.textContent = 'Проверить состояние сервера';
|
|
19
|
+
checkServerButton.style.padding = '10px 15px';
|
|
20
|
+
checkServerButton.style.margin = '10px 0';
|
|
21
|
+
checkServerButton.style.background = '#722ed1';
|
|
22
|
+
checkServerButton.style.color = 'white';
|
|
23
|
+
checkServerButton.style.border = 'none';
|
|
24
|
+
checkServerButton.style.borderRadius = '4px';
|
|
25
|
+
checkServerButton.style.cursor = 'pointer';
|
|
26
|
+
debugContainer.appendChild(checkServerButton);
|
|
27
|
+
|
|
28
|
+
// Кнопка для проверки циклических зависимостей
|
|
29
|
+
const checkButton = document.createElement('button');
|
|
30
|
+
checkButton.textContent = 'Проверить и исправить циклические зависимости';
|
|
31
|
+
checkButton.style.padding = '10px 15px';
|
|
32
|
+
checkButton.style.margin = '10px 0 10px 10px';
|
|
33
|
+
checkButton.style.background = '#1890ff';
|
|
34
|
+
checkButton.style.color = 'white';
|
|
35
|
+
checkButton.style.border = 'none';
|
|
36
|
+
checkButton.style.borderRadius = '4px';
|
|
37
|
+
checkButton.style.cursor = 'pointer';
|
|
38
|
+
debugContainer.appendChild(checkButton);
|
|
39
|
+
|
|
40
|
+
// Кнопка для тестирования создания папки
|
|
41
|
+
const testCreateFolderButton = document.createElement('button');
|
|
42
|
+
testCreateFolderButton.textContent = 'Тест создания папки';
|
|
43
|
+
testCreateFolderButton.style.padding = '10px 15px';
|
|
44
|
+
testCreateFolderButton.style.margin = '10px 0 10px 10px';
|
|
45
|
+
testCreateFolderButton.style.background = '#52c41a';
|
|
46
|
+
testCreateFolderButton.style.color = 'white';
|
|
47
|
+
testCreateFolderButton.style.border = 'none';
|
|
48
|
+
testCreateFolderButton.style.borderRadius = '4px';
|
|
49
|
+
testCreateFolderButton.style.cursor = 'pointer';
|
|
50
|
+
debugContainer.appendChild(testCreateFolderButton);
|
|
51
|
+
|
|
52
|
+
// Лог результатов
|
|
53
|
+
const resultLog = document.createElement('div');
|
|
54
|
+
resultLog.style.marginTop = '20px';
|
|
55
|
+
resultLog.style.padding = '15px';
|
|
56
|
+
resultLog.style.background = '#fff';
|
|
57
|
+
resultLog.style.border = '1px solid #ddd';
|
|
58
|
+
resultLog.style.borderRadius = '4px';
|
|
59
|
+
resultLog.style.height = '400px';
|
|
60
|
+
resultLog.style.overflowY = 'auto';
|
|
61
|
+
resultLog.style.fontFamily = 'monospace';
|
|
62
|
+
debugContainer.appendChild(resultLog);
|
|
63
|
+
|
|
64
|
+
document.getElementById('root').appendChild(debugContainer);
|
|
65
|
+
|
|
66
|
+
// Функция добавления записи в лог
|
|
67
|
+
function logMessage(message, type = 'info') {
|
|
68
|
+
const logEntry = document.createElement('div');
|
|
69
|
+
logEntry.style.margin = '5px 0';
|
|
70
|
+
logEntry.style.padding = '5px';
|
|
71
|
+
|
|
72
|
+
switch (type) {
|
|
73
|
+
case 'error':
|
|
74
|
+
logEntry.style.color = '#ff4d4f';
|
|
75
|
+
logEntry.style.fontWeight = 'bold';
|
|
76
|
+
break;
|
|
77
|
+
case 'success':
|
|
78
|
+
logEntry.style.color = '#52c41a';
|
|
79
|
+
break;
|
|
80
|
+
case 'warning':
|
|
81
|
+
logEntry.style.color = '#faad14';
|
|
82
|
+
break;
|
|
83
|
+
default:
|
|
84
|
+
logEntry.style.color = '#222';
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
logEntry.textContent = `[${new Date().toLocaleTimeString()}] ${message}`;
|
|
88
|
+
resultLog.appendChild(logEntry);
|
|
89
|
+
resultLog.scrollTop = resultLog.scrollHeight;
|
|
90
|
+
console.log(`[DEBUG] ${message}`);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Обработчик кнопки проверки сервера
|
|
94
|
+
checkServerButton.addEventListener('click', () => {
|
|
95
|
+
resultLog.innerHTML = '';
|
|
96
|
+
logMessage('Проверка состояния сервера...');
|
|
97
|
+
|
|
98
|
+
if (window.server) {
|
|
99
|
+
logMessage('Сервер инициализирован!', 'success');
|
|
100
|
+
logMessage(`Версия Mirage: ${window.server.miragejs.VERSION || 'неизвестна'}`);
|
|
101
|
+
logMessage('Доступные модели:');
|
|
102
|
+
|
|
103
|
+
// Перечисляем доступные модели
|
|
104
|
+
try {
|
|
105
|
+
const models = window.server.db._collections;
|
|
106
|
+
for (const modelName in models) {
|
|
107
|
+
logMessage(`- ${modelName}: ${models[modelName].length} записей`);
|
|
108
|
+
}
|
|
109
|
+
} catch (error) {
|
|
110
|
+
logMessage(`Ошибка при получении моделей: ${error.message}`, 'error');
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Проверяем доступ к API через fetch
|
|
114
|
+
logMessage('Проверка доступа к API...');
|
|
115
|
+
|
|
116
|
+
fetch('/api/folders')
|
|
117
|
+
.then(response => {
|
|
118
|
+
if (response.ok) {
|
|
119
|
+
logMessage('API /api/folders доступен', 'success');
|
|
120
|
+
return response.json();
|
|
121
|
+
} else {
|
|
122
|
+
throw new Error(`HTTP ошибка ${response.status}`);
|
|
123
|
+
}
|
|
124
|
+
})
|
|
125
|
+
.then(data => {
|
|
126
|
+
logMessage(`Получено ${data.folders?.length || 0} папок`);
|
|
127
|
+
})
|
|
128
|
+
.catch(error => {
|
|
129
|
+
logMessage(`Ошибка при доступе к API: ${error.message}`, 'error');
|
|
130
|
+
});
|
|
131
|
+
} else {
|
|
132
|
+
logMessage('Сервер не найден в глобальном объекте window!', 'error');
|
|
133
|
+
logMessage('Проверяем доступность API напрямую...');
|
|
134
|
+
|
|
135
|
+
// Пробуем получить доступ к API даже если server не найден
|
|
136
|
+
fetch('/api/folders')
|
|
137
|
+
.then(response => {
|
|
138
|
+
if (response.ok) {
|
|
139
|
+
logMessage('API /api/folders доступен несмотря на отсутствие объекта server', 'success');
|
|
140
|
+
} else {
|
|
141
|
+
throw new Error(`HTTP ошибка ${response.status}`);
|
|
142
|
+
}
|
|
143
|
+
})
|
|
144
|
+
.catch(error => {
|
|
145
|
+
logMessage(`API недоступен: ${error.message}`, 'error');
|
|
146
|
+
logMessage('Возможно, сервер не запущен или не настроен правильно', 'warning');
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
// Обработчик кнопки проверки циклических зависимостей
|
|
152
|
+
checkButton.addEventListener('click', async () => {
|
|
153
|
+
resultLog.innerHTML = '';
|
|
154
|
+
logMessage('Начинаем проверку структуры папок...');
|
|
155
|
+
|
|
156
|
+
try {
|
|
157
|
+
// Загружаем папки с сервера
|
|
158
|
+
logMessage('Загрузка списка папок...');
|
|
159
|
+
const foldersResponse = await fetch('/api/folders');
|
|
160
|
+
|
|
161
|
+
if (!foldersResponse.ok) {
|
|
162
|
+
throw new Error(`Ошибка при загрузке папок: ${foldersResponse.status}`);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const foldersData = await foldersResponse.json();
|
|
166
|
+
const folders = foldersData.folders || [];
|
|
167
|
+
|
|
168
|
+
logMessage(`Загружено ${folders.length} папок`, 'success');
|
|
169
|
+
|
|
170
|
+
// Проверка на прямые циклические зависимости (папка сама себе родитель)
|
|
171
|
+
const directCycles = folders.filter(folder => folder.id === folder.parentId && folder.parentId !== null);
|
|
172
|
+
|
|
173
|
+
if (directCycles.length > 0) {
|
|
174
|
+
logMessage(`Обнаружено ${directCycles.length} папок с прямыми циклическими зависимостями:`, 'error');
|
|
175
|
+
directCycles.forEach(folder => {
|
|
176
|
+
logMessage(`- Папка "${folder.name}" (ID: ${folder.id}) является родителем самой себя`, 'error');
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
// Исправляем прямые циклические зависимости
|
|
180
|
+
logMessage('Исправление прямых циклических зависимостей...');
|
|
181
|
+
|
|
182
|
+
for (const folder of directCycles) {
|
|
183
|
+
logMessage(`Исправление папки "${folder.name}" (ID: ${folder.id})...`);
|
|
184
|
+
|
|
185
|
+
// Сбрасываем parentId на null
|
|
186
|
+
const fixResponse = await fetch(`/api/folders/${folder.id}`, {
|
|
187
|
+
method: 'PATCH',
|
|
188
|
+
headers: {
|
|
189
|
+
'Content-Type': 'application/json'
|
|
190
|
+
},
|
|
191
|
+
body: JSON.stringify({
|
|
192
|
+
parentId: null
|
|
193
|
+
})
|
|
194
|
+
}).catch(error => {
|
|
195
|
+
// Если API не поддерживает PATCH, симулируем изменение через консоль
|
|
196
|
+
logMessage(`API метод PATCH не поддерживается: ${error.message}`, 'warning');
|
|
197
|
+
logMessage(`Симуляция исправления: window.server.db.folders.update(${folder.id}, { parentId: null })`, 'info');
|
|
198
|
+
|
|
199
|
+
// Выполняем прямую модификацию в консоли, если доступно
|
|
200
|
+
if (window.server && window.server.db && window.server.db.folders) {
|
|
201
|
+
const updatedFolder = window.server.db.folders.update(folder.id, { parentId: null });
|
|
202
|
+
return { ok: true, json: () => updatedFolder };
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return { ok: false };
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
if (fixResponse.ok) {
|
|
209
|
+
logMessage(`Папка "${folder.name}" исправлена`, 'success');
|
|
210
|
+
} else {
|
|
211
|
+
logMessage(`Не удалось исправить папку "${folder.name}"`, 'error');
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
} else {
|
|
215
|
+
logMessage('Прямых циклических зависимостей не обнаружено', 'success');
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Ищем непрямые циклические зависимости
|
|
219
|
+
logMessage('Проверка на непрямые циклические зависимости...');
|
|
220
|
+
|
|
221
|
+
// Функция для проверки циклических зависимостей
|
|
222
|
+
function findCyclicDependencies(folders) {
|
|
223
|
+
const cyclicFolders = [];
|
|
224
|
+
|
|
225
|
+
for (const folder of folders) {
|
|
226
|
+
if (!folder.parentId) continue;
|
|
227
|
+
|
|
228
|
+
const visited = new Set();
|
|
229
|
+
let currentId = folder.parentId;
|
|
230
|
+
|
|
231
|
+
while (currentId) {
|
|
232
|
+
if (visited.has(currentId)) {
|
|
233
|
+
// Цикл обнаружен
|
|
234
|
+
cyclicFolders.push(folder);
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (currentId === folder.id) {
|
|
239
|
+
// Прямой цикл (уже обработан выше)
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
visited.add(currentId);
|
|
244
|
+
|
|
245
|
+
const parentFolder = folders.find(f => f.id === currentId);
|
|
246
|
+
if (!parentFolder) break;
|
|
247
|
+
|
|
248
|
+
currentId = parentFolder.parentId;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
return cyclicFolders;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const cyclicFolders = findCyclicDependencies(folders);
|
|
256
|
+
|
|
257
|
+
if (cyclicFolders.length > 0) {
|
|
258
|
+
logMessage(`Обнаружено ${cyclicFolders.length} папок с непрямыми циклическими зависимостями:`, 'error');
|
|
259
|
+
|
|
260
|
+
cyclicFolders.forEach(folder => {
|
|
261
|
+
logMessage(`- Папка "${folder.name}" (ID: ${folder.id}) имеет циклическую зависимость через родителя ${folder.parentId}`, 'error');
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
// Исправляем непрямые циклические зависимости
|
|
265
|
+
logMessage('Исправление непрямых циклических зависимостей...');
|
|
266
|
+
|
|
267
|
+
for (const folder of cyclicFolders) {
|
|
268
|
+
logMessage(`Исправление папки "${folder.name}" (ID: ${folder.id})...`);
|
|
269
|
+
|
|
270
|
+
// Сбрасываем parentId на null
|
|
271
|
+
const fixResponse = await fetch(`/api/folders/${folder.id}`, {
|
|
272
|
+
method: 'PATCH',
|
|
273
|
+
headers: {
|
|
274
|
+
'Content-Type': 'application/json'
|
|
275
|
+
},
|
|
276
|
+
body: JSON.stringify({
|
|
277
|
+
parentId: null
|
|
278
|
+
})
|
|
279
|
+
}).catch(error => {
|
|
280
|
+
// Если API не поддерживает PATCH, симулируем изменение
|
|
281
|
+
logMessage(`API метод PATCH не поддерживается: ${error.message}`, 'warning');
|
|
282
|
+
logMessage(`Симуляция исправления: window.server.db.folders.update(${folder.id}, { parentId: null })`, 'info');
|
|
283
|
+
|
|
284
|
+
// Выполняем прямую модификацию, если доступно
|
|
285
|
+
if (window.server && window.server.db && window.server.db.folders) {
|
|
286
|
+
const updatedFolder = window.server.db.folders.update(folder.id, { parentId: null });
|
|
287
|
+
return { ok: true, json: () => updatedFolder };
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return { ok: false };
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
if (fixResponse.ok) {
|
|
294
|
+
logMessage(`Папка "${folder.name}" исправлена`, 'success');
|
|
295
|
+
} else {
|
|
296
|
+
logMessage(`Не удалось исправить папку "${folder.name}"`, 'error');
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
} else {
|
|
300
|
+
logMessage('Непрямых циклических зависимостей не обнаружено', 'success');
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// Финальная проверка после исправлений
|
|
304
|
+
logMessage('Выполняем повторную проверку после исправлений...');
|
|
305
|
+
|
|
306
|
+
const finalCheckResponse = await fetch('/api/folders');
|
|
307
|
+
const finalFoldersData = await finalCheckResponse.json();
|
|
308
|
+
const finalFolders = finalFoldersData.folders || [];
|
|
309
|
+
|
|
310
|
+
const remainingDirectCycles = finalFolders.filter(folder => folder.id === folder.parentId && folder.parentId !== null);
|
|
311
|
+
const remainingIndirectCycles = findCyclicDependencies(finalFolders);
|
|
312
|
+
|
|
313
|
+
if (remainingDirectCycles.length === 0 && remainingIndirectCycles.length === 0) {
|
|
314
|
+
logMessage('Все циклические зависимости успешно устранены!', 'success');
|
|
315
|
+
} else {
|
|
316
|
+
logMessage(`Осталось нерешенных проблем: ${remainingDirectCycles.length + remainingIndirectCycles.length}`, 'warning');
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// Визуализация итоговой структуры папок
|
|
320
|
+
logMessage('Итоговая структура папок:');
|
|
321
|
+
|
|
322
|
+
// Строим карту отношений родитель-дети
|
|
323
|
+
const folderMap = {};
|
|
324
|
+
finalFolders.forEach(folder => {
|
|
325
|
+
if (!folderMap[folder.id]) {
|
|
326
|
+
folderMap[folder.id] = {
|
|
327
|
+
...folder,
|
|
328
|
+
children: []
|
|
329
|
+
};
|
|
330
|
+
} else {
|
|
331
|
+
folderMap[folder.id] = {
|
|
332
|
+
...folderMap[folder.id],
|
|
333
|
+
...folder
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
// Создаем связи родитель-дети
|
|
339
|
+
finalFolders.forEach(folder => {
|
|
340
|
+
if (folder.parentId && folderMap[folder.parentId]) {
|
|
341
|
+
folderMap[folder.parentId].children.push(folderMap[folder.id]);
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
// Корневые папки (без родителя)
|
|
346
|
+
const rootFolders = finalFolders.filter(folder => !folder.parentId);
|
|
347
|
+
|
|
348
|
+
// Рекурсивная функция для вывода структуры папок
|
|
349
|
+
function printFolderStructure(folder, level = 0) {
|
|
350
|
+
const indent = ' '.repeat(level);
|
|
351
|
+
logMessage(`${indent}└─ ${folder.name} (ID: ${folder.id})`);
|
|
352
|
+
|
|
353
|
+
const children = finalFolders.filter(f => f.parentId === folder.id);
|
|
354
|
+
children.forEach(child => {
|
|
355
|
+
printFolderStructure(child, level + 1);
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
rootFolders.forEach(folder => {
|
|
360
|
+
printFolderStructure(folder);
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
} catch (error) {
|
|
364
|
+
logMessage(`Ошибка при выполнении проверки: ${error.message}`, 'error');
|
|
365
|
+
console.error('Ошибка при отладке:', error);
|
|
366
|
+
}
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
// Обработчик кнопки тестирования создания папки
|
|
370
|
+
testCreateFolderButton.addEventListener('click', async () => {
|
|
371
|
+
resultLog.innerHTML = '';
|
|
372
|
+
logMessage('Тестирование создания папки...');
|
|
373
|
+
|
|
374
|
+
try {
|
|
375
|
+
// Генерируем уникальное имя папки для тестирования
|
|
376
|
+
const testFolderName = `Тестовая папка ${new Date().toLocaleTimeString()}`;
|
|
377
|
+
logMessage(`Создаем папку "${testFolderName}" в корневом каталоге...`);
|
|
378
|
+
|
|
379
|
+
// Отправляем запрос на создание папки
|
|
380
|
+
const response = await fetch('/api/folders', {
|
|
381
|
+
method: 'POST',
|
|
382
|
+
headers: {
|
|
383
|
+
'Content-Type': 'application/json'
|
|
384
|
+
},
|
|
385
|
+
body: JSON.stringify({
|
|
386
|
+
name: testFolderName,
|
|
387
|
+
parentId: null
|
|
388
|
+
})
|
|
389
|
+
});
|
|
390
|
+
|
|
391
|
+
// Анализируем ответ
|
|
392
|
+
logMessage(`Статус ответа: ${response.status} ${response.statusText}`);
|
|
393
|
+
const responseData = await response.json();
|
|
394
|
+
|
|
395
|
+
// Выводим подробную информацию о структуре ответа
|
|
396
|
+
logMessage('Структура ответа сервера:');
|
|
397
|
+
const responseStructure = JSON.stringify(responseData, null, 2);
|
|
398
|
+
|
|
399
|
+
const responseDetails = document.createElement('pre');
|
|
400
|
+
responseDetails.style.backgroundColor = '#f5f5f5';
|
|
401
|
+
responseDetails.style.padding = '10px';
|
|
402
|
+
responseDetails.style.borderRadius = '4px';
|
|
403
|
+
responseDetails.style.fontSize = '12px';
|
|
404
|
+
responseDetails.style.overflow = 'auto';
|
|
405
|
+
responseDetails.style.maxHeight = '200px';
|
|
406
|
+
responseDetails.textContent = responseStructure;
|
|
407
|
+
resultLog.appendChild(responseDetails);
|
|
408
|
+
|
|
409
|
+
if (response.ok) {
|
|
410
|
+
logMessage(`Папка "${testFolderName}" успешно создана!`, 'success');
|
|
411
|
+
|
|
412
|
+
// Проверяем структуру ответа
|
|
413
|
+
if (responseData.folder) {
|
|
414
|
+
logMessage(`ID новой папки: ${responseData.folder.id}`, 'success');
|
|
415
|
+
logMessage('Формат ответа: { folder: {...} }', 'info');
|
|
416
|
+
} else if (responseData.id) {
|
|
417
|
+
logMessage(`ID новой папки: ${responseData.id}`, 'success');
|
|
418
|
+
logMessage('Формат ответа: {...}', 'info');
|
|
419
|
+
} else {
|
|
420
|
+
logMessage('Некорректный формат ответа: отсутствует ID папки', 'error');
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
// Загружаем список папок для проверки
|
|
424
|
+
logMessage('Проверяем, что папка появилась в списке...');
|
|
425
|
+
const foldersResponse = await fetch('/api/folders');
|
|
426
|
+
const foldersData = await foldersResponse.json();
|
|
427
|
+
const folders = foldersData.folders || [];
|
|
428
|
+
|
|
429
|
+
// Ищем созданную папку в списке
|
|
430
|
+
const folderId = responseData.folder ? responseData.folder.id : responseData.id;
|
|
431
|
+
const createdFolder = folders.find(folder => folder.id === folderId);
|
|
432
|
+
|
|
433
|
+
if (createdFolder) {
|
|
434
|
+
logMessage(`Папка "${createdFolder.name}" найдена в списке!`, 'success');
|
|
435
|
+
} else {
|
|
436
|
+
logMessage('Папка не найдена в списке после создания!', 'error');
|
|
437
|
+
}
|
|
438
|
+
} else {
|
|
439
|
+
logMessage(`Ошибка при создании папки: ${responseData.error || 'Неизвестная ошибка'}`, 'error');
|
|
440
|
+
}
|
|
441
|
+
} catch (error) {
|
|
442
|
+
logMessage(`Ошибка при тестировании: ${error.message}`, 'error');
|
|
443
|
+
console.error('Ошибка при тестировании создания папки:', error);
|
|
444
|
+
}
|
|
445
|
+
});
|
|
446
446
|
});
|