hello.html 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830
  1. <html lang="en">
  2. <head>
  3. <meta charset="utf-8" />
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  5. <link rel="icon" href="/favicon.ico" />
  6. <link rel="stylesheet" type="text/css" href="/static/styles/custom.css?v=05" />
  7. <script
  8. src="https://res.cdn.office.net/teams-js/2.17.0/js/MicrosoftTeams.min.js"
  9. integrity="sha384-xp55t/129OsN192JZYLP0rGhzjCF9aYtjY0LVtXvolkDrBe4Jchylp56NrUYJ4S2"
  10. crossorigin="anonymous"
  11. ></script>
  12. <script src="https://secure.aadcdn.microsoftonline-p.com/lib/1.2.1/js/msal.js"></script>
  13. <script src="/static/scripts/teamsapp.js"></script>
  14. <script src="https://code.jquery.com/jquery-latest.min.js"></script>
  15. <title>Microsoft Teams Tab</title>
  16. <style>
  17. </style>
  18. </head>
  19. <body>
  20. <div class="wrap">
  21. <div class="content">
  22. <nav>
  23. <div class="tree">
  24. <li class="">
  25. <input type="checkbox" id="file">
  26. <label for="file">내 OFFICE 365 파일</label>
  27. </li>
  28. </div>
  29. <div class="total">모두</div>
  30. <div class="tree group"></div>
  31. </nav>
  32. <section>
  33. <div class="menu">
  34. <div class="sub-menu">
  35. <img src="/static/images/menu-icon.png" width="30" height="30" alt="메뉴 아이콘">
  36. </div>
  37. <div onclick="menuOpen(event, 'mk-items')">
  38. <div>새로만들기</div>
  39. <div class="mk-items click-menu">
  40. <div onclick="mkdir()"><img src="/static/images/folder.png" width="20" height="20" alt="문서 이미지">&nbsp;폴더</div>
  41. <div><img src="/static/images/docx.svg" width="20" height="20" alt="문서 이미지">&nbsp;Word 문서</div>
  42. <div><img src="/static/images/xlsx.svg" width="20" height="20" alt="문서 이미지">&nbsp;Excel 통합 문서</div>
  43. <div><img src="/static/images/pptx.svg" width="20" height="20" alt="문서 이미지">&nbsp;PowerPoint 프레젠테이션</div>
  44. </div>
  45. </div>
  46. <div onclick="menuOpen(event, 'upload-items')">
  47. <div>업로드</div>
  48. <div class="upload-items click-menu">
  49. <div style="width: 160px;">폴더</div>
  50. <div style="width: 160px;">파일</div>
  51. </div>
  52. </div>
  53. <div onclick="refreshDrive()">새로고침</div>
  54. <div class="one-drive-button">OneDrive에서 열기</div>
  55. </div>
  56. <div class="panel"></div>
  57. <div class="file-title">
  58. <div><img src="/static/images/file.png" width="20" alt="파일"></div>
  59. <div class="head-name" onclick="sorting('name')">이름</div>
  60. <div class="head-size" onclick="sorting('size')">용량</div>
  61. <div class="head-lastModifiedDateTime" onclick="sorting('lastModifiedDateTime')">수정된 날짜</div>
  62. <div class="head-lastModifiedBy.user.displayName" onclick="sorting('lastModifiedBy.user.displayName')">수정한 사람</div>
  63. <div class="head-label" onclick="sorting('label')">민감도</div>
  64. </div>
  65. <div class="file-content"></div>
  66. </section>
  67. </div>
  68. </div>
  69. </body>
  70. </html>
  71. <script>
  72. const groupId = '3df73dac-a8bc-4dd0-9159-fdb2c696c067';
  73. const groupMap = new Map();
  74. let _selectedData = [];
  75. let _listData = [];
  76. $(()=>{
  77. microsoftTeams.appInitialization.notifySuccess();
  78. getGroupList();
  79. window.oncontextmenu = function () {
  80. return false;
  81. };
  82. window.addEventListener('click', function() {
  83. $('.click-menu').css('display', 'none');
  84. })
  85. });
  86. function menuOpen(event, className) {
  87. event.preventDefault();
  88. event.stopPropagation();
  89. $('.click-menu:not(.'+className+')').css('display', 'none');
  90. $('.' + className).toggle();
  91. }
  92. function drawDriveFiles(jsonData, parentData, name) {
  93. _selectedData = [];
  94. const panel = $('.panel');
  95. let panelStr = `<span class="panel-item on">${name}</span>`;
  96. const $fileContent = $('.file-content');
  97. const $oneDriveBtn = $('.one-drive-button');
  98. let text = name;
  99. if (name !== 'One Drive') {
  100. text = 'SharePoint'
  101. }
  102. $oneDriveBtn.text(text+'에서 열기');
  103. $oneDriveBtn.off('click');
  104. if (jsonData && jsonData.value && jsonData.value.length > 0) {
  105. if (jsonData.value[0].webUrl) {
  106. $oneDriveBtn.on('click', ()=>{
  107. window.open(jsonData.value[0].webUrl);
  108. });
  109. };
  110. _selectedData = jsonData;
  111. const selectedPref = _selectedData.value[0].parentReference;
  112. if (selectedPref && selectedPref.path) {
  113. let path = selectedPref.path;
  114. panelStr = drawPath(path, selectedPref.siteId, name);
  115. }
  116. let str = "";
  117. jsonData.value.forEach((obj, idx)=>{
  118. dragAndDrop(obj.id);
  119. let images = "/static/images/";
  120. let modifyName = "";
  121. if (obj.lastModifiedBy && obj.lastModifiedBy.user) {
  122. modifyName = obj.lastModifiedBy.user.displayName;
  123. }
  124. if (obj.folder || obj.driveType) {
  125. images += "folder.png";
  126. }
  127. else if (obj.file && obj.name) {
  128. let ext = obj.name.substring(obj.name.lastIndexOf('.') + 1);
  129. let imageExt = ".svg";
  130. if (obj.file.mimeType && obj.file.mimeType.includes('image')){
  131. ext = 'photo';
  132. }
  133. else if (['txt'].includes(ext)) {
  134. ext = 'txt';
  135. }
  136. else if (['pptx', 'ppt', 'pptm'].includes(ext)) {
  137. ext = 'pptx';
  138. }
  139. else if (['xlsx', 'xlsm', 'xlsb', 'xltx'].includes(ext)) {
  140. ext = 'xlsx';
  141. }
  142. else if (['pdf'].includes(ext)) {
  143. ext = 'pdf';
  144. }
  145. else if (['doc', 'docx'].includes(ext)) {
  146. ext = 'docx';
  147. }
  148. else if (['one', 'onetoc'].includes(ext)) {
  149. ext = 'onetoc';
  150. }
  151. else if (['vsd', 'vdx', 'vdw', 'vstx', 'vstm', 'vst', 'vtx', 'vsdx'].includes(ext)) {
  152. ext = 'vsdx';
  153. }
  154. else if (['zip', 'apk', 'rar', '7z', 'tar'].includes(ext)) {
  155. ext = 'zip';
  156. }
  157. else if (['mp4', 'mov', 'Webm', 'mp3','wav', 'Ogg'].includes(ext)) {
  158. ext = 'clipchamp';
  159. }
  160. else {
  161. ext = 'file';
  162. imageExt = '.png';
  163. }
  164. images += ext + imageExt;
  165. }
  166. else {
  167. images += "file.png";
  168. }
  169. let amount = '0 Bytes';
  170. if (obj.size) {
  171. amount = getVolume(obj.size);
  172. }
  173. let modifyDate = obj.lastModifiedDateTime;
  174. if (modifyDate) {
  175. modifyDate = modifyDate.replace('T', ' ');
  176. modifyDate = modifyDate.substring(5, 7)+ '월 '+ modifyDate.substring(8, 10)+ '일';
  177. }
  178. // let method = `findOneDriveChildrenItems('${obj.id}')`;(siteId, path, name, value)
  179. let method = `siteDriveChildrenItems('${obj.parentReference.siteId}','${obj.parentReference.path + '/' + obj.name}','${name}', null, event)`;
  180. if (obj.file) {
  181. method = `downloadItems('${obj['@microsoft.graph.downloadUrl']}', '${obj.name}', event)`;
  182. }
  183. str += `
  184. <div id="row_${idx}">
  185. <div>
  186. <input type="checkbox" name="row_${idx}" value="${obj.id}" onclick="event.stopPropagation()">
  187. <img src="${images}" width="20" height="20" alt="폴더 이미지">
  188. </div>
  189. <div class="file_name"><span class="sp-name" onclick="${method}">${obj.name}</span></div>
  190. <div>${amount}</div>
  191. <div>${modifyDate}</div>
  192. <div>${modifyName}</div>
  193. <div></div>
  194. </div>`
  195. });
  196. $fileContent.html(str);
  197. $('.file-content > div').on('click', function(e){
  198. e.preventDefault();
  199. const checkbox = $('input[name="'+$(this).attr('id') + '"]');
  200. if (checkbox[0]) {
  201. const isChecked = checkbox.prop("checked");
  202. checkbox.prop('checked', !isChecked);
  203. const method = !isChecked ? 'addClass' : 'removeClass';
  204. $(this)[method]('on');
  205. }
  206. });
  207. window.addEventListener('click', ()=>{
  208. if ($('.toggle-box')[0]){
  209. $('.toggle-box').remove();
  210. }
  211. })
  212. $('.file-content > div').on('mousedown', function(e){
  213. if ((e.button == 2) || (e.which == 3)) {
  214. const checkbox = $('input[name="'+$(this).attr('id') + '"]');
  215. if (!$(this).hasClass('on')) {
  216. checkbox.prop('checked', true);
  217. $(this).addClass('on');
  218. }
  219. if ($('.toggle-box')[0]) {
  220. $('.toggle-box').remove();
  221. }
  222. const {clientX, clientY} = e;
  223. const toggleBox = $(`<div class="toggle-box" style="position:absolute; top:${clientY}; left: ${clientX}">
  224. <div>편집</div>
  225. <div>탭으로 설정</div>
  226. <div>다운로드</div>
  227. <div onclick="deleteItem()">삭제</div>
  228. <div>이동</div>
  229. <div>복사</div>
  230. <div onclick="nameChange()">이름 바꾸기</div>
  231. </div>`);
  232. $('body').append(toggleBox);
  233. }
  234. });
  235. }
  236. else {
  237. if (parentData && parentData.folder && parentData.folder.childCount === 0) {
  238. const refData = parentData.parentReference;
  239. let path = '';
  240. if (refData.path) {
  241. path = refData.path +'/' + parentData.name;
  242. }
  243. panelStr = drawPath(path, refData.siteId, name);
  244. $oneDriveBtn.off('click');
  245. if (parentData.webUrl){
  246. $oneDriveBtn.on('click', ()=>{
  247. window.open(parentData.webUrl);
  248. });
  249. }
  250. $fileContent.html(`<div class="empty-box">
  251. <img src="/static/images/empty_folder_v2.svg" alt="이미지">
  252. <div>이 폴더는 비어 있습니다.</div>
  253. </div>`)
  254. }
  255. }
  256. panel.html(panelStr);
  257. }
  258. //새로고침 이벤트
  259. function refreshDrive() {
  260. const selectedDrive = $('.panel-item.on');
  261. if (selectedDrive[0]) {
  262. selectedDrive.removeClass('on');
  263. selectedDrive.click();
  264. }
  265. }
  266. //삭제 이벤트
  267. function deleteItem() {
  268. const checkArr = $('.file-content input[type="checkbox"]');
  269. const checkedArr = [];
  270. let siteId = getSitesId();
  271. if (!siteId) return alert('그룹 정보를 확인 할 수 없습니다.');
  272. if (checkArr.length > 0) {
  273. for (let ii = 0; ii < checkArr.length; ii++) {
  274. if (checkArr.eq(ii).is(':checked')) {
  275. const title = checkArr.eq(ii).parent().next().text();
  276. const team = _listData.joinedTeams;
  277. const idx = team.teams.findIndex(obj => obj.sharePoint.siteId === siteId);
  278. if (idx >= 0) {
  279. const sameIndex = team.items[team.teams[idx].id].findIndex(obj => obj.id === checkArr.eq(ii).val());
  280. if (sameIndex >= 0) {
  281. return alert('채널 정보는 삭제하실수 없습니다.');
  282. };
  283. }
  284. checkedArr.push(checkArr.eq(ii).val());
  285. }
  286. }
  287. if (checkedArr.length === 0) {
  288. alert('선택된 정보가 없습니다. 삭제하실 파일을 먼저 선택해주세요.');
  289. }
  290. else {
  291. if (confirm('선택된 파일을 삭제하시겠습니까?')) {
  292. $.ajax({
  293. method:'post',
  294. url : "/deleteItems",
  295. data: {
  296. siteId: siteId,
  297. itemIds : JSON.stringify(checkedArr),
  298. },
  299. success: (res)=> {
  300. if (res.success === 'S') {
  301. const selectedDrive = $('.panel-item.on');
  302. selectedDrive.removeClass('on');
  303. selectedDrive.click();
  304. }
  305. alert(res.message);
  306. },
  307. error: (error)=> {
  308. console.log(error);
  309. }
  310. })
  311. }
  312. else {
  313. alert('선택된 그룹 정보가 없습니다. 선택 그룹을 확인해 주세요.');
  314. }
  315. }
  316. }
  317. }
  318. function drawPath(path, siteId, name) {
  319. let imgSrc = '';
  320. let panelStr = '';
  321. if ($('#'+siteId + '_li').find('img')[0]) {
  322. imgSrc = $('#'+siteId + '_li').find('img').attr('src');
  323. }
  324. if (path) {
  325. let formatPath = path.substring(path.lastIndexOf('root:') + 5);
  326. if (formatPath) {
  327. formatPath = formatPath.substring(1);
  328. formatPath = formatPath.split('/');
  329. panelStr = `<span class="panel-item" id="${siteId}" onclick="siteDriveChildrenItems('${siteId}', '/drive/root', '${name}', '${siteId}', event)">`;
  330. if (imgSrc) {
  331. panelStr += `<img style="margin-right:5px;" width="24" height="24" src="${imgSrc}" alt="이미지">`
  332. }
  333. panelStr += ` ${name}</span>`;
  334. let itemPath = "/drive/root:";
  335. if (Array.isArray(formatPath)) {
  336. for(let ii = 0; ii < formatPath.length; ii++) {
  337. let pathName = formatPath[ii];
  338. let className = 'panel-item';
  339. itemPath += "/" + pathName;
  340. let method = `siteDriveChildrenItems('${siteId}','${itemPath}', '${name}', null, event)`;
  341. if (formatPath.length - 1 === ii) {
  342. className += ' on';
  343. // method = '';
  344. }
  345. panelStr += `<span> > </span><span class="${className}" onclick="${method}">${pathName}</span>`;
  346. }
  347. }
  348. return panelStr;
  349. }
  350. }
  351. panelStr = `<span class="panel-item on" id="${siteId}" onclick="siteDriveChildrenItems('${siteId}', '/drive/root', '${name}', '${siteId}', event)">`;
  352. if (imgSrc) {
  353. panelStr += `<img style="margin-right:5px;" width="24" height="24" src="${imgSrc}" alt="이미지">`
  354. }
  355. panelStr += ` ${name}</span>`;
  356. return panelStr;
  357. }
  358. function nameChange() {
  359. if ($('.file-content > .on .file_name')[0]) {
  360. }
  361. }
  362. function dragAndDrop(driveId) {
  363. const $fileContent = $('.file-content');
  364. $fileContent.off('dragover');
  365. $fileContent.off('dragleave');
  366. $fileContent.off('drop');
  367. $fileContent.on('dragover', function(e){
  368. e.preventDefault();
  369. $(this).css('background-color', '#eee');
  370. });
  371. $fileContent.on('dragleave', function(e){
  372. $(this).css('background-color', '#f5f5f5');
  373. })
  374. $fileContent.on("drop", function(e){
  375. e.preventDefault();
  376. $(this).css('background-color', '#f5f5f5');
  377. const transfer = e.originalEvent.dataTransfer;
  378. if (transfer && transfer.files && transfer.files.length > 0) {
  379. for (let ii = 0; ii < transfer.files.length; ii++) {
  380. console.log(transfer.files[ii]);
  381. }
  382. }
  383. // const file = e.originalEvent.dataTransfer.files[0];
  384. // encryptFile(file, driveId);
  385. // if (file && file.type.startsWith("image")) {
  386. // displayImage(file);
  387. // }
  388. });
  389. }
  390. function encryptFile(file, driveId) {
  391. const extArr = [
  392. 'lnk', 'exe', 'com', 'cmd', 'bat', 'dll', 'ini',
  393. 'pst', 'sca', 'drm', 'sys', 'cpl', 'inf', 'drv',
  394. 'dat', 'tmp', 'msp', 'msi', 'pdb', 'jar'
  395. ]
  396. if (file && file.name) {
  397. const ext = file.name.substring(file.name.lastIndexOf('.') + 1);
  398. if (extArr.includes(ext)) {
  399. const modal = `<div class="modal error" style="display: flex;">
  400. <div style="display:flex; border:1px solid red; flex-direction: column; padding:20px;justify-content:center;width:400px;height:120px; background-color:white;">
  401. <div style='width:100%;margin-bottom:10px; height:40px;display:flex;justify-content:space-between; align-items:center; font-weight: bold; font-size: 18px;'>
  402. <div style="">파일 형식 오류</div>
  403. <div onclick="modalClose()" style="cursor:pointer; user-select:none;">x</div>
  404. </div>
  405. <div>
  406. 암호화 할수 없는 형식의 파일입니다.<br>
  407. 파일명 : ${file.name}
  408. </div>
  409. </div>
  410. </div>`;
  411. $('body').append($(modal));
  412. }
  413. uploadFiles(itemId)
  414. }
  415. }
  416. function modalClose() {
  417. if ($('.modal.error')[0]){
  418. $('.modal.error').remove();
  419. }
  420. }
  421. function callApi(type, uri, callBackMethod, args, params) {
  422. $.ajax({
  423. method: 'post',
  424. url : "/api-"+type,
  425. data: {
  426. api_uri: uri,
  427. param : JSON.stringify(params),
  428. },
  429. success: (res)=> {
  430. callBackMethod(res, args);
  431. },
  432. error: (error)=> {
  433. console.log(error);
  434. }
  435. });
  436. }
  437. function siteDriveChildrenItems(siteId, path, name, value, event) {
  438. event.preventDefault();
  439. event.stopPropagation();
  440. if ($(event.target).hasClass('on')) {
  441. return;
  442. }
  443. if (value) {
  444. // $('.tree.group input').prop('checked', true);
  445. $('input[value="'+value+'"]').prop('checked', false);
  446. if ($('.panel').children().text() === name) {
  447. return;
  448. }
  449. }
  450. console.log('/sites/' +siteId + path);
  451. callApi('get', '/sites/' +siteId + path, (jsonData)=>{
  452. if (jsonData && jsonData.id) {
  453. if (jsonData.folder && jsonData.folder.childCount === 0) {
  454. if (path.indexOf('root:') < 0) {
  455. path = '';
  456. }
  457. const panelStr = drawPath(path, siteId, name);
  458. const $oneDriveBtn = $('.one-drive-button');
  459. const $fileContent = $('.file-content');
  460. const $panel = $('.panel');
  461. $oneDriveBtn.off('click');
  462. if (jsonData.webUrl){
  463. $oneDriveBtn.on('click', ()=>{
  464. window.open(jsonData.webUrl);
  465. });
  466. }
  467. $fileContent.html(`<div class="empty-box">
  468. <img src="/static/images/empty_folder_v2.svg" alt="이미지">
  469. <div>이 폴더는 비어 있습니다.</div>
  470. </div>`);
  471. $panel.html(panelStr);
  472. return;
  473. }
  474. callApi('get', '/sites/' +siteId +'/drive/items/'+jsonData.id+'/children', (childrenData)=>{
  475. drawDriveFiles(childrenData, jsonData, name);
  476. },null);
  477. }
  478. })
  479. }
  480. function getVolume(amount) {
  481. const tb = 1099511627776;
  482. const gb = 1073741824;
  483. const mb = 1048576;
  484. const kb = 1024;
  485. if (!isNaN(Number(amount)) && amount > 0) {
  486. if (amount >= tb) {
  487. amount = (amount/tb).toFixed(2) + 'TB';
  488. }
  489. else if (amount >= gb){
  490. amount = (amount/gb).toFixed(2) + 'GB';
  491. }
  492. else if (amount >= mb){
  493. amount = (amount/mb).toFixed(2) + 'MB';
  494. }
  495. else if (amount >= kb){
  496. amount = (amount/kb).toFixed(2) + 'KB';
  497. }
  498. else {
  499. amount += "Byte";
  500. }
  501. }
  502. return amount;
  503. }
  504. function uploadFiles(itemId) {
  505. //
  506. $.ajax({
  507. method: 'post',
  508. url : "/api-post",
  509. data: {
  510. api_uri: '/groups/'+groupId+'/drive/items/'+itemId+'/content',
  511. scopes : 'Files.ReadWrite',
  512. param : params,
  513. },
  514. success: (res)=> {
  515. callBackMethod(res, args);
  516. },
  517. error: (error)=> {
  518. console.log(error);
  519. }
  520. });
  521. }
  522. function getGroupList() {
  523. $.ajax({
  524. method: 'post',
  525. url : "/getGroupList",
  526. success: (res)=> {
  527. drawList(res);
  528. },
  529. error: (error)=> {
  530. console.log(error);
  531. }
  532. })
  533. }
  534. function drawList(jsonData) {
  535. const group = $('.group');
  536. group.empty();
  537. if (jsonData) {
  538. _listData = jsonData;
  539. const groupImageUrl = '/_api/siteiconmanager/getsitelogo?type=1';
  540. const {oneDrive, joinedTeams, sites} = jsonData;
  541. let parentId = '';
  542. let siteId = '';
  543. let str = "";
  544. if (joinedTeams && joinedTeams.teams.length > 0) {
  545. str += `<li>
  546. <input id="my-team" type="checkbox">
  547. <label for="my-team">내 Teams 그룹</label>
  548. <ul class="group-section">
  549. `
  550. joinedTeams.teams.forEach((team)=>{
  551. const items = joinedTeams.items[team.id];
  552. let siteId = team.sharePoint.siteId;
  553. // onclick="siteDriveChildrenItems('${siteId}', '/drive/root', '${team.displayName}', '${siteId}', event)"
  554. str += `<li id="${siteId}_li">
  555. <input type="checkbox" checked="false" id="${siteId}_check" value="${siteId}">
  556. <label for="${siteId}_check"><img width="24" height="24" src="${team.sharePoint.siteUrl}${groupImageUrl}" alt="이미지">&nbsp;${team.displayName}</label>
  557. <ul>`;
  558. if (items && items.length > 0) {
  559. items.forEach((item)=>{
  560. str +=`<li id="${item.id}" onclick="siteDriveChildrenItems('${siteId}', '/drive/root:/${item.name}', '${team.displayName}', null, event)">${item.name}</li>`
  561. })
  562. }
  563. str +=`</ul></li>`;
  564. })
  565. str += '</ul></li>';
  566. }
  567. if (oneDrive) {
  568. const {teams, items} = oneDrive;
  569. const sharePoint = teams.sharePoint;
  570. siteId = sharePoint.siteId;
  571. // str += `<div>
  572. // <input type="checkbox" checked="false" id="${siteId}" value="${siteId}" onclick="siteDriveChildrenItems('${siteId}', '/drive/root', 'One Drive', '${siteId}', event)">
  573. // <label for="${siteId}"><img width="24" height="24" src="${sharePoint.siteUrl}${groupImageUrl}" alt="그룹 이미지">&nbsp;One Drive</label>
  574. // </div>`;
  575. str += `<div id="${siteId}_li" onclick="siteDriveChildrenItems('${siteId}', '/drive/root', 'One Drive', '${siteId}', event)">
  576. <img width="24" height="24" src="${sharePoint.siteUrl}${groupImageUrl}" alt="그룹 이미지">&nbsp;One Drive
  577. </div>`;
  578. }
  579. if (sites) {
  580. let {teams, items} = sites;
  581. if (!Array.isArray(teams)) {
  582. teams = [teams];
  583. }
  584. for (let team of teams) {
  585. // const items = sites.items[team.id];
  586. let siteId = team.sharePoint.siteId;
  587. let path;
  588. let imageUrl;
  589. // str += `<li>
  590. // <input type="checkbox" checked="false" id="${siteId}" value="${siteId}" onclick="siteDriveChildrenItems('${siteId}', '/drive/root', '${team.displayName}', '${siteId}', event)">
  591. // <label for="${siteId}"><img width="24" height="24" src="${team.sharePoint.siteUrl}${groupImageUrl}" alt="이미지">&nbsp;${team.displayName}</label>
  592. // <ul>`;
  593. // if (items && items.length > 0) {
  594. // items.forEach((item)=>{
  595. // str +=`<li id="${item.id}" onclick="siteDriveChildrenItems('${siteId}', '/drive/root:/${item.name}', '${team.displayName}', null, event)">${item.name}</li>`
  596. // })
  597. // }
  598. // str +=`</ul></li>`;
  599. str += `
  600. <div id="${siteId}_li" onclick="siteDriveChildrenItems('${siteId}', '/drive/root', '${team.displayName}', '${siteId}', event)">
  601. <img width="24" height="24" src="${team.sharePoint.siteUrl}${groupImageUrl}" alt="그룹 이미지">&nbsp;${team.displayName}
  602. </div>`;
  603. }
  604. }
  605. group.append($(str));
  606. }
  607. }
  608. function sorting(type) {
  609. const $sortingColumn = $('.head-'+type);
  610. const isSelected = $sortingColumn.hasClass('on');
  611. if ($('.file-title > div.on')[0]) {
  612. $('.file-title > div.on').removeClass('on');
  613. }
  614. if (_selectedData.value.length > 0) {
  615. let first = 1;
  616. let end = -1;
  617. if (!isSelected) {
  618. $sortingColumn.addClass('on');
  619. }
  620. else {
  621. first = -1;
  622. end = 1;
  623. }
  624. _selectedData.value.sort(function (a, b){
  625. return a[type] > b[type] ? first : a[type] === b[type] ? 0 : end;
  626. });
  627. if ($('.panel').children().first().text() === 'One Drive') {
  628. drawOneDrive(_selectedData);
  629. }
  630. else {
  631. }
  632. }
  633. }
  634. $('.tree.group input[type="checkbox"]').on('change', function(event){
  635. console.log($(this));
  636. })
  637. function downloadItems(downloadUrl, name, event) {
  638. event.preventDefault();
  639. event.stopPropagation();
  640. const link = document.createElement('a');
  641. link.download = name;
  642. link.href = downloadUrl;
  643. $('body').append(link);
  644. link.click();
  645. $(link).remove();
  646. window.URL.revokeObjectURL(downloadUrl);
  647. }
  648. function makeFolder() {
  649. const $folderName = $('#folder_name');
  650. const name = $folderName.val();
  651. if (!name || !name.trim()) {
  652. $folderName.focus();
  653. return alert("폴더명을 입력해주세요.");
  654. }
  655. let siteId = getSitesId();
  656. if (siteId === null) {
  657. return alert('선택된 그룹 정보를 찾을 수 없습니다. 생성할 그룹을 선택해주세요.');
  658. }
  659. const groupIndex = _listData.joinedTeams.teams.findIndex(obj => obj.sharePoint.siteId === siteId);
  660. const pathArr = $('.panel').children();
  661. if (groupIndex >= 0 && $('.panel').children().length === 1) {
  662. return alert('채널 리스트를 먼저 선택해 주세요.');
  663. }
  664. let sitePath = '/drive/root'
  665. if (pathArr.length > 1) {
  666. sitePath += ':';
  667. for (let ii = 0; ii < pathArr.length; ii++) {
  668. const path = pathArr.eq(ii).text();
  669. if (ii !== 0 && path !== " > ") {
  670. sitePath += "/" + path;
  671. }
  672. }
  673. }
  674. $.ajax({
  675. method: 'post',
  676. data : {
  677. siteId : siteId,
  678. path : sitePath,
  679. param : JSON.stringify({
  680. name: name,
  681. folder: { },
  682. '@microsoft.graph.conflictBehavior': 'rename'
  683. })
  684. },
  685. url : '/makeFolder',
  686. success: (res) => {
  687. alert('폴더가 생성되었습니다.\n폴더명 : '+ res.name);
  688. $('.modal').remove();
  689. const selectDrive = $('.panel-item.on');
  690. selectDrive.removeClass('on');
  691. selectDrive.click();
  692. },
  693. error: (error) => {
  694. console.log('==============error=============\n');
  695. console.log(error);
  696. }
  697. })
  698. }
  699. function mkdir() {
  700. const modalContainer = $(
  701. `<div class="modal" style="display: flex;">
  702. <div class="modal-box">
  703. <div class="header">
  704. <div class="title">폴더 생성</div>
  705. <div class="x-button">
  706. <span><img src="/static/images/x-button.png" width="15" height="15" alt="닫기 버튼" onclick="modalClose()"></span>
  707. </div>
  708. </div>
  709. <div class="modal-content">
  710. <div>폴더명</div>
  711. <input type="text" name="file_name" id="folder_name" value="">
  712. </div>
  713. <div class="button-box">
  714. <div class="name-btn" onclick="makeFolder()">만들기</div>
  715. <div class="name-btn" onclick="modalClose()">취소</div>
  716. </div>
  717. </div>
  718. </div>`);
  719. $('body').append(modalContainer);
  720. // callApi('post', '/sites/' +siteId +'/drive/items/'++'/children', (jsonData)=>{
  721. // console.log(jsonData);
  722. // callApi('post', '')
  723. // })
  724. }
  725. function modalClose(){
  726. $('.modal').remove();
  727. }
  728. function getSitesId() {
  729. let siteId = null;
  730. if ($('.panel').children().first()[0]) {
  731. siteId = $('.panel').children().first().attr('id');
  732. }
  733. return siteId;
  734. }
  735. function changeNames() {
  736. const modalContainer = $(
  737. `<div class="modal" style="display: flex;">
  738. <div class="modal-box">
  739. <div class="header">
  740. <div class="title">이름 바꾸기</div>
  741. <div class="x-button">
  742. <span><img src="/static/images/x-button.png" width="15" height="15" alt="닫기 버튼"></span>
  743. </div>
  744. </div>
  745. <div class="modal-content">
  746. <div>이름</div>
  747. <input type="text" name="file_name" id="" value="">
  748. </div>
  749. <div class="button-box">
  750. <div class="name-btn">이름 바꾸기</div>
  751. <div class="name-btn">취소</div>
  752. </div>
  753. </div>
  754. </div>`);
  755. }
  756. </script>