@girder/core 3.2.9 → 5.0.0-a11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/README.md +61 -0
  2. package/dist-lib/Girder_Favicon.png +0 -0
  3. package/dist-lib/fontello/node_modules/ansi-regex/index.d.ts +37 -0
  4. package/dist-lib/fontello/node_modules/ansi-styles/index.d.ts +345 -0
  5. package/dist-lib/fontello/node_modules/big-integer/BigInteger.d.ts +2393 -0
  6. package/dist-lib/fontello/node_modules/fontello-cli/node_modules/colors/safe.d.ts +48 -0
  7. package/dist-lib/fontello/node_modules/has-flag/index.d.ts +39 -0
  8. package/dist-lib/fontello/node_modules/iconv-lite/lib/index.d.ts +24 -0
  9. package/dist-lib/fontello/node_modules/is-docker/index.d.ts +15 -0
  10. package/dist-lib/fontello/node_modules/is-plain-object/index.d.ts +5 -0
  11. package/dist-lib/fontello/node_modules/is-wsl/index.d.ts +15 -0
  12. package/dist-lib/fontello/node_modules/isobject/index.d.ts +5 -0
  13. package/dist-lib/fontello/node_modules/open/index.d.ts +88 -0
  14. package/dist-lib/fontello/node_modules/safe-buffer/index.d.ts +187 -0
  15. package/dist-lib/fontello/node_modules/strip-ansi/index.d.ts +17 -0
  16. package/dist-lib/girder-core.js +58237 -0
  17. package/dist-lib/girder-core.js.map +1 -0
  18. package/dist-lib/girder-core.umd.cjs +1573 -0
  19. package/dist-lib/girder-core.umd.cjs.map +1 -0
  20. package/dist-lib/index.d.ts +1 -0
  21. package/{auth.js → dist-lib/src/auth.js} +1 -41
  22. package/{constants.js → dist-lib/src/constants.js} +0 -1
  23. package/dist-lib/src/index.d.ts +23 -0
  24. package/dist-lib/src/index.ts +80 -0
  25. package/dist-lib/src/main.ts +54 -0
  26. package/{models → dist-lib/src/models}/FolderModel.js +1 -1
  27. package/{rest.js → dist-lib/src/rest.js} +12 -7
  28. package/{routes.js → dist-lib/src/routes.js} +65 -67
  29. package/{templates → dist-lib/src/templates}/body/assetstores.pug +0 -15
  30. package/{templates → dist-lib/src/templates}/body/frontPage.pug +1 -1
  31. package/{templates → dist-lib/src/templates}/body/systemConfiguration.pug +35 -41
  32. package/{templates → dist-lib/src/templates}/widgets/editAssetstoreWidget.pug +0 -12
  33. package/{templates → dist-lib/src/templates}/widgets/newAssetstore.pug +0 -35
  34. package/dist-lib/src/utilities/EventStream.js +119 -0
  35. package/{utilities → dist-lib/src/utilities}/S3UploadHandler.js +4 -44
  36. package/dist-lib/src/version.js +6 -0
  37. package/{views → dist-lib/src/views}/View.js +2 -1
  38. package/{views → dist-lib/src/views}/body/AssetstoresView.js +24 -26
  39. package/{views → dist-lib/src/views}/body/SystemConfigurationView.js +2 -21
  40. package/{views → dist-lib/src/views}/body/index.js +2 -1
  41. package/{views → dist-lib/src/views}/layout/LoginView.js +1 -1
  42. package/{views → dist-lib/src/views}/widgets/ApiKeyListWidget.js +1 -1
  43. package/{views → dist-lib/src/views}/widgets/DateTimeRangeWidget.js +2 -1
  44. package/{views → dist-lib/src/views}/widgets/DateTimeWidget.js +2 -1
  45. package/{views → dist-lib/src/views}/widgets/EditAssetstoreWidget.js +0 -15
  46. package/{views → dist-lib/src/views}/widgets/ItemListWidget.js +1 -1
  47. package/{views → dist-lib/src/views}/widgets/MetadataWidget.js +7 -3
  48. package/{views → dist-lib/src/views}/widgets/NewAssetstoreWidget.js +0 -10
  49. package/{views → dist-lib/src/views}/widgets/PaginateWidget.js +2 -2
  50. package/{views → dist-lib/src/views}/widgets/RootSelectorWidget.js +1 -1
  51. package/{views → dist-lib/src/views}/widgets/SearchPaginateWidget.js +2 -2
  52. package/{views → dist-lib/src/views}/widgets/SortCollectionWidget.js +1 -1
  53. package/{views → dist-lib/src/views}/widgets/index.js +7 -1
  54. package/dist-lib/src/vite-env.d.ts +5 -0
  55. package/dist-lib/style.css +16 -0
  56. package/package.json +80 -31
  57. package/index.js +0 -31
  58. package/main.js +0 -21
  59. package/utilities/EventStream.js +0 -177
  60. package/version.js +0 -10
  61. /package/{assets → dist-lib}/Girder_Mark.png +0 -0
  62. /package/{collections → dist-lib/src/collections}/ApiKeyCollection.js +0 -0
  63. /package/{collections → dist-lib/src/collections}/AssetstoreCollection.js +0 -0
  64. /package/{collections → dist-lib/src/collections}/Collection.js +0 -0
  65. /package/{collections → dist-lib/src/collections}/CollectionCollection.js +0 -0
  66. /package/{collections → dist-lib/src/collections}/FileCollection.js +0 -0
  67. /package/{collections → dist-lib/src/collections}/FolderCollection.js +0 -0
  68. /package/{collections → dist-lib/src/collections}/GroupCollection.js +0 -0
  69. /package/{collections → dist-lib/src/collections}/ItemCollection.js +0 -0
  70. /package/{collections → dist-lib/src/collections}/UserCollection.js +0 -0
  71. /package/{collections → dist-lib/src/collections}/index.js +0 -0
  72. /package/{dialog.js → dist-lib/src/dialog.js} +0 -0
  73. /package/{events.js → dist-lib/src/events.js} +0 -0
  74. /package/{misc.js → dist-lib/src/misc.js} +0 -0
  75. /package/{models → dist-lib/src/models}/AccessControlledModel.js +0 -0
  76. /package/{models → dist-lib/src/models}/ApiKeyModel.js +0 -0
  77. /package/{models → dist-lib/src/models}/AssetstoreModel.js +0 -0
  78. /package/{models → dist-lib/src/models}/CollectionCreationPolicyModel.js +0 -0
  79. /package/{models → dist-lib/src/models}/CollectionModel.js +0 -0
  80. /package/{models → dist-lib/src/models}/FileModel.js +0 -0
  81. /package/{models → dist-lib/src/models}/GroupModel.js +0 -0
  82. /package/{models → dist-lib/src/models}/ItemModel.js +0 -0
  83. /package/{models → dist-lib/src/models}/MetadataMixin.js +0 -0
  84. /package/{models → dist-lib/src/models}/Model.js +0 -0
  85. /package/{models → dist-lib/src/models}/UserModel.js +0 -0
  86. /package/{models → dist-lib/src/models}/index.js +0 -0
  87. /package/{pluginUtils.js → dist-lib/src/pluginUtils.js} +0 -0
  88. /package/{router.js → dist-lib/src/router.js} +0 -0
  89. /package/{stylesheets → dist-lib/src/stylesheets}/apidocs/apidocs.styl +0 -0
  90. /package/{stylesheets → dist-lib/src/stylesheets}/body/adminConsole.styl +0 -0
  91. /package/{stylesheets → dist-lib/src/stylesheets}/body/assetstores.styl +0 -0
  92. /package/{stylesheets → dist-lib/src/stylesheets}/body/collectionList.styl +0 -0
  93. /package/{stylesheets → dist-lib/src/stylesheets}/body/collectionPage.styl +0 -0
  94. /package/{stylesheets → dist-lib/src/stylesheets}/body/frontPage.styl +0 -0
  95. /package/{stylesheets → dist-lib/src/stylesheets}/body/groupList.styl +0 -0
  96. /package/{stylesheets → dist-lib/src/stylesheets}/body/groupPage.styl +0 -0
  97. /package/{stylesheets → dist-lib/src/stylesheets}/body/itemPage.styl +0 -0
  98. /package/{stylesheets → dist-lib/src/stylesheets}/body/plugins.styl +0 -0
  99. /package/{stylesheets → dist-lib/src/stylesheets}/body/searchResultsList.styl +0 -0
  100. /package/{stylesheets → dist-lib/src/stylesheets}/body/systemConfig.styl +0 -0
  101. /package/{stylesheets → dist-lib/src/stylesheets}/body/userAccount.styl +0 -0
  102. /package/{stylesheets → dist-lib/src/stylesheets}/body/userList.styl +0 -0
  103. /package/{stylesheets → dist-lib/src/stylesheets}/body/userPage.styl +0 -0
  104. /package/{stylesheets → dist-lib/src/stylesheets}/layout/footer.styl +0 -0
  105. /package/{stylesheets → dist-lib/src/stylesheets}/layout/global.styl +0 -0
  106. /package/{stylesheets → dist-lib/src/stylesheets}/layout/globalNav.styl +0 -0
  107. /package/{stylesheets → dist-lib/src/stylesheets}/layout/header.styl +0 -0
  108. /package/{stylesheets → dist-lib/src/stylesheets}/layout/headerUser.styl +0 -0
  109. /package/{stylesheets → dist-lib/src/stylesheets}/layout/layout.styl +0 -0
  110. /package/{stylesheets → dist-lib/src/stylesheets}/layout/layoutVars.styl +0 -0
  111. /package/{stylesheets → dist-lib/src/stylesheets}/layout/loading.styl +0 -0
  112. /package/{stylesheets → dist-lib/src/stylesheets}/layout/progressArea.styl +0 -0
  113. /package/{stylesheets → dist-lib/src/stylesheets}/widgets/accessWidget.styl +0 -0
  114. /package/{stylesheets → dist-lib/src/stylesheets}/widgets/browserWidget.styl +0 -0
  115. /package/{stylesheets → dist-lib/src/stylesheets}/widgets/hierarchyWidget.styl +0 -0
  116. /package/{stylesheets → dist-lib/src/stylesheets}/widgets/markdownWidget.styl +0 -0
  117. /package/{stylesheets → dist-lib/src/stylesheets}/widgets/metadataWidget.styl +0 -0
  118. /package/{stylesheets → dist-lib/src/stylesheets}/widgets/searchFieldWidget.styl +0 -0
  119. /package/{stylesheets → dist-lib/src/stylesheets}/widgets/taskProgress.styl +0 -0
  120. /package/{stylesheets → dist-lib/src/stylesheets}/widgets/timelineWidget.styl +0 -0
  121. /package/{stylesheets → dist-lib/src/stylesheets}/widgets/uploadWidget.styl +0 -0
  122. /package/{stylesheets → dist-lib/src/stylesheets}/widgets/userOtpManagementWidget.styl +0 -0
  123. /package/{templates → dist-lib/src/templates}/body/adminConsole.pug +0 -0
  124. /package/{templates → dist-lib/src/templates}/body/collectionList.pug +0 -0
  125. /package/{templates → dist-lib/src/templates}/body/collectionPage.pug +0 -0
  126. /package/{templates → dist-lib/src/templates}/body/filesystemImport.pug +0 -0
  127. /package/{templates → dist-lib/src/templates}/body/groupList.pug +0 -0
  128. /package/{templates → dist-lib/src/templates}/body/groupPage.pug +0 -0
  129. /package/{templates → dist-lib/src/templates}/body/itemPage.pug +0 -0
  130. /package/{templates → dist-lib/src/templates}/body/plugins.pug +0 -0
  131. /package/{templates → dist-lib/src/templates}/body/s3Import.pug +0 -0
  132. /package/{templates → dist-lib/src/templates}/body/searchResults.pug +0 -0
  133. /package/{templates → dist-lib/src/templates}/body/searchResultsType.pug +0 -0
  134. /package/{templates → dist-lib/src/templates}/body/userAccount.pug +0 -0
  135. /package/{templates → dist-lib/src/templates}/body/userList.pug +0 -0
  136. /package/{templates → dist-lib/src/templates}/body/userPage.pug +0 -0
  137. /package/{templates → dist-lib/src/templates}/layout/alert.pug +0 -0
  138. /package/{templates → dist-lib/src/templates}/layout/layout.pug +0 -0
  139. /package/{templates → dist-lib/src/templates}/layout/layoutFooter.pug +0 -0
  140. /package/{templates → dist-lib/src/templates}/layout/layoutGlobalNav.pug +0 -0
  141. /package/{templates → dist-lib/src/templates}/layout/layoutHeader.pug +0 -0
  142. /package/{templates → dist-lib/src/templates}/layout/layoutHeaderUser.pug +0 -0
  143. /package/{templates → dist-lib/src/templates}/layout/layoutProgressArea.pug +0 -0
  144. /package/{templates → dist-lib/src/templates}/layout/loginDialog.pug +0 -0
  145. /package/{templates → dist-lib/src/templates}/layout/registerDialog.pug +0 -0
  146. /package/{templates → dist-lib/src/templates}/layout/resetPasswordDialog.pug +0 -0
  147. /package/{templates → dist-lib/src/templates}/widgets/accessEditor.pug +0 -0
  148. /package/{templates → dist-lib/src/templates}/widgets/accessEditorMixins.pug +0 -0
  149. /package/{templates → dist-lib/src/templates}/widgets/accessEditorNonModal.pug +0 -0
  150. /package/{templates → dist-lib/src/templates}/widgets/accessEntry.pug +0 -0
  151. /package/{templates → dist-lib/src/templates}/widgets/apiKeyList.pug +0 -0
  152. /package/{templates → dist-lib/src/templates}/widgets/browserWidget.pug +0 -0
  153. /package/{templates → dist-lib/src/templates}/widgets/checkedActionsMenu.pug +0 -0
  154. /package/{templates → dist-lib/src/templates}/widgets/collectionInfoDialog.pug +0 -0
  155. /package/{templates → dist-lib/src/templates}/widgets/confirmDialog.pug +0 -0
  156. /package/{templates → dist-lib/src/templates}/widgets/dateTimeRangeWidget.pug +0 -0
  157. /package/{templates → dist-lib/src/templates}/widgets/dateTimeWidget.pug +0 -0
  158. /package/{templates → dist-lib/src/templates}/widgets/editApiKeyWidget.pug +0 -0
  159. /package/{templates → dist-lib/src/templates}/widgets/editCollectionWidget.pug +0 -0
  160. /package/{templates → dist-lib/src/templates}/widgets/editFileWidget.pug +0 -0
  161. /package/{templates → dist-lib/src/templates}/widgets/editFolderWidget.pug +0 -0
  162. /package/{templates → dist-lib/src/templates}/widgets/editGroupWidget.pug +0 -0
  163. /package/{templates → dist-lib/src/templates}/widgets/editItemWidget.pug +0 -0
  164. /package/{templates → dist-lib/src/templates}/widgets/fileInfoDialog.pug +0 -0
  165. /package/{templates → dist-lib/src/templates}/widgets/fileList.pug +0 -0
  166. /package/{templates → dist-lib/src/templates}/widgets/folderInfoDialog.pug +0 -0
  167. /package/{templates → dist-lib/src/templates}/widgets/folderList.pug +0 -0
  168. /package/{templates → dist-lib/src/templates}/widgets/groupAdminList.pug +0 -0
  169. /package/{templates → dist-lib/src/templates}/widgets/groupInviteDialog.pug +0 -0
  170. /package/{templates → dist-lib/src/templates}/widgets/groupInviteList.pug +0 -0
  171. /package/{templates → dist-lib/src/templates}/widgets/groupMemberList.pug +0 -0
  172. /package/{templates → dist-lib/src/templates}/widgets/groupModList.pug +0 -0
  173. /package/{templates → dist-lib/src/templates}/widgets/hierarchyBreadcrumb.pug +0 -0
  174. /package/{templates → dist-lib/src/templates}/widgets/hierarchyPaginated.pug +0 -0
  175. /package/{templates → dist-lib/src/templates}/widgets/hierarchyWidget.pug +0 -0
  176. /package/{templates → dist-lib/src/templates}/widgets/itemBreadcrumb.pug +0 -0
  177. /package/{templates → dist-lib/src/templates}/widgets/itemList.pug +0 -0
  178. /package/{templates → dist-lib/src/templates}/widgets/jsonMetadatumEditWidget.pug +0 -0
  179. /package/{templates → dist-lib/src/templates}/widgets/jsonMetadatumView.pug +0 -0
  180. /package/{templates → dist-lib/src/templates}/widgets/loadingAnimation.pug +0 -0
  181. /package/{templates → dist-lib/src/templates}/widgets/markdownWidget.pug +0 -0
  182. /package/{templates → dist-lib/src/templates}/widgets/metadataWidget.pug +0 -0
  183. /package/{templates → dist-lib/src/templates}/widgets/metadatumEditWidget.pug +0 -0
  184. /package/{templates → dist-lib/src/templates}/widgets/metadatumView.pug +0 -0
  185. /package/{templates → dist-lib/src/templates}/widgets/paginateWidget.pug +0 -0
  186. /package/{templates → dist-lib/src/templates}/widgets/pluginConfigBreadcrumb.pug +0 -0
  187. /package/{templates → dist-lib/src/templates}/widgets/rootSelectorWidget.pug +0 -0
  188. /package/{templates → dist-lib/src/templates}/widgets/searchField.pug +0 -0
  189. /package/{templates → dist-lib/src/templates}/widgets/searchHelp.pug +0 -0
  190. /package/{templates → dist-lib/src/templates}/widgets/searchModeSelect.pug +0 -0
  191. /package/{templates → dist-lib/src/templates}/widgets/searchResults.pug +0 -0
  192. /package/{templates → dist-lib/src/templates}/widgets/sortCollectionWidget.pug +0 -0
  193. /package/{templates → dist-lib/src/templates}/widgets/taskProgress.pug +0 -0
  194. /package/{templates → dist-lib/src/templates}/widgets/timeline.pug +0 -0
  195. /package/{templates → dist-lib/src/templates}/widgets/uploadWidget.pug +0 -0
  196. /package/{templates → dist-lib/src/templates}/widgets/uploadWidgetMixins.pug +0 -0
  197. /package/{templates → dist-lib/src/templates}/widgets/uploadWidgetNonModal.pug +0 -0
  198. /package/{templates → dist-lib/src/templates}/widgets/userOtpBegin.pug +0 -0
  199. /package/{templates → dist-lib/src/templates}/widgets/userOtpDisable.pug +0 -0
  200. /package/{templates → dist-lib/src/templates}/widgets/userOtpEnable.pug +0 -0
  201. /package/{utilities → dist-lib/src/utilities}/PluginUtils.js +0 -0
  202. /package/{utilities → dist-lib/src/utilities}/index.js +0 -0
  203. /package/{utilities → dist-lib/src/utilities}/jquery/girderEnable.js +0 -0
  204. /package/{utilities → dist-lib/src/utilities}/jquery/girderModal.js +0 -0
  205. /package/{views → dist-lib/src/views}/App.js +0 -0
  206. /package/{views → dist-lib/src/views}/body/AdminView.js +0 -0
  207. /package/{views → dist-lib/src/views}/body/CollectionView.js +0 -0
  208. /package/{views → dist-lib/src/views}/body/CollectionsView.js +0 -0
  209. /package/{views → dist-lib/src/views}/body/FilesystemImportView.js +0 -0
  210. /package/{views → dist-lib/src/views}/body/FolderView.js +0 -0
  211. /package/{views → dist-lib/src/views}/body/FrontPageView.js +0 -0
  212. /package/{views → dist-lib/src/views}/body/GroupView.js +0 -0
  213. /package/{views → dist-lib/src/views}/body/GroupsView.js +0 -0
  214. /package/{views → dist-lib/src/views}/body/ItemView.js +0 -0
  215. /package/{views → dist-lib/src/views}/body/PluginsView.js +0 -0
  216. /package/{views → dist-lib/src/views}/body/S3ImportView.js +0 -0
  217. /package/{views → dist-lib/src/views}/body/SearchResultsView.js +0 -0
  218. /package/{views → dist-lib/src/views}/body/UserAccountView.js +0 -0
  219. /package/{views → dist-lib/src/views}/body/UserView.js +0 -0
  220. /package/{views → dist-lib/src/views}/body/UsersView.js +0 -0
  221. /package/{views → dist-lib/src/views}/index.js +0 -0
  222. /package/{views → dist-lib/src/views}/layout/FooterView.js +0 -0
  223. /package/{views → dist-lib/src/views}/layout/GlobalNavView.js +0 -0
  224. /package/{views → dist-lib/src/views}/layout/HeaderUserView.js +0 -0
  225. /package/{views → dist-lib/src/views}/layout/HeaderView.js +0 -0
  226. /package/{views → dist-lib/src/views}/layout/ProgressListView.js +0 -0
  227. /package/{views → dist-lib/src/views}/layout/RegisterView.js +0 -0
  228. /package/{views → dist-lib/src/views}/layout/ResetPasswordView.js +0 -0
  229. /package/{views → dist-lib/src/views}/layout/index.js +0 -0
  230. /package/{views → dist-lib/src/views}/widgets/AccessWidget.js +0 -0
  231. /package/{views → dist-lib/src/views}/widgets/BrowserWidget.js +0 -0
  232. /package/{views → dist-lib/src/views}/widgets/CheckedMenuWidget.js +0 -0
  233. /package/{views → dist-lib/src/views}/widgets/CollectionInfoWidget.js +0 -0
  234. /package/{views → dist-lib/src/views}/widgets/EditApiKeyWidget.js +0 -0
  235. /package/{views → dist-lib/src/views}/widgets/EditCollectionWidget.js +0 -0
  236. /package/{views → dist-lib/src/views}/widgets/EditFileWidget.js +0 -0
  237. /package/{views → dist-lib/src/views}/widgets/EditFolderWidget.js +0 -0
  238. /package/{views → dist-lib/src/views}/widgets/EditGroupWidget.js +0 -0
  239. /package/{views → dist-lib/src/views}/widgets/EditItemWidget.js +0 -0
  240. /package/{views → dist-lib/src/views}/widgets/FileInfoWidget.js +0 -0
  241. /package/{views → dist-lib/src/views}/widgets/FileListWidget.js +0 -0
  242. /package/{views → dist-lib/src/views}/widgets/FolderInfoWidget.js +0 -0
  243. /package/{views → dist-lib/src/views}/widgets/FolderListWidget.js +0 -0
  244. /package/{views → dist-lib/src/views}/widgets/GroupAdminsWidget.js +0 -0
  245. /package/{views → dist-lib/src/views}/widgets/GroupInvitesWidget.js +0 -0
  246. /package/{views → dist-lib/src/views}/widgets/GroupMembersWidget.js +0 -0
  247. /package/{views → dist-lib/src/views}/widgets/GroupModsWidget.js +0 -0
  248. /package/{views → dist-lib/src/views}/widgets/HierarchyWidget.js +0 -0
  249. /package/{views → dist-lib/src/views}/widgets/ItemBreadcrumbWidget.js +0 -0
  250. /package/{views → dist-lib/src/views}/widgets/LoadingAnimation.js +0 -0
  251. /package/{views → dist-lib/src/views}/widgets/MarkdownWidget.js +0 -0
  252. /package/{views → dist-lib/src/views}/widgets/PluginConfigBreadcrumbWidget.js +0 -0
  253. /package/{views → dist-lib/src/views}/widgets/SearchFieldWidget.js +0 -0
  254. /package/{views → dist-lib/src/views}/widgets/TaskProgressWidget.js +0 -0
  255. /package/{views → dist-lib/src/views}/widgets/TimelineWidget.js +0 -0
  256. /package/{views → dist-lib/src/views}/widgets/UploadWidget.js +0 -0
  257. /package/{views → dist-lib/src/views}/widgets/UserOtpManagementWidget.js +0 -0
