@girder/core 5.0.0-beta.1 → 5.0.0

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 (238) hide show
  1. package/dist-lib/Girder_Favicon.png +0 -0
  2. package/dist-lib/Girder_Mark.png +0 -0
  3. package/dist-lib/girder-core.css +2 -0
  4. package/dist-lib/girder-core.js +60421 -0
  5. package/dist-lib/girder-core.js.map +1 -0
  6. package/dist-lib/girder-core.umd.cjs +1484 -0
  7. package/dist-lib/girder-core.umd.cjs.map +1 -0
  8. package/dist-lib/index.d.ts +1 -0
  9. package/dist-lib/src/auth.js +112 -0
  10. package/dist-lib/src/collections/ApiKeyCollection.js +9 -0
  11. package/dist-lib/src/collections/AssetstoreCollection.js +10 -0
  12. package/dist-lib/src/collections/Collection.js +295 -0
  13. package/dist-lib/src/collections/CollectionCollection.js +9 -0
  14. package/dist-lib/src/collections/FileCollection.js +11 -0
  15. package/dist-lib/src/collections/FolderCollection.js +11 -0
  16. package/dist-lib/src/collections/GroupCollection.js +9 -0
  17. package/dist-lib/src/collections/ItemCollection.js +11 -0
  18. package/dist-lib/src/collections/UserCollection.js +24 -0
  19. package/dist-lib/src/collections/index.js +21 -0
  20. package/dist-lib/src/constants.js +32 -0
  21. package/dist-lib/src/dialog.js +128 -0
  22. package/dist-lib/src/events.js +6 -0
  23. package/dist-lib/src/index.ts +80 -0
  24. package/dist-lib/src/main.ts +61 -0
  25. package/dist-lib/src/misc.js +260 -0
  26. package/dist-lib/src/models/AccessControlledModel.js +76 -0
  27. package/dist-lib/src/models/ApiKeyModel.js +31 -0
  28. package/dist-lib/src/models/AssetstoreModel.js +43 -0
  29. package/dist-lib/src/models/CollectionCreationPolicyModel.js +20 -0
  30. package/dist-lib/src/models/CollectionModel.js +12 -0
  31. package/dist-lib/src/models/FileModel.js +310 -0
  32. package/dist-lib/src/models/FolderModel.js +33 -0
  33. package/dist-lib/src/models/GroupModel.js +197 -0
  34. package/dist-lib/src/models/ItemModel.js +72 -0
  35. package/dist-lib/src/models/MetadataMixin.js +88 -0
  36. package/dist-lib/src/models/Model.js +187 -0
  37. package/dist-lib/src/models/UserModel.js +189 -0
  38. package/dist-lib/src/models/index.js +25 -0
  39. package/dist-lib/src/pluginUtils.js +11 -0
  40. package/dist-lib/src/rest.js +221 -0
  41. package/dist-lib/src/router.js +58 -0
  42. package/dist-lib/src/routes.js +229 -0
  43. package/dist-lib/src/stylesheets/apidocs/apidocs.styl +50 -0
  44. package/dist-lib/src/stylesheets/body/adminConsole.styl +21 -0
  45. package/dist-lib/src/stylesheets/body/assetstores.styl +46 -0
  46. package/dist-lib/src/stylesheets/body/collectionList.styl +39 -0
  47. package/dist-lib/src/stylesheets/body/collectionPage.styl +6 -0
  48. package/dist-lib/src/stylesheets/body/frontPage.styl +48 -0
  49. package/dist-lib/src/stylesheets/body/groupList.styl +43 -0
  50. package/dist-lib/src/stylesheets/body/groupPage.styl +116 -0
  51. package/dist-lib/src/stylesheets/body/itemPage.styl +81 -0
  52. package/dist-lib/src/stylesheets/body/plugins.styl +61 -0
  53. package/dist-lib/src/stylesheets/body/searchResultsList.styl +51 -0
  54. package/dist-lib/src/stylesheets/body/systemConfig.styl +56 -0
  55. package/dist-lib/src/stylesheets/body/userAccount.styl +57 -0
  56. package/dist-lib/src/stylesheets/body/userList.styl +79 -0
  57. package/dist-lib/src/stylesheets/body/userPage.styl +6 -0
  58. package/dist-lib/src/stylesheets/layout/footer.styl +19 -0
  59. package/dist-lib/src/stylesheets/layout/global.styl +154 -0
  60. package/dist-lib/src/stylesheets/layout/globalNav.styl +89 -0
  61. package/dist-lib/src/stylesheets/layout/header.styl +29 -0
  62. package/dist-lib/src/stylesheets/layout/headerUser.styl +33 -0
  63. package/dist-lib/src/stylesheets/layout/layout.styl +75 -0
  64. package/dist-lib/src/stylesheets/layout/layoutVars.styl +9 -0
  65. package/dist-lib/src/stylesheets/layout/loading.styl +37 -0
  66. package/dist-lib/src/stylesheets/layout/progressArea.styl +17 -0
  67. package/dist-lib/src/stylesheets/widgets/accessWidget.styl +106 -0
  68. package/dist-lib/src/stylesheets/widgets/browserWidget.styl +9 -0
  69. package/dist-lib/src/stylesheets/widgets/hierarchyWidget.styl +188 -0
  70. package/dist-lib/src/stylesheets/widgets/markdownWidget.styl +92 -0
  71. package/dist-lib/src/stylesheets/widgets/metadataWidget.styl +92 -0
  72. package/dist-lib/src/stylesheets/widgets/searchFieldWidget.styl +70 -0
  73. package/dist-lib/src/stylesheets/widgets/taskProgress.styl +41 -0
  74. package/dist-lib/src/stylesheets/widgets/timelineWidget.styl +41 -0
  75. package/dist-lib/src/stylesheets/widgets/uploadWidget.styl +43 -0
  76. package/dist-lib/src/stylesheets/widgets/userOtpManagementWidget.styl +159 -0
  77. package/dist-lib/src/templates/body/adminConsole.pug +13 -0
  78. package/dist-lib/src/templates/body/assetstores.pug +83 -0
  79. package/dist-lib/src/templates/body/collectionList.pug +40 -0
  80. package/dist-lib/src/templates/body/collectionPage.pug +36 -0
  81. package/dist-lib/src/templates/body/filesystemImport.pug +41 -0
  82. package/dist-lib/src/templates/body/frontPage.pug +83 -0
  83. package/dist-lib/src/templates/body/groupList.pug +30 -0
  84. package/dist-lib/src/templates/body/groupPage.pug +116 -0
  85. package/dist-lib/src/templates/body/itemPage.pug +61 -0
  86. package/dist-lib/src/templates/body/plugins.pug +20 -0
  87. package/dist-lib/src/templates/body/s3Import.pug +35 -0
  88. package/dist-lib/src/templates/body/searchResults.pug +15 -0
  89. package/dist-lib/src/templates/body/searchResultsType.pug +13 -0
  90. package/dist-lib/src/templates/body/systemConfiguration.pug +215 -0
  91. package/dist-lib/src/templates/body/userAccount.pug +83 -0
  92. package/dist-lib/src/templates/body/userList.pug +43 -0
  93. package/dist-lib/src/templates/body/userPage.pug +40 -0
  94. package/dist-lib/src/templates/layout/alert.pug +5 -0
  95. package/dist-lib/src/templates/layout/layout.pug +12 -0
  96. package/dist-lib/src/templates/layout/layoutFooter.pug +11 -0
  97. package/dist-lib/src/templates/layout/layoutGlobalNav.pug +7 -0
  98. package/dist-lib/src/templates/layout/layoutHeader.pug +8 -0
  99. package/dist-lib/src/templates/layout/layoutHeaderUser.pug +26 -0
  100. package/dist-lib/src/templates/layout/layoutProgressArea.pug +1 -0
  101. package/dist-lib/src/templates/layout/loginDialog.pug +30 -0
  102. package/dist-lib/src/templates/layout/registerDialog.pug +35 -0
  103. package/dist-lib/src/templates/layout/resetPasswordDialog.pug +25 -0
  104. package/dist-lib/src/templates/widgets/accessEditor.pug +23 -0
  105. package/dist-lib/src/templates/widgets/accessEditorMixins.pug +57 -0
  106. package/dist-lib/src/templates/widgets/accessEditorNonModal.pug +11 -0
  107. package/dist-lib/src/templates/widgets/accessEntry.pug +32 -0
  108. package/dist-lib/src/templates/widgets/apiKeyList.pug +50 -0
  109. package/dist-lib/src/templates/widgets/browserWidget.pug +32 -0
  110. package/dist-lib/src/templates/widgets/checkedActionsMenu.pug +46 -0
  111. package/dist-lib/src/templates/widgets/collectionInfoDialog.pug +37 -0
  112. package/dist-lib/src/templates/widgets/confirmDialog.pug +14 -0
  113. package/dist-lib/src/templates/widgets/dateTimeRangeWidget.pug +20 -0
  114. package/dist-lib/src/templates/widgets/dateTimeWidget.pug +8 -0
  115. package/dist-lib/src/templates/widgets/editApiKeyWidget.pug +43 -0
  116. package/dist-lib/src/templates/widgets/editAssetstoreWidget.pug +70 -0
  117. package/dist-lib/src/templates/widgets/editCollectionWidget.pug +27 -0
  118. package/dist-lib/src/templates/widgets/editFileWidget.pug +21 -0
  119. package/dist-lib/src/templates/widgets/editFolderWidget.pug +27 -0
  120. package/dist-lib/src/templates/widgets/editGroupWidget.pug +54 -0
  121. package/dist-lib/src/templates/widgets/editItemWidget.pug +27 -0
  122. package/dist-lib/src/templates/widgets/fileInfoDialog.pug +33 -0
  123. package/dist-lib/src/templates/widgets/fileList.pug +33 -0
  124. package/dist-lib/src/templates/widgets/folderInfoDialog.pug +42 -0
  125. package/dist-lib/src/templates/widgets/folderList.pug +21 -0
  126. package/dist-lib/src/templates/widgets/groupAdminList.pug +33 -0
  127. package/dist-lib/src/templates/widgets/groupInviteDialog.pug +76 -0
  128. package/dist-lib/src/templates/widgets/groupInviteList.pug +14 -0
  129. package/dist-lib/src/templates/widgets/groupMemberList.pug +39 -0
  130. package/dist-lib/src/templates/widgets/groupModList.pug +23 -0
  131. package/dist-lib/src/templates/widgets/hierarchyBreadcrumb.pug +37 -0
  132. package/dist-lib/src/templates/widgets/hierarchyPaginated.pug +19 -0
  133. package/dist-lib/src/templates/widgets/hierarchyWidget.pug +96 -0
  134. package/dist-lib/src/templates/widgets/itemBreadcrumb.pug +16 -0
  135. package/dist-lib/src/templates/widgets/itemList.pug +27 -0
  136. package/dist-lib/src/templates/widgets/jsonMetadatumEditWidget.pug +13 -0
  137. package/dist-lib/src/templates/widgets/jsonMetadatumView.pug +6 -0
  138. package/dist-lib/src/templates/widgets/loadingAnimation.pug +4 -0
  139. package/dist-lib/src/templates/widgets/markdownWidget.pug +34 -0
  140. package/dist-lib/src/templates/widgets/metadataWidget.pug +16 -0
  141. package/dist-lib/src/templates/widgets/metadatumEditWidget.pug +15 -0
  142. package/dist-lib/src/templates/widgets/metadatumView.pug +5 -0
  143. package/dist-lib/src/templates/widgets/newAssetstore.pug +87 -0
  144. package/dist-lib/src/templates/widgets/paginateWidget.pug +7 -0
  145. package/dist-lib/src/templates/widgets/pluginConfigBreadcrumb.pug +13 -0
  146. package/dist-lib/src/templates/widgets/rootSelectorWidget.pug +13 -0
  147. package/dist-lib/src/templates/widgets/searchField.pug +10 -0
  148. package/dist-lib/src/templates/widgets/searchHelp.pug +12 -0
  149. package/dist-lib/src/templates/widgets/searchModeSelect.pug +9 -0
  150. package/dist-lib/src/templates/widgets/searchResults.pug +14 -0
  151. package/dist-lib/src/templates/widgets/sortCollectionWidget.pug +14 -0
  152. package/dist-lib/src/templates/widgets/taskProgress.pug +16 -0
  153. package/dist-lib/src/templates/widgets/timeline.pug +15 -0
  154. package/dist-lib/src/templates/widgets/uploadWidget.pug +15 -0
  155. package/dist-lib/src/templates/widgets/uploadWidgetMixins.pug +31 -0
  156. package/dist-lib/src/templates/widgets/uploadWidgetNonModal.pug +10 -0
  157. package/dist-lib/src/templates/widgets/userOtpBegin.pug +4 -0
  158. package/dist-lib/src/templates/widgets/userOtpDisable.pug +6 -0
  159. package/dist-lib/src/templates/widgets/userOtpEnable.pug +44 -0
  160. package/dist-lib/src/utilities/EventStream.js +119 -0
  161. package/dist-lib/src/utilities/PluginUtils.js +36 -0
  162. package/dist-lib/src/utilities/S3UploadHandler.js +263 -0
  163. package/dist-lib/src/utilities/index.js +9 -0
  164. package/dist-lib/src/utilities/jquery/girderEnable.js +19 -0
  165. package/dist-lib/src/utilities/jquery/girderModal.js +48 -0
  166. package/dist-lib/src/version.js +6 -0
  167. package/dist-lib/src/views/App.js +359 -0
  168. package/dist-lib/src/views/View.js +79 -0
  169. package/dist-lib/src/views/body/AdminView.js +29 -0
  170. package/dist-lib/src/views/body/AssetstoresView.js +233 -0
  171. package/dist-lib/src/views/body/CollectionView.js +188 -0
  172. package/dist-lib/src/views/body/CollectionsView.js +120 -0
  173. package/dist-lib/src/views/body/FilesystemImportView.js +83 -0
  174. package/dist-lib/src/views/body/FolderView.js +54 -0
  175. package/dist-lib/src/views/body/FrontPageView.js +47 -0
  176. package/dist-lib/src/views/body/GroupView.js +336 -0
  177. package/dist-lib/src/views/body/GroupsView.js +106 -0
  178. package/dist-lib/src/views/body/ItemView.js +177 -0
  179. package/dist-lib/src/views/body/PluginsView.js +73 -0
  180. package/dist-lib/src/views/body/S3ImportView.js +80 -0
  181. package/dist-lib/src/views/body/SearchResultsView.js +162 -0
  182. package/dist-lib/src/views/body/SystemConfigurationView.js +177 -0
  183. package/dist-lib/src/views/body/UserAccountView.js +179 -0
  184. package/dist-lib/src/views/body/UserView.js +165 -0
  185. package/dist-lib/src/views/body/UsersView.js +124 -0
  186. package/dist-lib/src/views/body/index.js +38 -0
  187. package/dist-lib/src/views/index.js +13 -0
  188. package/dist-lib/src/views/layout/FooterView.js +29 -0
  189. package/dist-lib/src/views/layout/GlobalNavView.js +103 -0
  190. package/dist-lib/src/views/layout/HeaderUserView.js +45 -0
  191. package/dist-lib/src/views/layout/HeaderView.js +83 -0
  192. package/dist-lib/src/views/layout/LoginView.js +100 -0
  193. package/dist-lib/src/views/layout/ProgressListView.js +70 -0
  194. package/dist-lib/src/views/layout/RegisterView.js +101 -0
  195. package/dist-lib/src/views/layout/ResetPasswordView.js +70 -0
  196. package/dist-lib/src/views/layout/index.js +19 -0
  197. package/dist-lib/src/views/widgets/AccessWidget.js +427 -0
  198. package/dist-lib/src/views/widgets/ApiKeyListWidget.js +140 -0
  199. package/dist-lib/src/views/widgets/BrowserWidget.js +317 -0
  200. package/dist-lib/src/views/widgets/CheckedMenuWidget.js +68 -0
  201. package/dist-lib/src/views/widgets/CollectionInfoWidget.js +40 -0
  202. package/dist-lib/src/views/widgets/DateTimeRangeWidget.js +180 -0
  203. package/dist-lib/src/views/widgets/DateTimeWidget.js +110 -0
  204. package/dist-lib/src/views/widgets/EditApiKeyWidget.js +124 -0
  205. package/dist-lib/src/views/widgets/EditAssetstoreWidget.js +136 -0
  206. package/dist-lib/src/views/widgets/EditCollectionWidget.js +93 -0
  207. package/dist-lib/src/views/widgets/EditFileWidget.js +56 -0
  208. package/dist-lib/src/views/widgets/EditFolderWidget.js +116 -0
  209. package/dist-lib/src/views/widgets/EditGroupWidget.js +125 -0
  210. package/dist-lib/src/views/widgets/EditItemWidget.js +110 -0
  211. package/dist-lib/src/views/widgets/FileInfoWidget.js +26 -0
  212. package/dist-lib/src/views/widgets/FileListWidget.js +151 -0
  213. package/dist-lib/src/views/widgets/FolderInfoWidget.js +39 -0
  214. package/dist-lib/src/views/widgets/FolderListWidget.js +106 -0
  215. package/dist-lib/src/views/widgets/GroupAdminsWidget.js +88 -0
  216. package/dist-lib/src/views/widgets/GroupInvitesWidget.js +56 -0
  217. package/dist-lib/src/views/widgets/GroupMembersWidget.js +185 -0
  218. package/dist-lib/src/views/widgets/GroupModsWidget.js +77 -0
  219. package/dist-lib/src/views/widgets/HierarchyWidget.js +1097 -0
  220. package/dist-lib/src/views/widgets/ItemBreadcrumbWidget.js +38 -0
  221. package/dist-lib/src/views/widgets/ItemListWidget.js +345 -0
  222. package/dist-lib/src/views/widgets/LoadingAnimation.js +17 -0
  223. package/dist-lib/src/views/widgets/MarkdownWidget.js +217 -0
  224. package/dist-lib/src/views/widgets/MetadataWidget.js +508 -0
  225. package/dist-lib/src/views/widgets/NewAssetstoreWidget.js +72 -0
  226. package/dist-lib/src/views/widgets/PaginateWidget.js +37 -0
  227. package/dist-lib/src/views/widgets/PluginConfigBreadcrumbWidget.js +33 -0
  228. package/dist-lib/src/views/widgets/RootSelectorWidget.js +192 -0
  229. package/dist-lib/src/views/widgets/SearchFieldWidget.js +365 -0
  230. package/dist-lib/src/views/widgets/SearchPaginateWidget.js +149 -0
  231. package/dist-lib/src/views/widgets/SortCollectionWidget.js +53 -0
  232. package/dist-lib/src/views/widgets/TaskProgressWidget.js +91 -0
  233. package/dist-lib/src/views/widgets/TimelineWidget.js +155 -0
  234. package/dist-lib/src/views/widgets/UploadWidget.js +340 -0
  235. package/dist-lib/src/views/widgets/UserOtpManagementWidget.js +105 -0
  236. package/dist-lib/src/views/widgets/index.js +81 -0
  237. package/dist-lib/src/vite-env.d.ts +5 -0
  238. package/package.json +17 -15
