Selaa lähdekoodia

update 2024-04-22

junggilpark 1 vuosi sitten
vanhempi
commit
cdec59fe02

+ 47 - 5
src/app.js

@@ -4,7 +4,7 @@ const fs = require("fs");
 const path = require("path");
 const express = require("express");
 const axios = require("axios");
-const SERVER_PORT = process.env.port || process.env.PORT || 3333;
+const SERVER_PORT = process.env.port || process.env.PORT || 53000;
 const authProvider = require('./auth/AuthProvider');
 const {fetch, updateFetch} = require('./fetch');
 const bodyParser = require('body-parser');
@@ -172,9 +172,20 @@ serverApp.get("/group-redirect",
           sites : [],
         }
         if (teams && teams.length) {
-          for(let team of teams) {
+          const options = {
+            responseType: 'arraybuffer',
+            headers: {
+              Authorization: `Bearer ${req.session.accessToken}`,
+              ConsistencyLevel: 'eventual',
+            },
+          };
+          for (let team of teams) {
             const item = await fetch(process.env.GRAPH_API_ENDPOINT + "v1.0/groups/"+team.id+"/drive/items/root/children", req.session.accessToken);
-            const photo = await fetch(process.env.GRAPH_API_ENDPOINT + "v1.0/groups/"+team.id+"/photo", req.session.accessToken);
+            let photoRes = await axios.get(process.env.GRAPH_API_ENDPOINT + "v1.0/groups/"+team.id+"/photos/48x48/$value", options);
+            
+            if (photoRes) {
+              photo = Buffer.from(photoRes.data, 'binary').toString('base64');
+            }
             if (item && item.value) {
               resultObj.joinedTeams.items[team.id] = item.value;
               team.image = photo;
@@ -184,6 +195,37 @@ serverApp.get("/group-redirect",
         res.json(resultObj);
     } catch (error) {
         next(error);
-    }
+    } 
   }
-)
+)
+
+
+serverApp.post('/getImages/:id', 
+  isAuthenticated,
+  (req, res, next)=>{
+    if (!req.session.accessToken) {
+      return authProvider.acquireToken({
+        scopes: ['.default'],
+        redirectUri: 'https://localhost:53000/redirect',
+        successRedirect: '/getImages/'+req.params.id
+      })(req, res, next);
+    }
+    next();
+  },
+  async (req, res, next)=>{
+    const options = {
+      method: 'GET',
+      url: `https://graph.microsoft.com/v1.0/groups/${req.params.id}/photo/$value`,
+      responseType: 'arraybuffer',
+      headers: {
+        Authorization: `Bearer ${req.session.accessToken}`,
+        ConsistencyLevel: 'eventual',
+      },
+    };
+    await axios.request(options).then((object) => {
+      var photo = Buffer.from(object.data, 'binary').toString('base64');
+      // console.log(object.data);
+      res.json(photo); 
+    });
+
+})

+ 1 - 0
src/static/images/clipchamp.svg

@@ -0,0 +1 @@
+<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><path fill="#fff" d="M5 1h10v14H5z"/><path opacity=".67" fill-rule="evenodd" clip-rule="evenodd" d="M15 1H5v14h10V1zM5 0a1 1 0 0 0-1 1v14a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V1a1 1 0 0 0-1-1H5z" fill="#605E5C"/><g clip-path="url(#b)"><path d="M7.577 3.698.497 5.32a.637.637 0 0 0-.48.764l.19.814c.079.343.424.557.77.478l7.079-1.622a.637.637 0 0 0 .481-.764l-.19-.814a.642.642 0 0 0-.77-.478z" fill="url(#c)"/><path d="M0 10.638h9v1.217a.817.817 0 0 1-.818.812H.818A.817.817 0 0 1 0 11.855v-1.217z" fill="#5A4CDB"/><path d="M9 8.608H2.863v2.03H9v-2.03z" fill="#885EDE"/><path d="M6.136 6.58H0v2.028h6.136V6.58z" fill="#C689E6"/><path d="M2.864 8.608H0v2.03h2.864v-2.03zM6.137 6.58h2.045c.45 0 .818.364.818.81v1.218H6.137V6.58z" fill="#AA72E1"/><path d="M0 10v.637h.642A.638.638 0 0 1 0 10z" fill="#5A4CDB"/><path d="M0 7.972v.637h.642A.638.638 0 0 1 0 7.972z" fill="#AA72E1"/><path d="M0 5.942v.637h.642A.638.638 0 0 1 0 5.942z" fill="#C689E6"/><path d="M8.182 6.58H.642A.64.64 0 0 1 0 5.941v5.913c0 .446.368.811.818.811h7.364c.45 0 .818-.365.818-.811V7.39a.817.817 0 0 0-.818-.812z" fill="url(#d)" style="mix-blend-mode:soft-light"/></g></g><defs><linearGradient id="c" x1="-.128" y1="5.463" x2="5.258" y2="9.832" gradientUnits="userSpaceOnUse"><stop stop-color="#5A4CDB"/><stop offset="1" stop-color="#AD58DB"/></linearGradient><linearGradient id="d" x1="0" y1="5.942" x2="10.046" y2="10.197" gradientUnits="userSpaceOnUse"><stop stop-color="#FCCEF5"/><stop offset="1" stop-color="#5A4CDB"/></linearGradient><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath><clipPath id="b"><path fill="#fff" transform="translate(0 3.333)" d="M0 0h9v9.333H0z"/></clipPath></defs></svg>

+ 1 - 0
src/static/images/docx.svg