@@ -1,40 +1,48 @@
1
1
  .g-body-title System configuration
2
+ .g-body-subtitle
3
+ p
4
+ | Note: all settings other than those referencing data in the database should be set as
5
+ | environment variables in the execution environment.
2
6
  form.g-settings-form(role="form")
3
7
  .g-settings-form-container
4
8
  h4 Instance Branding
5
9
  .form-group
6
10
  label(for="g-core-brand-name") Brand Name
7
11
  input#g-core-brand-name.form-control.input-sm(
12
+ disabled=true,
8
13
  type="text", value=settings['core.brand_name'] || '',
9
14
  title="The brand name of the application.")
10
15
  .form-group
11
16
  label(for="g-core-contact-email-address") Contact email address
12
17
  input#g-core-contact-email-address.form-control.input-sm(
18
+ disabled=true,
13
19
  type="text", value=settings['core.contact_email_address'] || '',
14
20
  title="The contact email address for users to obtain support with this instance.")
15
21
  .form-group
16
22
  label(for="g-core-banner-color") Banner Color
17
23
  #g-core-banner-color-container
18
24
  input#g-core-banner-color.form-control.input-sm(
25
+ disabled=true,
19
26
  type="color", value=settings['core.banner_color'],
20
27
  title="The banner color of the application.")
