@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,317 @@
1
+ import $ from 'jquery';
2
+ import _ from 'underscore';
3
+
4
+ import HierarchyWidget from '@girder/core/views/widgets/HierarchyWidget';
5
+ import RootSelectorWidget from '@girder/core/views/widgets/RootSelectorWidget';
6
+ import View from '@girder/core/views/View';
7
+ import CollectionModel from '@girder/core/models/CollectionModel';
8
+ import FolderModel from '@girder/core/models/FolderModel';
9
+ import UserModel from '@girder/core/models/UserModel';
10
+
11
+ import BrowserWidgetTemplate from '@girder/core/templates/widgets/browserWidget.pug';
12
+
13
+ import '@girder/core/stylesheets/widgets/browserWidget.styl';
14
+ import '@girder/core/utilities/jquery/girderModal';
15
+
16
+ /**
17
+ * This widget provides the user with an interface similar to a filesystem
18
+ * browser to pick a single user, collection, folder, or item from a
19
+ * hierarchical view.
20
+ */
21
+ var BrowserWidget = View.extend({
22
+ events: {
23
+ 'click .g-submit-button': function () {
24
+ this._validate();
25
+ }
26
+ },
27
+
28
+ /**
29
+ * Initialize the widget.
30
+ * @param {object} settings
31
+ * @param {string} [titleText="Select an item"] Text to display in the modal header
32
+ * @param {string} [helpText] Info text to display below the hierarchy widget
33
+ * @param {string} [submitText="Save"] Text to display on the submit button
34
+ * @param {boolean} [showItems=false] Show items in the hierarchy widget
35
+ * @param {boolean} [showPreview=true] Show a preview of the current object id
36
+ * @param {function} [validate] A validation function, which is passed the selected model as a
37
+ parameter, and which should return a promise. The returned promise should resolve if the
38
+ selection is acceptable and reject with a string value (as an error message) if the
39
+ selection is unacceptable.
40
+ * @param {object} [rootSelectorSettings] Settings passed to the root selector widget
41
+ * @param {boolean} [showMetadata=false] Show the metadata editor inside the hierarchy widget
42
+ * @param {Model} [root] The default root model to pass to the hierarchy widget
43
+ * @param {Model} [defaultSelectedResource] default resource item to be selected. It will start
44
+ * the browser with this item selected. Will override the root to the parent of
45
+ * the defaultSelectedResource
46
+ * @param {boolean} [selectItem=false] Adjust behavior to enable selecting items rather
47
+ * than folders. This will add a handler to the hierarchy widget responding to
48
+ * clicks on items to select a target rather than inferring it from the browsed
49
+ * location.
50
+ * @param {object} [input=false] Settings passed to an optional text input box
51
+ * The input box is primarily meant to be for a user to enter a file name
52
+ * as in a "Save As" dialog. The default (false) hides this element.
53
+ * @param {string} [input.label="Name"] A label for the input element.
54
+ * @param {string} [input.default] The default value
55
+ * @param {function} [input.validate] A validation function, which is passed the value of the
56
+ user-specified input element as a parameter, and which should return a promise. The returned
57
+ promise should resolve if the selection is acceptable and reject with a string value (as an
58
+ error message) if the selection is unacceptable.
59
+ * @param {string} [input.placeholder] A placeholder string for the input element.
60
+ * @param {boolean} [highlightItem=false] highlights the selected item in the hierarchy and scrolls to it.
61
+ * @param {boolean} [paginated=false] the browser widget is paginated
62
+ */
63
+ initialize: function (settings) {
64
+ // store options
65
+ settings = settings || {};
66
+ this.titleText = settings.titleText || 'Select an item';
67
+ this.validate = settings.validate || _.constant($.Deferred().resolve().promise());
68
+ this.helpText = settings.helpText;
69
+ this.showItems = settings.showItems;
70
+ this.showPreview = _.isUndefined(settings.showPreview) ? true : !!settings.showPreview;
71
+ this.submitText = settings.submitText || 'Save';
72
+ this.root = settings.root;
73
+ this.defaultSelectedResource = settings.defaultSelectedResource;
74
+ this.input = settings.input;
75
+ this.selectItem = !!settings.selectItem;
76
+ this.showMetadata = !!settings.showMetadata;
77
+ this.highlightItem = !!settings.highlightItem;
78
+ this.paginated = !!settings.paginated;
79
+ this._selected = null;
80
+
81
+ // Sets RootSelectorWidget to open properly to the root if not already set in the settings
82
+ if (this.defaultSelectedResource) {
83
+ if (!settings.rootSelectorSettings) {
84
+ settings.rootSelectorSettings = {};
85
+ }
86
+ if (!settings.rootSelectorSettings.selectByResource) {
87
+ settings.rootSelectorSettings.selectByResource = this.defaultSelectedResource;
88
+ }
89
+ }
90
+ // generate the root selection view and listen to it's events
91
+ this._rootSelectionView = new RootSelectorWidget(_.extend({
92
+ parentView: this
93
+ }, settings.rootSelectorSettings));
94
+ this.listenTo(this._rootSelectionView, 'g:selected', function (evt) {
95
+ this.root = evt.root;
96
+ this._renderHierarchyView();
97
+ });
98
+ if (this.defaultSelectedResource && !this.root) {
99
+ this._calculateDefaultSelectedRoot();
100
+ }
101
+ },
102
+
103
+ render: function () {
104
+ const defaultResourcename = (this.defaultSelectedResource && this.defaultSelectedResource.get('name'));
105
+ this.$el.html(
106
+ BrowserWidgetTemplate({
107
+ title: this.titleText,
108
+ help: this.helpText,
109
+ preview: this.showPreview,
110
+ submit: this.submitText,
111
+ input: this.input,
112
+ selectItem: this.selectItem,
113
+ defaultSelectedResource: defaultResourcename
114
+ })
115
+ ).girderModal(this);
116
+ this._renderRootSelection();
117
+ return this;
118
+ },
119
+
120
+ /**
121
+ * Return the selected model.
122
+ */
123
+ selectedModel: function () {
124
+ return this._selected;
125
+ },
126
+
127
+ _renderRootSelection: function () {
128
+ this._rootSelectionView.setElement(this.$('.g-hierarchy-root-container')).render();
129
+ this._renderHierarchyView();
130
+ },
131
+
132
+ _renderHierarchyView: function () {
133
+ if (this._hierarchyView) {
134
+ this.stopListening(this._hierarchyView);
135
+ this._hierarchyView.off();
136
+ this.$('.g-hierarchy-widget-container').empty();
137
+ }
138
+ if (!this.root) {
139
+ return;
140
+ }
141
+ this.$('.g-wait-for-root').removeClass('hidden');
142
+ this._hierarchyView = new HierarchyWidget({
143
+ el: this.$('.g-hierarchy-widget-container'),
144
+ parentView: this,
145
+ parentModel: this.root,
146
+ checkboxes: false,
147
+ routing: false,
148
+ showActions: false,
149
+ showItems: this.showItems,
150
+ onItemClick: _.bind(this._selectItem, this),
151
+ defaultSelectedResource: this.defaultSelectedResource,
152
+ highlightItem: this.highlightItem,
153
+ paginated: this.paginated,
154
+ showMetadata: this.showMetadata
155
+ });
156
+ this.listenTo(this._hierarchyView, 'g:setCurrentModel', this._selectModel);
157
+ this._selectModel();
158
+ },
159
+
160
+ _resetSelection: function (model) {
161
+ this._selected = model;
162
+ this.$('.g-validation-failed-message').addClass('hidden');
163
+ this.$('.g-selected-model').removeClass('has-error');
164
+ this.$('.g-input-element').removeClass('has-error');
165
+ this.$('#g-selected-model').val('');
166
+ if (this._selected) {
167
+ this.$('#g-selected-model').val(this._selected.get('name'));
168
+ if (this.highlightItem && this.selectItem) {
169
+ this._hierarchyView.selectItem(this._selected);
170
+ } else {
171
+ this._hierarchyView.selectFolder(this._selected);
172
+ }
173
+ }
174
+ },
175
+
176
+ _selectItem: function (item) {
177
+ if (!this.selectItem) {
178
+ return;
179
+ }
180
+ this._resetSelection(item);
181
+ },
182
+
183
+ _selectModel: function () {
184
+ if (this.selectItem) {
185
+ return;
186
+ }
187
+ this._resetSelection(this._hierarchyView.parentModel);
188
+ },
189
+
190
+ /**
191
+ * Independently validate the input-element and the selected-model.
192
+ */
193
+ _validate: function () {
194
+ // Validate input element
195
+ let inputValidation;
196
+ if (this.input && this.input.validate) {
197
+ inputValidation = this.input.validate(this.$('#g-input-element').val());
198
+ if (inputValidation === undefined) {
199
+ console.warn('Static validation is deprecated, return a promise instead');
200
+ inputValidation = $.Deferred().resolve().promise();
201
+ } else if (!_.isFunction(inputValidation.then)) {
202
+ console.warn('Static validation is deprecated, return a promise instead');
203
+ inputValidation = $.Deferred().reject(inputValidation).promise();
204
+ }
205
+ } else {
206
+ // No validator is implicit acceptance
207
+ inputValidation = $.Deferred().resolve().promise();
208
+ }
209
+
210
+ // Validate selected element
211
+ const selectedModel = this.selectedModel();
212
+ let selectedValidation = this.validate(selectedModel);
213
+ if (selectedValidation === undefined) {
214
+ console.warn('Static validation is deprecated, return a promise instead');
215
+ selectedValidation = $.Deferred().resolve().promise();
216
+ } else if (!_.isFunction(selectedValidation.then)) {
217
+ console.warn('Static validation is deprecated, return a promise instead');
218
+ selectedValidation = $.Deferred().reject(selectedValidation).promise();
219
+ }
220
+
221
+ let invalidInputElement = null;
222
+ let invalidSelectedModel = null;
223
+ // We want to wait until both promises to run to completion, which only happens if they're
224
+ // accepted. So, chain an extra handler on to them, which transforms a rejection into an
225
+ // acceptance.
226
+ $.when(
227
+ inputValidation
228
+ .catch((failMessage) => {
229
+ // input-element is invalid
230
+ invalidInputElement = failMessage;
231
+ return undefined;
232
+ }),
233
+ selectedValidation
234
+ .catch((failMessage) => {
235
+ // selected-model is invalid
236
+ invalidSelectedModel = failMessage;
237
+ return undefined;
238
+ })
239
+ )
240
+ .done(() => {
241
+ // Reset any previous error states
242
+ this.$('.g-selected-model').removeClass('has-error');
243
+ this.$('.g-input-element').removeClass('has-error');
244
+ this.$('.g-validation-failed-message').addClass('hidden').html('');
245
+
246
+ // The 4 possible outcomes of this validation are as follows...
247
+ //
248
+ // Case | input-element | selected-model
249
+ // 1. | Valid | Valid
250
+ // 2. | Valid | Invalid
251
+ // 3. | Invalid | Valid
252
+ // 4. | Invalid | Invalid
253
+ if (!invalidInputElement && !invalidSelectedModel) {
254
+ // Case 1
255
+ this.root = this._hierarchyView.parentModel;
256
+ this.$el.modal('hide');
257
+ this.trigger('g:saved', selectedModel, this.$('#g-input-element').val());
258
+ } else if (!invalidInputElement && invalidSelectedModel) {
259
+ // Case 2
260
+ this.$('.g-selected-model').addClass('has-error');
261
+ this.$('.g-validation-failed-message').removeClass('hidden').text(invalidSelectedModel);
262
+ } else if (invalidInputElement && !invalidSelectedModel) {
263
+ // Case 3
264
+ this.$('.g-input-element').addClass('has-error');
265
+ this.$('.g-validation-failed-message').removeClass('hidden').text(invalidInputElement);
266
+ } else if (invalidInputElement && invalidSelectedModel) {
267
+ // Case 4
268
+ this.$('.g-selected-model').addClass('has-error');
269
+ this.$('.g-input-element').addClass('has-error');
270
+ this.$('.g-validation-failed-message').removeClass('hidden').html(
271
+ _.escape(invalidInputElement) + '<br>' + _.escape(invalidSelectedModel));
272
+ }
273
+ });
274
+ },
275
+
276
+ /**
277
+ * If we have a defaultSelectedResource we need the root item for the hiearachyWidget
278
+ * This will calculate what the root item should be if one hasn't been supplied
279
+ */
280
+ _calculateDefaultSelectedRoot: function () {
281
+ // If we are are only using folders, the root is the defaultselectedResource then
282
+ if (!this.selectItem) {
283
+ this.root = this.defaultSelectedResource;
284
+ return;
285
+ }
286
+ // We need to calculate the parent model of the default.selectedResoure when selectItem is true
287
+ const modelTypes = {
288
+ folder: FolderModel,
289
+ collection: CollectionModel,
290
+ user: UserModel
291
+ };
292
+ let modelType = 'folder'; // folder type by default, other types if necessary
293
+ let modelId = null;
294
+ // If it is an item it will have a folderId associated with it as a parent item
295
+ if (this.defaultSelectedResource.get('folderId')) {
296
+ modelId = this.defaultSelectedResource.get('folderId');
297
+ } else if (this.defaultSelectedResource.get('parentCollection')) {
298
+ // Case for providing a folder as the defaultSelectedResource but want the user to select an item
299
+ // folder parent is either 'user' | 'folder' | 'collection', most likely folder though
300
+ modelType = this.defaultSelectedResource.get('parentCollection');
301
+ modelId = this.defaultSelectedResource.get('parentId');
302
+ }
303
+ if (modelTypes[modelType] && modelId) {
304
+ const parentModel = new modelTypes[modelType]();
305
+ parentModel.set({
306
+ _id: modelId
307
+ }).on('g:fetched', function () {
308
+ this.root = parentModel;
309
+ this.render();
310
+ }, this).on('g:error', function () {
311
+ this.render();
312
+ }, this).fetch();
313
+ }
314
+ }
315
+ });
316
+
317
+ export default BrowserWidget;
@@ -0,0 +1,68 @@
1
+ import HierarchyWidget from '@girder/core/views/widgets/HierarchyWidget';
2
+ import View from '@girder/core/views/View';
3
+ import { AccessType } from '@girder/core/constants';
4
+
5
+ import CheckedActionsMenuTemplate from '@girder/core/templates/widgets/checkedActionsMenu.pug';
6
+
7
+ import '@girder/core/utilities/jquery/girderEnable';
8
+
9
+ /**
10
+ * This widget presents a list of available batch actions
11
+ * on a set of selected resources.
12
+ */
13
+ var CheckedMenuWidget = View.extend({
14
+
15
+ initialize: function (params) {
16
+ this._fetchAndInit(params);
17
+ this.dropdownToggle = params.dropdownToggle;
18
+ },
19
+
20
+ render: function () {
21
+ // If nothing is checked, disable the parent element and return
22
+ if (this.folderCount + this.itemCount + this.pickedCount === 0) {
23
+ this.dropdownToggle.girderEnable(false);
24
+ return;
25
+ }
26
+
27
+ this.dropdownToggle.girderEnable(true);
28
+ this.$el.html(CheckedActionsMenuTemplate({
29
+ minFolderLevel: this.minFolderLevel,
30
+ minItemLevel: this.minItemLevel,
31
+ folderCount: this.folderCount,
32
+ itemCount: this.itemCount,
33
+ AccessType: AccessType,
34
+ pickedCount: this.pickedCount,
35
+ pickedCopyAllowed: this.pickedCopyAllowed,
36
+ pickedMoveAllowed: this.pickedMoveAllowed,
37
+ pickedDesc: this.pickedDesc,
38
+ HierarchyWidget: HierarchyWidget
39
+ }));
40
+
41
+ return this;
42
+ },
43
+
44
+ /**
45
+ * This should be called when the checkbox selection changes. It will
46
+ * update and re-render the checked action menu.
47
+ * @param minLevel The minimum access level across the checked resource set.
48
+ * @param folderCount The number of checked folders.
49
+ * @param itemCount The number of checked items.
50
+ */
51
+ update: function (params) {
52
+ this._fetchAndInit(params);
53
+ this.render();
54
+ },
55
+
56
+ _fetchAndInit: function (params) {
57
+ this.minFolderLevel = params.minFolderLevel || AccessType.READ;
58
+ this.minItemLevel = params.minItemLevel || AccessType.READ;
59
+ this.folderCount = params.folderCount || 0;
60
+ this.itemCount = params.itemCount || 0;
61
+ this.pickedCount = params.pickedCount || 0;
62
+ this.pickedCopyAllowed = params.pickedCopyAllowed || false;
63
+ this.pickedMoveAllowed = params.pickedMoveAllowed || false;
64
+ this.pickedDesc = params.pickedDesc || '';
65
+ }
66
+ });
67
+
68
+ export default CheckedMenuWidget;
@@ -0,0 +1,40 @@
1
+ import View from '@girder/core/views/View';
2
+ import { formatDate, DATE_SECOND, renderMarkdown, formatSize } from '@girder/core/misc';
3
+
4
+ import CollectionInfoDialogTemplate from '@girder/core/templates/widgets/collectionInfoDialog.pug';
5
+
6
+ import '@girder/core/utilities/jquery/girderModal';
7
+
8
+ /**
9
+ * This view shows a dialog containing detailed collection information.
10
+ */
11
+ var CollectionInfoWidget = View.extend({
12
+ initialize: function () {
13
+ this.needToFetch = !this.model.has('nFolders');
14
+ if (this.needToFetch || this.timestamp !== this.model.get('updated')) {
15
+ this.model.once('g:fetched.details', function () {
16
+ this.needToFetch = false;
17
+ this.timestamp = this.model.get('updated');
18
+ this.render();
19
+ }, this).fetch({ extraPath: 'details' });
20
+ }
21
+ },
22
+
23
+ render: function () {
24
+ if (this.needToFetch) {
25
+ return;
26
+ }
27
+
28
+ this.$el.html(CollectionInfoDialogTemplate({
29
+ collection: this.model,
30
+ formatDate: formatDate,
31
+ formatSize: formatSize,
32
+ DATE_SECOND: DATE_SECOND,
33
+ renderMarkdown: renderMarkdown
34
+ })).girderModal(this);
35
+
36
+ return this;
37
+ }
38
+ });
39
+
40
+ export default CollectionInfoWidget;
@@ -0,0 +1,180 @@
1
+ import _ from 'underscore';
2
+ import moment from 'moment';
3
+
4
+ import View from '@girder/core/views/View';
5
+
6
+ import dateTimeRangeWidgetTemplate from '@girder/core/templates/widgets/dateTimeRangeWidget.pug';
7
+
8
+ // Momentjs is not require()'d in the way this library expects
9
+ // import 'eonasdan-bootstrap-datetimepicker'; // /src/js/bootstrap-datetimepicker.js'
10
+ import 'eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.css';
11
+
12
+ /**
13
+ * This widget provides text input fields to specify a range of dates/times.
14
+ * That is, the first field specifies "from" and the second field specifies
15
+ * "to." The user chooses each date/time using a popup picker.
16
+ */
17
+ var DateTimeRangeWidget = View.extend({
18
+
19
+ /**
20
+ * @param [settings.defaultFromDate=false] The default "from" date/time when
21
+ * not set explicitly. Set to false to have no default.
22
+ * @param [settings.defaultToDate=false] The default "to" date/time when not
23
+ * set explicitly. Set to false to have no default.
24
+ * @param [settings.showIcon=true] Whether to show calendar icons beside
25
+ * the input fields. When true, clicking the icon shows the popup. Otherwise,
26
+ * focusing the input field shows the popup.
27
+ * @param [settings.fromLabel='Start date'] The label text for the "from"
28
+ * input field.
29
+ * @param [settings.toLabel='End date'] The label text for the "to" input
30
+ * field.
31
+ */
32
+ initialize: function (settings) {
33
+ this.defaultFromDate = settings.defaultFromDate || false;
34
+ this.defaultToDate = settings.defaultToDate || false;
35
+ this.showIcon = _.has(settings, 'showIcon') ? settings.showIcon : true;
36
+ this.fromLabel = settings.fromLabel || 'Start date';
37
+ this.toLabel = settings.toLabel || 'End date';
38
+ },
39
+
40
+ render: function () {
41
+ this.$el.html(dateTimeRangeWidgetTemplate({
42
+ showIcon: this.showIcon,
43
+ fromLabel: this.fromLabel,
44
+ toLabel: this.toLabel
45
+ }));
46
+
47
+ // Link datetimepickers to disallow choosing range where "from" date is
48
+ // after "to" date
49
+
50
+ var options = {
51
+ showClear: true,
52
+ showTodayButton: true,
53
+ icons: {
54
+ time: 'icon-clock',
55
+ date: 'icon-calendar',
56
+ up: 'icon-up-open',
57
+ down: 'icon-down-open',
58
+ previous: 'icon-left-open',
59
+ next: 'icon-right-open',
60
+ clear: 'icon-trash',
61
+ close: 'icon-cancel',
62
+ today: 'icon-target'
63
+ }
64
+ };
65
+ options.useCurrent = 'day';
66
+ options.defaultDate = this.defaultFromDate;
67
+ this.$('.g-datetime-widget-from').datetimepicker(options);
68
+
69
+ options.useCurrent = false;
70
+ options.defaultDate = this.defaultToDate;
71
+ this.$('.g-datetime-widget-to').datetimepicker(options);
72
+
73
+ this.$('.g-datetime-widget-from').on('dp.change', (e) => {
74
+ var picker = this._picker('.g-datetime-widget-to');
75
+ picker.minDate(e.date);
76
+ });
77
+ this.$('.g-datetime-widget-to').on('dp.change', (e) => {
78
+ var picker = this._picker('.g-datetime-widget-from');
79
+ picker.maxDate(e.date);
80
+ });
81
+
82
+ return this;
83
+ },
84
+
85
+ /**
86
+ * Set "from" date/time. Argument can be an ISO 8601-formatted date string,
87
+ * a moment object, or a Date object. Call with null or the empty string to
88
+ * clear. When called with a string, the widget displays in local time.
89
+ *
90
+ * @param date From date/time to display.
91
+ */
92
+ setFromDate: function (date) {
93
+ this._setDate('.g-datetime-widget-from', date);
94
+ },
95
+
96
+ /**
97
+ * Set "to" date/time. Argument can be an ISO 8601-formatted date string,
98
+ * a moment object, or a Date object. Call with null or the empty string to
99
+ * clear. When called with a string, the widget displays in local time.
100
+ *
101
+ * @param date To date/time to display.
102
+ */
103
+ setToDate: function (date) {
104
+ this._setDate('.g-datetime-widget-to', date);
105
+ },
106
+
107
+ /*
108
+ * Convenience function to set date/time for a specified datetimepicker.
109
+ *
110
+ * @param [id] Element ID on which to access the datetimepicker.
111
+ */
112
+ _setDate: function (id, date) {
113
+ var picker = this._picker(id);
114
+ if (_.isEmpty(date)) {
115
+ picker.clear();
116
+ } else if (_.isString(date)) {
117
+ var localDate = moment.utc(date).local();
118
+ picker.date(localDate);
119
+ } else {
120
+ picker.date(date);
121
+ }
122
+ },
123
+
124
+ /**
125
+ * Get the "from" date/time as a moment object in UTC. Returns null if no
126
+ * date is set.
127
+ */
128
+ fromDate: function () {
129
+ return this._date('.g-datetime-widget-from');
130
+ },
131
+
132
+ /**
133
+ * Get the "to" date/time as a moment object in UTC. Returns null if no date
134
+ * is set.
135
+ */
136
+ toDate: function () {
137
+ return this._date('.g-datetime-widget-to');
138
+ },
139
+
140
+ /**
141
+ * Convenience function to return "from" the date/time as a string in UTC.
142
+ * Returns the empty string if no date is set.
143
+ */
144
+ fromDateString: function () {
145
+ return this._dateString('.g-datetime-widget-from');
146
+ },
147
+
148
+ /**
149
+ * Convenience function to return the "to" date/time as a string in UTC.
150
+ * Returns the empty string if no date is set.
151
+ */
152
+ toDateString: function () {
153
+ return this._dateString('.g-datetime-widget-to');
154
+ },
155
+
156
+ _picker: function (id) {
157
+ var picker = this.$(id).data('DateTimePicker');
158
+ return picker;
159
+ },
160
+
161
+ _date: function (id) {
162
+ var picker = this._picker(id);
163
+ var date = picker.date();
164
+ if (date !== null) {
165
+ date = moment(date);
166
+ date.utc();
167
+ }
168
+ return date;
169
+ },
170
+
171
+ _dateString: function (id) {
172
+ var date = this._date(id);
173
+ if (date === null) {
174
+ return '';
175
+ }
176
+ return date.format();
177
+ }
178
+ });
179
+
180
+ export default DateTimeRangeWidget;