@@ -0,0 +1 @@
+<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M5.5 15h9c.275 0 .5-.225.5-.5V5h-1.5c-.827 0-1.5-.673-1.5-1.5V1H5.5c-.275 0-.5.225-.5.5v13c0 .275.225.5.5.5z" fill="#fff"/><path d="M15 4v-.086a.496.496 0 0 0-.146-.353L13 1.707V3.5c0 .275.225.5.5.5H15z" fill="#fff"/><path opacity=".67" fill-rule="evenodd" clip-rule="evenodd" d="M15.56 2.853 13.146.44a1.51 1.51 0 0 0-1.06-.44H5.5C4.673 0 4 .673 4 1.5v13c0 .827.673 1.5 1.5 1.5h9c.827 0 1.5-.673 1.5-1.5V3.914c0-.4-.156-.777-.44-1.06v-.001zm-.707.708c.095.094.147.22.147.353V4h-1.5a.501.501 0 0 1-.5-.5V1.707l1.854 1.854h-.001zM5.5 15h9c.275 0 .5-.225.5-.5V5h-1.5c-.827 0-1.5-.673-1.5-1.5V1H5.5c-.275 0-.5.225-.5.5v13c0 .276.224.5.5.5z" fill="#605E5C"/><path d="M13.5 10H10v1h3.5a.5.5 0 0 0 0-1z" fill="#185ABD"/><path d="M13.5 8H10v1h3.5a.5.5 0 0 0 0-1z" fill="#2B7CD3"/><path d="M13.5 6H10v1h3.5a.5.5 0 0 0 0-1z" fill="#41A5EE"/><path d="M1 13h7a1 1 0 0 0 1-1V5a1 1 0 0 0-1-1H1a1 1 0 0 0-1 1v7a1 1 0 0 0 1 1z" fill="#185ABD"/><path d="M5.855 10.972h-.576l-.765-3.755-.82 3.773H3.22L2.006 6l.732.002.698 3.308L4.154 6h.706l.808 3.298.606-3.267.707.005-1.126 4.936z" fill="#fff"/></svg>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 0 - 0
src/static/images/empty_folder_v2.svg


+ 1 - 0
src/static/images/vsdx.svg

@@ -0,0 +1 @@
+<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path opacity=".67" fill-rule="evenodd" clip-rule="evenodd" d="M15.56 2.85 13.15.44A1.52 1.52 0 0 0 12.09 0H5.5A1.5 1.5 0 0 0 4 1.5v13A1.5 1.5 0 0 0 5.5 16h9a1.5 1.5 0 0 0 1.5-1.5V3.91a1.52 1.52 0 0 0-.44-1.06zm-.71.71a.49.49 0 0 1 .15.35V4h-1.5a.5.5 0 0 1-.5-.5V1.71l1.85 1.85zM5.5 15h9a.5.5 0 0 0 .5-.5V5h-1.5A1.5 1.5 0 0 1 12 3.5V1H5.5a.5.5 0 0 0-.5.5v13a.5.5 0 0 0 .5.5z" fill="#605E5C"/><path d="M5.5 15h9a.5.5 0 0 0 .5-.5V5h-1.5A1.5 1.5 0 0 1 12 3.5V1H5.5a.5.5 0 0 0-.5.5v13a.5.5 0 0 0 .5.5z" fill="#fff"/><path d="M15 4v-.09a.49.49 0 0 0-.15-.35L13 1.71V3.5a.5.5 0 0 0 .5.5H15z" fill="#fff"/><rect y="4" width="9" height="9" rx="1" fill="#185ABD"/><path d="M4.23 11 2.02 6h.95l1.54 3.56L6.02 6H7l-2.22 5h-.55z" fill="#fff"/><path d="M11.5 11h-1v-1h1a.5.5 0 0 0 .5-.5v-3h1v3a1.5 1.5 0 0 1-1.5 1.5z" fill="#185ABD"/><path fill="#103F91" d="m10.996 6.497 1.499-1.499 1.5 1.5-1.5 1.498z"/><path fill="#41A5EE" d="M10 9h1v3h-1z"/></svg>

+ 1 - 0
src/static/images/zip.svg

@@ -0,0 +1 @@
+<svg width="32" height="32" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="m15 8-1.268-1.268A2.5 2.5 0 0 0 11.964 6H3.5A1.5 1.5 0 0 0 2 7.5v17A1.5 1.5 0 0 0 3.5 26h25a1.5 1.5 0 0 0 1.5-1.5v-15A1.5 1.5 0 0 0 28.5 8H15z" fill="#FFB900"/><path d="m15 8-1.268 1.268a2.5 2.5 0 0 1-1.768.732H2v14.5A1.5 1.5 0 0 0 3.5 26h25a1.5 1.5 0 0 0 1.5-1.5v-15A1.5 1.5 0 0 0 28.5 8H15z" fill="#FFD75E"/><path d="m15 8-1.268 1.268a2.5 2.5 0 0 1-1.768.732H2v14.5A1.5 1.5 0 0 0 3.5 26h25a1.5 1.5 0 0 0 1.5-1.5v-15A1.5 1.5 0 0 0 28.5 8H15z" fill="url(#a)"/><path d="M3 25.5c-.286 0-.55-.084-.777-.223.263.432.734.723 1.277.723h25c.543 0 1.014-.29 1.277-.723A1.488 1.488 0 0 1 29 25.5H3z" fill="#BF5712"/><path opacity=".4" d="M14.129 9.621 15.75 8H15l-1.268 1.268a2.5 2.5 0 0 1-1.768.732H2v.5h10.007a3 3 0 0 0 2.122-.879z" fill="#fff"/><path fill-rule="evenodd" clip-rule="evenodd" d="M3.5 16h10a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-10a.5.5 0 0 1-.5-.5V20h.75a.25.25 0 0 0 .25-.25v-2.5a.25.25 0 0 0-.25-.25H3v-.5a.5.5 0 0 1 .5-.5zm12 4a.5.5 0 0 1-.5-.5v-2a.5.5 0 0 1 1 0v2a.5.5 0 0 1-.5.5zm2 0a.5.5 0 0 1-.5-.5v-2a.5.5 0 0 1 1 0v2a.5.5 0 0 1-.5.5zm1.5-.5a.5.5 0 0 0 1 0v-2a.5.5 0 0 0-1 0v2zm2.5.5a.5.5 0 0 1-.5-.5v-2a.5.5 0 0 1 1 0v2a.5.5 0 0 1-.5.5zm1.5-.5a.5.5 0 0 0 1 0v-2a.5.5 0 0 0-1 0v2zm2.5.5a.5.5 0 0 1-.5-.5v-2a.5.5 0 0 1 1 0v2a.5.5 0 0 1-.5.5zm1.5-.5a.5.5 0 0 0 1 0v-2a.5.5 0 0 0-1 0v2zm2.5.5a.5.5 0 0 1-.5-.5v-2a.5.5 0 0 1 1 0v2a.5.5 0 0 1-.5.5zM13 19.75a.25.25 0 0 1-.25.25h-2.5a.25.25 0 0 1-.25-.25v-2.5a.25.25 0 0 1 .25-.25h2.5a.25.25 0 0 1 .25.25v2.5zM2 20h.75a.25.25 0 0 0 .25-.25v-2.5a.25.25 0 0 0-.25-.25H2v3z" fill="#BF5712"/><defs><linearGradient id="a" x1="2" y1="8" x2="2" y2="26" gradientUnits="userSpaceOnUse"><stop stop-color="#fff" stop-opacity=".01"/><stop offset=".999" stop-color="#FFD75E" stop-opacity=".3"/></linearGradient></defs></svg>