21
- button#g-core-banner-default-color.form-control.input-sm(
22
- type="button", title="Default color") default
23
28
  .form-group
24
29
  label(for="g-core-privacy-notice") Privacy Notice Link
25
30
  input#g-core-privacy-notice.form-control.input-sm(
31
+ disabled=true,
26
32
  type="text", value=settings['core.privacy_notice'] || '',
27
33
  title="The privacy notice link.")
28
34
  .form-group
29
35
  label(for="g-core-cookie-lifetime") Cookie duration (days)
30
36
  input#g-core-cookie-lifetime.form-control.input-sm(
37
+ disabled=true,
31
38
  type="text", value=settings['core.cookie_lifetime'] || '',
32
39
  title="How long users will stay logged in.")
33
40
  .g-settings-form-container
34
41
  h4 Administrative Policy
35
42
  .form-group
36
43
  label(for="g-core-registration-policy") Registration policy
37
- select#g-core-registration-policy.form-control.input-sm
44
+ select#g-core-registration-policy.form-control.input-sm(
45
+ disabled=true)
38
46
  option(value="open",
39
47
  selected=(settings['core.registration_policy'] === "open")) Open registration
40
48
  option(value="closed",
@@ -43,7 +51,8 @@ form.g-settings-form(role="form")
43
51
  selected=(settings['core.registration_policy'] === "approve")) Admin approval required
