first commit

This commit is contained in:
salam committed 2026-10-19 08:18:39 +02:00
commit 1218dd1517
12716 files changed
+989233

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 808 B

@@ -0,0 +1 @@
<svg viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg"><title>module-extensionmanager</title><g fill="none" fill-rule="evenodd"><path d="M0 0h64v64H0z" fill="#F08D34"/><path d="M33.018 27.928l10.897-3.8A1 1 0 1 1 44.618 26L34 29.703V42.93c0 .589-.448 1.066-1 1.066s-1-.477-1-1.066V29.687l-10.67-3.815a1 1 0 1 1 .702-1.873l10.986 3.929zm.454-12a1.83 1.83 0 0 0-.944 0L16.472 21.05a.712.712 0 0 0-.472.643v20.633c0 .271.215.56.472.642l16.056 5.122c.26.083.687.082.944 0l16.056-5.122a.712.712 0 0 0 .472-.642V21.692a.723.723 0 0 0-.472-.643l-16.056-5.12z" fill="#FFF"/></g></svg>

After

Width:  |  Height:  |  Size: 581 B

@@ -0,0 +1,23 @@
<svg width="600" height="450" viewBox="0 0 600 450" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="1.5">
<path fill="url(#a)" d="M0 0h600v450H0z"/>
<path d="M374 384.829L629 290l-130-53-312 126" fill="url(#b)"/>
<path d="M374 72v312.829L413 362V96l-39-24z" fill="#f7f7f7"/>
<path d="M187 96l187-23v311.829L187 363V96z" fill="#fff"/>
<path d="M187 96v267l187 21.829L413 362V96l-39-23-187 23z" fill="none" stroke="#969696" stroke-width="2"/>
<path d="M291.466 305.869v-22.591l-22.591-2.759v22.591l22.591 2.759zm27.335-122.653c0-41.306-18.567-41.314-40.212-40.637-8.189.255-19.428 1.886-25.302 2.524v16.492c7.003-.5 18.299-1.38 27.561-.249 11.295 1.379 18.75 6.808 18.75 21.492 0 14.684-.903 16.155-15.587 31.757l-13.555 14.384v27.335l19.202 2.345v-23.687l12.199-12.969c15.136-15.998 16.944-21.166 16.944-38.787z" fill="#ccc" fill-rule="nonzero"/>
<g fill-rule="nonzero">
<path d="M388.788 360.247v8.369l-.813.47v-8.37l-1.44.831v-1.019l3.692-2.132v1.019l-1.439.832zm4.362 1.491v4.36l-.842.486v-4.36l-1.672-4.064.897-.517 1.233 3.082 1.234-4.507.851-.491-1.701 6.011zm4.224-1.62l-.785.453v3.541l-.814.47v-9.389s.805-.559 1.581-1.007c1.42-.82 1.831.204 1.831 1.853 0 2.039-.486 3.313-1.813 4.079m.093-5.03a7.66 7.66 0 0 0-.878.588v3.915l.878-.507c.524-.303.889-1.009.889-2.471 0-1.342-.226-1.908-.889-1.525m4.655 5.923c-1.542.89-1.953-.482-1.953-3.767 0-3.153.412-4.92 1.953-5.81 1.542-.89 1.953.402 1.953 3.555 0 3.285-.411 5.132-1.953 6.022m0-8.598c-.84.485-1.121 1.466-1.121 4.417 0 2.883.281 3.688 1.121 3.203.841-.486 1.121-1.615 1.121-4.497 0-2.951-.28-3.608-1.121-3.123m4.299 6.116c-.458.264-1.139.457-1.225.478v-.978c.225-.063.804-.259 1.216-.497.476-.274.785-1.033.785-2.067 0-1.219-.139-1.783-.803-1.399l-.767.442v-.98l.672-.388c.759-.438.794-1.572.794-2.107 0-1.061-.232-1.356-.699-1.086-.411.237-.88.655-1.15.892v-.979c.102-.086.655-.606 1.13-.881.963-.556 1.515-.284 1.515 1.715 0 .912-.225 1.846-.721 2.388.571-.275.832.472.832 1.786 0 1.999-.542 3.062-1.579 3.661"/>
<path d="M382.618 368.303a1.666 1.666 0 0 1-.375.293c-1.13.652-2.789-4.056-2.789-5.942 0-.694.115-.991.276-1.284-1.382 1.03-3.042 2.717-3.572 3.949-.115.298-.184.702-.184 1.165 0 2.943 2.189 8.359 3.733 7.468.715-.413 1.92-2.794 2.911-5.649m-.721-8.381c1.428-.825 2.858-1.32 2.858-.162 0 2.348-1.038 5.793-1.567 6.099-.945.545-2.121-2.548-2.121-4.433 0-.86.231-1.158.83-1.504" fill="#ff8700"/>
</g>
<defs>
<linearGradient id="a" x2="1" gradientUnits="userSpaceOnUse" gradientTransform="rotate(36.9) scale(750)">
<stop offset="0" stop-color="#fff"/>
<stop offset="1" stop-color="#e6e6e6"/>
</linearGradient>
<linearGradient id="b" x2="1" gradientUnits="userSpaceOnUse" gradientTransform="rotate(53.626 -3.606 595.823) scale(98.3078)">
<stop offset="0" stop-color="#fff" stop-opacity="0"/>
<stop offset=".48" stop-color="#3b3b3b" stop-opacity=".039"/>
<stop offset="1" stop-opacity=".051"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

