@girder/core 3.2.8 → 5.0.0-a7
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.
- package/README.md +61 -0
- package/package.json +79 -31
- package/assets/Girder_Mark.png +0 -0
- package/auth.js +0 -152
- package/collections/ApiKeyCollection.js +0 -9
- package/collections/AssetstoreCollection.js +0 -9
- package/collections/Collection.js +0 -295
- package/collections/CollectionCollection.js +0 -9
- package/collections/FileCollection.js +0 -11
- package/collections/FolderCollection.js +0 -11
- package/collections/GroupCollection.js +0 -9
- package/collections/ItemCollection.js +0 -11
- package/collections/UserCollection.js +0 -24
- package/collections/index.js +0 -21
- package/constants.js +0 -33
- package/dialog.js +0 -128
- package/events.js +0 -6
- package/index.js +0 -31
- package/main.js +0 -21
- package/misc.js +0 -260
- package/models/AccessControlledModel.js +0 -76
- package/models/ApiKeyModel.js +0 -31
- package/models/AssetstoreModel.js +0 -43
- package/models/CollectionCreationPolicyModel.js +0 -20
- package/models/CollectionModel.js +0 -12
- package/models/FileModel.js +0 -310
- package/models/FolderModel.js +0 -33
- package/models/GroupModel.js +0 -197
- package/models/ItemModel.js +0 -72
- package/models/MetadataMixin.js +0 -88
- package/models/Model.js +0 -187
- package/models/UserModel.js +0 -189
- package/models/index.js +0 -25
- package/pluginUtils.js +0 -11
- package/rest.js +0 -216
- package/router.js +0 -58
- package/routes.js +0 -231
- package/stylesheets/apidocs/apidocs.styl +0 -50
- package/stylesheets/body/adminConsole.styl +0 -21
- package/stylesheets/body/assetstores.styl +0 -46
- package/stylesheets/body/collectionList.styl +0 -39
- package/stylesheets/body/collectionPage.styl +0 -6
- package/stylesheets/body/frontPage.styl +0 -48
- package/stylesheets/body/groupList.styl +0 -43
- package/stylesheets/body/groupPage.styl +0 -116
- package/stylesheets/body/itemPage.styl +0 -81
- package/stylesheets/body/plugins.styl +0 -61
- package/stylesheets/body/searchResultsList.styl +0 -51
- package/stylesheets/body/systemConfig.styl +0 -56
- package/stylesheets/body/userAccount.styl +0 -57
- package/stylesheets/body/userList.styl +0 -79
- package/stylesheets/body/userPage.styl +0 -6
- package/stylesheets/layout/footer.styl +0 -19
- package/stylesheets/layout/global.styl +0 -154
- package/stylesheets/layout/globalNav.styl +0 -89
- package/stylesheets/layout/header.styl +0 -29
- package/stylesheets/layout/headerUser.styl +0 -33
- package/stylesheets/layout/layout.styl +0 -75
- package/stylesheets/layout/layoutVars.styl +0 -9
- package/stylesheets/layout/loading.styl +0 -37
- package/stylesheets/layout/progressArea.styl +0 -17
- package/stylesheets/widgets/accessWidget.styl +0 -106
- package/stylesheets/widgets/browserWidget.styl +0 -9
- package/stylesheets/widgets/hierarchyWidget.styl +0 -188
- package/stylesheets/widgets/markdownWidget.styl +0 -92
- package/stylesheets/widgets/metadataWidget.styl +0 -92
- package/stylesheets/widgets/searchFieldWidget.styl +0 -70
- package/stylesheets/widgets/taskProgress.styl +0 -41
- package/stylesheets/widgets/timelineWidget.styl +0 -41
- package/stylesheets/widgets/uploadWidget.styl +0 -43
- package/stylesheets/widgets/userOtpManagementWidget.styl +0 -159
- package/templates/body/adminConsole.pug +0 -13
- package/templates/body/assetstores.pug +0 -98
- package/templates/body/collectionList.pug +0 -40
- package/templates/body/collectionPage.pug +0 -36
- package/templates/body/filesystemImport.pug +0 -41
- package/templates/body/frontPage.pug +0 -83
- package/templates/body/groupList.pug +0 -30
- package/templates/body/groupPage.pug +0 -116
- package/templates/body/itemPage.pug +0 -61
- package/templates/body/plugins.pug +0 -20
- package/templates/body/s3Import.pug +0 -35
- package/templates/body/searchResults.pug +0 -15
- package/templates/body/searchResultsType.pug +0 -13
- package/templates/body/systemConfiguration.pug +0 -221
- package/templates/body/userAccount.pug +0 -83
- package/templates/body/userList.pug +0 -43
- package/templates/body/userPage.pug +0 -40
- package/templates/layout/alert.pug +0 -5
- package/templates/layout/layout.pug +0 -12
- package/templates/layout/layoutFooter.pug +0 -11
- package/templates/layout/layoutGlobalNav.pug +0 -7
- package/templates/layout/layoutHeader.pug +0 -8
- package/templates/layout/layoutHeaderUser.pug +0 -26
- package/templates/layout/layoutProgressArea.pug +0 -1
- package/templates/layout/loginDialog.pug +0 -30
- package/templates/layout/registerDialog.pug +0 -35
- package/templates/layout/resetPasswordDialog.pug +0 -25
- package/templates/widgets/accessEditor.pug +0 -23
- package/templates/widgets/accessEditorMixins.pug +0 -57
- package/templates/widgets/accessEditorNonModal.pug +0 -11
- package/templates/widgets/accessEntry.pug +0 -32
- package/templates/widgets/apiKeyList.pug +0 -50
- package/templates/widgets/browserWidget.pug +0 -32
- package/templates/widgets/checkedActionsMenu.pug +0 -46
- package/templates/widgets/collectionInfoDialog.pug +0 -37
- package/templates/widgets/confirmDialog.pug +0 -14
- package/templates/widgets/dateTimeRangeWidget.pug +0 -20
- package/templates/widgets/dateTimeWidget.pug +0 -8
- package/templates/widgets/editApiKeyWidget.pug +0 -43
- package/templates/widgets/editAssetstoreWidget.pug +0 -78
- package/templates/widgets/editCollectionWidget.pug +0 -27
- package/templates/widgets/editFileWidget.pug +0 -21
- package/templates/widgets/editFolderWidget.pug +0 -27
- package/templates/widgets/editGroupWidget.pug +0 -54
- package/templates/widgets/editItemWidget.pug +0 -27
- package/templates/widgets/fileInfoDialog.pug +0 -33
- package/templates/widgets/fileList.pug +0 -33
- package/templates/widgets/folderInfoDialog.pug +0 -42
- package/templates/widgets/folderList.pug +0 -21
- package/templates/widgets/groupAdminList.pug +0 -33
- package/templates/widgets/groupInviteDialog.pug +0 -76
- package/templates/widgets/groupInviteList.pug +0 -14
- package/templates/widgets/groupMemberList.pug +0 -39
- package/templates/widgets/groupModList.pug +0 -23
- package/templates/widgets/hierarchyBreadcrumb.pug +0 -37
- package/templates/widgets/hierarchyPaginated.pug +0 -19
- package/templates/widgets/hierarchyWidget.pug +0 -96
- package/templates/widgets/itemBreadcrumb.pug +0 -16
- package/templates/widgets/itemList.pug +0 -27
- package/templates/widgets/jsonMetadatumEditWidget.pug +0 -13
- package/templates/widgets/jsonMetadatumView.pug +0 -6
- package/templates/widgets/loadingAnimation.pug +0 -4
- package/templates/widgets/markdownWidget.pug +0 -34
- package/templates/widgets/metadataWidget.pug +0 -16
- package/templates/widgets/metadatumEditWidget.pug +0 -15
- package/templates/widgets/metadatumView.pug +0 -5
- package/templates/widgets/newAssetstore.pug +0 -118
- package/templates/widgets/paginateWidget.pug +0 -7
- package/templates/widgets/pluginConfigBreadcrumb.pug +0 -13
- package/templates/widgets/rootSelectorWidget.pug +0 -13
- package/templates/widgets/searchField.pug +0 -10
- package/templates/widgets/searchHelp.pug +0 -12
- package/templates/widgets/searchModeSelect.pug +0 -9
- package/templates/widgets/searchResults.pug +0 -14
- package/templates/widgets/sortCollectionWidget.pug +0 -14
- package/templates/widgets/taskProgress.pug +0 -16
- package/templates/widgets/timeline.pug +0 -15
- package/templates/widgets/uploadWidget.pug +0 -15
- package/templates/widgets/uploadWidgetMixins.pug +0 -31
- package/templates/widgets/uploadWidgetNonModal.pug +0 -10
- package/templates/widgets/userOtpBegin.pug +0 -4
- package/templates/widgets/userOtpDisable.pug +0 -6
- package/templates/widgets/userOtpEnable.pug +0 -44
- package/utilities/EventStream.js +0 -177
- package/utilities/PluginUtils.js +0 -36
- package/utilities/S3UploadHandler.js +0 -303
- package/utilities/index.js +0 -9
- package/utilities/jquery/girderEnable.js +0 -19
- package/utilities/jquery/girderModal.js +0 -48
- package/version.js +0 -10
- package/views/App.js +0 -359
- package/views/View.js +0 -78
- package/views/body/AdminView.js +0 -29
- package/views/body/AssetstoresView.js +0 -235
- package/views/body/CollectionView.js +0 -188
- package/views/body/CollectionsView.js +0 -120
- package/views/body/FilesystemImportView.js +0 -83
- package/views/body/FolderView.js +0 -54
- package/views/body/FrontPageView.js +0 -47
- package/views/body/GroupView.js +0 -336
- package/views/body/GroupsView.js +0 -106
- package/views/body/ItemView.js +0 -177
- package/views/body/PluginsView.js +0 -73
- package/views/body/S3ImportView.js +0 -80
- package/views/body/SearchResultsView.js +0 -162
- package/views/body/SystemConfigurationView.js +0 -196
- package/views/body/UserAccountView.js +0 -179
- package/views/body/UserView.js +0 -165
- package/views/body/UsersView.js +0 -124
- package/views/body/index.js +0 -37
- package/views/index.js +0 -13
- package/views/layout/FooterView.js +0 -29
- package/views/layout/GlobalNavView.js +0 -103
- package/views/layout/HeaderUserView.js +0 -45
- package/views/layout/HeaderView.js +0 -83
- package/views/layout/LoginView.js +0 -100
- package/views/layout/ProgressListView.js +0 -70
- package/views/layout/RegisterView.js +0 -101
- package/views/layout/ResetPasswordView.js +0 -70
- package/views/layout/index.js +0 -19
- package/views/widgets/AccessWidget.js +0 -427
- package/views/widgets/ApiKeyListWidget.js +0 -140
- package/views/widgets/BrowserWidget.js +0 -317
- package/views/widgets/CheckedMenuWidget.js +0 -68
- package/views/widgets/CollectionInfoWidget.js +0 -40
- package/views/widgets/DateTimeRangeWidget.js +0 -179
- package/views/widgets/DateTimeWidget.js +0 -109
- package/views/widgets/EditApiKeyWidget.js +0 -122
- package/views/widgets/EditAssetstoreWidget.js +0 -148
- package/views/widgets/EditCollectionWidget.js +0 -93
- package/views/widgets/EditFileWidget.js +0 -56
- package/views/widgets/EditFolderWidget.js +0 -116
- package/views/widgets/EditGroupWidget.js +0 -125
- package/views/widgets/EditItemWidget.js +0 -110
- package/views/widgets/FileInfoWidget.js +0 -26
- package/views/widgets/FileListWidget.js +0 -151
- package/views/widgets/FolderInfoWidget.js +0 -39
- package/views/widgets/FolderListWidget.js +0 -106
- package/views/widgets/GroupAdminsWidget.js +0 -88
- package/views/widgets/GroupInvitesWidget.js +0 -56
- package/views/widgets/GroupMembersWidget.js +0 -185
- package/views/widgets/GroupModsWidget.js +0 -77
- package/views/widgets/HierarchyWidget.js +0 -1097
- package/views/widgets/ItemBreadcrumbWidget.js +0 -38
- package/views/widgets/ItemListWidget.js +0 -345
- package/views/widgets/LoadingAnimation.js +0 -17
- package/views/widgets/MarkdownWidget.js +0 -217
- package/views/widgets/MetadataWidget.js +0 -504
- package/views/widgets/NewAssetstoreWidget.js +0 -81
- package/views/widgets/PaginateWidget.js +0 -37
- package/views/widgets/PluginConfigBreadcrumbWidget.js +0 -33
- package/views/widgets/RootSelectorWidget.js +0 -192
- package/views/widgets/SearchFieldWidget.js +0 -365
- package/views/widgets/SearchPaginateWidget.js +0 -149
- package/views/widgets/SortCollectionWidget.js +0 -53
- package/views/widgets/TaskProgressWidget.js +0 -91
- package/views/widgets/TimelineWidget.js +0 -155
- package/views/widgets/UploadWidget.js +0 -340
- package/views/widgets/UserOtpManagementWidget.js +0 -105
- package/views/widgets/index.js +0 -75
|
@@ -1,504 +0,0 @@
|
|
|
1
|
-
import $ from 'jquery';
|
|
2
|
-
import _ from 'underscore';
|
|
3
|
-
|
|
4
|
-
import View from '@girder/core/views/View';
|
|
5
|
-
import { AccessType } from '@girder/core/constants';
|
|
6
|
-
import { confirm } from '@girder/core/dialog';
|
|
7
|
-
import events from '@girder/core/events';
|
|
8
|
-
import { localeSort } from '@girder/core/misc';
|
|
9
|
-
|
|
10
|
-
import JsonMetadatumEditWidgetTemplate from '@girder/core/templates/widgets/jsonMetadatumEditWidget.pug';
|
|
11
|
-
import JsonMetadatumViewTemplate from '@girder/core/templates/widgets/jsonMetadatumView.pug';
|
|
12
|
-
import MetadataWidgetTemplate from '@girder/core/templates/widgets/metadataWidget.pug';
|
|
13
|
-
import MetadatumEditWidgetTemplate from '@girder/core/templates/widgets/metadatumEditWidget.pug';
|
|
14
|
-
import MetadatumViewTemplate from '@girder/core/templates/widgets/metadatumView.pug';
|
|
15
|
-
|
|
16
|
-
import '@girder/core/stylesheets/widgets/metadataWidget.styl';
|
|
17
|
-
|
|
18
|
-
import JSONEditor from 'jsoneditor/dist/jsoneditor.js'; // can't 'jsoneditor'
|
|
19
|
-
import 'jsoneditor/dist/jsoneditor.css';
|
|
20
|
-
|
|
21
|
-
import 'bootstrap/js/dropdown';
|
|
22
|
-
|
|
23
|
-
var MetadatumWidget = View.extend({
|
|
24
|
-
className: 'g-widget-metadata-row',
|
|
25
|
-
|
|
26
|
-
events: {
|
|
27
|
-
'click .g-widget-metadata-edit-button': 'editMetadata'
|
|
28
|
-
},
|
|
29
|
-
|
|
30
|
-
initialize: function (settings) {
|
|
31
|
-
if (!_.has(this.parentView.modes, settings.mode)) {
|
|
32
|
-
throw new Error('Unsupported metadatum mode ' + settings.mode + ' detected.');
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
this.mode = settings.mode;
|
|
36
|
-
this.key = settings.key;
|
|
37
|
-
this.value = settings.value;
|
|
38
|
-
this.accessLevel = settings.accessLevel;
|
|
39
|
-
this.parentView = settings.parentView;
|
|
40
|
-
this.fieldName = settings.fieldName;
|
|
41
|
-
this.apiPath = settings.apiPath;
|
|
42
|
-
this.onMetadataEdited = settings.onMetadataEdited;
|
|
43
|
-
this.onMetadataAdded = settings.onMetadataAdded;
|
|
44
|
-
},
|
|
45
|
-
|
|
46
|
-
_validate: function (from, to, value) {
|
|
47
|
-
var newMode = this.parentView.modes[to];
|
|
48
|
-
|
|
49
|
-
if (_.has(newMode, 'validation') &&
|
|
50
|
-
_.has(newMode.validation, 'from') &&
|
|
51
|
-
_.has(newMode.validation.from, from)) {
|
|
52
|
-
var validate = newMode.validation.from[from][0];
|
|
53
|
-
var msg = newMode.validation.from[from][1];
|
|
54
|
-
|
|
55
|
-
if (!validate(value)) {
|
|
56
|
-
events.trigger('g:alert', {
|
|
57
|
-
text: msg,
|
|
58
|
-
type: 'warning'
|
|
59
|
-
});
|
|
60
|
-
return false;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
return true;
|
|
65
|
-
},
|
|
66
|
-
|
|
67
|
-
// @todo too much duplication with editMetadata
|
|
68
|
-
toggleEditor: function (event, newEditorMode, existingEditor, overrides) {
|
|
69
|
-
var fromEditorMode = (existingEditor instanceof JsonMetadatumEditWidget) ? 'json' : 'simple';
|
|
70
|
-
var newValue = (overrides || {}).value || existingEditor.$el.attr('g-value');
|
|
71
|
-
if (!this._validate(fromEditorMode, newEditorMode, newValue)) {
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
var row = existingEditor.$el;
|
|
76
|
-
existingEditor.destroy();
|
|
77
|
-
row.addClass('editing').empty();
|
|
78
|
-
|
|
79
|
-
var opts = _.extend({
|
|
80
|
-
el: row,
|
|
81
|
-
item: this.parentView.item,
|
|
82
|
-
key: row.attr('g-key'),
|
|
83
|
-
value: row.attr('g-value'),
|
|
84
|
-
accessLevel: this.accessLevel,
|
|
85
|
-
newDatum: false,
|
|
86
|
-
parentView: this,
|
|
87
|
-
fieldName: this.fieldName,
|
|
88
|
-
apiPath: this.apiPath,
|
|
89
|
-
onMetadataEdited: this.onMetadataEdited,
|
|
90
|
-
onMetadataAdded: this.onMetadataAdded
|
|
91
|
-
}, overrides || {});
|
|
92
|
-
|
|
93
|
-
this.parentView.modes[newEditorMode].editor(opts).render();
|
|
94
|
-
},
|
|
95
|
-
|
|
96
|
-
editMetadata: function (event) {
|
|
97
|
-
this.$el.addClass('editing');
|
|
98
|
-
this.$el.empty();
|
|
99
|
-
|
|
100
|
-
var opts = {
|
|
101
|
-
item: this.parentView.item,
|
|
102
|
-
key: this.$el.attr('g-key'),
|
|
103
|
-
value: this.$el.attr('g-value'),
|
|
104
|
-
accessLevel: this.accessLevel,
|
|
105
|
-
newDatum: false,
|
|
106
|
-
parentView: this,
|
|
107
|
-
fieldName: this.fieldName,
|
|
108
|
-
apiPath: this.apiPath,
|
|
109
|
-
onMetadataEdited: this.onMetadataEdited,
|
|
110
|
-
onMetadataAdded: this.onMetadataAdded
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
// If they're trying to open false, null, 6, etc which are not stored as strings
|
|
114
|
-
if (this.mode === 'json') {
|
|
115
|
-
try {
|
|
116
|
-
var jsonValue = JSON.parse(this.$el.attr('g-value'));
|
|
117
|
-
|
|
118
|
-
if (jsonValue !== undefined && !_.isObject(jsonValue)) {
|
|
119
|
-
opts.value = jsonValue;
|
|
120
|
-
}
|
|
121
|
-
} catch (e) {}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
this.parentView.modes[this.mode].editor(opts)
|
|
125
|
-
.render()
|
|
126
|
-
.$el.appendTo(this.$el);
|
|
127
|
-
},
|
|
128
|
-
|
|
129
|
-
render: function () {
|
|
130
|
-
this.$el.attr({
|
|
131
|
-
'g-key': this.key,
|
|
132
|
-
'g-value': _.bind(this.parentView.modes[this.mode].displayValue, this)()
|
|
133
|
-
}).empty();
|
|
134
|
-
|
|
135
|
-
this.$el.html(this.parentView.modes[this.mode].template({
|
|
136
|
-
key: this.key,
|
|
137
|
-
value: _.bind(this.parentView.modes[this.mode].displayValue, this)(),
|
|
138
|
-
accessLevel: this.accessLevel,
|
|
139
|
-
AccessType: AccessType
|
|
140
|
-
}));
|
|
141
|
-
|
|
142
|
-
return this;
|
|
143
|
-
}
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
var MetadatumEditWidget = View.extend({
|
|
147
|
-
events: {
|
|
148
|
-
'click .g-widget-metadata-cancel-button': 'cancelEdit',
|
|
149
|
-
'click .g-widget-metadata-save-button': 'save',
|
|
150
|
-
'click .g-widget-metadata-delete-button': 'deleteMetadatum',
|
|
151
|
-
'click .g-widget-metadata-toggle-button': function (event) {
|
|
152
|
-
var editorType;
|
|
153
|
-
// @todo modal
|
|
154
|
-
// in the future this event will have the new editorType (assuming a dropdown)
|
|
155
|
-
if (this instanceof JsonMetadatumEditWidget) {
|
|
156
|
-
editorType = 'simple';
|
|
157
|
-
} else {
|
|
158
|
-
editorType = 'json';
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
this.parentView.toggleEditor(event, editorType, this, {
|
|
162
|
-
// Save state before toggling editor
|
|
163
|
-
key: this.$el.find('.g-widget-metadata-key-input').val(),
|
|
164
|
-
value: this.getCurrentValue()
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
},
|
|
168
|
-
|
|
169
|
-
initialize: function (settings) {
|
|
170
|
-
this.item = settings.item;
|
|
171
|
-
this.key = settings.key || '';
|
|
172
|
-
this.fieldName = settings.fieldName || 'meta';
|
|
173
|
-
this.value = (settings.value !== undefined) ? settings.value : '';
|
|
174
|
-
this.accessLevel = settings.accessLevel;
|
|
175
|
-
this.newDatum = settings.newDatum;
|
|
176
|
-
this.fieldName = settings.fieldName;
|
|
177
|
-
this.apiPath = settings.apiPath;
|
|
178
|
-
this.onMetadataEdited = settings.onMetadataEdited;
|
|
179
|
-
this.onMetadataAdded = settings.onMetadataAdded;
|
|
180
|
-
},
|
|
181
|
-
|
|
182
|
-
editTemplate: MetadatumEditWidgetTemplate,
|
|
183
|
-
|
|
184
|
-
getCurrentValue: function () {
|
|
185
|
-
return this.$el.find('.g-widget-metadata-value-input').val();
|
|
186
|
-
},
|
|
187
|
-
|
|
188
|
-
deleteMetadatum: function (event) {
|
|
189
|
-
event.stopImmediatePropagation();
|
|
190
|
-
const target = $(event.currentTarget);
|
|
191
|
-
var metadataList = target.parent().parent();
|
|
192
|
-
var params = {
|
|
193
|
-
text: 'Are you sure you want to delete the metadatum <b>' +
|
|
194
|
-
_.escape(this.key) + '</b>?',
|
|
195
|
-
escapedHtml: true,
|
|
196
|
-
yesText: 'Delete',
|
|
197
|
-
confirmCallback: () => {
|
|
198
|
-
this.item.removeMetadata(this.key, function () {
|
|
199
|
-
metadataList.remove();
|
|
200
|
-
}, null, {
|
|
201
|
-
field: this.fieldName,
|
|
202
|
-
path: this.apiPath
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
};
|
|
206
|
-
confirm(params);
|
|
207
|
-
},
|
|
208
|
-
|
|
209
|
-
cancelEdit: function (event) {
|
|
210
|
-
event.stopImmediatePropagation();
|
|
211
|
-
const target = $(event.currentTarget);
|
|
212
|
-
var curRow = target.parent().parent();
|
|
213
|
-
if (this.newDatum) {
|
|
214
|
-
curRow.remove();
|
|
215
|
-
} else {
|
|
216
|
-
this.parentView.render();
|
|
217
|
-
}
|
|
218
|
-
},
|
|
219
|
-
|
|
220
|
-
save: function (event, value) {
|
|
221
|
-
event.stopImmediatePropagation();
|
|
222
|
-
const target = $(event.currentTarget);
|
|
223
|
-
var curRow = target.parent(),
|
|
224
|
-
tempKey = curRow.find('.g-widget-metadata-key-input').val(),
|
|
225
|
-
tempValue = (value !== undefined) ? value : curRow.find('.g-widget-metadata-value-input').val();
|
|
226
|
-
|
|
227
|
-
if (this.newDatum && tempKey === '') {
|
|
228
|
-
events.trigger('g:alert', {
|
|
229
|
-
text: 'A key is required for all metadata.',
|
|
230
|
-
type: 'warning'
|
|
231
|
-
});
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
var saveCallback = () => {
|
|
236
|
-
this.key = tempKey;
|
|
237
|
-
this.value = tempValue;
|
|
238
|
-
|
|
239
|
-
this.parentView.key = this.key;
|
|
240
|
-
this.parentView.value = this.value;
|
|
241
|
-
|
|
242
|
-
if (this instanceof JsonMetadatumEditWidget) {
|
|
243
|
-
this.parentView.mode = 'json';
|
|
244
|
-
} else {
|
|
245
|
-
this.parentView.mode = 'simple';
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
this.parentView.render();
|
|
249
|
-
|
|
250
|
-
this.newDatum = false;
|
|
251
|
-
};
|
|
252
|
-
|
|
253
|
-
var errorCallback = function (out) {
|
|
254
|
-
events.trigger('g:alert', {
|
|
255
|
-
text: out.message,
|
|
256
|
-
type: 'danger'
|
|
257
|
-
});
|
|
258
|
-
};
|
|
259
|
-
|
|
260
|
-
if (this.newDatum) {
|
|
261
|
-
if (this.onMetadataAdded) {
|
|
262
|
-
this.onMetadataAdded(tempKey, tempValue, saveCallback, errorCallback);
|
|
263
|
-
} else {
|
|
264
|
-
this.item.addMetadata(tempKey, tempValue, saveCallback, errorCallback, {
|
|
265
|
-
field: this.fieldName,
|
|
266
|
-
path: this.apiPath
|
|
267
|
-
});
|
|
268
|
-
}
|
|
269
|
-
} else {
|
|
270
|
-
if (this.onMetadataEdited) {
|
|
271
|
-
this.onMetadataEdited(tempKey, this.key, tempValue, saveCallback, errorCallback);
|
|
272
|
-
} else {
|
|
273
|
-
this.item.editMetadata(tempKey, this.key, tempValue, saveCallback, errorCallback, {
|
|
274
|
-
field: this.fieldName,
|
|
275
|
-
path: this.apiPath
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
},
|
|
280
|
-
|
|
281
|
-
render: function () {
|
|
282
|
-
this.$el.html(this.editTemplate({
|
|
283
|
-
item: this.item,
|
|
284
|
-
key: this.key,
|
|
285
|
-
value: this.value,
|
|
286
|
-
accessLevel: this.accessLevel,
|
|
287
|
-
newDatum: this.newDatum,
|
|
288
|
-
AccessType: AccessType
|
|
289
|
-
}));
|
|
290
|
-
this.$el.find('.g-widget-metadata-key-input').trigger('focus');
|
|
291
|
-
|
|
292
|
-
return this;
|
|
293
|
-
}
|
|
294
|
-
});
|
|
295
|
-
|
|
296
|
-
var JsonMetadatumEditWidget = MetadatumEditWidget.extend({
|
|
297
|
-
editTemplate: JsonMetadatumEditWidgetTemplate,
|
|
298
|
-
|
|
299
|
-
getCurrentValue: function () {
|
|
300
|
-
return this.editor.getText();
|
|
301
|
-
},
|
|
302
|
-
|
|
303
|
-
save: function (event) {
|
|
304
|
-
try {
|
|
305
|
-
MetadatumEditWidget.prototype.save.call(
|
|
306
|
-
this, event, this.editor.get());
|
|
307
|
-
} catch (err) {
|
|
308
|
-
events.trigger('g:alert', {
|
|
309
|
-
text: 'The field contains invalid JSON and can not be saved.',
|
|
310
|
-
type: 'warning'
|
|
311
|
-
});
|
|
312
|
-
}
|
|
313
|
-
},
|
|
314
|
-
|
|
315
|
-
render: function () {
|
|
316
|
-
MetadatumEditWidget.prototype.render.apply(this, arguments);
|
|
317
|
-
|
|
318
|
-
const jsonEditorEl = this.$el.find('.g-json-editor');
|
|
319
|
-
this.editor = new JSONEditor(jsonEditorEl[0], {
|
|
320
|
-
mode: 'tree',
|
|
321
|
-
modes: ['code', 'tree'],
|
|
322
|
-
onError: () => {
|
|
323
|
-
events.trigger('g:alert', {
|
|
324
|
-
text: 'The field contains invalid JSON and can not be viewed in Tree Mode.',
|
|
325
|
-
type: 'warning'
|
|
326
|
-
});
|
|
327
|
-
}
|
|
328
|
-
});
|
|
329
|
-
|
|
330
|
-
if (this.value !== undefined) {
|
|
331
|
-
this.editor.setText(JSON.stringify(this.value));
|
|
332
|
-
this.editor.expandAll();
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
return this;
|
|
336
|
-
}
|
|
337
|
-
});
|
|
338
|
-
|
|
339
|
-
/**
|
|
340
|
-
* This widget shows a list of metadata in a given item.
|
|
341
|
-
*/
|
|
342
|
-
var MetadataWidget = View.extend({
|
|
343
|
-
events: {
|
|
344
|
-
'click .g-add-json-metadata': function (event) {
|
|
345
|
-
this.addMetadata(event, 'json');
|
|
346
|
-
},
|
|
347
|
-
'click .g-add-simple-metadata': function (event) {
|
|
348
|
-
this.addMetadata(event, 'simple');
|
|
349
|
-
}
|
|
350
|
-
},
|
|
351
|
-
|
|
352
|
-
/**
|
|
353
|
-
* Creates a widget to display and optionally edit metadata fields.
|
|
354
|
-
*
|
|
355
|
-
* @param settings.item {Model} The model object whose metadata to display.
|
|
356
|
-
* Can be any model type that inherits MetadataMixin.
|
|
357
|
-
* @param [settings.fieldName='meta'] {string} The name of the model attribute
|
|
358
|
-
* to display/edit. The model attribute with this name should be an object
|
|
359
|
-
* whose top level keys represent metadata keys.
|
|
360
|
-
* @param [settings.title='Metadata'] {string} Title for the widget.
|
|
361
|
-
* @param [settings.apiPath] {string} The relative API path to use when editing
|
|
362
|
-
* metadata keys for this model. Defaults to using the MetadataMixin default path.
|
|
363
|
-
* @param [settings.accessLevel=AccessType.READ] {AccessType} The
|
|
364
|
-
* access level for this widget. Use READ for read-only, or WRITE (or greater)
|
|
365
|
-
* for adding editing capabilities as well.
|
|
366
|
-
* @param [settings.onMetadataAdded] {Function} A custom callback for when a
|
|
367
|
-
* new metadata key is added to the list. If passed, will override the
|
|
368
|
-
* default behavior of calling MetadataMixin.addMetadata.
|
|
369
|
-
* @param [settings.onMetadataEdited] {Function} A custom callback for when an
|
|
370
|
-
* existing metadata key is updated. If passed, will override the default
|
|
371
|
-
* behavior of calling MetadataMixin.editMetadata.
|
|
372
|
-
*/
|
|
373
|
-
initialize: function (settings) {
|
|
374
|
-
this.item = settings.item;
|
|
375
|
-
this.fieldName = settings.fieldName || 'meta';
|
|
376
|
-
this.title = settings.title || 'Metadata';
|
|
377
|
-
this.apiPath = settings.apiPath;
|
|
378
|
-
this.accessLevel = settings.accessLevel;
|
|
379
|
-
this.onMetadataEdited = settings.onMetadataEdited;
|
|
380
|
-
this.onMetadataAdded = settings.onMetadataAdded;
|
|
381
|
-
|
|
382
|
-
this.item.on('g:changed', function () {
|
|
383
|
-
this.render();
|
|
384
|
-
}, this);
|
|
385
|
-
this.render();
|
|
386
|
-
},
|
|
387
|
-
|
|
388
|
-
modes: {
|
|
389
|
-
simple: {
|
|
390
|
-
editor: function (args) {
|
|
391
|
-
return new MetadatumEditWidget(args);
|
|
392
|
-
},
|
|
393
|
-
displayValue: function () {
|
|
394
|
-
return this.value;
|
|
395
|
-
},
|
|
396
|
-
template: MetadatumViewTemplate
|
|
397
|
-
},
|
|
398
|
-
json: {
|
|
399
|
-
editor: function (args) {
|
|
400
|
-
if (args.value !== undefined) {
|
|
401
|
-
args.value = JSON.parse(args.value);
|
|
402
|
-
}
|
|
403
|
-
return new JsonMetadatumEditWidget(args);
|
|
404
|
-
},
|
|
405
|
-
displayValue: function () {
|
|
406
|
-
return JSON.stringify(this.value, null, 4);
|
|
407
|
-
},
|
|
408
|
-
validation: {
|
|
409
|
-
from: {
|
|
410
|
-
simple: [
|
|
411
|
-
function (value) {
|
|
412
|
-
try {
|
|
413
|
-
JSON.parse(value);
|
|
414
|
-
return true;
|
|
415
|
-
} catch (e) {}
|
|
416
|
-
|
|
417
|
-
return false;
|
|
418
|
-
},
|
|
419
|
-
'The simple field is not valid JSON and can not be converted.'
|
|
420
|
-
]
|
|
421
|
-
}
|
|
422
|
-
},
|
|
423
|
-
template: JsonMetadatumViewTemplate
|
|
424
|
-
}
|
|
425
|
-
},
|
|
426
|
-
|
|
427
|
-
setItem: function (item) {
|
|
428
|
-
this.item = item;
|
|
429
|
-
return this;
|
|
430
|
-
},
|
|
431
|
-
|
|
432
|
-
// Does not support modal editing
|
|
433
|
-
getModeFromValue: function (value) {
|
|
434
|
-
return _.isString(value) ? 'simple' : 'json';
|
|
435
|
-
},
|
|
436
|
-
|
|
437
|
-
addMetadata: function (event, mode) {
|
|
438
|
-
var EditWidget = this.modes[mode].editor;
|
|
439
|
-
var value = (mode === 'json') ? '{}' : '';
|
|
440
|
-
|
|
441
|
-
var widget = new MetadatumWidget({
|
|
442
|
-
className: 'g-widget-metadata-row editing',
|
|
443
|
-
mode: mode,
|
|
444
|
-
key: '',
|
|
445
|
-
value: value,
|
|
446
|
-
item: this.item,
|
|
447
|
-
fieldName: this.fieldName,
|
|
448
|
-
apiPath: this.apiPath,
|
|
449
|
-
accessLevel: this.accessLevel,
|
|
450
|
-
parentView: this,
|
|
451
|
-
onMetadataEdited: this.onMetadataEdited,
|
|
452
|
-
onMetadataAdded: this.onMetadataAdded
|
|
453
|
-
});
|
|
454
|
-
widget.$el.appendTo(this.$('.g-widget-metadata-container'));
|
|
455
|
-
|
|
456
|
-
new EditWidget({
|
|
457
|
-
item: this.item,
|
|
458
|
-
key: '',
|
|
459
|
-
value: value,
|
|
460
|
-
fieldName: this.fieldName,
|
|
461
|
-
apiPath: this.apiPath,
|
|
462
|
-
accessLevel: this.accessLevel,
|
|
463
|
-
newDatum: true,
|
|
464
|
-
parentView: widget,
|
|
465
|
-
onMetadataEdited: this.onMetadataEdited,
|
|
466
|
-
onMetadataAdded: this.onMetadataAdded
|
|
467
|
-
})
|
|
468
|
-
.render()
|
|
469
|
-
.$el.appendTo(widget.$el);
|
|
470
|
-
},
|
|
471
|
-
|
|
472
|
-
render: function () {
|
|
473
|
-
var metaDict = this.item.get(this.fieldName) || {};
|
|
474
|
-
var metaKeys = Object.keys(metaDict);
|
|
475
|
-
metaKeys.sort(localeSort);
|
|
476
|
-
|
|
477
|
-
// Metadata header
|
|
478
|
-
this.$el.html(MetadataWidgetTemplate({
|
|
479
|
-
item: this.item,
|
|
480
|
-
title: this.title,
|
|
481
|
-
accessLevel: this.accessLevel,
|
|
482
|
-
AccessType: AccessType
|
|
483
|
-
}));
|
|
484
|
-
|
|
485
|
-
// Append each metadatum
|
|
486
|
-
_.each(metaKeys, function (metaKey) {
|
|
487
|
-
this.$el.find('.g-widget-metadata-container').append(new MetadatumWidget({
|
|
488
|
-
mode: this.getModeFromValue(metaDict[metaKey]),
|
|
489
|
-
key: metaKey,
|
|
490
|
-
value: metaDict[metaKey],
|
|
491
|
-
accessLevel: this.accessLevel,
|
|
492
|
-
parentView: this,
|
|
493
|
-
fieldName: this.fieldName,
|
|
494
|
-
apiPath: this.apiPath,
|
|
495
|
-
onMetadataEdited: this.onMetadataEdited,
|
|
496
|
-
onMetadataAdded: this.onMetadataAdded
|
|
497
|
-
}).render().$el);
|
|
498
|
-
}, this);
|
|
499
|
-
|
|
500
|
-
return this;
|
|
501
|
-
}
|
|
502
|
-
});
|
|
503
|
-
|
|
504
|
-
export default MetadataWidget;
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import AssetstoreModel from '@girder/core/models/AssetstoreModel';
|
|
2
|
-
import View from '@girder/core/views/View';
|
|
3
|
-
import { AssetstoreType } from '@girder/core/constants';
|
|
4
|
-
|
|
5
|
-
import NewAssetstoreTemplate from '@girder/core/templates/widgets/newAssetstore.pug';
|
|
6
|
-
|
|
7
|
-
import 'bootstrap/js/collapse';
|
|
8
|
-
import 'bootstrap/js/transition';
|
|
9
|
-
|
|
10
|
-
import '@girder/core/utilities/jquery/girderEnable';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* This widget is for creating new assetstores. The parent view is responsible
|
|
14
|
-
* for checking admin privileges before rendering this widget.
|
|
15
|
-
*/
|
|
16
|
-
var NewAssetstoreWidget = View.extend({
|
|
17
|
-
events: {
|
|
18
|
-
'submit #g-new-fs-form': function (e) {
|
|
19
|
-
this.createAssetstore(e, this.$('#g-new-fs-error'), {
|
|
20
|
-
type: AssetstoreType.FILESYSTEM,
|
|
21
|
-
name: this.$('#g-new-fs-name').val(),
|
|
22
|
-
root: this.$('#g-new-fs-root').val()
|
|
23
|
-
});
|
|
24
|
-
},
|
|
25
|
-
|
|
26
|
-
'submit #g-new-gridfs-form': function (e) {
|
|
27
|
-
this.createAssetstore(e, this.$('#g-new-gridfs-error'), {
|
|
28
|
-
type: AssetstoreType.GRIDFS,
|
|
29
|
-
name: this.$('#g-new-gridfs-name').val(),
|
|
30
|
-
db: this.$('#g-new-gridfs-db').val(),
|
|
31
|
-
mongohost: this.$('#g-new-gridfs-mongohost').val(),
|
|
32
|
-
replicaset: this.$('#g-new-gridfs-replicaset').val()
|
|
33
|
-
});
|
|
34
|
-
},
|
|
35
|
-
|
|
36
|
-
'submit #g-new-s3-form': function (e) {
|
|
37
|
-
this.createAssetstore(e, this.$('#g-new-s3-error'), {
|
|
38
|
-
type: AssetstoreType.S3,
|
|
39
|
-
name: this.$('#g-new-s3-name').val(),
|
|
40
|
-
bucket: this.$('#g-new-s3-bucket').val(),
|
|
41
|
-
prefix: this.$('#g-new-s3-prefix').val(),
|
|
42
|
-
accessKeyId: this.$('#g-new-s3-access-key-id').val(),
|
|
43
|
-
secret: this.$('#g-new-s3-secret').val(),
|
|
44
|
-
service: this.$('#g-new-s3-service').val(),
|
|
45
|
-
region: this.$('#g-new-s3-region').val(),
|
|
46
|
-
readOnly: this.$('#g-new-s3-readonly').is(':checked'),
|
|
47
|
-
inferCredentials: this.$('#g-new-s3-infercredentials').is(':checked'),
|
|
48
|
-
serverSideEncryption: this.$('#g-new-s3-sse').is(':checked')
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
},
|
|
52
|
-
|
|
53
|
-
render: function () {
|
|
54
|
-
this.$el.html(NewAssetstoreTemplate());
|
|
55
|
-
return this;
|
|
56
|
-
},
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Call this to make the request to the server to create the assetstore.
|
|
60
|
-
* @param e The submit event from the form.
|
|
61
|
-
* @param container The element to write the error message into.
|
|
62
|
-
* @param data The form data to POST to /assetstore
|
|
63
|
-
*/
|
|
64
|
-
createAssetstore: function (e, container, data) {
|
|
65
|
-
e.preventDefault();
|
|
66
|
-
this.$('.g-new-assetstore-submit').girderEnable(false);
|
|
67
|
-
container.empty();
|
|
68
|
-
|
|
69
|
-
var assetstore = new AssetstoreModel();
|
|
70
|
-
assetstore.set(data);
|
|
71
|
-
assetstore.on('g:saved', function () {
|
|
72
|
-
this.$('.g-new-assetstore-submit').girderEnable(true);
|
|
73
|
-
this.trigger('g:created', assetstore);
|
|
74
|
-
}, this).on('g:error', function (err) {
|
|
75
|
-
this.$('.g-new-assetstore-submit').girderEnable(true);
|
|
76
|
-
container.text(err.responseJSON.message);
|
|
77
|
-
}, this).save();
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
export default NewAssetstoreWidget;
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import View from '@girder/core/views/View';
|
|
2
|
-
|
|
3
|
-
import PaginateWidgetTemplate from '@girder/core/templates/widgets/paginateWidget.pug';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* This widget is used to provide a consistent widget for iterating amongst
|
|
7
|
-
* pages of a Collection.
|
|
8
|
-
*/
|
|
9
|
-
var PaginateWidget = View.extend({
|
|
10
|
-
events: {
|
|
11
|
-
'click .g-page-next:not(.disabled)': function (e) {
|
|
12
|
-
this.collection.fetchNextPage();
|
|
13
|
-
},
|
|
14
|
-
'click .g-page-prev:not(.disabled)': function (e) {
|
|
15
|
-
this.collection.fetchPreviousPage();
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
|
-
|
|
19
|
-
initialize: function (settings) {
|
|
20
|
-
this.collection = settings.collection;
|
|
21
|
-
},
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Do not call render() until the collection has been fetched once.
|
|
25
|
-
*/
|
|
26
|
-
render: function () {
|
|
27
|
-
this.$el.html(PaginateWidgetTemplate({
|
|
28
|
-
collection: this.collection
|
|
29
|
-
}));
|
|
30
|
-
|
|
31
|
-
this.$('.g-page-next').girderEnable(this.collection.hasNextPage());
|
|
32
|
-
this.$('.g-page-prev').girderEnable(this.collection.hasPreviousPage());
|
|
33
|
-
return this;
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
export default PaginateWidget;
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import router from '@girder/core/router';
|
|
2
|
-
import View from '@girder/core/views/View';
|
|
3
|
-
|
|
4
|
-
import PluginConfigBreadcrumbTemplate from '@girder/core/templates/widgets/pluginConfigBreadcrumb.pug';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* This widget provides a consistent breadcrumb to be displayed on the admin
|
|
8
|
-
* configuration pages for plugins.
|
|
9
|
-
*/
|
|
10
|
-
var PluginConfigBreadcrumbWidget = View.extend({
|
|
11
|
-
events: {
|
|
12
|
-
'click a.g-admin-console-link': function () {
|
|
13
|
-
router.navigate('admin', { trigger: true });
|
|
14
|
-
},
|
|
15
|
-
'click a.g-plugins-link': function () {
|
|
16
|
-
router.navigate('plugins', { trigger: true });
|
|
17
|
-
}
|
|
18
|
-
},
|
|
19
|
-
|
|
20
|
-
initialize: function (settings) {
|
|
21
|
-
this.pluginName = settings.pluginName;
|
|
22
|
-
},
|
|
23
|
-
|
|
24
|
-
render: function () {
|
|
25
|
-
this.$el.html(PluginConfigBreadcrumbTemplate({
|
|
26
|
-
pluginName: this.pluginName
|
|
27
|
-
}));
|
|
28
|
-
|
|
29
|
-
return this;
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
export default PluginConfigBreadcrumbWidget;
|