瀏覽代碼

Finalized bridged fsh design

Toby Chui 3 年之前
父節點
當前提交
c3f0a742bd

+ 3 - 0
web/SystemAO/file_system/file_versions.html

@@ -16,6 +16,9 @@
                 opacity: 0.3;
                 margin-right: -8em;
                 margin-bottom: -5em;
+                z-index: -99;
+                pointer-events: none;
+                user-select: none;
             }
         </style>
     </head>

+ 3 - 0
web/SystemAO/file_system/sharelist.html

@@ -17,6 +17,9 @@
                 opacity: 0.4;
                 margin-right: -5em;
                 margin-bottom: -5em;
+                z-index: -99;
+                pointer-events: none;
+                user-select: none;
             }
         </style>
     </head>

+ 230 - 0
web/SystemAO/storage/fshBridge.html

@@ -0,0 +1,230 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <link rel="stylesheet" href="../../script/semantic/semantic.min.css">
+    <script type="text/javascript" src="../../script/jquery.min.js"></script>
+    <script type="text/javascript" src="../../script/semantic/semantic.min.js"></script>
+    <script type="text/javascript" src="../../script/ao_module.js"></script>
+    <title>Storage Pool Editor</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+    <style>
+        body{
+            background-color:white;
+        }
+        .themebackground{
+            background-color:#242424 !important;
+            color:white !important;
+            background-image: url("img/slate.png") !important;
+            background-repeat: no-repeat !important;
+            background-attachment: fixed !important;
+            height:100px;
+            border: 0px solid transparent !important;
+            padding:24px !important;
+        }
+        .fshList{
+            max-height: 300px;
+            overflow-y: auto;
+        }
+
+        .controls{
+            position: absolute;
+            top: 12px;
+            right: 12px;
+        }
+
+        a{
+            cursor: pointer;
+        }
+
+        .backuponly{
+            display:none;
+        }
+        .backgroundIcon{
+            position: fixed;
+            bottom: 0px;
+            right: 0px;
+            opacity: 0.3;
+            margin-right: -3em;
+            margin-bottom: -5em;
+            z-index: -99;
+            pointer-events: none;
+            user-select: none;
+        }
+    </style>
+</head>
+<body>
+    <div class="backgroundIcon">
+        <img class="ui medium image" src="../../img/system/drive-bridge.svg">
+    </div>
+    <br>
+    <div class="ui container">
+        <h3 class="ui header">
+            <img src="../../img/system/drive-bridge.svg">
+            <div class="content">
+                <span>Bridge File System Handler </span><span id="poolid"></span>
+                <div class="sub header">Share Storage across Storage Pools</div>
+            </div>
+        </h3>
+        <div class="ui divider"></div>
+        <div class="ui text segment">
+            <p><i class="ui info blue circle icon"></i> Bridge a File System Handler (FSH) from other Storage Pool to this pool.
+            The bridged FSH will implements the same permission and hierarchy as its source pool</p>
+            <p><b>Notes: All users that has access to this storage pool will be able to access the newly bridged File System Handler</b></p>
+        </div>
+        <div id="errdialog" class="ui red message" style="display:none;">
+            <i class="ui red remove icon"></i> <span id="errMsg">Unknown Error Occured</span>
+        </div>
+        <div class="ui form">
+            <p>Source File System Handler</p>
+            <div class="field">
+                <label>Storage Pool from Permission Group</label>
+                <div class="ui selection dropdown">
+                    <input id="bridgeTargetPool" type="hidden" name="sourcePool" value="" onchange="loadFSHForPool(this.value);">
+                    <i class="dropdown icon"></i>
+                    <div class="default text"></div>
+                    <div id="otherPools" class="menu">
+                    
+                    </div>
+                </div>
+            </div>
+
+            <div class="field">
+                <label>Target File System Handler</label>
+                <div class="ui selection dropdown">
+                <input id="souceFSH" type="hidden" name="souceFSH" value="">
+                <i class="dropdown icon"></i>
+                <div class="default text"></div>
+                <div id="sourceFSH" class="menu">
+
+                </div>
+                </div>
+            </div>
+        </div>
+        <br>
+        <div class="ui right floated buttons">
+            <button class="ui green button" onclick="bridgeFSH();">Bridge Handler to Pool</button>
+            <button class="ui button" onclick="handleCancel();"></i>Close</button>
+        </div>
+        
+        <div id="done" class="ui basic modal">
+            <div class="ui icon header">
+                <i class="green checkmark icon"></i>
+                File System Handler Bridged
+            </div>
+            <div class="content">
+              <p>Reload storage pool is needed for these changes to take effect</p>
+            </div>
+            <div class="actions">
+              <div class="ui basic cancel inverted button" onclick="handleCancel();">
+                Later
+              </div>
+              <div class="ui green ok inverted button" onclick="done();">
+                <i class="checkmark icon"></i>
+                Ok
+              </div>
+            </div>
+          </div>
+
+
+    <script>
+        //Get target fsh uuid and group from hash
+        var editingStoragePool = "";
+        var otherPoolConfigMap = {};
+        $(".ui.dropdown").dropdown();
+        $(".ui.checkbox").checkbox();
+
+        if (window.location.hash.length > 0){
+            var input = JSON.parse(decodeURIComponent(window.location.hash.substr(1)));
+            editingStoragePool = input.group;
+            $("#poolid").text("(" + editingStoragePool + ":/)");
+        }
+
+        initBridgingOptions();
+        function initBridgingOptions(){
+            $.get("../../system/storage/pool/list", function(data){
+                $("#otherPools").html('');
+                var firstPool = "";
+                console.log(data);
+                for (var i = 0; i < data.length; i++){
+                    let thisPool = data[i];
+                    if (thisPool.Owner == "system"){
+                        //Do not allow bridging
+                        continue;
+                    }
+                    if (thisPool.Owner != editingStoragePool){
+                        if (firstPool == ""){
+                            firstPool = JSON.parse(JSON.stringify(thisPool.Owner));
+                        }
+                        if (thisPool.Storages == null || thisPool.Storages.length == 0){
+                            otherPoolConfigMap[thisPool.Owner] = [];
+                        }else{
+                            otherPoolConfigMap[thisPool.Owner] = thisPool.Storages
+                        }
+                        $("#otherPools").append(`<div class="item" data-value="${thisPool.Owner}">${thisPool.Owner}</div>`);
+                    }
+                }
+                $("#otherPools").parent().dropdown();
+                $("#otherPools").parent().dropdown("set selected", firstPool);
+
+                loadFSHForPool(firstPool);
+            });
+        }
+
+        function loadFSHForPool(poolName){
+            if (otherPoolConfigMap[poolName]){
+                $("#sourceFSH").html("");
+                $("#sourceFSH").parent().removeClass('disabled');
+                var storages = otherPoolConfigMap[poolName];
+                if (storages.length > 0){
+                    storages.forEach(fsh => {
+                        $("#sourceFSH").append(`<div class="item" data-value="${fsh.UUID}"><i class="grey hdd icon"></i> ${fsh.Name} (${fsh.UUID}:/)</div>`);
+                    });
+                    $("#sourceFSH").parent().dropdown();
+                    $("#sourceFSH").parent().dropdown("set selected", storages[0].UUID);
+                }else{
+                    //No storage inside
+                    $("#sourceFSH").parent().addClass('disabled');
+                    $("#sourceFSH").append(`<div class="item" data-value="nodisk"><i class="remove icon"></i> No File System Handler in this Storage Pool</div>`);
+                    $("#sourceFSH").parent().dropdown();
+                    $("#sourceFSH").parent().dropdown("set selected", "nodisk");
+                }
+               
+            }else{
+                //Pool not exists
+                $("#sourceFSH").parent().addClass('disabled');
+            }
+        }
+
+
+        function bridgeFSH(){
+            var currentStoragePool = editingStoragePool;
+            var selectedSourceFSH = $("#souceFSH").val();
+            $.ajax({
+                url: "../../system/storage/pool/bridge",
+                data: {base: currentStoragePool, fsh: selectedSourceFSH},
+                success: function(data){
+                    if (data.error !== undefined){
+                        $("#errMsg").text(data.error);
+                        $("#errdialog").stop().finish().slideDown("fast").delay(10000).slideUp("fast");
+                    }else{
+                        //Success
+                        $("#done").modal("show");
+                        $(window).scrollTop(0);
+                    }
+                }
+            })
+        }
+
+
+        function done(){
+            ao_module_parentCallback(true);
+            ao_module_close();
+        }
+
+        function handleCancel(){
+            ao_module_close();
+        }
+    </script>
+</body>
+</html>