@@ -0,0 +1,95 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 64 64" enable-background="new 0 0 64 64" xml:space="preserve">
<g>
<circle fill="#FF8700" cx="32" cy="32" r="32"/>
<circle fill="#FFFFFF" cx="32" cy="32" r="18"/>
<g>
<g>
<path fill="#FFFFFF" d="M10.9,28.7c-0.1,0.4-0.2,0.8-0.4,1.2c-0.2,0.3-0.5,0.6-0.8,0.8c-0.3,0.2-0.7,0.4-1.2,0.4
c-0.5,0.1-0.9,0.1-1.5,0c-0.5-0.1-1-0.2-1.4-0.4c-0.4-0.2-0.7-0.5-1-0.8c-0.2-0.3-0.4-0.7-0.5-1.1C4,28.5,4,28.1,4,27.6
c0.1-0.4,0.2-0.8,0.4-1.2c0.2-0.3,0.5-0.6,0.8-0.8c0.3-0.2,0.7-0.4,1.2-0.4c0.4-0.1,0.9-0.1,1.5,0c0.5,0.1,1,0.2,1.4,0.4
c0.4,0.2,0.7,0.5,1,0.8c0.3,0.3,0.4,0.7,0.5,1.1C11,27.8,11,28.2,10.9,28.7z M9.6,28.5c0.1-0.5-0.1-0.8-0.4-1.2
c-0.3-0.3-0.9-0.5-1.5-0.6c-0.7-0.1-1.2-0.1-1.6,0.2c-0.4,0.2-0.7,0.5-0.7,1c-0.1,0.5,0.1,0.8,0.4,1.2c0.3,0.3,0.8,0.5,1.5,0.6
c0.7,0.1,1.2,0.1,1.7-0.1S9.6,28.9,9.6,28.5z"/>
<path fill="#FFFFFF" d="M11.7,24.9l-6.1-2.8l1.7-3.9l1.2,0.5l-1.1,2.5l1.4,0.6l1-2.1l1.2,0.5l-1,2.1l2.4,1.1L11.7,24.9z"/>
<path fill="#FFFFFF" d="M13.8,20.4l-5.3-4.1l2.6-3.4l1,0.8l-1.7,2.2l1.2,1l1.4-1.8l1,0.8l-1.4,1.8l2.1,1.6L13.8,20.4z"/>
<path fill="#FFFFFF" d="M17.1,16.5l-4.5-5l1.1-1l4.5,5L17.1,16.5z"/>
<path fill="#FFFFFF" d="M21.6,13.3c-0.4,0.2-0.8,0.4-1.2,0.4c-0.4,0.1-0.8,0-1.2-0.1c-0.4-0.1-0.8-0.3-1.1-0.6
c-0.4-0.3-0.7-0.7-1-1.2c-0.3-0.5-0.5-0.9-0.5-1.4c-0.1-0.5-0.1-0.9,0-1.3c0.1-0.4,0.3-0.8,0.5-1.1c0.3-0.3,0.6-0.6,0.9-0.8
c0.4-0.2,0.8-0.3,1.1-0.4c0.4,0,0.7,0,1,0.1l-0.2,1.2c-0.2,0-0.4-0.1-0.7-0.1c-0.2,0-0.4,0.1-0.6,0.2c-0.2,0.1-0.4,0.3-0.5,0.5
s-0.2,0.4-0.2,0.6c0,0.2,0,0.5,0,0.8c0.1,0.3,0.2,0.6,0.4,0.8c0.4,0.6,0.8,1,1.2,1.2s0.9,0.1,1.3-0.1c0.2-0.1,0.4-0.3,0.5-0.5
c0.1-0.2,0.2-0.4,0.3-0.7l1.2,0.4C22.9,12.2,22.4,12.9,21.6,13.3z"/>
<path fill="#FFFFFF" d="M24.1,12l-2.3-6.3l1.4-0.5l2.3,6.3L24.1,12z"/>
<path fill="#FFFFFF" d="M25.9,11.2l1.1-7L28.8,4l3.1,6.3l-1.6,0.2L29.6,9l-2,0.3L27.4,11L25.9,11.2z M27.8,7.5l-0.1,0.6l1.4-0.2
l-0.2-0.6c-0.1-0.3-0.3-0.7-0.4-1c-0.1-0.4-0.3-0.7-0.4-1l0,0c0,0.4-0.1,0.7-0.1,1.1C27.9,6.7,27.8,7.1,27.8,7.5z"/>
<path fill="#FFFFFF" d="M32.2,10.4l0.6-6.7l1.5,0.1l-0.5,5.4l2.7,0.2l-0.1,1.3L32.2,10.4z"/>
<path fill="#FFFFFF" d="M40.1,12.1l2.2-5l-1.7-0.8l0.5-1.2l4.8,2.1l-0.5,1.2l-1.7-0.8l-2.2,5L40.1,12.1z"/>
<path fill="#FFFFFF" d="M44.5,14.5l1.5-1.9l1-4.7l1.3,1l-0.5,1.6c-0.1,0.3-0.2,0.5-0.2,0.8c-0.1,0.2-0.2,0.5-0.2,0.8l0,0
c0.2-0.1,0.5-0.3,0.7-0.4c0.2-0.1,0.4-0.3,0.7-0.4l1.4-0.9l1.3,1l-4.2,2.2l-1.5,1.9L44.5,14.5z"/>
<path fill="#FFFFFF" d="M47.5,16.8l5.3-4.2l1.4,1.8c0.2,0.3,0.4,0.6,0.6,0.9c0.1,0.3,0.2,0.6,0.2,0.9c0,0.3,0,0.6-0.2,0.9
c-0.1,0.3-0.4,0.6-0.7,0.8c-0.3,0.2-0.6,0.4-0.9,0.5c-0.3,0.1-0.6,0.1-0.9,0c-0.3-0.1-0.6-0.2-0.8-0.4c-0.3-0.2-0.5-0.4-0.7-0.7
l-0.5-0.7L48.4,18L47.5,16.8z M51.1,15.9l0.5,0.6c0.5,0.6,1.1,0.7,1.6,0.3c0.3-0.2,0.4-0.5,0.4-0.7s-0.2-0.6-0.4-0.9l-0.4-0.5
L51.1,15.9z"/>
<path fill="#FFFFFF" d="M51.8,23.9c-0.2-0.4-0.3-0.8-0.2-1.2s0.1-0.8,0.3-1.2s0.4-0.7,0.8-1c0.3-0.3,0.8-0.6,1.3-0.8
c0.5-0.2,1-0.3,1.4-0.4c0.5,0,0.9,0,1.2,0.2s0.7,0.4,1,0.6s0.5,0.6,0.7,1.1c0.2,0.4,0.3,0.8,0.3,1.2c0,0.4-0.1,0.8-0.3,1.1
c-0.2,0.4-0.4,0.7-0.8,1c-0.3,0.3-0.8,0.6-1.3,0.8c-0.5,0.2-1,0.3-1.4,0.4c-0.5,0-0.9,0-1.3-0.2s-0.7-0.3-1-0.6
S52,24.3,51.8,23.9z M53,23.4c0.2,0.4,0.5,0.7,1,0.8c0.5,0.1,1,0,1.6-0.2c0.6-0.3,1.1-0.6,1.3-1c0.2-0.4,0.3-0.8,0.1-1.2
c-0.2-0.4-0.5-0.7-0.9-0.8c-0.5-0.1-1,0-1.6,0.2c-0.6,0.3-1.1,0.6-1.3,1S52.9,23,53,23.4z"/>
<path fill="#FFFFFF" d="M53.2,29.2c-0.1-0.5,0-1,0.1-1.4c0.1-0.4,0.3-0.7,0.6-1l1,0.6c-0.2,0.2-0.3,0.5-0.4,0.7
c-0.1,0.3-0.1,0.5-0.1,0.8c0,0.3,0.1,0.6,0.3,0.7c0.2,0.2,0.4,0.2,0.6,0.2c0.1,0,0.3-0.1,0.4-0.1c0.1-0.1,0.2-0.2,0.3-0.3
c0.1-0.1,0.1-0.3,0.1-0.6c0-0.2,0-0.5,0-0.9l1.1-0.1c0,0.3,0.1,0.5,0.1,0.7c0.1,0.2,0.1,0.3,0.2,0.5s0.2,0.2,0.3,0.2
c0.1,0,0.2,0,0.4,0c0.2,0,0.4-0.1,0.5-0.3c0.1-0.2,0.1-0.4,0.1-0.6c0-0.2-0.1-0.4-0.2-0.6c-0.1-0.2-0.3-0.4-0.5-0.5l0.8-0.9
c0.3,0.3,0.5,0.6,0.7,0.9s0.3,0.7,0.4,1.1c0,0.3,0,0.6,0,0.9c0,0.3-0.1,0.5-0.3,0.7s-0.3,0.4-0.5,0.5c-0.2,0.1-0.5,0.2-0.7,0.3
c-0.3,0-0.6,0-0.9-0.2c-0.3-0.2-0.5-0.4-0.7-0.7l0,0c-0.1,0.4-0.2,0.7-0.4,1s-0.6,0.4-1,0.5c-0.3,0-0.6,0-0.8-0.1
c-0.3-0.1-0.5-0.3-0.7-0.5s-0.3-0.4-0.5-0.7C53.4,29.9,53.3,29.6,53.2,29.2z"/>
</g>
<g>
<path fill="#FFFFFF" d="M53.4,35.8l6.4,1.9l-0.5,1.8c-0.1,0.5-0.3,0.9-0.6,1.3c-0.2,0.4-0.5,0.6-0.9,0.8C57.4,41.9,57,42,56.6,42
s-0.9,0-1.5-0.2c-0.6-0.2-1-0.4-1.4-0.7c-0.4-0.3-0.6-0.6-0.8-0.9c-0.2-0.4-0.3-0.7-0.3-1.2s0-0.9,0.2-1.3L53.4,35.8z M54.1,37.6
L54,37.9c-0.1,0.3-0.1,0.5-0.1,0.8c0,0.2,0.1,0.5,0.2,0.7c0.1,0.2,0.3,0.4,0.5,0.6c0.2,0.2,0.6,0.3,0.9,0.4
c0.4,0.1,0.7,0.2,1,0.2c0.3,0,0.5-0.1,0.7-0.2c0.2-0.1,0.4-0.3,0.5-0.5s0.2-0.4,0.3-0.7l0.1-0.3L54.1,37.6z"/>
<path fill="#FFFFFF" d="M51.3,41.6l5.9,3.2l-0.7,1.3L50.6,43L51.3,41.6z"/>
<path fill="#FFFFFF" d="M48.6,45.6c0.3-0.3,0.6-0.6,1-0.9c0.4-0.2,0.8-0.4,1.3-0.4l0.3,1.3c-0.3,0.1-0.6,0.2-0.9,0.3
c-0.3,0.1-0.5,0.3-0.7,0.5c-0.2,0.2-0.3,0.5-0.3,0.7c0,0.2,0.1,0.4,0.2,0.5c0.1,0.1,0.2,0.1,0.3,0.1c0.1,0,0.2,0,0.3,0
s0.2-0.1,0.3-0.1c0.1-0.1,0.2-0.1,0.4-0.2l0.8-0.4c0.2-0.1,0.3-0.2,0.5-0.2s0.4-0.1,0.6-0.1c0.2,0,0.4,0,0.6,0.1s0.4,0.2,0.6,0.3
c0.2,0.2,0.4,0.4,0.5,0.6c0.1,0.2,0.2,0.5,0.2,0.8c0,0.3,0,0.6-0.2,0.9s-0.3,0.6-0.5,0.8c-0.3,0.3-0.6,0.6-0.9,0.8
s-0.7,0.3-1.1,0.4L51.5,50c0.3-0.1,0.5-0.1,0.7-0.3c0.2-0.1,0.4-0.3,0.6-0.5c0.2-0.2,0.3-0.4,0.3-0.6c0-0.2-0.1-0.3-0.2-0.5
c-0.1-0.1-0.2-0.1-0.3-0.1c-0.1,0-0.2,0-0.3,0c-0.1,0-0.2,0.1-0.3,0.1c-0.1,0.1-0.2,0.1-0.4,0.2L50.8,49
c-0.4,0.2-0.8,0.3-1.1,0.3c-0.4,0-0.7-0.2-1.1-0.5c-0.2-0.2-0.4-0.4-0.5-0.6c-0.1-0.2-0.2-0.5-0.2-0.8c0-0.3,0-0.6,0.2-0.9
C48.1,46.2,48.3,45.9,48.6,45.6z"/>
<path fill="#FFFFFF" d="M45.6,48.7l3.3,4.4l1.5-1.1l0.8,1l-4.2,3.1l-0.8-1l1.5-1.1l-3.3-4.4L45.6,48.7z"/>
<path fill="#FFFFFF" d="M42.3,51l2.5,6.2l-2.2,0.9c-0.3,0.1-0.7,0.2-1,0.3c-0.3,0.1-0.6,0.1-0.9,0c-0.3-0.1-0.5-0.2-0.8-0.4
s-0.4-0.5-0.6-0.8c-0.2-0.5-0.2-0.9-0.2-1.3c0.1-0.4,0.3-0.7,0.5-1l-2.4-1.9l1.6-0.6l2.1,1.8l0.8-0.3l-0.9-2.2L42.3,51z M42.3,55
l-0.7,0.3c-0.4,0.2-0.6,0.3-0.8,0.6c-0.1,0.2-0.1,0.5,0,0.8c0.1,0.3,0.3,0.5,0.6,0.5c0.2,0,0.5,0,0.9-0.2l0.7-0.3L42.3,55z"/>
<path fill="#FFFFFF" d="M36.7,53l1.2,6.6l-1.5,0.3l-1.2-6.6L36.7,53z"/>
<path fill="#FFFFFF" d="M34,53.5l-0.1,6.7l-2.3,0c-0.4,0-0.7,0-1-0.1c-0.3-0.1-0.6-0.2-0.8-0.3c-0.2-0.1-0.4-0.3-0.5-0.5
c-0.1-0.2-0.2-0.5-0.2-0.8c0-0.2,0-0.3,0.1-0.5s0.1-0.3,0.2-0.4c0.1-0.1,0.2-0.2,0.3-0.3s0.2-0.2,0.4-0.2v0
c-0.2,0-0.3-0.1-0.5-0.2c-0.1-0.1-0.3-0.2-0.4-0.3C29.1,56.4,29,56.2,29,56c-0.1-0.2-0.1-0.4-0.1-0.6c0-0.3,0.1-0.6,0.2-0.9
c0.1-0.2,0.3-0.4,0.6-0.6c0.2-0.2,0.5-0.3,0.8-0.3c0.3-0.1,0.7-0.1,1-0.1L34,53.5z M32.5,54.7l-0.9,0c-0.8,0-1.3,0.3-1.3,0.9
c0,0.3,0.1,0.5,0.3,0.6c0.2,0.1,0.5,0.2,0.9,0.2l0.9,0L32.5,54.7z M32.4,57.6l-0.7,0c-0.4,0-0.6,0.1-0.8,0.2
c-0.2,0.1-0.3,0.3-0.3,0.6c0,0.3,0.1,0.4,0.2,0.6c0.2,0.1,0.4,0.2,0.8,0.2l0.7,0L32.4,57.6z"/>
<path fill="#FFFFFF" d="M25.7,52.4c0.8,0.3,1.4,0.7,1.7,1.3s0.3,1.5-0.1,2.6l-1.1,3.5l-1.5-0.4l1.1-3.6c0.2-0.6,0.2-1.1,0.1-1.4
c-0.1-0.3-0.4-0.5-0.7-0.6s-0.7-0.1-1,0.1c-0.3,0.2-0.5,0.6-0.7,1.2l-1.1,3.6l-1.4-0.4l1.1-3.5c0.3-1.1,0.8-1.8,1.4-2.2
C24.2,52.2,24.9,52.2,25.7,52.4z"/>
<path fill="#FFFFFF" d="M21.1,50.5l-2.9,4.6l1.6,1L19,57.2l-4.4-2.8l0.7-1.1l1.6,1l2.9-4.6L21.1,50.5z"/>
<path fill="#FFFFFF" d="M17.8,48.1L13.2,53l-1.1-1l4.6-4.9L17.8,48.1z"/>
<path fill="#FFFFFF" d="M14.3,44c0.3,0.4,0.4,0.8,0.5,1.2c0.1,0.4,0.1,0.8,0,1.2c-0.1,0.4-0.3,0.8-0.6,1.1
c-0.3,0.4-0.6,0.7-1.1,1c-0.5,0.3-0.9,0.5-1.3,0.6c-0.4,0.1-0.9,0.1-1.2,0.1c-0.4-0.1-0.8-0.2-1.1-0.4s-0.6-0.5-0.9-0.9
s-0.4-0.8-0.5-1.2C8,46.3,8,46,8.1,45.6c0.1-0.4,0.3-0.8,0.6-1.1c0.3-0.4,0.6-0.7,1.1-1c0.5-0.3,0.9-0.5,1.3-0.6
c0.4-0.1,0.9-0.2,1.3-0.1c0.4,0.1,0.8,0.2,1.1,0.4C13.8,43.3,14.1,43.6,14.3,44z M13.2,44.7c-0.3-0.4-0.6-0.6-1.1-0.6
c-0.5,0-1,0.2-1.6,0.6c-0.6,0.4-0.9,0.8-1.1,1.2c-0.2,0.4-0.1,0.8,0.1,1.2c0.3,0.4,0.6,0.6,1.1,0.6c0.5,0,1-0.2,1.5-0.6
c0.6-0.4,0.9-0.8,1.1-1.2C13.5,45.5,13.5,45.1,13.2,44.7z"/>
<path fill="#FFFFFF" d="M12.2,40.8l-6.4,2l-0.5-1.5L8,38.6l1.2-1.1l0,0c-0.3,0.1-0.7,0.3-1.1,0.5c-0.4,0.2-0.8,0.3-1.2,0.4
l-2.3,0.7l-0.4-1.4l6.4-2l0.5,1.5l-2.7,2.7L7.2,41l0,0c0.3-0.1,0.7-0.3,1.1-0.5s0.8-0.3,1.2-0.4l2.3-0.7L12.2,40.8z"/>
</g>
</g>
<g>
<path fill="#FF8700" d="M38.4,36.4c-0.3,0.1-0.6,0.1-1,0.1c-3,0-7.3-10.3-7.3-13.8c0-1.3,0.3-1.7,0.7-2.1c-3.6,0.4-8,1.8-9.4,3.4
c-0.3,0.4-0.5,1.1-0.5,1.9c0,5.4,5.7,17.6,9.8,17.6C32.7,43.6,35.8,40.6,38.4,36.4"/>
<path fill="#FF8700" d="M36.5,20.4c3.7,0,7.5,0.6,7.5,2.7c0,4.3-2.7,9.5-4.1,9.5c-2.5,0-5.6-6.9-5.6-10.3
C34.3,20.7,34.9,20.4,36.5,20.4"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.7 KiB

