Picker.html 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons.css">
  5. <script type="text/javascript">
  6. var DIALOG_DIMENSIONS = {width: 620, height: 460};
  7. var DEVELOPER_KEY = 'AIzaSyB4sU8tc25bR_87qNb7eUVQN72_vv8mpbU';
  8. /**
  9. * Loads the Google Picker API.
  10. */
  11. function onApiLoad()
  12. {
  13. gapi.load('picker', {'callback': function()
  14. {
  15. getOAuthToken();
  16. }});
  17. }
  18. /**
  19. * Gets the user's OAuth 2.0 access token from the server-side script so that
  20. * it can be passed to Picker. This technique keeps Picker from needing to
  21. * show its own authorization dialog, but is only possible if the OAuth scope
  22. * that Picker needs is available in Apps Script. Otherwise, your Picker code
  23. * will need to declare its own OAuth scopes.
  24. */
  25. function getOAuthToken()
  26. {
  27. try
  28. {
  29. google.script.run.withSuccessHandler(createPicker)
  30. .withFailureHandler(showError).getOAuthToken();
  31. }
  32. catch (e)
  33. {
  34. showError(e.message);
  35. }
  36. }
  37. /**
  38. * Creates a Picker that can access the user's spreadsheets. This function
  39. * uses advanced options to hide the Picker's left navigation panel and
  40. * default title bar.
  41. *
  42. * @param {string} token An OAuth 2.0 access token that lets Picker access the
  43. * file type specified in the addView call.
  44. */
  45. function createPicker(token)
  46. {
  47. if (token)
  48. {
  49. var view1 = new google.picker.DocsView(google.picker.ViewId.FOLDERS)
  50. .setParent('root')
  51. .setIncludeFolders(true)
  52. .setMimeTypes('*/*');
  53. var view2 = new google.picker.DocsView()
  54. .setIncludeFolders(true);
  55. var view3 = new google.picker.DocsView()
  56. .setEnableDrives(true)
  57. .setIncludeFolders(true);
  58. var view4 = new google.picker.DocsUploadView()
  59. .setIncludeFolders(true);
  60. var picker = new google.picker.PickerBuilder()
  61. .addView(view1)
  62. .addView(view2)
  63. .addView(view3)
  64. .addView(view4)
  65. .addView(google.picker.ViewId.RECENTLY_PICKED)
  66. .enableFeature(google.picker.Feature.MULTISELECT_ENABLED)
  67. .enableFeature(google.picker.Feature.SUPPORT_DRIVES)
  68. .hideTitleBar()
  69. .setOAuthToken(token)
  70. .setDeveloperKey(DEVELOPER_KEY)
  71. .setCallback(pickerCallback)
  72. .setOrigin(google.script.host.origin)
  73. .setSize(DIALOG_DIMENSIONS.width - 2, DIALOG_DIMENSIONS.height - 2)
  74. .build();
  75. picker.setVisible(true);
  76. }
  77. else
  78. {
  79. showError('Unable to load the file picker.');
  80. }
  81. }
  82. /**
  83. * A callback function that extracts the chosen document's metadata from the
  84. * response object. For details on the response object, see
  85. * https://developers.google.com/picker/docs/result
  86. *
  87. * @param {object} data The response object.
  88. */
  89. function pickerCallback(data)
  90. {
  91. var action = data[google.picker.Response.ACTION];
  92. if (action == google.picker.Action.PICKED)
  93. {
  94. var items = [];
  95. var docs = data[google.picker.Response.DOCUMENTS];
  96. for (var i = 0; i < docs.length; i++)
  97. {
  98. items.push({name: docs[i][google.picker.Document.NAME], id: docs[i][google.picker.Document.ID]});
  99. }
  100. if (items.length > 0)
  101. {
  102. selectPages(items, function(execute)
  103. {
  104. if (execute)
  105. {
  106. document.getElementById('status').innerHTML = (items.length > 1) ?
  107. 'Inserting ' + items.length + ' Diagrams...' : "Inserting Diagram...";
  108. google.script.run.withSuccessHandler(closeWindow).pickerHandler(items);
  109. }
  110. else
  111. {
  112. google.script.host.close();
  113. }
  114. });
  115. }
  116. else
  117. {
  118. google.script.host.close();
  119. }
  120. }
  121. else if (action == google.picker.Action.CANCEL)
  122. {
  123. google.script.host.close();
  124. }
  125. }
  126. /**
  127. * Closes the window after all diagrams have been inserted.
  128. */
  129. function selectPages(items, handler)
  130. {
  131. document.getElementById('spinner').style.display = 'none';
  132. var pageInputs = [];
  133. var table = document.createElement('table');
  134. table.setAttribute('cellpadding', '4');
  135. table.style.width = '100%';
  136. var tbody = document.createElement('tbody');
  137. var title = document.createElement('td');
  138. title.setAttribute('colspan', '2');
  139. title.innerHTML = '<font size="3">Select ' + ((items.length > 1) ? 'Pages' : 'Page') +
  140. ' and Click Insert</font>';
  141. var row = document.createElement('tr');
  142. row.appendChild(title);
  143. tbody.appendChild(row);
  144. for (var i = 0; i < items.length; i++)
  145. {
  146. var row = document.createElement('tr');
  147. var td1 = document.createElement('td');
  148. td1.appendChild(document.createTextNode(items[i].name));
  149. td1.setAttribute('title', 'ID ' + items[i].id);
  150. row.appendChild(td1);
  151. var td2 = document.createElement('td');
  152. td2.style.textAlign = 'right';
  153. td2.style.paddingLeft = '10px';
  154. td2.innerHTML = 'Page: ';
  155. var input = document.createElement('input');
  156. input.setAttribute('type', 'number');
  157. input.setAttribute('min', '1');
  158. input.setAttribute('value', '1');
  159. input.style.width = '60px';
  160. td2.appendChild(input);
  161. pageInputs.push(input);
  162. row.appendChild(td2);
  163. tbody.appendChild(row);
  164. }
  165. var buttons = document.createElement('td');
  166. buttons.setAttribute('colspan', '2');
  167. buttons.setAttribute('align', 'right');
  168. var insertButton = document.createElement('button');
  169. insertButton.innerHTML = 'Insert';
  170. insertButton.className = 'blue';
  171. buttons.appendChild(insertButton);
  172. insertButton.addEventListener('click', function()
  173. {
  174. table.parentNode.removeChild(table);
  175. document.getElementById('spinner').style.display = '';
  176. for (var i = 0; i < items.length; i++)
  177. {
  178. items[i].page = (parseInt(pageInputs[i].value) || 1) - 1;
  179. }
  180. handler(true);
  181. });
  182. var cancelButton = document.createElement('button');
  183. cancelButton.innerHTML = 'Cancel';
  184. buttons.appendChild(cancelButton);
  185. cancelButton.addEventListener('click', function()
  186. {
  187. handler(false);
  188. });
  189. var row = document.createElement('tr');
  190. row.appendChild(buttons);
  191. tbody.appendChild(row);
  192. table.appendChild(tbody);
  193. document.body.appendChild(table);
  194. }
  195. /**
  196. * Closes the window after all diagrams have been inserted.
  197. */
  198. function closeWindow()
  199. {
  200. google.script.host.close();
  201. }
  202. /**
  203. * Displays an error message within the #result element.
  204. *
  205. * @param {string} message The error message to display.
  206. */
  207. function showError(message)
  208. {
  209. document.getElementById('icon').setAttribute('src', 'https://www.draw.io/images/stop-flat-icon-80.png');
  210. document.getElementById('status').innerHTML = 'Error: ' + message;
  211. }
  212. </script>
  213. </head>
  214. <body>
  215. <div id="spinner" style="text-align:center;padding-top:100px;">
  216. <img id="icon" src="https://www.draw.io/images/ajax-loader.gif"/>
  217. <h3 id="status" style="margin-top:6px;">Loading...</h3>
  218. </div>
  219. <script src="https://apis.google.com/js/api.js?onload=onApiLoad"></script>
  220. </body>
  221. </html>