+ 31 - 5
web/SystemAO/storage/fshedit.html

@@ -47,11 +47,28 @@
         .backuponly{
             display:none;
         }
+
+        .backgroundIcon{
+            position: fixed;
+            bottom: 0px;
+            right: 0px;
+            opacity: 0.1;
+            margin-right: -3em;
+            margin-bottom: -5em;
+            z-index: -99;
+            pointer-events: none;
+            user-select: none;
+        }
+
     </style>
 </head>
 <body>
+    <div class="backgroundIcon">
+        <img class="ui medium image" src="../../img/system/drive-virtual.svg">
+    </div>
+    <!-- 
     <div class="ui fluid attached segment themebackground" >
-        <h24 class="ui inverted header">
+        <h4 class="ui inverted header">
             <i class="folder icon"></i>
             <div class="content">
                 <span id="pagetitle">Edit File System Handler</span>
@@ -59,8 +76,16 @@
             </div>
         </h4>
     </div>
+    -->
     <br>
     <div class="ui container">
+        <h3 class="ui header">
+            <img src="../../img/system/drive-virtual.svg">
+            <div class="content">
+                <span>Bridge File System Handler </span><span id="poolid"></span>
+                <div class="sub header">Share Storage across Storage Pools</div>
+            </div>
+        </h3>
         <form id="mainForm" class="ui form" onsubmit="handleFormSubmit(event);">
             <div class="field" style="display: none;">
                 <label>Group</label>