@@ -0,0 +1,233 @@
1
+ import $ from 'jquery';
2
+ import _ from 'underscore';
3
+
4
+ import AssetstoreCollection from '@girder/core/collections/AssetstoreCollection';
5
+ import AssetstoreModel from '@girder/core/models/AssetstoreModel';
6
+ import EditAssetstoreWidget from '@girder/core/views/widgets/EditAssetstoreWidget';
7
+ import NewAssetstoreWidget from '@girder/core/views/widgets/NewAssetstoreWidget';
8
+ import View from '@girder/core/views/View';
9
+ import { AssetstoreType } from '@girder/core/constants';
10
+ import { cancelRestRequests } from '@girder/core/rest';
11
+ import { confirm } from '@girder/core/dialog';
12
+ import events from '@girder/core/events';
13
+ import { formatSize } from '@girder/core/misc';
14
+ import { getCurrentUser } from '@girder/core/auth';
15
+
16
+ import AssetstoresTemplate from '@girder/core/templates/body/assetstores.pug';
17
+
18
+ import '@girder/core/stylesheets/body/assetstores.styl';
19
+
20
+ import ApexCharts from 'apexcharts';
21
+
22
+ /**
23
+ * This private data structure is a dynamic way to map assetstore types to the views
24
+ * that should be rendered to import data into them.
25
+ */
26
+ import FilesystemImportView from '@girder/core/views/body/FilesystemImportView';
27
+ import S3ImportView from '@girder/core/views/body/S3ImportView';
28
+ var assetstoreImportViewMap = {};
29
+ assetstoreImportViewMap[AssetstoreType.FILESYSTEM] = FilesystemImportView;
30
+ assetstoreImportViewMap[AssetstoreType.S3] = S3ImportView;
31
+
32
+ /**
33
+ * This view shows the admin console, which links to all available admin pages.
34
+ */
35
+ var AssetstoresView = View.extend({
36
+ events: {
37
+ 'click .g-set-current': 'setCurrentAssetstore',
38
+ 'click .g-delete-assetstore': 'deleteAssetstore',
39
+ 'click .g-edit-assetstore': 'editAssetstore'
40
+ },
41
+
42
+ initialize: function (settings) {
43
+ cancelRestRequests('fetch');
44
+ this.plots = [];
45
+ this.assetstoreEdit = settings.assetstoreEdit || false;
46
+ this.importableTypes = [
47
+ AssetstoreType.FILESYSTEM,
48
+ AssetstoreType.S3
49
+ ].concat(settings.importableTypes || []);
50
+
51
+ this.newAssetstoreWidget = new NewAssetstoreWidget({
52
+ parentView: this
53
+ }).on('g:created', this.addAssetstore, this);
54
+
55
+ // Fetch all of the current assetstores
56
+ this.collection = new AssetstoreCollection();
57
+ this.collection.on('g:changed', function () {
58
+ this.render();
59
+ }, this).fetch();
60
+ },
61
+
62
+ destroy: function () {
63
+ this._destroyPlots();
64
+ View.prototype.destroy.call(this);
65
+ },
66
+
67
+ _destroyPlots: function () {
68
+ for (const plot of this.plots) {
69
+ plot.destroy();
70
+ }
71
+ this.plots = [];
72
+ },
73
+
74
+ render: function () {
75
+ if (!getCurrentUser() || !getCurrentUser().get('admin')) {
76
+ this.$el.text('Must be logged in as admin to view this page.');
77
+ return;
78
+ }
79
+ this._destroyPlots();
80
+ this.$el.html(AssetstoresTemplate({
81
+ assetstores: this.collection.toArray(),
82
+ types: AssetstoreType,
83
+ importableTypes: this.importableTypes,
84
+ getAssetstoreImportRoute: this.getAssetstoreImportRoute
85
+ }));
86
+
87
+ this.newAssetstoreWidget.setElement(this.$('#g-new-assetstore-container')).render();
88
+
89
+ _.each(this.$('.g-assetstore-capacity-chart'),
90
+ this.capacityChart, this);
91
+
92
+ if (this.assetstoreEdit) {
93
+ this.editAssetstoreDialog(this.assetstoreEdit);
94
+ this.assetstoreEdit = false;
95
+ }
96
+
97
+ return this;
98
+ },
99
+
100
+ addAssetstore: function (assetstore) {
101
+ this.collection.add(assetstore);
102
+ this.render();
103
+ },
104
+
105
+ /**
106
+ * Renders the capacities of the assetstores in a pie chart using Chart.js.
107
+ * @param el The canvas element to render in.
108
+ */
109
+ capacityChart: function (el) {
110
+ var assetstore = this.collection.get($(el).attr('cid'));
111
+ var capacity = assetstore.get('capacity');
112
+ var used = capacity.total - capacity.free;
113
+ var data = [
114
+ ['Used (' + formatSize(used) + ')', used],
115
+ ['Free (' + formatSize(capacity.free) + ')', capacity.free]
116
+ ];
117
+ var plot = new ApexCharts(el, {
118
+ series: data.map(d => d[1]),
119
+ chart: {
120
+ type: 'pie',
121
+ animations: { enabled: false }
122
+ },
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
+ }
133
+ },
134
+ dataLabels: {
135
+ style: {
136
+ colors: ['#000', '#000']
137
+ },
138
+ dropShadow: {enabled: false},
139
+ },
140
+ legend: { position: 'right' }
141
+ });
142
+ plot.render();
143
+ this.plots.push(plot);
144
+ },
145
+
146
+ setCurrentAssetstore: function (evt) {
147
+ var el = $(evt.currentTarget);
148
+ var assetstore = this.collection.get(el.attr('cid'));
149
+ assetstore.set({ current: true });
150
+ assetstore.off('g:saved').on('g:saved', function () {
151
+ events.trigger('g:alert', {
152
+ icon: 'ok',
153
+ text: 'Changed current assetstore.',
154
+ type: 'success',
155
+ timeout: 4000
156
+ });
157
+ this.collection.fetch({}, true);
158
+ }, this).off('g:error').on('g:error', function (err) {
159
+ events.trigger('g:alert', {
160
+ icon: 'cancel',
161
+ text: err.responseJSON.message,
162
+ type: 'danger'
163
+ });
164
+ }).save();
165
+ },
166
+
167
+ deleteAssetstore: function (evt) {
168
+ var el = $(evt.currentTarget);
169
+ var assetstore = this.collection.get(el.attr('cid'));
170
+
171
+ confirm({
172
+ text: 'Are you sure you want to delete the assetstore <b>' +
173
+ assetstore.escape('name') + '</b>? There are no files ' +
174
+ 'stored in it, and no data will be lost.',
175
+ escapedHtml: true,
176
+ yesText: 'Delete',
177
+ confirmCallback: () => {
178
+ assetstore.on('g:deleted', function () {
179
+ events.trigger('g:alert', {
180
+ icon: 'ok',
181
+ text: 'Assetstore deleted.',
182
+ type: 'success',
183
+ timeout: 4000
184
+ });
185
+ this.collection.fetch({}, true);
186
+ }, this).off('g:error').on('g:error', function (resp) {
187
+ events.trigger('g:alert', {
188
+ icon: 'attention',
189
+ text: resp.responseJSON.message,
190
+ type: 'danger',
191
+ timeout: 4000
192
+ });
193
+ }, this).destroy();
194
+ }
195
+ });
196
+ },
197
+
198
+ editAssetstore: function (evt) {
199
+ var cid = $(evt.currentTarget).attr('cid');
200
+ this.editAssetstoreDialog(cid);
201
+ },
202
+
203
+ editAssetstoreDialog: function (cid) {
204
+ var assetstore = this.collection.get(cid);
205
+ var container = $('#g-dialog-container');
206
+
207
+ var editAssetstoreWidget = new EditAssetstoreWidget({
208
+ el: container,
209
+ model: assetstore,
210
+ parentView: this
211
+ }).off('g:saved').on('g:saved', function () {
212
+ this.render();
213
+ }, this);
214
+ editAssetstoreWidget.render();
215
+ }
216
+ }, {
217
+ import: function (assetstoreId) {
218
+ var assetstore = new AssetstoreModel({ _id: assetstoreId });
219
+ assetstore.once('g:fetched', function () {
220
+ var View = assetstoreImportViewMap[assetstore.get('type')];
221
+ if (View) {
222
+ events.trigger('g:navigateTo', View, {
223
+ assetstore: assetstore
224
+ });
225
+ } else {
226
+ throw new Error('No such view');
227
+ }
228
+ }).fetch();
229
+ }
230
+ });
231
+
232
+ export { assetstoreImportViewMap };
233
+ export default AssetstoresView;
@@ -0,0 +1,188 @@
1
+ import $ from 'jquery';
2
+ import _ from 'underscore';
3
+
4
+ import AccessWidget from '@girder/core/views/widgets/AccessWidget';
5
+ import CollectionModel from '@girder/core/models/CollectionModel';
6
+ import EditCollectionWidget from '@girder/core/views/widgets/EditCollectionWidget';
7
+ import FolderModel from '@girder/core/models/FolderModel';
8
+ import HierarchyWidget from '@girder/core/views/widgets/HierarchyWidget';
9
+ import router from '@girder/core/router';
10
+ import View from '@girder/core/views/View';
11
+ import { AccessType } from '@girder/core/constants';
12
+ import { cancelRestRequests } from '@girder/core/rest';
13
+ import { confirm } from '@girder/core/dialog';
14
+ import { renderMarkdown, formatSize } from '@girder/core/misc';
15
+ import events from '@girder/core/events';
16
+
17
+ import CollectionPageTemplate from '@girder/core/templates/body/collectionPage.pug';
18
+
19
+ import '@girder/core/stylesheets/body/collectionPage.styl';
20
+
21
+ import 'bootstrap/js/dropdown';
22
+
23
+ /**
24
+ * This view shows a single collection's page.
25
+ */
26
+ var CollectionView = View.extend({
27
+ events: {
28
+ 'click .g-edit-collection': 'editCollection',
29
+ 'click .g-collection-access-control': 'editAccess',
30
+ 'click .g-delete-collection': 'deleteConfirmation'
31
+ },
32
+
33
+ initialize: function (settings) {
34
+ cancelRestRequests('fetch');
35
+
36
+ this.upload = settings.upload || false;
37
+ this.access = settings.access || false;
38
+ this.edit = settings.edit || false;
39
+ this.folderAccess = settings.folderAccess || false;
40
+ this.folderCreate = settings.folderCreate || false;
41
+ this.folderEdit = settings.folderEdit || false;
42
+ this.itemCreate = settings.itemCreate || false;
43
+
44
+ // If collection model is already passed, there is no need to fetch.
45
+ if (settings.collection) {
46
+ this.model = settings.collection;
47
+
48
+ if (settings.folderId) {
49
+ this.folder = new FolderModel();
50
+ this.folder.set({
51
+ _id: settings.folderId
52
+ }).on('g:fetched', function () {
53
+ this.render();
54
+ }, this).on('g:error', function () {
55
+ this.folder = null;
56
+ this.render();
57
+ }, this).fetch();
58
+ } else {
59
+ this.render();
60
+ }
61
+ } else if (settings.id) {
62
+ this.model = new CollectionModel();
63
+ this.model.set('_id', settings.id);
64
+
65
+ this.model.on('g:fetched', function () {
66
+ this.render();
67
+ }, this).fetch();
68
+ }
69
+ },
70
+
71
+ editCollection: function () {
72
+ var container = $('#g-dialog-container');
73
+
74
+ if (!this.editCollectionWidget) {
75
+ this.editCollectionWidget = new EditCollectionWidget({
76
+ el: container,
77
+ model: this.model,
78
+ parentView: this
79
+ }).on('g:saved', function () {
80
+ this.render();
81
+ }, this);
82
+ }
83
+ this.editCollectionWidget.render();
84
+ },
85
+
86
+ render: function () {
87
+ this.$el.html(CollectionPageTemplate({
88
+ collection: this.model,
89
+ AccessType: AccessType,
90
+ renderMarkdown: renderMarkdown
91
+ }));
92
+
93
+ if (!this.hierarchyWidget) {
94
+ // The HierarchyWidget will self-render when instantiated
95
+ this.hierarchyWidget = new HierarchyWidget({
96
+ el: this.$('.g-collection-hierarchy-container'),
97
+ parentModel: this.folder || this.model,
98
+ upload: this.upload,
99
+ folderAccess: this.folderAccess,
100
+ folderEdit: this.folderEdit,
101
+ folderCreate: this.folderCreate,
102
+ itemCreate: this.itemCreate,
103
+ parentView: this
104
+ }).on('g:setCurrentModel', () => {
105
+ // When a user descends into the hierarchy, hide the collection
106
+ // actions list to avoid confusion.
107
+ this.$('.g-collection-header .g-collection-actions-button').hide();
108
+ });
109
+ } else {
110
+ this.hierarchyWidget
111
+ .setElement(this.$('.g-collection-hierarchy-container'))
112
+ .render();
113
+ }
114
+
115
+ this.upload = false;
116
+ this.folderAccess = false;
117
+ this.folderEdit = false;
118
+ this.folderCreate = false;
119
+ this.itemCreate = false;
120
+
121
+ if (this.edit) {
122
+ this.editCollection();
123
+ } else if (this.access) {
124
+ this.editAccess();
125
+ }
126
+
127
+ return this;
128
+ },
129
+
130
+ editAccess: function () {
131
+ new AccessWidget({
132
+ el: $('#g-dialog-container'),
133
+ modelType: 'collection',
134
+ model: this.model,
135
+ parentView: this
136
+ }).on('g:accessListSaved', function (params) {
137
+ if (params.recurse) {
138
+ this.hierarchyWidget.refreshFolderList();
139
+ }
140
+ }, this);
141
+ },
142
+
143
+ deleteConfirmation: function () {
144
+ let params = {
145
+ text: 'Are you sure you want to delete the collection <b>' +
146
+ this.model.escape('name') + this.model.escape('nFolders') + '</b>?',
147
+ yesText: 'Delete',
148
+ escapedHtml: true,
149
+ confirmCallback: () => {
150
+ this.model.on('g:deleted', function () {
151
+ events.trigger('g:alert', {
152
+ icon: 'ok',
153
+ text: 'Collection deleted.',
154
+ type: 'success',
155
+ timeout: 4000
156
+ });
157
+ router.navigate('collections', { trigger: true });
158
+ }).destroy();
159
+ }
160
+ };
161
+ if (this.model.get('nFolders') !== 0 || this.model.get('size') !== 0) {
162
+ params = _.extend({
163
+ additionalText: '<b>' + this.model.escape('name') + '</b>' +
164
+ ' contains <b>' + this.model.escape('nFolders') +
165
+ ' folders</b> taking up <b>' +
166
+ formatSize(parseInt(this.model.get('size'), 10)) + '</b>',
167
+ msgConfirmation: true,
168
+ name: this.model.escape('name')
169
+ }, params);
170
+ }
171
+ confirm(params);
172
+ }
173
+ }, {
174
+ /**
175
+ * Helper function for fetching the user and rendering the view with
176
+ * an arbitrary set of extra parameters.
177
+ */
178
+ fetchAndInit: function (cid, params) {
179
+ var collection = new CollectionModel();
180
+ collection.set({ _id: cid }).on('g:fetched', function () {
181
+ events.trigger('g:navigateTo', CollectionView, _.extend({
182
+ collection: collection
183
+ }, params || {}));
184
+ }, this).fetch();
185
+ }
186
+ });
187
+
188
+ export default CollectionView;
@@ -0,0 +1,120 @@
1
+ import $ from 'jquery';
2
+
3
+ import CollectionCollection from '@girder/core/collections/CollectionCollection';
4
+ import CollectionModel from '@girder/core/models/CollectionModel';
5
+ import EditCollectionWidget from '@girder/core/views/widgets/EditCollectionWidget';
6
+ import PaginateWidget from '@girder/core/views/widgets/PaginateWidget';
7
+ import router from '@girder/core/router';
8
+ import SearchFieldWidget from '@girder/core/views/widgets/SearchFieldWidget';
9
+ import View from '@girder/core/views/View';
10
+ import { cancelRestRequests } from '@girder/core/rest';
11
+ import { formatDate, formatSize, renderMarkdown, DATE_MINUTE } from '@girder/core/misc';
12
+ import { getCurrentUser } from '@girder/core/auth';
13
+
14
+ import CollectionListTemplate from '@girder/core/templates/body/collectionList.pug';
15
+
16
+ import '@girder/core/stylesheets/body/collectionList.styl';
17
+
18
+ /**
19
+ * This view lists the collections.
20
+ */
21
+ var CollectionsView = View.extend({
22
+ events: {
23
+ 'click a.g-collection-link': function (event) {
24
+ var cid = $(event.currentTarget).attr('g-collection-cid');
25
+ router.navigate('collection/' + this.collection.get(cid).id, { trigger: true });
26
+ },
27
+ 'click button.g-collection-create-button': 'createCollectionDialog',
28
+ 'submit .g-collections-search-form': function (event) {
29
+ event.preventDefault();
30
+ },
31
+ 'click .g-show-description': '_toggleDescription'
32
+ },
33
+
34
+ initialize: function (settings) {
35
+ cancelRestRequests('fetch');
36
+ this.collection = new CollectionCollection();
37
+ this.collection.on('g:changed', function () {
38
+ this.render();
39
+ }, this).fetch();
40
+
41
+ this.paginateWidget = new PaginateWidget({
42
+ collection: this.collection,
43
+ parentView: this
44
+ });
45
+
46
+ this.searchWidget = new SearchFieldWidget({
47
+ placeholder: 'Search collections...',
48
+ types: ['collection'],
49
+ parentView: this
50
+ }).on('g:resultClicked', this._gotoCollection, this);
51
+
52
+ this.create = settings.dialog === 'create';
53
+ },
54
+
55
+ /**
56
+ * Prompt the user to create a new collection
57
+ */
58
+ createCollectionDialog: function () {
59
+ var container = $('#g-dialog-container');
60
+
61
+ new EditCollectionWidget({
62
+ el: container,
63
+ parentView: this
64
+ }).on('g:saved', function (collection) {
65
+ router.navigate('collection/' + collection.get('_id'),
66
+ { trigger: true });
67
+ }, this).render();
68
+ },
69
+
70
+ render: function () {
71
+ this.$el.html(CollectionListTemplate({
72
+ collections: this.collection.toArray(),
73
+ getCurrentUser: getCurrentUser,
74
+ formatDate: formatDate,
75
+ DATE_MINUTE: DATE_MINUTE,
76
+ formatSize: formatSize
77
+ }));
78
+
79
+ this.paginateWidget.setElement(this.$('.g-collection-pagination')).render();
80
+ this.searchWidget.setElement(this.$('.g-collections-search-container')).render();
81
+
82
+ if (this.create) {
83
+ this.createCollectionDialog();
84
+ }
85
+
86
+ return this;
87
+ },
88
+
89
+ /**
90
+ * When the user clicks a search result collection, this helper method
91
+ * will navigate them to the view for that specific collection.
92
+ */
93
+ _gotoCollection: function (result) {
94
+ var collection = new CollectionModel();
95
+ collection.set('_id', result.id).on('g:fetched', function () {
96
+ router.navigate('/collection/' + collection.get('_id'), { trigger: true });
97
+ }, this).fetch();
98
+ },
99
+
100
+ _toggleDescription: function (e) {
101
+ const link = $(e.currentTarget);
102
+ const cid = link.attr('cid');
103
+ const dest = this.$(`.g-collection-description[cid="${cid}"]`);
104
+
105
+ if (link.attr('state') === 'hidden') {
106
+ renderMarkdown(this.collection.get(cid).get('description'), dest);
107
+ dest.removeClass('hide');
108
+ link.attr('state', 'visible');
109
+ link.find('i').removeClass('icon-down-dir').addClass('icon-up-dir');
110
+ link.find('span').text('Hide description');
111
+ } else {
112
+ dest.addClass('hide');
113
+ link.attr('state', 'hidden');
114
+ link.find('i').removeClass('icon-up-dir').addClass('icon-down-dir');
115
+ link.find('span').text('Show description');
116
+ }
117
+ }
118
+ });
119
+
120
+ export default CollectionsView;
@@ -0,0 +1,83 @@
1
+ import $ from 'jquery';
2
+
3
+ import BrowserWidget from '@girder/core/views/widgets/BrowserWidget';
4
+ import router from '@girder/core/router';
5
+ import View from '@girder/core/views/View';
6
+ import { restRequest } from '@girder/core/rest';
7
+
8
+ import FilesystemImportTemplate from '@girder/core/templates/body/filesystemImport.pug';
9
+
10
+ var FilesystemImportView = View.extend({
11
+ events: {
12
+ 'submit .g-filesystem-import-form': function (e) {
13
+ e.preventDefault();
14
+
15
+ var destId = this.$('#g-filesystem-import-dest-id').val().trim().split(/\s/)[0],
16
+ destType = this.$('#g-filesystem-import-dest-type').val(),
17
+ foldersAsItems = this.$('#g-filesystem-import-leaf-items').val();
18
+
19
+ this.$('.g-validation-failed-message').empty();
20
+
21
+ this.assetstore.off('g:imported').on('g:imported', function () {
22
+ router.navigate(destType + '/' + destId, { trigger: true });
23
+ }, this).on('g:error', function (resp) {
24
+ this.$('.g-validation-failed-message').text(resp.responseJSON.message);
25
+ }, this).import({
26
+ importPath: this.$('#g-filesystem-import-path').val().trim(),
27
+ leafFoldersAsItems: foldersAsItems,
28
+ destinationId: destId,
29
+ destinationType: destType,
30
+ progress: true
31
+ });
32
+ },
33
+ 'click .g-open-browser': '_openBrowser'
34
+ },
35
+
36
+ initialize: function (settings) {
37
+ this._browserWidgetView = new BrowserWidget({
38
+ parentView: this,
39
+ titleText: 'Destination',
40
+ helpText: 'Browse to a location to select it as the destination.',
41
+ submitText: 'Select Destination',
42
+ validate: function (model) {
43
+ const isValid = $.Deferred();
44
+ if (!model) {
45
+ isValid.reject('Please select a valid root.');
46
+ } else {
47
+ isValid.resolve();
48
+ }
49
+ return isValid.promise();
50
+ }
51
+ });
52
+ this.listenTo(this._browserWidgetView, 'g:saved', function (val) {
53
+ this.$('#g-filesystem-import-dest-id').val(val.id);
54
+ this.$('#g-filesystem-import-dest-type').val(val.get('_modelType'));
55
+ restRequest({
56
+ url: `resource/${val.id}/path`,
57
+ method: 'GET',
58
+ data: { type: val.get('_modelType') }
59
+ }).done((result) => {
60
+ // Only add the resource path if the value wasn't altered
61
+ if (this.$('#g-filesystem-import-dest-id').val() === val.id) {
62
+ this.$('#g-filesystem-import-dest-id').val(`${val.id} (${result})`);
63
+ }
64
+ });
65
+ });
66
+ this.assetstore = settings.assetstore;
67
+ this.render();
68
+ },
69
+
70
+ render: function () {
71
+ this.$el.html(FilesystemImportTemplate({
72
+ assetstore: this.assetstore
73
+ }));
74
+
75
+ return this;
76
+ },
77
+
78
+ _openBrowser: function () {
79
+ this._browserWidgetView.setElement($('#g-dialog-container')).render();
80
+ }
81
+ });
82
+
83
+ export default FilesystemImportView;
@@ -0,0 +1,54 @@
1
+ import _ from 'underscore';
2
+
3
+ import FolderModel from '@girder/core/models/FolderModel';
4
+ import HierarchyWidget from '@girder/core/views/widgets/HierarchyWidget';
5
+ import View from '@girder/core/views/View';
6
+ import { cancelRestRequests } from '@girder/core/rest';
7
+ import events from '@girder/core/events';
8
+
9
+ /**
10
+ * This view shows a single folder as a hierarchy widget.
11
+ */
12
+ var FolderView = View.extend({
13
+ initialize: function (settings) {
14
+ cancelRestRequests('fetch');
15
+ this.folder = settings.folder;
16
+ this.upload = settings.upload || false;
17
+ this.folderAccess = settings.folderAccess || false;
18
+ this.folderCreate = settings.folderCreate || false;
19
+ this.folderEdit = settings.folderEdit || false;
20
+ this.itemCreate = settings.itemCreate || false;
21
+
22
+ this.render();
23
+ },
24
+
25
+ render: function () {
26
+ this.hierarchyWidget = new HierarchyWidget({
27
+ el: this.$el,
28
+ parentModel: this.folder,
29
+ upload: this.upload,
30
+ folderAccess: this.folderAccess,
31
+ folderEdit: this.folderEdit,
32
+ folderCreate: this.folderCreate,
33
+ itemCreate: this.itemCreate,
34
+ parentView: this
35
+ });
36
+
37
+ return this;
38
+ }
39
+ }, {
40
+ /**
41
+ * Helper function for fetching the folder by id, then render the view.
42
+ */
43
+ fetchAndInit: function (id, params) {
44
+ var folder = new FolderModel();
45
+ folder.set({ _id: id }).on('g:fetched', function () {
46
+ events.trigger('g:navigateTo', FolderView, _.extend({
47
+ folder: folder
48
+ }, params || {}));
49
+ }, this).fetch();
50
+ }
51
+
52
+ });
53
+
54
+ export default FolderView;