44
52
  .form-group
45
53
  label(for="g-core-email-verification") Email verification
46
- select#g-core-email-verification.form-control.input-sm
54
+ select#g-core-email-verification.form-control.input-sm(
55
+ disabled=true)
47
56
  option(value="required",
48
57
  selected=(settings['core.email_verification'] === "required")) Required
49
58
  option(value="optional",
@@ -52,7 +61,8 @@ form.g-settings-form(role="form")
52
61
  selected=(settings['core.email_verification'] === "disabled")) Disabled
53
62
  .form-group
54
63
  label(for="g-core-add-to-group-policy") Allow members to be directly added to groups
55
- select#g-core-add-to-group-policy.form-control.input-sm
64
+ select#g-core-add-to-group-policy.form-control.input-sm(
65
+ disabled=true)
56
66
  option(value="never",
57
67
  selected=(settings['core.add_to_group_policy'] === "never"))
58
68
  | No, members must be invited and accept invitations
@@ -79,7 +89,8 @@ form.g-settings-form(role="form")
79
89
  = JSON.stringify(settings['core.collection_create_policy'])
80
90
  .form-group
81
91
  label(for="g-core-user-default-folders") Create default folders for new users
82
- select#g-core-user-default-folders.form-control.input-sm
92
+ select#g-core-user-default-folders.form-control.input-sm(
93
+ disabled=true)
83
94
  option(value="none",
84
95
  selected=(settings['core.user_default_folders'] === "none")) No