@@ -68,15 +93,15 @@
                 </div>
             <div class="field">
                 <label>Name</label>
-                <input type="text" name="name" placeholder="e.g. My Folder">
+                <input type="text" name="name" placeholder="e.g. My Drive">
             </div>
             <div class="field">
                 <label>UUID</label>
-                <input type="text" name="uuid" placeholder="e.g. myfolder">
+                <input type="text" name="uuid" placeholder="e.g. mydrive">
             </div>
             <div class="field">
                 <label>Path</label>
-                <input type="text" name="path" placeholder="e.g. /media/myfolder">
+                <input type="text" name="path" placeholder="e.g. /media/mydrive">
             </div>
             <div class="field">
                 <label>Access Permission</label>
@@ -140,6 +165,7 @@
             <div class="networkfs" style="display:none;">
                 <div class="ui divider"></div>
                 <p>Security and Authentication</p>
+                <small>Leave Username / Password field empty for using the old config</small>
                 <div class="field">
                     <label>Username</label>
                     <input type="text" name="username" placeholder="">
@@ -151,7 +177,7 @@
                 <br>
             </div>
             <button class="ui right floated button" onclick='handleCancel();'>Cancel</button>
-            <button class="ui green right floated button" type="submit">Update</button>
+            <button class="ui green right floated button" type="submit">Confirm</button>
             <br><br><br><br>
         </form>
     </div>

文件差異過大導致無法顯示
+ 27 - 0
web/SystemAO/storage/img/bridge.ai