+ 45 - 4
src/static/styles/custom.css

@@ -218,11 +218,20 @@ li {
 }
 
 .empty-box {
-  background-image: url('/static/images/empty_folder.svg');
   width: 100%;
   height: 100%;
-  background-repeat: no-repeat;
-  background-position: center;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex-direction: column;
+}
+
+.file-content > div.empty-box > div {
+  font-size: 23px;
+  font-weight: bold;
+  width: auto;
+  padding: 0;
+  padding-top: 20px;
 }
 
 .empty-box .text {
@@ -240,6 +249,11 @@ li {
   background-color: #eeeeee;
   cursor: pointer;
 }
+
+.file-content > div.empty-box:hover {
+  cursor: default;
+  background-color: #f5f5f5;
+}
 .file-content input[type='checkbox'] {
   cursor: pointer;
 }
@@ -303,4 +317,31 @@ li {
   padding: 0px 0px 0px 35px;
   margin-block-end : 0.5rem;
   margin-block-start: 0;
-}
+}
+
+.tree label {
+  display: flex;
+  align-items: center;
+  height: 25px;
+}
+
+.tree li > ul > li {
+  cursor: pointer;
+}
+.panel-item {
+  user-select: none;
+  display: flex;
+  align-items: center;
+}
+.panel-item:hover {
+  cursor: pointer;
+}
+.panel {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 10px;
+}
+.panel-item.on {
+  cursor: text;
+  font-weight: bold;
+}

+ 363 - 352
src/views/hello.html

@@ -72,317 +72,264 @@
   $(()=>{
     microsoftTeams.appInitialization.notifySuccess();
     getGroupList();
-    // callApi('get', '/me/drive/root/children', (jsonData)=>{
-    //   console.log('=======================one drive==========================');
-    //   console.log(jsonData);
-    //   console.log('============================================================');
-    //   let str = `<li>
-    //                 <input type="checkbox" checked="false" id="my-one-drive" onclick="showOneDrive()">
-    //                 <label for="my-one-drive">One Drive</label>
-    //                 <ul>`;
-    //                   if (jsonData && jsonData.value) {
-    //                     const drives = jsonData.value;
-    //                     drives.forEach((drive)=>{
-    //                       str +=`<li id="${drive.id}" onclick="DrawOneDrive(${drive.id})">${drive.name}</li>`
-    //                     })
-    //                   }
-    //         str += `</ul>
-    //             </li>`;
-    //   $('.group').append(str);
-    // });
-    // callApi('get', '/me/joinedTeams', (jsonData)=>{
-    //   console.log('======================joinedTeams======================')
-    //   console.log(jsonData);
-    //   if (jsonData && jsonData.value && jsonData.value.length) {
-    //     // jsonData.value.forEach((team)=>{
-    //     //     team.id
-    //     //     callApi('get', '/')
-    //     // })
-    //   }
-    //   // let str = `<li>
-    //   //               <input type="checkbox" checked="false" id="my-one-drive" onclick="showOneDrive()">
-    //   //               <label for="my-one-drive">One Drive</label>
-    //   //               <ul>`;
-    //   //                 if (jsonData && jsonData.value) {
-    //   //                   const drives = jsonData.value;
-    //   //                   drives.forEach((drive)=>{
-    //   //                     str +=`<li id="${drive.id}" onclick="DrawOneDrive(${drive.id})">${drive.name}</li>`
-    //   //                   })
-    //   //                 }
-    //   //       str += `</ul>
-    //   //           </li>`;
-    // });
-    // callApi('get', '/sites', (jsonData)=>{
-    //   console.log('=====================sites===================');
-    //   console.log(jsonData);
-    // });
-    // callApi('get', '/me/drives', (jsonData)=>{
-    //   console.log('=====================/me/drives===================');
-    //   console.log(jsonData);
-    //   // drawOneDrive(jsonData);
-    // })
-    // getGroupList();
-    // callApi('get', '/groups/'+groupId+'/drive/items/root/children', (jsonData) =>drawFileList(jsonData, groupId));
-    //
+
     window.oncontextmenu = function () {
         return false;
-      };
-    });
+    };
 