85
96
  option(value="public_private",
@@ -87,24 +98,28 @@ form.g-settings-form(role="form")
87
98
  .form-group
88
99
  .checkbox
89
100
  label(for="g-core-api-keys")
90
- input#g-core-api-keys(type="checkbox", checked=settings['core.api_keys'])
101
+ input#g-core-api-keys(type="checkbox", checked=settings['core.api_keys'],
102
+ disabled=true)
91
103
  | Enable API keys
92
104
  .form-group
93
105
  .checkbox
94
106
  label(for="g-core-enable-password-login")
95
107
  input#g-core-enable-password-login(
96
- type="checkbox", checked=settings['core.enable_password_login'])
108
+ type="checkbox", checked=settings['core.enable_password_login'],
109
+ disabled=true)
97
110
  | Enable password login
98
111
  .g-settings-form-container
99
112
  h4 Email Creation
100
113
  .form-group
101
114
  label(for="g-core-email-from-address") Email from address
102
115
  input#g-core-email-from-address.form-control.input-sm(
116
+ disabled=true,
103
117
  type="text", value=settings['core.email_from_address'] || '',
104
118
  title="The email address the system will use when sending emails.")
105
119
  .form-group
106
120
  label(for="g-core-email-host") Email host
107
121
  input#g-core-email-host.form-control.input-sm(
122
+ disabled=true,
108
123
  type="text", value=settings['core.email_host'] || '',
109
124
  title="The host email server that is shown as a link in the footer of emails.")
110
125
  .g-settings-form-container
@@ -112,16 +127,19 @@ form.g-settings-form(role="form")
112
127
  .form-group
113
128
  label(for="g-core-smtp-host") SMTP host
114
129
  input#g-core-smtp-host.form-control.input-sm(
130
+ disabled=true,
115
131
  type="text", value=settings['core.smtp_host'] || '',
116
132
  title="The hostname of the SMTP server used to send emails.")
117
133
  .form-group
118
134
  label(for="g-core-smtp-port") SMTP port
119
135
  input#g-core-smtp-port.form-control.input-sm(
136
+ disabled=true,
120
137
  type="text", value=settings['core.smtp.port'] || '',
121
138
  title="The port number of the SMTP server used to send emails.")
122
139
  .form-group
123
140
  label(for="g-core-smtp-encryption") SMTP encryption
124
- select#g-core-smtp-encryption.form-control.input-sm
141
+ select#g-core-smtp-encryption.form-control.input-sm(
142
+ disabled=true)
125
143
  option(value="none",
126
144
  selected=(settings['core.smtp.encryption'] === "none")) None
127
145
  option(value="starttls",
@@ -131,36 +149,16 @@ form.g-settings-form(role="form")
131
149
  .form-group
132
150
  label(for="g-core-smtp-username") SMTP username
133
151
  input#g-core-smtp-username.form-control.input-sm(
152
+ disabled=true,
134
153
  type="text", value=settings['core.smtp.username'] || '',
135
154
  title="The username, if any, used to authenticate to the SMTP server used to send emails.")
136
155
  .form-group
137
156
  label(for="g-core-smtp-password") SMTP password
138
157
  input#g-core-smtp-password.form-control.input-sm(
158
+ disabled=true,
139
159
  type="password", value=settings['core.smtp.password'] || '',
140
160
  title="The password, if any, used to authenticate to the SMTP server used to send emails.")
141
161
 
142
- .g-settings-form-container
143
- h4 Routing
144
- p.
145
- Altering routes requires a restart of the Girder server to take effect.
146
- .g-settings-form-container
147
- h5 Core Routes
148
- label core_girder
149
- input.g-core-route-table.form-control.input-sm(
150
- type="text",
151
- value=routes['core_girder'] || '',
152
- data-webroot-name="core_girder",
153
- title="The path to place core_girder.")
154
- if routeKeys.length > 2
155
- .form-group
156
- h5 Other Routes
157
- each name in routeKeys.slice(2)
158
- label= name
159
- input.g-core-route-table.form-control.input-sm(
160
- type="text",
161
- value=routes[name] || '',
162
- data-webroot-name=name,
163
- title="The path to place ${name}.")
164
162
  #g-configuration-accordion.panel-group
165
163
  .panel.panel-default
166
164
  .panel-heading(data-toggle="collapse",
@@ -175,24 +173,17 @@ form.g-settings-form(role="form")
175
173
  .form-group
176
174
  label(for="g-core-server-root") Server root URL
177
175
  input#g-core-server-root.form-control.input-sm(
176
+ disabled=true,
178
177
  type="text", value=settings['core.server_root'] || '',
179
178
  placeholder='Detect automatically')
180
179
  .form-group
181
180
  label(for="g-core-upload-minimum-chunk-size") Upload minimum chunk size (bytes)
182
181
  br
183
- span This applies to Filesystem and GridFS assetstores.
182
+ span This applies to Filesystem assetstores.
184
183
  input#g-core-upload-minimum-chunk-size.form-control.input-sm(
184
+ disabled=true,
185
185
  type="text", value=settings['core.upload_minimum_chunk_size'] || '',
186
186
  title="For large files, the minimum size of all but the last chunk.")
187
- .form-group
188
- label Server Notification Stream
189
- br
190
- span Disabling this may improve server performance with many concurrent web client users.
191
- .checkbox
192
- label(for="g-core-enable-notification-stream")
193
- input#g-core-enable-notification-stream(
194
- type="checkbox", checked=(settings['core.enable_notification_stream']))
195
- | Enabled
196
187
  .g-settings-form-container