@@ -0,0 +1,755 @@
/*
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/
/**
* Module: TYPO3/CMS/Extensionmanager/Main
* main logic holding everything together, consists of multiple parts
* ExtensionManager => Various functions for displaying the extension list / sorting
* Repository => Various AJAX functions for TER downloads
* ExtensionManager.Update => Various AJAX functions to display updates
* ExtensionManager.uploadForm => helper to show the upload form
*/
define([
'jquery',
'nprogress',
'TYPO3/CMS/Backend/Modal',
'TYPO3/CMS/Backend/SplitButtons',
'TYPO3/CMS/Backend/Tooltip',
'TYPO3/CMS/Backend/Notification',
'TYPO3/CMS/Backend/Severity',
'TYPO3/CMS/Core/SecurityUtility',
'datatables',
'TYPO3/CMS/Backend/jquery.clearable'
], function($, NProgress, Modal, SplitButtons, Tooltip, Notification, Severity, SecurityUtility) {
var securityUtility = new SecurityUtility();
/**
*
* @type {{identifier: {extensionlist: string, searchField: string, extensionManager: string}}}
* @exports TYPO3/CMS/Extensionmanager/Main
*/
var ExtensionManager = {
identifier: {
extensionlist: '#typo3-extension-list',
searchField: '#Tx_Extensionmanager_extensionkey'
}
};
/**
*
* @returns {Object}
*/
ExtensionManager.manageExtensionListing = function() {
var $searchField = $(this.identifier.searchField),
dataTable = $(this.identifier.extensionlist).DataTable({
paging: false,
dom: 'lrtip',
lengthChange: false,
pageLength: 15,
stateSave: true,
drawCallback: this.bindExtensionListActions,
columns: [
null,
null,
{
type: 'extension'
},
null,
{
type: 'version'
}, {
orderable: false
},
null,
null
]
});
$searchField.parents('form').on('submit', function() {
return false;
});
var getVars = ExtensionManager.getUrlVars();
// restore filter
var currentSearch = (getVars['search'] ? getVars['search'] : dataTable.search());
$searchField.val(currentSearch);
$searchField.on('input', function(e) {
dataTable.search($(this).val()).draw();
});
return dataTable;
};
/**
*
*/
ExtensionManager.bindExtensionListActions = function() {
$('.removeExtension').not('.transformed').each(function() {
var $me = $(this);
$me.data('href', $me.attr('href'));
$me.attr('href', '#');
$me.addClass('transformed');
$me.click(function() {
Modal.confirm(
TYPO3.lang['extensionList.removalConfirmation.title'],
TYPO3.lang['extensionList.removalConfirmation.question'],
Severity.error,
[
{
text: TYPO3.lang['button.cancel'],
active: true,
btnClass: 'btn-default',
trigger: function() {
Modal.dismiss();
}
}, {
text: TYPO3.lang['button.remove'],
btnClass: 'btn-danger',
trigger: function() {
ExtensionManager.removeExtensionFromDisk($me);
Modal.dismiss();
}
}
]
);
});
});
};
/**
*
* @param {Object} $extension
*/
ExtensionManager.removeExtensionFromDisk = function($extension) {
$.ajax({
url: $extension.data('href'),
beforeSend: function() {
NProgress.start();
},
success: function() {
location.reload();
},
complete: function() {
NProgress.done();
}
});
};
/**
*
* @returns {Array}
*/
ExtensionManager.getUrlVars = function() {
var vars = [], hash;
var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
for (var i = 0; i < hashes.length; i++) {
hash = hashes[i].split('=');
vars.push(hash[0]);
vars[hash[0]] = hash[1];
}
return vars;
};
$.fn.dataTableExt.oSort['extension-asc'] = function(a, b) {
return ExtensionManager.extensionCompare(a, b);
};
$.fn.dataTableExt.oSort['extension-desc'] = function(a, b) {
var result = ExtensionManager.extensionCompare(a, b);
return result * -1;
};
$.fn.dataTableExt.oSort['version-asc'] = function(a, b) {
var result = ExtensionManager.versionCompare(a, b);
return result * -1;
};
$.fn.dataTableExt.oSort['version-desc'] = function(a, b) {
return ExtensionManager.versionCompare(a, b);
};
/**
* Special sorting for the extension version column
*
* @param {String} a
* @param {String} b
* @returns {Number}
*/
ExtensionManager.versionCompare = function(a, b) {
if (a === b) {
return 0;
}
var a_components = a.split(".");
var b_components = b.split(".");
var len = Math.min(a_components.length, b_components.length);
// loop while the components are equal
for (var i = 0; i < len; i++) {
// A bigger than B
if (parseInt(a_components[i]) > parseInt(b_components[i])) {
return 1;
}
// B bigger than A
if (parseInt(a_components[i]) < parseInt(b_components[i])) {
return -1;
}
}
// If one's a prefix of the other, the longer one is greaRepository.
if (a_components.length > b_components.length) {
return 1;
}
if (a_components.length < b_components.length) {
return -1;
}
// Otherwise they are the same.
return 0;
};
/**
* The extension name column can contain various forms of HTML that
* break a direct comparison of values
*
* @param {String} a
* @param {String} b
* @returns {Number}
*/
ExtensionManager.extensionCompare = function(a, b) {
var div = document.createElement("div");
div.innerHTML = a;
var aStr = div.textContent || div.innerText || a;
div.innerHTML = b;
var bStr = div.textContent || div.innerText || b;
return aStr.trim().localeCompare(bStr.trim());
}
/**
*
* @param {Object} data
*/
ExtensionManager.updateExtension = function(data) {
var i = 0;
var $form = $('<form>');
$.each(data.updateComments, function(version, comment) {
var $input = $('<input>').attr({type: 'radio', name: 'version'}).val(version);
if (i === 0) {
$input.attr('checked', 'checked');
}
$form.append([
$('<h3>').append([
$input,
' ' + securityUtility.encodeHtml(version)
]),
$('<div>')
.append(
comment
.replace(/(\r\n|\n\r|\r|\n)/g, '\n')
.split(/\n/).map(function(line) {
return securityUtility.encodeHtml(line);
})
.join('<br>')
)
]);
i++;
});
var $container = $('<div>').append([
$('<h1>').text(TYPO3.lang['extensionList.updateConfirmation.title']),
$('<h2>').text(TYPO3.lang['extensionList.updateConfirmation.message']),
$form
]);
NProgress.done();
Modal.confirm(
TYPO3.lang['extensionList.updateConfirmation.questionVersionComments'],
$container,
Severity.warning,
[
{
text: TYPO3.lang['button.cancel'],
active: true,
btnClass: 'btn-default',
trigger: function() {
Modal.dismiss();
}
}, {
text: TYPO3.lang['button.updateExtension'],
btnClass: 'btn-warning',
trigger: function() {
$.ajax({
url: data.url,
data: {
tx_extensionmanager_tools_extensionmanagerextensionmanager: {
version: $('input:radio[name=version]:checked', Modal.currentModal).val()
}
},
dataType: 'json',
beforeSend: function() {
NProgress.start();
},
complete: function() {
location.reload();
}
});
Modal.dismiss();
}
}
]
);
};
/**
*
* @type {{downloadPath: string}}
*/
var Repository = {
downloadPath: ''
};
/**
*
*/
Repository.initDom = function() {
NProgress.configure({parent: '.module-loading-indicator', showSpinner: false});
$('#terTable').DataTable({
lengthChange: false,
pageLength: 15,
stateSave: false,
info: false,
paging: false,
searching: false,
ordering: false,
drawCallback: Repository.bindDownload
});
$('#terVersionTable').DataTable({
lengthChange: false,
pageLength: 15,
stateSave: false,
info: false,
paging: false,
searching: false,
drawCallback: Repository.bindDownload,
order: [
[2, 'asc']
],
columns: [
{orderable: false},
null,
{type: 'version'},
null,
null,
null
]
});
$('#terSearchTable').DataTable({
paging: false,
lengthChange: false,
stateSave: false,
searching: false,
language: {
search: 'Filter results:'
},
ordering: false,
drawCallback: Repository.bindDownload
});
Repository.bindDownload();
Repository.bindSearchFieldResetter();
};
/**
*
*/
Repository.bindDownload = function() {
var installButtons = $('.downloadFromTer form.download button[type=submit]');
installButtons.off('click');
installButtons.on('click', function(event) {
event.preventDefault();
var url = $(event.currentTarget.form).attr('data-href');
Repository.downloadPath = $(event.currentTarget.form).find('input.downloadPath:checked').val();
$.ajax({
url: url,
dataType: 'json',
beforeSend: function() {
NProgress.start();
},
success: Repository.getDependencies
});
});
};
/**
*
* @param {Object} data
* @returns {Boolean}
*/
Repository.getDependencies = function(data) {
NProgress.done();
if (data.hasDependencies) {
Modal.confirm(data.title, $(data.message), Severity.info, [
{
text: TYPO3.lang['button.cancel'],
active: true,
btnClass: 'btn-default',
trigger: function() {
Modal.dismiss();
}
}, {
text: TYPO3.lang['button.resolveDependencies'],
btnClass: 'btn-info',
trigger: function() {
Repository.getResolveDependenciesAndInstallResult(data.url + '&tx_extensionmanager_tools_extensionmanagerextensionmanager[downloadPath]=' + Repository.downloadPath);
Modal.dismiss();
}
}
]);
} else {
if (data.hasErrors) {
Notification.error(data.title, data.message, 15);
} else {
Repository.getResolveDependenciesAndInstallResult(data.url + '&tx_extensionmanager_tools_extensionmanagerextensionmanager[downloadPath]=' + Repository.downloadPath);
}
}
return false;
};
/**
*
* @param {String} url
*/
Repository.getResolveDependenciesAndInstallResult = function(url) {
$.ajax({
url: url,
dataType: 'json',
beforeSend: function() {
NProgress.start();
},
success: function(data) {
if (data.errorCount > 0) {
Modal.confirm(data.errorTitle, $(data.errorMessage), Severity.error, [
{
text: TYPO3.lang['button.cancel'],
active: true,
btnClass: 'btn-default',
trigger: function() {
Modal.dismiss();
}
}, {
text: TYPO3.lang['button.resolveDependenciesIgnore'],
btnClass: 'btn-danger disabled t3js-dependencies',
trigger: function() {
if (!$(this).hasClass('disabled')) {
Repository.getResolveDependenciesAndInstallResult(data.skipDependencyUri);
Modal.dismiss();
}
}
}
]);
Modal.currentModal.on('shown.bs.modal', function() {
var $actionButton = Modal.currentModal.find('.t3js-dependencies');
$('input[name="unlockDependencyIgnoreButton"]', Modal.currentModal).on('change', function() {
$actionButton.toggleClass('disabled', !$(this).prop('checked'));
});
});
} else {
var successMessage = TYPO3.lang['extensionList.dependenciesResolveDownloadSuccess.message' + data.installationTypeLanguageKey].replace(/\{0\}/g, data.extension);
successMessage += '\n' + TYPO3.lang['extensionList.dependenciesResolveDownloadSuccess.header'] + ': ';
$.each(data.result, function(index, value) {
successMessage += '\n\n' + TYPO3.lang['extensionList.dependenciesResolveDownloadSuccess.item'] + ' ' + index + ': ';
$.each(value, function(extkey) {
successMessage += '\n* ' + extkey
});
});
Notification.info(TYPO3.lang['extensionList.dependenciesResolveFlashMessage.title' + data.installationTypeLanguageKey].replace(/\{0\}/g, data.extension), successMessage, 15);
top.TYPO3.ModuleMenu.App.refreshMenu();
}
},
complete: function() {
NProgress.done();
}
});
};
/**
*
*/
Repository.bindSearchFieldResetter = function() {
var $searchFields = $('.typo3-extensionmanager-searchTerForm input[type="text"]');
var searchResultShown = ('' !== $searchFields.first().val());
$searchFields.clearable(
{
onClear: function() {
if (searchResultShown) {
$(this).closest('form').submit();
}
}
}
);
};
/**
*
* @type {{identifier: {extensionTable: string, terUpdateAction: string, pagination: string, splashscreen: string, terTableWrapper: string, terTableDataTableWrapper: string}}}
*/
ExtensionManager.Update = {
identifier: {
extensionTable: '#terTable',
terUpdateAction: '.update-from-ter',
pagination: '.pagination-wrap',
splashscreen: '.splash-receivedata',
terTableWrapper: '#terTableWrapper',
terTableDataTableWrapper: '#terTableWrapper .dataTables_wrapper'
}
};
/**
* Register "update from ter" action
*/
ExtensionManager.Update.initializeEvents = function() {
$(ExtensionManager.Update.identifier.terUpdateAction).each(function() {
// "this" is the form which updates the extension list from
// TER on submit
var $me = $(this),
updateURL = $(this).attr('action');
$me.attr('action', '#');
$me.submit(function() {
// Force update on click.
ExtensionManager.Update.updateFromTer(updateURL, true);
// Prevent normal submit action.
return false;
});
// This might give problems when there are more "update"-buttons,
// each one would trigger a TER-ExtensionManager.Update.
ExtensionManager.Update.updateFromTer(updateURL, false);
});
};
/**
*
* @param {String} url
* @param {Boolean} forceUpdate
*/
ExtensionManager.Update.updateFromTer = function(url, forceUpdate) {
if (forceUpdate) {
url = url + '&tx_extensionmanager_tools_extensionmanagerextensionmanager%5BforceUpdateCheck%5D=1';
}
// Hide triggers for TER update
$(ExtensionManager.Update.identifier.terUpdateAction).addClass('is-hidden');
// Hide extension table
$(ExtensionManager.Update.identifier.extensionTable).hide();
// Show loaders
$(ExtensionManager.Update.identifier.splashscreen).addClass('is-shown');
$(ExtensionManager.Update.identifier.terTableDataTableWrapper).addClass('is-loading');
$(ExtensionManager.Update.identifier.pagination).addClass('is-loading');
var reload = false;
$.ajax({
url: url,
dataType: 'json',
cache: false,
beforeSend: function() {
NProgress.start();
},
success: function(data) {
// Something went wrong, show message
if (data.errorMessage.length) {
Notification.error(TYPO3.lang['extensionList.updateFromTerFlashMessage.title'], data.errorMessage, 10);
}
// Message with latest updates
var $lastUpdate = $(ExtensionManager.Update.identifier.terUpdateAction + ' .time-since-last-update');
$lastUpdate.text(data.timeSinceLastUpdate);
$lastUpdate.attr(
'title',
TYPO3.lang['extensionList.updateFromTer.lastUpdate.timeOfLastUpdate'] + data.lastUpdateTime
);
if (data.updated) {
// Reload page
reload = true;
window.location.replace(window.location.href);
}
},
error: function(jqXHR, textStatus, errorThrown) {
// Create an error message with diagnosis info.
var errorMessage = textStatus + '(' + errorThrown + '): ' + jqXHR.responseText;
Notification.warning(
TYPO3.lang['extensionList.updateFromTerFlashMessage.title'],
errorMessage,
10
);
},
complete: function() {
NProgress.done();
if (!reload) {
// Hide loaders
$(ExtensionManager.Update.identifier.splashscreen).removeClass('is-shown');
$(ExtensionManager.Update.identifier.terTableDataTableWrapper).removeClass('is-loading');
$(ExtensionManager.Update.identifier.pagination).removeClass('is-loading');
// Show triggers for TER-update
$(ExtensionManager.Update.identifier.terUpdateAction).removeClass('is-hidden');
// Show extension table
$(ExtensionManager.Update.identifier.extensionTable).show();
}
}
});
};
/**
*
*/
ExtensionManager.Update.transformPaginatorToAjax = function() {
$(ExtensionManager.Update.identifier.pagination + ' a').each(function() {
var $me = $(this);
$me.data('href', $(this).attr('href'));
$me.attr('href', '#');
$me.click(function() {
var $terTableWrapper = $(ExtensionManager.Update.identifier.terTableWrapper);
NProgress.start();
$.ajax({
url: $(this).data('href'),
dataType: 'json',
success: function(data) {
$terTableWrapper.html(data);
ExtensionManager.Update.transformPaginatorToAjax();
},
complete: function() {
NProgress.done();
}
});
});
});
};
/**
* show the uploading form
*/
ExtensionManager.UploadForm = {
expandedUploadFormClass: 'transformed'
};
/**
*
*/
ExtensionManager.UploadForm.initializeEvents = function() {
// Show upload form
$(document).on('click', '.t3js-upload', function(event) {
var $me = $(this),
$uploadForm = $('.uploadForm');
event.preventDefault();
if ($me.hasClass(ExtensionManager.UploadForm.expandedUploadFormClass)) {
$uploadForm.stop().slideUp();
$me.removeClass(ExtensionManager.UploadForm.expandedUploadFormClass);
} else {
$me.addClass(ExtensionManager.UploadForm.expandedUploadFormClass);
$uploadForm.stop().slideDown();
$.ajax({
url: $me.attr('href'),
dataType: 'html',
success: function(data) {
$uploadForm.html(data);
}
});
}
});
};
$(function() {
var dataTable = ExtensionManager.manageExtensionListing();
$(document).on('click', '.onClickMaskExtensionManager', function() {
NProgress.start();
}).on('click', 'a[data-action=update-extension]', function(e) {
e.preventDefault();
$.ajax({
url: $(this).attr('href'),
dataType: 'json',
beforeSend: function() {
NProgress.start();
},
success: ExtensionManager.updateExtension
});
}).on('change', 'input[name=unlockDependencyIgnoreButton]', function() {
var $actionButton = $('.t3js-dependencies');
$actionButton.toggleClass('disabled', !$(this).prop('checked'));
});
$(ExtensionManager.identifier.searchField).clearable({
onClear: function() {
dataTable.search('').draw();
}
});
$(document).on('click', '.t3-button-action-installdistribution', function() {
NProgress.start();
});
SplitButtons.addPreSubmitCallback(function(e) {
if ($(e.target).hasClass('t3js-save-close')) {
$('#configurationform').append($('<input />', {
type: 'hidden',
name: 'tx_extensionmanager_tools_extensionmanagerextensionmanager[action]',
value: 'saveAndClose'
}));
}
});
// initialize the repository
Repository.initDom();
ExtensionManager.Update.initializeEvents();
ExtensionManager.UploadForm.initializeEvents();
Tooltip.initialize('#typo3-extension-list [title]', {
delay: {
show: 500,
hide: 100
},
trigger: 'hover',
container: 'body'
});
});
if (typeof TYPO3.ExtensionManager === 'undefined') {
TYPO3.ExtensionManager = ExtensionManager;
}
return ExtensionManager;
});