+ 22 - 0
web/SystemAO/storage/img/bridge.svg

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="圖層_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="128px" height="128px" viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<path fill="#E99415" d="M124.709,107.196c0,9.773-7.924,17.699-17.697,17.699H21.962c-9.776,0-17.697-7.926-17.697-17.699V22.147
+	c0-9.773,7.921-17.698,17.697-17.698h85.049c9.773,0,17.697,7.924,17.697,17.698V107.196z"/>
+<path fill="#FFFFFF" d="M104.595,23.919l-0.393-0.389c-8.036-8.038-19.942-9.166-26.588-2.518l-19.863,19.86
+	c-0.245,0.455-0.387,0.975-0.387,1.537c0,1.877,1.476,3.399,3.292,3.399c0.537,0,1.022-0.165,1.474-0.4l17.49-17.488
+	c5.299-5.304,14.126-5.074,19.714,0.514l0.271,0.271c5.586,5.589,5.819,14.415,0.517,19.719L81.099,67.453
+	c-5.304,5.301-14.133,5.067-19.723-0.521l-0.27-0.272c-0.592-0.592-1.091-1.236-1.561-1.893c-0.033,0.05-0.058,0.105-0.091,0.154
+	c-0.599-0.771-1.48-1.294-2.504-1.294c-1.813,0-3.279,1.535-3.279,3.432c0,0.686,0.24,1.287,0.572,1.823
+	c-0.047,0.018-0.096,0.022-0.141,0.04c0.661,0.87,1.376,1.719,2.18,2.524l0.394,0.388c8.03,8.041,19.938,9.17,26.583,2.524
+	l23.853-23.851C113.76,43.863,112.629,31.959,104.595,23.919z"/>
+<path fill="#FFFFFF" d="M24.38,102.455l0.392,0.387c8.039,8.039,19.945,9.168,26.591,2.521L71.225,85.5
+	c0.243-0.454,0.386-0.976,0.386-1.536c0-1.877-1.474-3.397-3.293-3.397c-0.536,0-1.02,0.162-1.472,0.398L49.356,98.452
+	c-5.301,5.305-14.128,5.076-19.716-0.513l-0.271-0.271c-5.586-5.59-5.82-14.417-0.517-19.72l19.025-19.027
+	c5.303-5.302,14.132-5.068,19.721,0.52l0.271,0.272c0.592,0.591,1.089,1.236,1.561,1.893c0.033-0.05,0.058-0.106,0.089-0.155
+	c0.602,0.771,1.482,1.294,2.505,1.294c1.812,0,3.281-1.535,3.281-3.432c0-0.686-0.24-1.287-0.572-1.825
+	c0.045-0.016,0.096-0.022,0.141-0.039c-0.664-0.87-1.378-1.72-2.182-2.523l-0.395-0.389c-8.03-8.038-19.938-9.169-26.583-2.524
+	l-23.85,23.85C15.217,82.512,16.348,94.413,24.38,102.455z"/>
+</svg>

文件差異過大導致無法顯示
+ 27 - 0
web/SystemAO/storage/img/fsh.ai


+ 10 - 0
web/SystemAO/storage/img/fsh.svg

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="圖層_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="128px" height="128px" viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<path fill="#FFFFFF" d="M123.691,113.946c0,5.564-4.514,10.078-10.078,10.078H15.068c-5.569,0-10.08-4.514-10.08-10.078V15.4
+	c0-5.565,4.511-10.078,10.08-10.078h98.545c5.564,0,10.078,4.513,10.078,10.078V113.946z"/>
+<polygon fill="#3E3A39" points="30.383,78.045 66.513,33.127 102.642,78.045 "/>
+<rect x="30.383" y="85.254" fill="#3E3A39" width="72.258" height="9.851"/>
+</svg>

+ 1 - 1
web/SystemAO/storage/poolEditor.html

@@ -569,7 +569,7 @@
                 url:"SystemAO/storage/fshedit.html#" + encodeURIComponent(JSON.stringify({uuid: uuid, group: gpname})),
                 width: 530,
                 height: 740,
-                appicon: "SystemAO/storage/img/fsh.png",
+                appicon: "SystemAO/storage/img/fsh.svg",
                 title: "Edit File System Handler",
                 callback: "finishFshEdit",
                 parent: ao_module_windowID

+ 57 - 9
web/SystemAO/storage/poolList.html

@@ -22,6 +22,9 @@
         .clickable:hover{
             opacity: 0.6;
         }