197
188
  h4 CORS
198
189
  p.
@@ -202,17 +193,20 @@ form.g-settings-form(role="form")
202
193
  .form-group
203
194
  label(for="g-core-cors-allow-origin") CORS Allowed Origins
204
195
  input#g-core-cors-allow-origin.form-control.input-sm(
196
+ disabled=true,
205
197
  type="text", value=settings['core.cors.allow_origin'] || '',
206
198
  title="A comma-separated list of allowed base URLs that can make cross-site requests. This may include *.")
207
199
  .form-group
208
200
  label(for="g-core-cors-allow-methods") CORS Allowed Methods
209
201
  input#g-core-cors-allow-methods.form-control.input-sm(
202
+ disabled=true,
210
203
  type="text", value=settings['core.cors.allow_methods'] || '',
211
204
  placeholder="Default: allow all methods",
212
205
  title="A comma-separated list of allowed methods")
213
206
  .form-group
214
207
  label(for="g-core-cors-allow-headers") CORS Allowed Headers
215
208
  input#g-core-cors-allow-headers.form-control.input-sm(
209
+ disabled=true,
216
210
  type="text", value=settings['core.cors.allow_headers'] || '',
217
211
  title="A comma-separated list of allowed headers.")
218
212
  p
@@ -17,18 +17,6 @@
17
17
  .form-group
18
18
  label.control-label(for="g-edit-fs-perms") File creation permissions (octal)
19
19
  input#g-edit-fs-perms.input-sm.form-control(type="text", placeholder="600")
20
- if assetstore.get('type') === types.GRIDFS
21
- .form-group
22
- label.control-label(for="g-edit-gridfs-db") Database name
23
- input#g-edit-gridfs-db.input-sm.form-control(type="text", placeholder="Database name")
24
- .form-group
25
- label.control-label(for="g-edit-gridfs-mongohost") Mongo Host URI
26
- input#g-edit-gridfs-mongohost.input-sm.form-control(
27
- type="text", placeholder="Mongo host uri (defaults to the main Girder database)",
28
- title="The URI is of the form mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]")
29
- .form-group
30
- label.control-label(for="g-edit-gridfs-replicaset") Replica Set
31
- input#g-edit-gridfs-replicaset.input-sm.form-control(type="text", placeholder="Replica set name (blank if not using a replica set)")
32
20
  if assetstore.get('type') === types.S3
33
21
  .form-group
34
22
  label.control-label(for="g-edit-s3-bucket") S3 bucket name
@@ -28,41 +28,6 @@
28
28
  p#g-new-fs-error.g-validation-failed-message
29
29
  input.g-new-assetstore-submit.btn.btn-sm.btn-primary(type="submit", value="Create")
30
30
 
31
- .panel.panel-default
32
- .panel-heading(data-toggle="collapse",
33
- data-parent="#g-assetstore-accordion",
34
- data-target="#g-create-gridfs-tab")
35
- .panel-title
36
- a
37
- i.icon-leaf
38
- span Create new #[b GridFS] assetstore
39
- #g-create-gridfs-tab.panel-collapse.collapse
40
- .panel-body
41
- p.
42
- This type of assetstore uses
43
- MongoDB's #[a(target="_blank", href="http://docs.mongodb.org/manual/core/gridfs/") GridFS]
44
- storage engine. The files should be stored in a separate database
45
- from the rest of the server's information to avoid locking issues.
46
- form#g-new-gridfs-form(role="form")
47
- .form-group
48
- label.control-label(for="g-new-gridfs-name") Assetstore name
49
- input#g-new-gridfs-name.input-sm.form-control(type="text", placeholder="Name")
50
- .form-group
51
- label.control-label(for="g-new-gridfs-db") Database name
52
- input#g-new-gridfs-db.input-sm.form-control(
53
- type="text", placeholder="Database name")
54
- .form-group
55
- label.control-label(for="g-new-gridfs-mongohost") Mongo Host URI
56
- input#g-new-gridfs-mongohost.input-sm.form-control(
57
- type="text", placeholder="Mongo host uri (defaults to the main Girder database)",
58
- title="The URI is of the form mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]")
59
- .form-group
60
- label.control-label(for="g-new-gridfs-replicaset") Replica Set
61
- input#g-new-gridfs-replicaset.input-sm.form-control(
62
- type="text", placeholder="Replica set name (blank if not using a replica set)")
63
- p#g-new-gridfs-error.g-validation-failed-message
64
- input.g-new-assetstore-submit.btn.btn-sm.btn-primary(type="submit", value="Create")
65
-
66
31
  .panel.panel-default