-    function getFileList(id) {
-      // callApi('get', "/"+id+"/drive/root/children", "Files.Read", drawFileList, id);
-      callApi('get', "/users/"+id+"/drive", drawFileList, id);
-    }
+  });
 
-    // function drawList(jsonData) {
-    //   if (jsonData && jsonData.value) {
-    //       const group = $('.group');
-    //       let str = "";
-    //       jsonData.value.forEach(element => {
-    //           str+=`<li onclick="getFileList('${element.userPrincipalName}')">
-    //                   <div style="display:flex;">
-    //                     <div class="circle-name">${element.givenName}</div>
-    //                     <div style="display:flex; flex-direction:column; justify-content:space-between;">
-    //                       <div style="font-size: 16px; font-weight:bold;">${element.displayName}</div>
-    //                       <div style="font-size: 12px; color: #7b7777ec;">${element.mail}</div>
-    //                     </div>
-    //                   </div>
-    //                 </li>`
-    //       });
-
-          
-    //       group.html(str);
-    //   }
-    // }
-
-    function drawFileList(jsonData) {
-              _selectedData = [];    
-      if (jsonData && jsonData.value && jsonData.value.length > 0) {
-              _selectedData = jsonData.value;
-              let str = "";
-              const $fileContent = $('.file-content');
-              const $oneDriveBtn  = $('.one-drive-button');
-              const panel = $('.panel');
-              let panelStr = "";
-
-              jsonData.value.forEach((obj, idx)=>{
-                if (idx === 0 && obj.parentReference) {
-                  const parent = $('#' + obj.parentReference.id);
-                  if (parent) {
-                    console.log(parent);
-                  }
-                  console.log(obj.parentReference.id);
-                  panelStr += `<span class="panel-item on" id="${obj.parentReference.id}" onclick="findChildrenItems(${obj.parentReference.id})">${obj.parentReference.name}</span>`
-                  
-                  panel.html(panelStr);
-                }
-                dragAndDrop(obj.id);
-                let images = "/static/images/";
-                $oneDriveBtn.off('click');
-                if (obj.webUrl){
-                  $oneDriveBtn.on('click', ()=>{
-                    window.open(obj.webUrl);
-                  })
-                }
 
-                let modifyName = "";
-                if (obj.lastModifiedBy && obj.lastModifiedBy.user) {
-                  modifyName = obj.lastModifiedBy.user.displayName;
-                }
-                if (obj.folder || obj.driveType) {
-                  images += "folder.png";
-                }
-                else if (obj.file && obj.name) {
-                  let ext = obj.name.substring(obj.name.lastIndexOf('.') + 1);
-                  if (obj.file.mimeType && obj.file.mimeType.includes('image')){
-                    ext = 'photo';
-                  }
-                  images += ext+ ".svg";
-                }
-                else {
-                  images += "file.png";
-                }
-                let amount = '';
-                if (obj.quota) {
-                  amount = getVolume(obj.quota.remaining);
-                }
-                if (obj.size) {
-                  amount = getVolume(obj.size);
-                }
-                let modifyDate = obj.lastModifiedDateTime;
-                if (modifyDate) {
-                  modifyDate = modifyDate.replace('T', ' ');
-                  modifyDate = modifyDate.substring(5, 7)+ '월 '+ modifyDate.substring(8, 10)+ '일';
-                }
-                str += `
-                  <div id="row_${idx}">
-                    <div>
-                      <input type="checkbox" name="row_${idx}" value="${obj.id}" onclick="event.stopPropagation()">
-                      <img src="${images}" width="20" height="20" alt="폴더 이미지">
-                    </div>
-                    <div class="file_name"><span class="sp-name" onclick="findChildrenItems('${obj.id}', '${obj.name}')">${obj.name}</span></div>
-                    <div>${amount}</div>
-                    <div>${modifyDate}</div>
-                    <div>${modifyName}</div>
-                    <div></div>
-                  </div>`
-              });
-              $fileContent.html(str);
-              $('.file-content > div').on('click', function(e){
-                e.preventDefault();
-                const checkbox = $('input[name="' + $(this).attr('id') + '"]');
-                if (checkbox[0]) {
-                  const isChecked = checkbox.prop("checked");
-                  checkbox.prop('checked', !isChecked);
-                  const method = !isChecked ? 'addClass' : 'removeClass';
-                  $(this)[method]('on');
-                }
-              });
+  function drawDriveFiles(jsonData, parentData, name) {
+      _selectedData = [];
+      const panel = $('.panel');
+      let panelStr = `<span class="panel-item on">${name}</span>`;
+      const $fileContent = $('.file-content');
+      const $oneDriveBtn  = $('.one-drive-button');
+      let text = name;
+      if (name !== 'One Drive') {
+        text = 'SharePoint'
+      }
+      $oneDriveBtn.text(text+'에서 열기');
+      $oneDriveBtn.off('click');
+      
+      if (jsonData && jsonData.value && jsonData.value.length > 0) {
+        if (jsonData.value[0].webUrl) {
+          $oneDriveBtn.on('click', ()=>{
+            window.open(obj.webUrl);
+          });
+        };
+        _selectedData = jsonData;
+        const selectedPref = _selectedData.value[0].parentReference;
+        if (selectedPref && selectedPref.path) {
+          let path = selectedPref.path;
+          panelStr = drawPath(path, selectedPref.siteId, name);
+        }
+        let str = "";
+          jsonData.value.forEach((obj, idx)=>{
+            dragAndDrop(obj.id);
+            let images = "/static/images/";
+            
+
+            let modifyName = "";
+            if (obj.lastModifiedBy && obj.lastModifiedBy.user) {
+              modifyName = obj.lastModifiedBy.user.displayName;
+            }
+            if (obj.folder || obj.driveType) {
+              images += "folder.png";
+            }
+            else if (obj.file && obj.name) {
+              let ext = obj.name.substring(obj.name.lastIndexOf('.') + 1);
+              let imageExt = ".svg";
+              if (obj.file.mimeType && obj.file.mimeType.includes('image')){
+                ext = 'photo';
+              }
+              else if (['pptx', 'ppt', 'pptm'].includes(ext)) {
+                ext = 'pptx';
+              }
+              else if (['xlsx', 'xlsm', 'xlsb', 'xltx'].includes(ext)) {
+                ext = 'xlsx';
+              }
+              else if (['pdf'].includes(ext)) {
+                ext = 'pdf';
+              }
+              else if (['doc', 'docx'].includes(ext)) {
+                ext = 'docx';
+              }
+              else if (['one', 'onetoc'].includes(ext)) {
+                ext = 'onetoc';
+              }
+              else if (['vsd', 'vdx', 'vdw', 'vstx', 'vstm', 'vst', 'vtx', 'vsdx'].includes(ext)) {
+                ext = 'vsdx';
+              }
+              else if (['zip', 'apk', 'rar', '7z', 'tar'].includes(ext)) {
+                ext = 'zip';
+              }
+              else if (['mp4', 'mov', 'Webm', 'mp3','wav', 'Ogg'].includes(ext)) {
+                ext = 'clipchamp';
+              }
+              else {
+                ext = 'file';
+                imageExt = '.png';
+              }
 
-              window.addEventListener('click', ()=>{
-                  if ($('.toggle-box')[0]){
-                    $('.toggle-box').remove();
-                  }
-              })
-              $('.file-content > div').on('mousedown', function(e){
-                if ((e.button == 2) || (e.which == 3)) {
-                  const checkbox = $('input[name="'+$(this).attr('id') + '"]');
-                  if (!$(this).hasClass('on')) {
-                    checkbox.prop('checked', true);
-                    $(this).addClass('on');
-                  }
+              images += ext + imageExt;
+            }
+            else {
+              images += "file.png";
+            }
+            let amount = '0 Bytes';
+            if (obj.size) {
+              amount = getVolume(obj.size);
+            }
+            let modifyDate = obj.lastModifiedDateTime;
+            if (modifyDate) {
+              modifyDate = modifyDate.replace('T', ' ');
+              modifyDate = modifyDate.substring(5, 7)+ '월 '+ modifyDate.substring(8, 10)+ '일';
+            }
 
-                  if ($('.toggle-box')[0]) {
-                    $('.toggle-box').remove();
-                  }
-                  const {clientX, clientY} = e;
-                    const toggleBox = $(`<div class="toggle-box" style="position:absolute; top:${clientY}; left: ${clientX}">
-                        <div>편집</div>
-                        <div>탭으로 설정</div>
-                        <div>다운로드</div>
-                        <div>삭제</div>
-                        <div>이동</div>
-                        <div>복사</div>
-                        <div onclick="nameChange()">이름 바꾸기</div>
-                      </div>`);
-                      $('body').append(toggleBox);
-                }
-              });
+            // let method = `findOneDriveChildrenItems('${obj.id}')`;(siteId, path, name, value)
+            let method = `siteDriveChildrenItems('${obj.parentReference.siteId}','${obj.parentReference.path + '/' + obj.name}','${name}')`;
+            if (obj.file) {
+              method = `downloadItems('${obj['@microsoft.graph.downloadUrl']}', '${obj.name}', event)`;
             }
-    }
+            str += `
+              <div id="row_${idx}">
+                <div>
+                  <input type="checkbox" name="row_${idx}" value="${obj.id}" onclick="event.stopPropagation()">
+                  <img src="${images}" width="20" height="20" alt="폴더 이미지">
+                </div>
+                <div class="file_name"><span class="sp-name" onclick="${method}">${obj.name}</span></div>
+                <div>${amount}</div>
+                <div>${modifyDate}</div>
+                <div>${modifyName}</div>
+                <div></div>
+              </div>`
+          });
+          $fileContent.html(str);
+          $('.file-content > div').on('click', function(e){
+            e.preventDefault();
+            const checkbox = $('input[name="'+$(this).attr('id') + '"]');
+            if (checkbox[0]) {
+              const isChecked = checkbox.prop("checked");
+              checkbox.prop('checked', !isChecked);
+              const method = !isChecked ? 'addClass' : 'removeClass';
+              $(this)[method]('on');
+            }
+          });
 
-    function drawOneDrive(jsonData, name) {
-      _selectedData = [];
-      const panel = $('.panel');
-      let panelStr = `<span class="panel-item on" onclick="showOneDrive()">One Drive</span>`;
-      panel.html(panelStr);
-      if (jsonData && jsonData.value && jsonData.value.length > 0) {
-        _selectedData = jsonData.value;
-              let str = "";
-              const $fileContent = $('.file-content');
-              const $oneDriveBtn  = $('.one-drive-button');
-              
-              jsonData.value.forEach((obj, idx)=>{
-                console.log(obj);
-                dragAndDrop(obj.id);
-                let images = "/static/images/";
+          window.addEventListener('click', ()=>{
+              if ($('.toggle-box')[0]){
+                $('.toggle-box').remove();
+              }
+          })
+
+          $('.file-content > div').on('mousedown', function(e){
+            if ((e.button == 2) || (e.which == 3)) {
+              const checkbox = $('input[name="'+$(this).attr('id') + '"]');
+              if (!$(this).hasClass('on')) {
+                checkbox.prop('checked', true);
+                $(this).addClass('on');
+              }
+
+              if ($('.toggle-box')[0]) {
+                $('.toggle-box').remove();
+              }
+              const {clientX, clientY} = e;
+                const toggleBox = $(`<div class="toggle-box" style="position:absolute; top:${clientY}; left: ${clientX}">
+                    <div>편집</div>
+                    <div>탭으로 설정</div>
+                    <div>다운로드</div>
+                    <div>삭제</div>
+                    <div>이동</div>
+                    <div>복사</div>
+                    <div onclick="nameChange()">이름 바꾸기</div>
+                  </div>`);
+                  $('body').append(toggleBox);
+            }
+          });
+        }
+        else {
+            if (parentData && parentData.folder && parentData.folder.childCount === 0) {
+                const refData = parentData.parentReference;
+                panelStr = drawPath(refData.path +'/' + parentData.name, refData.siteId ,name);
                 $oneDriveBtn.off('click');
-                if (obj.webUrl){
+                
+                if (parentData.webUrl){
                   $oneDriveBtn.on('click', ()=>{
-                    window.open(obj.webUrl);
-                  })
+                    window.open(parentData.webUrl);
+                  });
                 }
 
-                let modifyName = "";
-                if (obj.lastModifiedBy && obj.lastModifiedBy.user) {
-                  modifyName = obj.lastModifiedBy.user.displayName;
-                }
-                if (obj.folder || obj.driveType) {
-                  images += "folder.png";
-                }
-                else if (obj.file && obj.name) {
-                  let ext = obj.name.substring(obj.name.lastIndexOf('.') + 1);
-                  if (obj.file.mimeType && obj.file.mimeType.includes('image')){
-                    ext = 'photo';
-                  }
-                  images += ext+ ".svg";
-                }
-                else {
-                  images += "file.png";
-                }
-                let amount = '0 Bytes';
-                if (obj.size) {
-                  amount = getVolume(obj.size);
-                }
-                let modifyDate = obj.lastModifiedDateTime;
-                if (modifyDate) {
-                  modifyDate = modifyDate.replace('T', ' ');
-                  modifyDate = modifyDate.substring(5, 7)+ '월 '+ modifyDate.substring(8, 10)+ '일';
-                }
-                str += `
-                  <div id="row_${idx}">
-                    <div>
-                      <input type="checkbox" name="row_${idx}" value="${obj.id}" onclick="event.stopPropagation()">
-                      <img src="${images}" width="20" height="20" alt="폴더 이미지">
-                    </div>
-                    <div class="file_name"><span class="sp-name" onclick="findOneDriveChildrenItems('${obj.id}')">${obj.name}</span></div>
-                    <div>${amount}</div>
-                    <div>${modifyDate}</div>
-                    <div>${modifyName}</div>
-                    <div></div>
-                  </div>`
-              });
-              $fileContent.html(str);
-              $('.file-content > div').on('click', function(e){
-                e.preventDefault();
-                const checkbox = $('input[name="'+$(this).attr('id') + '"]');
-                if (checkbox[0]) {
-                  const isChecked = checkbox.prop("checked");
-                  checkbox.prop('checked', !isChecked);
-                  const method = !isChecked ? 'addClass' : 'removeClass';
-                  $(this)[method]('on');
-                }
-              });
-
-              window.addEventListener('click', ()=>{
-                  if ($('.toggle-box')[0]){
-                    $('.toggle-box').remove();
-                  }
-              })
-              $('.file-content > div').on('mousedown', function(e){
-                if ((e.button == 2) || (e.which == 3)) {
-                  const checkbox = $('input[name="'+$(this).attr('id') + '"]');
-                  if (!$(this).hasClass('on')) {
-                    checkbox.prop('checked', true);
-                    $(this).addClass('on');
-                  }
-
-                  if ($('.toggle-box')[0]) {
-                    $('.toggle-box').remove();
-                  }
-                  const {clientX, clientY} = e;
-                    const toggleBox = $(`<div class="toggle-box" style="position:absolute; top:${clientY}; left: ${clientX}">
-                        <div>편집</div>
-                        <div>탭으로 설정</div>
-                        <div>다운로드</div>
-                        <div>삭제</div>
-                        <div>이동</div>
-                        <div>복사</div>
-                        <div onclick="nameChange()">이름 바꾸기</div>
-                      </div>`);
-                      $('body').append(toggleBox);
-                }
-              });
+                $fileContent.html(`<div class="empty-box">
+                                    <img src="/static/images/empty_folder_v2.svg" alt="이미지">
+                                    <div>이 폴더는 비어 있습니다.</div>
+                                  </div>`)
+            }
         }
+        
+        panel.html(panelStr);
     }
 
     // callApi('get','/deviceManagement', (jsonData)=>{
     //     console.log(jsonData);
     // })
+    function drawDrivePath(path, name, siteId) {
+      if (path) {
+        let formatPath = path.substring(path.lastIndexOf('root:') + 5);
+        
+        if (formatPath) {
+          formatPath = formatPath.substring(1);
+          formatPath = formatPath.split('/');
+          panelStr = `<span class="panel-item" onclick="siteDriveChildrenItems('${siteId}', '/drive/root', '${name}', '${siteId}')">${name}</span>`;
+          let itemPath = "/drive/root:";
+          if (Array.isArray(formatPath)) {
+            for(let ii = 0; ii < formatPath.length; ii++) {
+              let pathName = formatPath[ii];
+              let className = 'panel-item';
+              itemPath += "/" + pathName;
+              let method = `drawDriveFiles('${itemPath}', event)`;
+              if (formatPath.length - 1 === ii) {
+                className += ' on';
+                method = '';
+              }
+              
+              panelStr += `<span> > </span><span class="${className}" onclick="${method}">${pathName}</span>`;
+            }
+          }
+          return panelStr;
+        }
+      }
+      return `<span class="panel-item on">${name}</span>`;
+    }
+
+    function drawPath(path, siteId, name) {
+      let imgSrc = '';
+      let panelStr = '';
+      if ($('#'+siteId).next().find('img')[0]) {
+        imgSrc = $('#'+siteId).next().find('img').attr('src');
+      }
+      if (path) {
+        let formatPath = path.substring(path.lastIndexOf('root:') + 5);
+        
+        if (formatPath) {
+          formatPath = formatPath.substring(1);
+          formatPath = formatPath.split('/');
+          panelStr = `<span class="panel-item" onclick="siteDriveChildrenItems('${siteId}', '/drive/root', '${name}', '${siteId}')">`;
+          if (imgSrc) {
+            panelStr += `<img style="margin-right:5px;" width="24" height="24" src="${imgSrc}" alt="이미지">`
+          }
+          panelStr += ` ${name}</span>`;
+          let itemPath = "/drive/root:";
+          if (Array.isArray(formatPath)) {
+            for(let ii = 0; ii < formatPath.length; ii++) {
+              let pathName = formatPath[ii];
+              let className = 'panel-item';
+              itemPath += "/" + pathName;
+              let method = `siteDriveChildrenItems('${siteId}','${itemPath}', '${name}')`;
+              if (formatPath.length - 1 === ii) {
+                className += ' on';
+                method = '';
+              }
+              
+              panelStr += `<span> > </span><span class="${className}" onclick="${method}">${pathName}</span>`;
+            }
+          }
+          return panelStr;
+        }
+      }
+      
+      panelStr = `<span class="panel-item on">`;
+      if (imgSrc) {
+        panelStr += `<img style="margin-right:5px;" width="24" height="24" src="${imgSrc}" alt="이미지">`
+      }
+
+      panelStr += ` ${name}</span>`;
 
+      return panelStr;
+    }
     function nameChange() {
         if ($('.file-content > .on .file_name')[0]) {
-          console.log($('.file-content > .on .file_name').text());
         }
     }
 
@@ -398,13 +345,28 @@
       });
       $fileContent.on('dragleave', function(e){
           $(this).css('background-color', '#f5f5f5');
+        
       })
 
       $fileContent.on("drop", function(e){
             e.preventDefault();
             $(this).css('background-color', '#f5f5f5');
-            const file = e.originalEvent.dataTransfer.files[0];
-            encryptFile(file, driveId);
+            const transfer = e.originalEvent.dataTransfer;
+            console.log(e.dataTransfer);
+            console.log(transfer.items);
+            if (transfer.items.length > 0) {
+              for (let ii=0; ii < transfer.items.length; ii++) {
+                entries[0] = e.dataTransfer.items[ii].webkitGetAsEntry();
+                console.log(entries[0]);
+              }
+            }
+            if (transfer && transfer.files && transfer.files.length > 0) {
+                for (let ii = 0; ii < transfer.files.length; ii++) {
+                  console.log(transfer.files[ii]);
+                }
+            }
+            // const file = e.originalEvent.dataTransfer.files[0];
+            // encryptFile(file, driveId);
             // if (file && file.type.startsWith("image")) {
             //     displayImage(file);
             // }
@@ -482,48 +444,23 @@
       });
     }
 