+        .storagepool.active{
+            background-color: #f7f7f7;
+        }
 
         .reloadpoolBtn{
             position: absolute;
@@ -97,7 +100,7 @@
                     <button onclick="newFsh();" title="Add Storage" class="circular basic large ui icon button">
                         <i class="add icon"></i>
                     </button>
-                    <button title="Bridge Storage" class="circular basic blue large ui icon button">
+                    <button onclick="bridgeFsh();" title="Bridge Storage" class="circular basic blue large ui icon button">
                         <i class="linkify icon"></i>
                     </button>
                 </div>
@@ -121,7 +124,7 @@
                     $("#poolNameList").html(``);
                     storagePoolList = data;
                     data.forEach(storagePool => {
-                       $("#poolNameList").append(` <div class="ui clickable segment" onclick="loadThisPoolDetails('${storagePool.Owner}');">
+                       $("#poolNameList").append(` <div class="ui clickable storagepool segment" uuid="${storagePool.Owner}" onclick="loadThisPoolDetails('${storagePool.Owner}');">
                         <h4 class="ui header storagepool">
                             <img src="../../img/system/cluster.svg">
                             <div class="content">
@@ -153,6 +156,15 @@
                 }
             }
 
+           
+            $(".storagepool.active").removeClass("active");
+            $(".storagepool").each(function(){
+                if ($(this).attr("uuid") == owner){
+                    $(this).addClass("active");
+                }
+            })
+        
+
             $("#disklist").html("");
             var storages = targetStoragePool.Storages;
             storages.forEach(function(storage){
@@ -176,7 +188,7 @@
                 }else if (isReserved){
                     driveIcon = "drive.svg";
                 }
-                var editButtons = `<button onclick="editFsh('${storage.UUID}','${owner}');" title="Edit Virtual Disk" onclick="" class="circular tiny basic ui icon button">
+                var editButtons = `<button onclick="editFsh('${storage.UUID}','${owner}');" title="Edit Virtual Disk" onclick="" class="circular tiny basic ui icon button editButton">
                     <i class="edit icon"></i>
                 </button>
                 <button onclick="toggleFsh('${storage.UUID}','${owner}');" title="Toggle Virtual Disk IO" onclick="" class="circular tiny basic ui icon button shutdownButton">
@@ -274,11 +286,30 @@
 
                     $('.vdisk').each(function(){
                         if (!$(this).hasClass("online") && !$(this).hasClass("offline") && !$(this).hasClass("stopped")){
-                            $(this).find(".fshbuttons").hide();
-                            $(this).css({
-                                "border-left": "3px dotted #ff6666",
+                            //This pool record not exists in json file, check if this is bridged
+                            var fshid = $(this).attr("uuid");
+                            let thisFsh = $(this);
+                            $.ajax({
+                                url: "../../system/storage/pool/checkBridge",
+                                data: {base: selectedStoragePool, fsh: fshid},
+                                success: function(data){
+                                    if (data == true){
+                                        thisFsh.find(".shutdownButton").hide();
+                                        thisFsh.find(".editButton").hide();
+                                        thisFsh.css({
+                                            "border-left": "3px solid #e29eff",
+                                        });
+                                        thisFsh.find(".statusText").text("Bridged");
+                                    }else{
+                                        thisFsh.find(".fshbuttons").hide();
+                                        thisFsh.css({
+                                            "border-left": "3px dotted #ff6666",
+                                        });
+                                        thisFsh.find(".statusText").text("Removed");
+                                    }
+                                }
                             });
-                            $(this).find(".statusText").text("Removed");
+                           
                         }
                     });
                 }
@@ -330,6 +361,23 @@
             }
         }
 
+        function bridgeFsh(){
+            let url = "SystemAO/storage/fshBridge.html#" + encodeURIComponent(JSON.stringify({group: selectedStoragePool}))
+            if (typeof(ao_module_newfw) == "undefined"){
+                window.open("../../" + url);
+                return
+            }
+            ao_module_newfw({
+                url: url,
+                width: 530,
+                height: 740,
+                appicon: "SystemAO/storage/img/bridge.svg",
+                title: "New File System Handler Bridging",
+                callback: "finishFshEdit",
+                parent: ao_module_windowID
+            });
+        }
+
         function editFsh(uuid, gpname){
             if (typeof(ao_module_newfw) == "undefined"){
                 window.open("../../SystemAO/storage/fshedit.html#" + encodeURIComponent(JSON.stringify({uuid: uuid, group: gpname})));
@@ -339,7 +387,7 @@
                 url:"SystemAO/storage/fshedit.html#" + encodeURIComponent(JSON.stringify({uuid: uuid, group: gpname})),
                 width: 530,
                 height: 740,
-                appicon: "SystemAO/storage/img/fsh.png",
+                appicon: "SystemAO/storage/img/fsh.svg",
                 title: "Edit File System Handler",
                 callback: "finishFshEdit",
                 parent: ao_module_windowID
@@ -355,7 +403,7 @@
                 url:"SystemAO/storage/fshedit.html#" + encodeURIComponent(JSON.stringify({group: selectedStoragePool})),
                 width: 530,
                 height: 740,
-                appicon: "SystemAO/storage/img/fsh.png",
+                appicon: "SystemAO/storage/img/fsh.svg",
                 title: "New File System Handler",
                 callback: "finishFshEdit",
                 parent: ao_module_windowID

文件差異過大導致無法顯示
+ 27 - 0
web/img/system/drive-bridge.ai


二進制
web/img/system/drive-bridge.png


+ 31 - 0
web/img/system/drive-bridge.svg

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="128px"
+	 height="128px" viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<g id="圖層_1">
+	<rect x="11.458" y="82.333" fill="#717071" width="102.833" height="29.167"/>
+	<polygon fill="#DBDCDC" points="95.374,41.167 29.208,41.167 11.542,82.333 114.374,82.333 	"/>
+	<path fill="#3E3A39" d="M112.125,106.811c0,1.728-1.358,3.127-3.034,3.127H16.535c-1.676,0-3.035-1.399-3.035-3.127V87.002
+		c0-1.728,1.359-3.127,3.035-3.127h92.556c1.676,0,3.034,1.399,3.034,3.127V106.811z"/>
+	<circle fill="#009FE8" cx="99.375" cy="96.916" r="3.708"/>
+</g>
+<g id="圖層_2">
+	<path fill="#F39800" d="M122.084,60.654c0,4.288-3.476,7.764-7.763,7.764H77.014c-4.288,0-7.763-3.477-7.763-7.764V23.347
+		c0-4.287,3.475-7.763,7.763-7.763h37.308c4.287,0,7.763,3.476,7.763,7.763V60.654z"/>
+	<path fill="#FFFFFF" d="M113.261,24.124l-0.172-0.17c-3.525-3.526-8.748-4.021-11.663-1.104l-8.713,8.712
+		c-0.107,0.2-0.17,0.428-0.17,0.674c0,0.823,0.647,1.491,1.444,1.491c0.235,0,0.448-0.072,0.646-0.176l7.672-7.671
+		c2.324-2.327,6.196-2.226,8.647,0.226l0.119,0.119c2.45,2.452,2.553,6.323,0.227,8.65l-8.345,8.346
+		c-2.326,2.326-6.199,2.223-8.651-0.228l-0.118-0.12c-0.26-0.259-0.479-0.542-0.685-0.83c-0.015,0.022-0.025,0.046-0.04,0.068
+		c-0.263-0.338-0.649-0.568-1.099-0.568c-0.795,0-1.438,0.673-1.438,1.505c0,0.301,0.105,0.564,0.251,0.8
+		c-0.021,0.007-0.042,0.01-0.062,0.017c0.29,0.382,0.604,0.754,0.956,1.107l0.173,0.171c3.522,3.526,8.746,4.022,11.661,1.107
+		l10.463-10.462C117.281,32.873,116.785,27.651,113.261,24.124z"/>
+	<path fill="#FFFFFF" d="M78.074,58.574l0.172,0.17c3.526,3.526,8.749,4.021,11.664,1.105l8.713-8.712
+		c0.106-0.2,0.169-0.428,0.169-0.674c0-0.823-0.646-1.491-1.444-1.491c-0.235,0-0.447,0.072-0.646,0.175l-7.672,7.671
+		c-2.325,2.327-6.197,2.226-8.648-0.226l-0.119-0.119c-2.45-2.452-2.553-6.323-0.227-8.65l8.346-8.346
+		c2.326-2.326,6.199-2.223,8.65,0.228l0.119,0.12c0.26,0.259,0.478,0.542,0.685,0.83c0.015-0.022,0.025-0.046,0.039-0.068
+		c0.264,0.338,0.65,0.568,1.099,0.568c0.795,0,1.439-0.673,1.439-1.505c0-0.301-0.105-0.564-0.251-0.8
+		c0.02-0.007,0.042-0.01,0.062-0.017c-0.291-0.382-0.604-0.754-0.957-1.107l-0.173-0.171c-3.522-3.526-8.746-4.022-11.661-1.107
+		L76.971,46.911C74.055,49.826,74.551,55.047,78.074,58.574z"/>
+</g>
+</svg>

部分文件因文件數量過多而無法顯示