67
32
  .panel-heading(data-toggle="collapse",
68
33
  data-parent="#g-assetstore-accordion",
@@ -0,0 +1,119 @@
1
+ import _ from 'underscore';
2
+ import Backbone from 'backbone';
3
+
4
+ import { getCurrentToken } from '@girder/core/auth';
5
+
6
+ const appElement = document.getElementById('app');
7
+ let apiRoot = (appElement && appElement.getAttribute('root')) || '';
8
+ apiRoot += (apiRoot.endsWith('/') ? '' : '/') + 'api/v1';
9
+ if (!apiRoot.startsWith('/') && apiRoot.indexOf(':') < 0) {
10
+ apiRoot = '/' + apiRoot;
11
+ }
12
+ let notifyRoot = apiRoot.endsWith('/api/v1') ? apiRoot.slice(0, -6) : apiRoot;
13
+ notifyRoot = notifyRoot.endsWith('/') ? notifyRoot.slice(0, -1) : notifyRoot;
14
+
15
+ /**
16
+ * The EventStream is an abstraction for server-sent events / long-polling via a
17
+ * per-user event channel endpoint using a WebSocket. When events are
18
+ * received on the websocket channel, this triggers a Backbone event of the form
19
+ * 'g:event.<type>' where <type> is the value of the event type field.
20
+ * Listeners can bind to specific event types on the channel.
21
+ */
22
+ function EventStream(settings) {
23
+ // Possible states are 'closed', 'stopped', 'started'
24
+ this._state = 'closed';
25
+
26
+ // Create context bindings only once, so they can be referenced when unbinding events
27
+ this._onVisibilityStateChange = _.bind(this._onVisibilityStateChange, this);
28
+ this._onMessage = _.bind(this._onMessage, this);
29
+ this._onError = _.bind(this._onError, this);
30
+
31
+ return _.extend(this, Backbone.Events);
32
+ }
33
+
34
+ EventStream.prototype._onVisibilityStateChange = function () {
35
+ if (document.visibilityState === 'visible' && this._state === 'stopped') {
36
+ this._start();
37
+ } else if (document.visibilityState === 'hidden' && this._state === 'started') {
38
+ this._stop();
39
+ }
40
+ };
41
+
42
+ EventStream.prototype._onMessage = function (e) {
43
+ let obj;
44
+ try {
45
+ obj = window.JSON.parse(e.data);
46
+ } catch (err) {
47
+ console.error('Invalid JSON from notification stream: ' + e.data + ',' + err);
48
+ this.trigger('g:error', e);
49
+ return;
50
+ }
51
+ this.trigger('g:event.' + obj.type, obj);
52
+ };
53
+
54
+ EventStream.prototype._onError = function () {
55
+ // TODO: Handle error
56
+ };
57
+
58
+ EventStream.prototype.open = function () {
59
+ if (!window.EventSource) {
60
+ console.error('EventSource is not supported on this platform.');
61
+ this.trigger('g:eventStream.disable');
62
+ return;
63
+ }
64
+ if (this._state !== 'closed') {
65
+ console.warn('EventStream should be closed.');
66
+ return;
67
+ }
68
+
69
+ this._state = 'stopped';
70
+ this._start();
71
+
72
+ document.addEventListener('visibilitychange', this._onVisibilityStateChange);
73
+ };
74
+
75
+ EventStream.prototype._start = function () {
76
+ if (this._state !== 'stopped') {
77
+ console.warn('EventStream should be stopped');
78
+ return;
79
+ }
80
+ this._websocket = new WebSocket(`${notifyRoot}/notifications/me?token=${getCurrentToken()}`);
81
+ this._websocket.onmessage = this._onMessage;
82
+ this._websocket.onerror = this._onError;
83
+
84
+ this._state = 'started';
85
+ this.trigger('g:eventStream.start');
86
+ };
87
+
88
+ EventStream.prototype._stop = function () {
89
+ if (this._state !== 'started') {
90
+ console.warn('EventStream should be started');
91
+ return;
92
+ }
93
+
94
+ this._websocket.close();
95
+ this._websocket = null;
96
+
97
+ this._state = 'stopped';
98
+ this.trigger('g:eventStream.stop');
99
+ };
100
+
101
+ EventStream.prototype.close = function () {
102
+ if (this._state === 'closed') {
103
+ console.warn('EventStream should not be closed');
104
+ return;
105
+ }
106
+
107
+ document.removeEventListener('visibilitychange', this._onVisibilityStateChange);
108
+
109
+ if (this._state === 'started') {
110
+ this._stop();
111
+ }
112
+
113
+ this._state = 'closed';
114
+ this.trigger('g:eventStream.close');
115
+ };
116
+
117
+ const eventStream = new EventStream();
118
+
119
+ export default eventStream;
@@ -251,51 +251,11 @@ prototype._finalizeMultiChunkUpload = function () {
251
251
  },
252
252
  error: null
253
253
  }).done((resp) => {
254
- // Create the XML document that will be the request body to S3
255
- var doc = document.implementation.createDocument(null, null, null);
256
- var root = doc.createElement('CompleteMultipartUpload');
257
-
258
- _.each(this.eTagList, (etag, partNumber) => {
259
- var partEl = doc.createElement('Part');
260
- var partNumberEl = doc.createElement('PartNumber');
261
- var etagEl = doc.createElement('ETag');
262
-
263
- partNumberEl.appendChild(doc.createTextNode(partNumber));
264
- etagEl.appendChild(doc.createTextNode(etag));
265
- partEl.appendChild(partNumberEl);
266
- partEl.appendChild(etagEl);
267
- root.appendChild(partEl);
268
- });
269
-
270
- var req = resp.s3FinalizeRequest;
271
- var xhr = new XMLHttpRequest();
272
-
273
- xhr.open(req.method, req.url);
274
-
275
- _.each(req.headers, (v, k) => {
276
- xhr.setRequestHeader(k, v);
277
- });
278
-
279
- xhr.onload = () => {
280
- if (xhr.status === 200) {
281
- delete resp.s3FinalizeRequest;
282
- this.trigger('g:upload.complete', resp);
283
- } else {
284
- this.trigger('g:upload.error', {
285
- message: 'Error occurred uploading to S3 (' + xhr.status + ').'
286
- });
287
- }
288
- };
289
-
290
- xhr.send(new window.XMLSerializer().serializeToString(root));
254
+ this.trigger('g:upload.complete', resp);
291
255
  }).fail((resp) => {
292
- var msg;
293
-
294
- if (resp.status === 0) {
295
- msg = 'Could not connect to the server.';
296
- } else {
297
- msg = 'Upload error during finalize, check console.';
298
- }
256
+ const msg = resp.status === 0
257
+ ? 'Could not connect to the server.'
258
+ : 'Upload error during finalize, check console.';
299
259
  this.trigger('g:upload.error', {
300
260
  message: msg
301
261
  });
@@ -0,0 +1,6 @@
1
+ const versionRaw = import.meta.env.GIRDER_VERSION || null;
2
+
3
+ // Enforce that it's a string or null to make TypeScript happy
4
+ const version = versionRaw === null ? null : `${versionRaw}`;
5
+
6
+ export default version;
@@ -5,7 +5,8 @@ import events from '@girder/core/events';
5
5
  import eventStream from '@girder/core/utilities/EventStream';
6
6
 
7
7
  var View = Backbone.View.extend({
8
- constructor: function (opts) { // eslint-disable-line backbone/no-constructor
8
+ // eslint-disable-next-line backbone/no-constructor
9
+ constructor: function (opts) {
9
10
  if (opts && _.has(opts, 'parentView')) {
10
11
  if (opts.parentView) {
11
12
  opts.parentView.registerChildView(this);
@@ -17,9 +17,7 @@ import AssetstoresTemplate from '@girder/core/templates/body/assetstores.pug';
17
17
 
18
18
  import '@girder/core/stylesheets/body/assetstores.styl';
19
19
 
20
- import 'as-jqplot/dist/jquery.jqplot.js';
21
- import 'as-jqplot/dist/jquery.jqplot.css'; // jquery.jqplot.min.css
22
- import 'as-jqplot/dist/plugins/jqplot.pieRenderer.js';
20
+ import ApexCharts from 'apexcharts';
23
21
 
24
22
  /**
25
23
  * This private data structure is a dynamic way to map assetstore types to the views
@@ -68,7 +66,7 @@ var AssetstoresView = View.extend({
68
66
 
69
67
  _destroyPlots: function () {
70
68
  for (const plot of this.plots) {
71
- plot.data('jqplot').destroy();
69
+ plot.destroy();
72
70
  }
73
71
  this.plots = [];
74
72
  },
@@ -116,32 +114,32 @@ var AssetstoresView = View.extend({
116
114
  ['Used (' + formatSize(used) + ')', used],
117
115
  ['Free (' + formatSize(capacity.free) + ')', capacity.free]
118
116
  ];
119
- var plot = $(el).jqplot([data], {
120
- seriesDefaults: {
121
- renderer: $.jqplot.PieRenderer,
122
- rendererOptions: {
123
- sliceMargin: 2,
124
- shadow: false,
125
- highlightMouseOver: false,
126
- showDataLabels: true,
127
- padding: 5,
128
- startAngle: 180
129
- }
117
+ var plot = new ApexCharts(el, {
118
+ series: data.map(d => d[1]),
119
+ chart: {
120
+ type: 'pie',
121
+ animations: { enabled: false }
130
122
  },
131
- legend: {
132
- show: true,
133
- location: 'e',
134
- background: 'transparent',
135
- border: 'none'
123
+ labels: data.map(d => d[0]),
124
+ plotOptions: {
125
+ pie: {
126
+ startAngle: -90,
127
+ endAngle: 270,
128
+ expandOnClick: false,
129
+ dataLabels: {
130
+ enabled: true
131
+ }
132
+ }
136
133
  },
137
- grid: {
138
- background: 'transparent',
139
- border: 'none',
140
- borderWidth: 0,
141
- shadow: false
134
+ dataLabels: {
135
+ style: {
136
+ colors: ['#000', '#000']
137
+ },
138
+ dropShadow: {enabled: false},
142
139
  },
143
- gridPadding: { top: 10, right: 10, bottom: 10, left: 10 }
140
+ legend: { position: 'right' }
144
141
  });
142
+ plot.render();
145
143
  this.plots.push(plot);
146
144
  },
147
145
 
@@ -1,4 +1,3 @@
1
- import $ from 'jquery';
2
1
  import _ from 'underscore';
3
2
 
4
3
  import AccessWidget from '@girder/core/views/widgets/AccessWidget';
@@ -30,18 +29,10 @@ var SystemConfigurationView = View.extend({
30
29
  var settings = _.map(this.settingsKeys, (key) => {
31
30
  const element = this.$('#g-' + key.replace(/[_.]/g, '-'));
32
31
 
33
- if (key === 'core.route_table') {
34
- return {
35
- key,
36
- value: _.object(_.map($('.g-core-route-table'), function (el) {
37
- return [$(el).data('webrootName'), $(el).val()];
38
- }))
39
- };
40
- } else if (_.contains(
32
+ if (_.contains(
41
33
  [
42
34
  'core.api_keys',
43
35
  'core.enable_password_login',
44
- 'core.enable_notification_stream'
45
36
  ],
46
37
  key
47
38
  )) { // booleans via checkboxes
@@ -77,9 +68,6 @@ var SystemConfigurationView = View.extend({
77
68
  this.$('#g-settings-error-message').text(resp.responseJSON.message);
78
69
  });
79
70
  },
80
- 'click #g-core-banner-default-color': function () {
81
- this.$('#g-core-banner-color').val(this.defaults['core.banner_color']);
82
- }
83
71
  },
84
72
 
85
73
  initialize: function () {
@@ -104,14 +92,12 @@ var SystemConfigurationView = View.extend({
104
92
  'core.smtp.username',
105
93
  'core.smtp.password',
106
94
  'core.upload_minimum_chunk_size',
107
- 'core.enable_notification_stream',
108
95
  'core.cors.allow_origin',
109
96
  'core.cors.allow_methods',
110
97
  'core.cors.allow_headers',
111
98
  'core.add_to_group_policy',
112
99
  'core.collection_create_policy',
113
100
  'core.user_default_folders',
114
- 'core.route_table'
115
101
  ];
116
102
  this.settingsKeys = keys;
117
103
  restRequest({
@@ -129,11 +115,6 @@ var SystemConfigurationView = View.extend({
129
115
  render: function () {
130
116
  this.$el.html(SystemConfigurationTemplate({
131
117
  settings: this.settings,
132
- routes: this.settings['core.route_table'],
133
- routeKeys: _.sortBy(
134
- _.keys(this.settings['core.route_table']),
135
- (a) => a.indexOf('core_') === 0 ? -1 : 0
136
- ),
137
118
  JSON: window.JSON
138
119
  }));
139
120
 
@@ -179,7 +160,7 @@ var SystemConfigurationView = View.extend({
179
160
  _covertCollectionCreationPolicy: function () {
180
161
  // get collection creation policy from AccessWidget and format the result properly
181
162
  var settingValue = null;
182
- if (this.$('.g-setting-switch').bootstrapSwitch('state')) {
163
+ if (this.$('.g-setting-switch').bootstrapSwitch('state') && this.accessWidget) {
183
164
  settingValue = { open: this.$('.g-setting-switch').bootstrapSwitch('state') };
184
165
  var accessList = this.accessWidget.getAccessList();
185
166
  _.each(_.keys(accessList), (key) => {
@@ -1,5 +1,5 @@
1
1
  import AdminView from './AdminView';
2
- import AssetstoresView from './AssetstoresView';
2
+ import AssetstoresView, { assetstoreImportViewMap } from './AssetstoresView';
3
3
  import CollectionView from './CollectionView';
4
4
  import CollectionsView from './CollectionsView';
5
5
  import FilesystemImportView from './FilesystemImportView';
@@ -19,6 +19,7 @@ import UsersView from './UsersView';
19
19
  export {
20
20
  AdminView,
21
21
  AssetstoresView,
22
+ assetstoreImportViewMap,
22
23
  CollectionView,
23
24
  CollectionsView,
24
25
  FilesystemImportView,
@@ -26,7 +26,7 @@ var LoginView = View.extend({
26
26
  const loginName = this.$('#g-login').val();
27
27
  const password = this.$('#g-password').val();
28
28
  const otpToken = this.$('#g-login-otp-group').hasClass('hidden') ? null : this.$('#g-login-otp').val();
29
- login(loginName, password, undefined, otpToken)
29
+ login(loginName, password, otpToken)
30
30
  .done(() => {
31
31
  this.$el.modal('hide');
32
32
  })
@@ -38,7 +38,7 @@ var ApiKeyListWidget = View.extend({
38
38
  }
39
39
  },
40
40
 
41
- 'click .g-api-key-new': function (e) {
41
+ 'click .g-api-key-new': function () {
42
42
  this._renderEditWidget();
43
43
  },
44
44
 
@@ -5,7 +5,8 @@ import View from '@girder/core/views/View';
5
5
 
6
6
  import dateTimeRangeWidgetTemplate from '@girder/core/templates/widgets/dateTimeRangeWidget.pug';
7
7
 
8
- import 'eonasdan-bootstrap-datetimepicker'; // /src/js/bootstrap-datetimepicker.js'
8
+ // Momentjs is not require()'d in the way this library expects
9
+ // import 'eonasdan-bootstrap-datetimepicker'; // /src/js/bootstrap-datetimepicker.js'
9
10
  import 'eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.css';
10
11
 
11
12
  /**