-    function findChildrenItems(id, type) {
-      window.event.preventDefault();
-      window.event.stopPropagation();
-
-      // const param = {
-      //     "requests": [
-      //         {
-      //             "entityTypes": [
-      //                 "driveItem"
-      //             ],
-      //             "query": {
-      //                 "queryString": id
-      //             }
-      //         }
-      //     ]
-      // }
-      // 
-      // callApi('post', '/search/query', (jsonData)=>{
-      //   console.log(jsonData);
-      // },null, param);
-      if ($('#' + id)[0]) return;
-      let uri = '/groups/'+groupId+'/drive/items/'+id+'/children';
-      callApi('get', uri, (jsonData)=>{
-        drawFileList(jsonData);
-      },null);
-    }
-
-    function findOneDriveChildrenItems(id) {
-      callApi('get', '/me/drive/items/'+id+'/children', (jsonData)=>{
-        drawOneDrive(jsonData);
-      },null);
+    function siteDriveChildrenItems(siteId, path, name, value) {
+      if (value) {
+        $('.tree.group input').prop('checked', true);
+        $('input[value="'+value+'"]').prop('checked', false);
+        if ($('.panel').children().text() === name) {
+          return;
+        }
+      }
+      callApi('get', '/sites/' +siteId +'/'+ path, (jsonData)=>{
+        if (jsonData && jsonData.id) {
+          callApi('get', '/sites/' +siteId +'/drive/items/'+jsonData.id+'/children', (childrenData)=>{
+            // drawOneDrive(childrenData, jsonData, name);
+            drawDriveFiles(childrenData, jsonData, name);
+          },null); 
+        }
+      })
     }
-    // $.ajax({
-    //   url: '/test',
-    //   method : 'post',
-    //   success: function(res){
-    //     console.log(res);
-    //   },
-    //   error: function(error) {
-    //     console.log(error);
-    //   }
-    // })
 
     function getVolume(amount) {
       const tb = 1099511627776;
@@ -583,34 +520,51 @@
           }
       })
     }
-
+//sites/2ec19976-da37-4d7e-993a-fe82cf97a586/drive/items/01ILDTREXEZN5EXKD5YJHLNYXU6HTAX5VS/children
+//oneDrive => /me/drive/items/${item.id}/children
     function drawList(jsonData) {
       const group = $('.group');
       group.empty();
       if (jsonData) {
           const {oneDrive, joinedTeams, sites} = jsonData;
+          let parentId = '';
+          let siteId = '';
+          if (oneDrive && oneDrive.length > 0) {
+            if (oneDrive[0].parentReference) {
+              siteId = oneDrive[0].parentReference.siteId;
+            }
+          }
+          // <input type="checkbox" checked="false" id="my-one-drive" value="${parentId}" onclick="showOneDrive(event)">
+          //siteDriveChildrenItems(siteId, path, name) 
           let str = `<li>
-                      <input type="checkbox" checked="false" id="my-one-drive" onclick="showOneDrive()">
-                      <label for="my-one-drive">One Drive</label>
+                      <input type="checkbox" checked="false" id="${siteId}" value="${siteId}" onclick="siteDriveChildrenItems('${siteId}', '/drive/root', 'One Drive', '${siteId}')">
+                      <label for="${siteId}">One Drive</label>
                       <ul>`;
                       if (oneDrive && oneDrive.length > 0) {
                         oneDrive.forEach((drive)=>{
-                          str +=`<li id="${drive.id}" onclick="DrawOneDriveFile('${drive.id}', '${drive.name}')">${drive.name}</li>`
+                          str +=`<li id="${drive.id}" onclick="siteDriveChildrenItems('${siteId}', '/drive/root:/${drive.name}', 'One Drive')">${drive.name}</li>`
                         })
                       }
               str += `</ul>
                     </li>`;
-              if (joinedTeams) {
+              if (joinedTeams && joinedTeams.teams.length > 0) {
                 joinedTeams.teams.forEach((team)=>{
+                  const items = joinedTeams.items[team.id];
+                  let siteId;
+                  let path;
+                  if (items[0]) {
+                    let joinedRef = items[0].parentReference;
+                    siteId = joinedRef.siteId;
+                    path = joinedRef.path;
+                  }
                   str += `<li>
-                            <input type="checkbox" checked="false" id="joined-team" onclick="showJoinedTeam('${team.id}')">
-                            <label for="joined-team">${team.displayName}</label>
+                            <input type="checkbox" checked="false" id="${siteId}" value="${siteId}" onclick="siteDriveChildrenItems('${siteId}', '/drive/root', '${team.displayName}', '${siteId}')">
+                            <label for="${siteId}"><img width="24" height="24" src="data:image/jpeg;base64, ${team.image}" alt="이미지">&nbsp;${team.displayName}</label>
                             <ul>`;
-                            console.log('팀 : ',team);
-                            const items = joinedTeams.items[team.id];
+                            
                             if (items && items.length > 0) {
                               items.forEach((item)=>{
-                                str +=`<li id="${item.id}" onclick="showJoinedTeam('${item.id}', '${item.name}')">${item.name}</li>`
+                                str +=`<li id="${item.id}" onclick="siteDriveChildrenItems('${siteId}', '/drive/root:/${item.name}', '${team.displayName}')">${item.name}</li>`
                               })
                             }
                   str +=`</ul></li>`;
@@ -620,28 +574,85 @@
       }
     }
 
-    function showOneDrive() {
+    function showOneDrive(event) {
+      $('.tree.group input[type="checkbox"]').prop('checked', true);
+      event.target.checked = false;
+      if ($(event.target).next().text() === $('.panel').children().first().text()) {
+        return;
+      }
       callApi('get', '/me/drive/root/children', (jsonData)=>{
-        drawOneDrive(jsonData, 'One Drive', null);
+        drawOneDrive(jsonData, '', $(event.target).next().text());
       })
     }
 
     function DrawOneDriveFile(id, name) {
-      callApi('get', '/me/drive/items/' + id, (jsonData)=>{
+      callApi('get', '/me/drive/items/' + id + '/children', (jsonData)=>{
         drawOneDrive(jsonData, name, id);
       })
     }
 
-    function showJoinedTeam(id, name) {
+    function showJoinedTeam(id, name, event) {
+      // const $target = $(event.target);
+      // const isChecked = $target.is(':checked');
+      // if (isChecked) {
+      //   $target.prop('checked', 'checked');
+      //   return;
+      // }
+      $('.tree.group input[type="checkbox"]').prop('checked', true);
+      event.target.checked = false;
+      if ($(event.target).next().text() === $('.panel').children().first().text()) {
+        return;
+      }
       callApi('get', '/groups/'+id+'/drive/items/root/children', (jsonData)=>{
-        drawFileList(jsonData, name, id);
+        drawFileList(jsonData, name, id, $(event.target));
       })
     }
+
     function sorting(type) {
-      console.log($('.head-'+type));
-      console.log(_selectedData);
-      // _selectedData.sort(function (a, b){
+      const $sortingColumn = $('.head-'+type);
+      const isSelected = $sortingColumn.hasClass('on');
+      if ($('.file-title > div.on')[0]) {
+        $('.file-title > div.on').removeClass('on');
+      } 
+
+      if (_selectedData.value.length > 0) {
+        let first = 1;
+        let end = -1;
+        if (!isSelected) {
+          $sortingColumn.addClass('on');
+        }
+        else {
+          first = -1;
+          end = 1; 
+        }
+        
+
+        _selectedData.value.sort(function (a, b){
+          return a[type] > b[type] ? first : a[type] === b[type] ? 0 : end;
+        });
+
+        if ($('.panel').children().first().text() === 'One Drive') {
+          drawOneDrive(_selectedData);
+        }
+        else {
+
+        }
+      }
+  }
+  $('.tree.group input[type="checkbox"]').on('change', function(event){
+    console.log($(this));
+  })
+
+  function downloadItems(downloadUrl, name, event) {
+    event.preventDefault();
+    event.stopPropagation();
+    const link = document.createElement('a');
+    link.download = name;
+    link.href = downloadUrl;
+    $('body').append(link);
+    link.click();
+    $(link).remove();
+    window.URL.revokeObjectURL(downloadUrl);
+  }
 
-      // })
-    }
 </script>

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä