{"version":3,"sources":["templates.js","../../src/init.js","../../src/girder-version.js","../../src/view.js","../../src/app.js","../../src/router.js","../../src/utilities/DialogHelper.js","../../src/utilities/EventStream.js","../../src/utilities/JQuery.js","../../src/utilities/MiscFunctions.js","../../src/utilities/S3UploadHandler.js","../../src/plugin_utils.js","../../src/collection.js","../../src/model.js","../../src/models/AssetstoreModel.js","../../src/models/CollectionModel.js","../../src/models/FileModel.js","../../src/models/FolderModel.js","../../src/models/GroupModel.js","../../src/models/ItemModel.js","../../src/models/UserModel.js","../../src/collections/AssetstoreCollection.js","../../src/collections/CollectionCollection.js","../../src/collections/FileCollection.js","../../src/collections/FolderCollection.js","../../src/collections/GroupCollection.js","../../src/collections/ItemCollection.js","../../src/collections/UserCollection.js","../../src/views/body/AdminView.js","../../src/views/body/AssetstoresView.js","../../src/views/body/CollectionView.js","../../src/views/body/CollectionsView.js","../../src/views/body/FilesystemImportView.js","../../src/views/body/FolderView.js","../../src/views/body/FrontPageView.js","../../src/views/body/GroupView.js","../../src/views/body/GroupsView.js","../../src/views/body/ItemView.js","../../src/views/body/PluginsView.js","../../src/views/body/S3ImportView.js","../../src/views/body/SystemConfigurationView.js","../../src/views/body/UserSettingsView.js","../../src/views/body/UserView.js","../../src/views/body/UsersView.js","../../src/views/layout/FooterView.js","../../src/views/layout/GlobalNavView.js","../../src/views/layout/HeaderUserView.js","../../src/views/layout/HeaderView.js","../../src/views/layout/LoginView.js","../../src/views/layout/ProgressListView.js","../../src/views/layout/RegisterView.js","../../src/views/layout/ResetPasswordView.js","../../src/views/widgets/AccessWidget.js","../../src/views/widgets/CheckedMenuWidget.js","../../src/views/widgets/CollectionInfoWidget.js","../../src/views/widgets/DateTimeWidget.js","../../src/views/widgets/EditAssetstoreWidget.js","../../src/views/widgets/EditCollectionWidget.js","../../src/views/widgets/EditFileWidget.js","../../src/views/widgets/EditFolderWidget.js","../../src/views/widgets/EditGroupWidget.js","../../src/views/widgets/EditItemWidget.js","../../src/views/widgets/FileListWidget.js","../../src/views/widgets/FolderInfoWidget.js","../../src/views/widgets/FolderListWidget.js","../../src/views/widgets/GroupAdminsWidget.js","../../src/views/widgets/GroupInvitesWidget.js","../../src/views/widgets/GroupMembersWidget.js","../../src/views/widgets/GroupModsWidget.js","../../src/views/widgets/HierarchyWidget.js","../../src/views/widgets/ItemBreadcrumbWidget.js","../../src/views/widgets/ItemListWidget.js","../../src/views/widgets/LoadingAnimation.js","../../src/views/widgets/MarkdownWidget.js","../../src/views/widgets/MetadataWidget.js","../../src/views/widgets/NewAssetstoreWidget.js","../../src/views/widgets/PaginateWidget.js","../../src/views/widgets/PluginConfigBreadcrumbWidget.js","../../src/views/widgets/SearchFieldWidget.js","../../src/views/widgets/TaskProgressWidget.js","../../src/views/widgets/TimelineWidget.js","../../src/views/widgets/UploadWidget.js"],"names":["this","template","locals","buf","jade_mixins","jade_interp","push","join","locals_","assetstores","undefined","types","importableTypes","length","$$obj","$index","$$l","assetstore","jade","cls","get","attr","escape","FILESYSTEM","GRIDFS","S3","capacityKnown","capacityString","indexOf","call","girder","collections","collection","formatDate","DATE_MINUTE","formatSize","downloadUrl","getAccessLevel","AccessType","WRITE","ADMIN","staticRoot","apiRoot","currentUser","versionInfo","git","shortSHA","Date","date","toLocaleDateString","apiVersion","groups","group","DATE_DAY","isMember","isInvited","isAdmin","isModerator","isRequested","user","name","login","accessLevel","item","DATE_SECOND","allPlugins","plugin","experimental","value","version","key","unmetDependencies","enabled","configRoute","description","settings","defaults","JSON","stringify","users","cid","temporaryToken","isCurrentUser","type","icon","text","navItems","navItem","title","public","modelType","model","hideRecurseOption","typeName","block","attributes","hideSaveButton","entry","accessTypes","subtitle","sel","level","READ","folderCount","itemCount","pickedCount","pickedMoveAllowed","pickedCopyAllowed","pickedDesc","minFolderLevel","minItemLevel","pickedResources","intro","property","renderMarkdown","id","params","noText","yesText","fromLabel","showIcon","toLabel","file","folder","groupAddAllowed","addToGroupPolicy","addAllowed","files","parentItem","hasMore","has","folders","checkboxes","admins","accessType","userAccess","mayAdd","invitees","members","member","moderators","links","current","descriptionText","idx","obj","resourceName","showActions","capitalize","parentChain","parent","object","items","newDatum","prefix","enableUploads","placeholder","rows","pageNum","pluginName","modes","mode","currentMode","results","result","progressClass","width","barClass","percentText","timeLeftText","progress","data","message","segments","points","startLabel","endLabel","segment","tooltip","class","point","parentType","window","console","log","$","noop","error","_","extend","models","views","replace","location","origin","currentToken","events","clone","Backbone","Events","uploadHandlers","corsAuth","UPLOAD_CHUNK_SIZE","SORT_ASC","SORT_DESC","MONTHS","NONE","AssetstoreType","Layout","DEFAULT","EMPTY","layout","restRequest","opts","dataType","status","info","trigger","timeout","statusText","responseJSON","responseText","lastError","path","substring","url","token","girderToken","cookie","find","headers","ajax","username","password","cors","auth","btoa","method","Girder-Authorization","then","response","authToken","UserModel","document","jqxhr","logout","fetchCurrentUser","templates","View","constructor","parentView","registerChildView","prototype","apply","arguments","destroy","each","_childViews","child","undelegateEvents","stopListening","off","eventStream","unregisterChildView","$el","is","el","isShown","on","empty","removeData","modal","without","App","initialize","done","bind","EventStream","sseTimeout","headerView","LayoutHeaderView","globalNavView","LayoutGlobalNavView","footerView","LayoutFooterView","progressListView","ProgressListView","open","layoutRenderMap","_defaultLayout","_emptyLayout","render","history","start","pushState","navigateTo","loginDialog","registerDialog","resetPasswordDialog","alert","show","addClass","hide","removeClass","html","setElement","view","deactivateAll","bodyView","closeDialogIfUser","girderModal","loginView","LoginView","registerView","RegisterView","resetPasswordView","ResetPasswordView","options","append","fadeIn","setTimeout","fadeOut","remove","route","dialogs","splitRoute","fragment","base","close","router","navigate","Router","_enabled","execute","callback","args","parseQueryString","pop","queryString","dialog","slice","firstIndex","lastIndex","lastIndexOf","dialogName","baseRoute","handleClose","nameId","curRoute","routeParts","dialogId","dialogid","unparsedQueryString","param","handleOpen","streamPath","EventSource","stream","_eventSource","onmessage","e","parse","err","fn","that","elem","$element","hasFade","hasClass","toggleClass","unbind","click","delegateEvents","jQuery","DATE_MONTH","datestr","resolution","output","getMonth","getDate","getFullYear","getHours","getMinutes","getSeconds","sizeBytes","i","sizeVal","precision","toFixed","Math","min","formatCount","n","sep","maxLen","max","confirm","yesClass","escapedHtml","confirmDialog","confirmCallback","localeComparator","model1","model2","a1","sortField","a2","localeCompare","sortDir","secondarySortField","localeSort","getModelClassByName","className","charAt","toUpperCase","substr","split","aux","val","decodeURIComponent","findAll","cookies","chain","map","m","c","arr","size","list","restartServer","waitForServer","resp","serverStartDate","_lastStartDate","_reloadWindow","_callSystemRestart","reload","defineFlags","allOption","opt","Remarkable","md","linkify","Error","str","_pluginConfigRoutes","exposePluginConfig","getPluginConfigRoute","restXhrPool","restXhrCount","ajaxSend","event","xhr","girderXhrNumber","ajaxComplete","num","numberOutstandingRestRequests","category","filter","cancelRestRequests","abort","s3","startByte","_xhrProgress","lengthComputable","loaded","payloadLength","total","s3Info","upload","handler","XMLHttpRequest","request","v","k","setRequestHeader","chunked","_multiChunkUpload","onload","bytes","uploadId","_id","msg","addEventListener","send","resume","_sendNextChunk","eTagList","chunkN","s3UploadId","match","sliceFn","webkitSlice","chunkLength","offset","chunk","partNumber","contentLength","getResponseHeader","_finalizeMultiChunkUpload","doc","implementation","createDocument","root","createElement","etag","partEl","partNumberEl","etagEl","appendChild","createTextNode","req","s3FinalizeRequest","XMLSerializer","serializeToString","wrap","funcName","wrapper","Collection","Model","comparator","pageLimit","altUrl","hasPreviousPage","hasNextPage","_hasMorePages","fetchPreviousPage","fetch","fetchNextPage","ceil","reset","limit","sort","sortdir","add","idAttribute","increment","amount","set","save","keys","isObject","restOpts","extraPath","ignoreError","download","assign","throwError","AccessControlledModel","updateAccess","access","fetchAccess","force","MetadataMixin","_sendMetadata","metadata","successCallback","errorCallback","contentType","field","meta","isFunction","addMetadata","datum","removeMetadata","editMetadata","newKey","oldKey","metas","AssetstoreModel","cap","free","import","CollectionModel","FileModel","resumeInfo","_wrapData","wrapped","Blob","isArray","updateContents","_uploadToContainer","isString","uploadToFolder","parentFolder","FolderModel","uploadToItem","ItemModel","parentModel","_restParams","uploadHandler","parentId","mimeType","behavior","g:upload.complete","g:upload.chunkSent","g:upload.error","g:upload.errorStarting","g:upload.progress","_uploadChunk","identifier","resumeUpload","abortUpload","endByte","blob","fd","FormData","_uploadId","processData","success","_uploadProgress","GroupModel","sendInvitation","userId","addToGroup","addInvitation","joinGroup","removeInvitation","requestInvitation","promoteUser","role","demoteUser","removeMember","removeFromGroup","mayAddMembers","once","getRootPath","clear","groupId","index","splice","invites","filtered","invite","changePassword","oldPassword","newPassword","old","new","adminChangePassword","AssetstoreCollection","CollectionCollection","FileCollection","FolderCollection","GroupCollection","ItemCollection","UserCollection","AdminView","click .g-server-config","click .g-assetstore-config","click .g-plugins-config","adminConsole","AssetstoresView","click .g-set-current","click .g-delete-assetstore","click .g-edit-assetstore","assetstoreEdit","concat","newAssetstoreWidget","NewAssetstoreWidget","addAssetstore","toArray","getAssetstoreImportRoute","capacityChart","editAssetstoreDialog","capacity","used","jqplot","seriesDefaults","renderer","PieRenderer","rendererOptions","sliceMargin","shadow","highlightMouseOver","showDataLabels","padding","startAngle","legend","background","border","grid","borderWidth","gridPadding","top","right","bottom","left","setCurrentAssetstore","evt","currentTarget","deleteAssetstore","editAssetstore","container","editAssetstoreWidget","EditAssetstoreWidget","assetstoreImportViewMap","assetstoreId","viewName","CollectionView","click .g-edit-collection","click .g-collection-access-control","click .g-delete-collection","edit","folderAccess","folderCreate","folderEdit","itemCreate","folderId","_createHierarchyWidget","hierarchyWidget","HierarchyWidget","editCollection","editCollectionWidget","EditCollectionWidget","collectionPage","placement","animation","delay","editAccess","AccessWidget","recurse","refreshFolderList","_fetchAndInit","collectionId","CollectionsView","click a.g-collection-link","click button.g-collection-create-button","submit .g-collections-search-form","preventDefault","paginateWidget","PaginateWidget","searchWidget","SearchFieldWidget","_gotoCollection","create","createCollectionDialog","collectionList","FilesystemImportView","submit .g-filesystem-import-form","destId","trim","destType","importPath","destinationId","destinationType","filesystemImport","FolderView","FrontPageView","click .g-register-link","click .g-login-link","click .g-collections-link","click .g-quicksearch-link","focus","click .g-my-account-link","click .g-my-folders-link","frontPage","GroupView","click .g-edit-group","click .g-group-join","click .g-group-leave","click .g-group-delete","click .g-group-request-invite","click .g-group-request-accept","click .g-group-request-deny","click #g-group-tab-pending a.g-member-name","parents","tab","editGroup","editGroupWidget","EditGroupWidget","deleteGroup","every","inv","groupPage","_renderInvitesWidget","LoadingAnimation","updatePendingStatus","_updateRolesLists","tabLink","GroupInvitesWidget","count","leaveGroup","acceptMembershipRequest","denyMembershipRequest","mods","adminsWidget","GroupAdminsWidget","modsWidget","GroupModsWidget","membersWidget","GroupMembersWidget","GroupsView","click a.g-group-link","submit .g-group-search-form","click .g-group-create-button","createGroupDialog","_gotoGroup","groupList","userGroups","ItemView","click .g-edit-item","click .g-delete-item","click .g-upload-into-item","fileEdit","uploadIntoItem","UploadWidget","fileListWidget","editItem","editItemWidget","EditItemWidget","deleteItem","parentRoute","page","itemPage","FileListWidget","metadataWidget","MetadataWidget","breadcrumbWidget","ItemBreadcrumbWidget","itemId","PluginsView","click a.g-plugin-config-link","click .g-plugin-restart-button","all","_unmetDependencies","isEmpty","contains","plugins","_sortPlugins","bootstrapSwitch","offText","state","pluginsChanged","_updatePlugins","reject","dependencies","sortedPlugins","a","b","intersection","UsersView","S3ImportView","submit .g-s3-import-form","s3Import","SystemConfigurationView","submit .g-settings-form","settingsKeys","click .g-edit-collection-create-policy","collectionCreateAccessWidget","default","systemConfiguration","settingValue","resetState","UserAccountView","submit #g-user-info-form","email","firstName","lastName","admin","submit #g-password-change-form","temporary","userSettings","UserView","click a.g-edit-user","editUrl","click a.g-delete-user","userPage","click a.g-user-link","click button.g-user-create-button","submit .g-user-search-form","_gotoUser","register","userList","createUserDialog","layoutFooter","click .g-nav-link","link","selectForView","defaultNavItems","target","layoutGlobalNav","LayoutHeaderUserView","click a.g-login","click a.g-register","click a.g-logout","click a.g-my-folders","click a.g-my-settings","layoutHeaderUser","click .g-app-title","userView","layoutHeader","submit #g-login-form","click a.g-register-link","click a.g-forgot-password","_handleProgress","_map","layoutProgressArea","_onUpdate","update","appendTo","TaskProgressWidget","p","submit #g-register-form","click a.g-login-link","submit #g-reset-password-form","click button.g-save-access-list","saveAccessList","click a.g-action-remove-access","change .g-public-container .radio input","addEntry","closeFunction","accessEditor","accessEditorNonModal","groupAccess","accessEntry","_makeTooltips","privacyChanged","_addUserEntry","_addGroupEntry","exists","acList","parseInt","removeAccessEntry","selected","CheckedMenuWidget","dropdownToggle","removeAttr","checkedActionsMenu","CollectionInfoWidget","needToFetch","collectionInfoDialog","DateTimeWidget","defaultDate","dateTimeWidget","datetimepicker","showClear","showTodayButton","useCurrent","icons","time","up","down","previous","next","today","setDate","picker","_picker","localDate","moment","utc","local","dateString","format","DateTimeRangeWidget","defaultFromDate","defaultToDate","dateTimeRangeWidget","minDate","maxDate","setFromDate","_setDate","setToDate","fromDate","_date","toDate","fromDateString","_dateString","toDateString","submit #g-assetstore-edit-form","fields","fieldsMap","updateAssetstore","Event","relatedTarget","oldfields","db","mongohost","replicaset","bucket","accessKeyId","secret","service","readOnly","submit #g-collection-edit-form","updateCollection","createCollection","EditFileWidget","submit #g-file-edit-form","editFileWidget","select","EditFolderWidget","submit #g-folder-edit-form","descriptionEditor","updateFolder","createFolder","MarkdownWidget","allowedExtensions","editFolderWidget","submit #g-group-edit-form","updateGroup","createGroup","pub","submit #g-item-edit-form","updateItem","createItem","click a.g-show-more-files","click a.g-update-contents","uploadDialog","click a.g-update-info","editFileDialog","click a.g-delete-file","checked","fileList","insertFile","FolderInfoWidget","folderInfoDialog","FolderListWidget","click a.g-folder-list-link","click a.g-show-more-folders","_checkboxes","folderList","change","insertFolder","checkAll","prop","recomputeChecked","checkbox","click .g-demote-moderator","li","userid","click .g-demote-member","click a.g-group-admin-remove","click a.g-member-name","groupAdminList","click .g-group-uninvite","groupInviteList","membersColl","click a.g-group-member-remove","click .g-promote-moderator","click .g-promote-admin","modsAndAdmins","inArray","groupMemberList","userSearch","_inviteUser","InviteUserDialog","click .g-invite-as-member","_sendInvitation","click .g-invite-as-moderator","click .g-invite-as-admin","click .g-add-as-member","click .g-add-as-moderator","click .g-add-as-admin","groupInviteDialog","click .g-group-mod-promote","click .g-group-mod-demote","click a.g-group-mod-remove","groupModList","click a.g-create-subfolder","click a.g-edit-folder","click a.g-delete-folder","click .g-folder-info-button","click .g-collection-info-button","click .g-description-preview","click a.g-create-item","click .g-upload-here-button","click .g-edit-access","click .g-hierarchy-level-up","click a.g-download-checked","click a.g-pick-checked","click a.g-move-picked","click a.g-copy-picked","click a.g-clear-picked","click a.g-delete-checked","click .g-list-checkbox","change .g-select-all","folderListView","itemListView","_showActions","_showItems","showItems","_routing","routing","_appendPages","appendPages","_onItemClick","onItemClick","breadcrumbs","breadcrumbView","HierarchyBreadcrumbView","objects","setCurrentModel","_setRoute","checkedMenuWidget","getPickedCount","getPickedCopyAllowed","getPickedMoveAllowed","getPickedDescription","descend","uploadWidget","updateChecked","_childCountCheck","_initFolderViewSubwidgets","_fetchToRoot","resetPickedResources","ItemListWidget","reverse","setItem","createFolderDialog","editFolderDialog","createItemDialog","fetchAndShowChildCount","upOneLevel","insertItem","deleteFolderDialog","showInfoDialog","showCounts","setRoute","_describeResources","resources","kinds","desc","kind","deleteCheckedDialog","_getCheckedResourceParam","X-HTTP-Method-Override","totalSize","asObject","downloadChecked","redirectViaForm","pickChecked","pickDesc","existing","resource","union","totalPickDesc","_incrementCounts","nFolders","nItems","movePickedResources","clearPickedResources","copyPickedResources","form","submit","editFolderAccess","selectItem","getSelectedItem","checkboxListener","_lastCheckbox","shiftKey","from","to","click a.g-breadcrumb-link","active","hierarchyBreadcrumb","click a.g-item-breadcrumb-link","click a.g-hierarchy-level-up","itemBreadcrumb","click a.g-item-list-link","click a.g-show-more-items","itemList","loadingAnimation","show.bs.tab .g-preview-link","shown.bs.tab .g-write-link","click .g-browse","change .g-file-input","filesAdded","dragenter .g-markdown-drop-zone","stopPropagation","originalEvent","dataTransfer","dropEffect","dragleave .g-markdown-drop-zone","dragover .g-markdown-drop-zone","drop .g-markdown-drop-zone","maxUploadSize","validateFiles","fileModel","currentProgress","css","ext","toLowerCase","markdownWidget","click .g-add-json-metadata","click .g-add-simple-metadata","fieldName","apiPath","onMetadataEdited","onMetadataAdded","simple","editor","MetadatumEditWidget","displayValue","metadatumView","json","JsonMetadatumEditWidget","validation","jsonMetadatumView","getModeFromValue","EditWidget","newRow","widget","MetadatumWidget","newEditRow","metaDict","metaKeys","Object","metaKey","click .g-widget-metadata-edit-button","_validate","newMode","validate","toggleEditor","newEditorMode","existingEditor","overrides","fromEditorMode","newValue","row","parentElement","jsonValue","g-key","g-value","click .g-widget-metadata-cancel-button","click .g-widget-metadata-save-button","click .g-widget-metadata-delete-button","click .g-widget-metadata-toggle-button","editorType","getCurrentValue","editTemplate","metadatumEditWidget","deleteMetadatum","stopImmediatePropagation","metadataList","cancelEdit","curRow","tempKey","tempValue","saveCallback","out","jsonMetadatumEditWidget","getText","JSONEditor","setText","expandAll","submit #g-new-fs-form","createAssetstore","submit #g-new-gridfs-form","submit #g-new-s3-form","newAssetstore","click .g-page-next","click .g-page-prev","PluginConfigBreadcrumbWidget","click a.g-admin-console-link","click a.g-plugins-link","pluginConfigBreadcrumb","input .g-search-field","click .g-search-mode-radio","hideResults","search","popover","click .g-search-result>a","_resultClicked","keydown .g-search-field","code","keyCode","which","pos","eq","ajaxLock","pending","getInfoCallback","q","_doSearch","searchField","viewport","selector","content","searchHelp","searchModeSelect","clearText","res","searchResults","percent","round","timeLeft","estimatedTotalTime","updatedTime","startTime","sprintf","_scheduleHide","taskProgress","ms","TimelineWidget","endTime","numeric","defaultSegmentClass","defaultPointClass","_processData","_processedSegments","_processedPoints","range","end","classes","_segmentTooltip","_pointTooltip","toISOString","timeline","submit #g-upload-form","startUpload","click .g-resume-upload","currentFile","click .g-restart-upload","uploadNextFile","change #g-files","filesChanged","click .g-drop-zone","dragenter .g-drop-zone","dragleave .g-drop-zone","dragover .g-drop-zone","drop .g-drop-zone","noParent","overrideStart","uploadWidgetNonModal","filesDropped","setUploadEnabled","currentIndex","overallProgress"],"mappings":"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","file":"girder.app.min.js","sourcesContent":["this[\"girder\"] = this[\"girder\"] || {};\nthis[\"girder\"][\"templates\"] = this[\"girder\"][\"templates\"] || {};\n\nthis[\"girder\"][\"templates\"][\"adminConsole\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\n\nbuf.push(\"\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"assetstores\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),assetstores = locals_.assetstores,undefined = locals_.undefined,types = locals_.types,importableTypes = locals_.importableTypes;\nbuf.push(\"
Assetstores
\");\nif ( !assetstores.length)\n{\nbuf.push(\"
You must create an assetstore before you can upload files to the server.\\nSelect from the options below to create one.
\");\n}\nelse\n{\nbuf.push(\"
Below is a list of all of the assetstores available to the server. The\\none set as \\\"current\\\" is the one that uploaded files will be written to.
\");\n}\n// iterate assetstores\n;(function(){\n var $$obj = assetstores;\n if ('number' == typeof $$obj.length) {\n\n for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {\n var assetstore = $$obj[$index];\n\nbuf.push(\"
Name: \" + (jade.escape((jade_interp = assetstore.get('name')) == null ? '' : jade_interp)) + \"\");\nif ( assetstore.get('current'))\n{\nbuf.push(\" (Current assetstore)\");\n}\nbuf.push(\"
\");\nif ( assetstore.get('type') === types.FILESYSTEM)\n{\nbuf.push(\"
Type: Filesystem
Root path: \" + (jade.escape((jade_interp = assetstore.get('root')) == null ? '' : jade_interp)) + \"
\");\n}\nelse if ( assetstore.get('type') === types.GRIDFS)\n{\nbuf.push(\"
Type: GridFS
Database name: \" + (jade.escape((jade_interp = assetstore.get('db')) == null ? '' : jade_interp)) + \"
\");\nif ( assetstore.get('mongohost'))\n{\nbuf.push(\"
Mongo Host URI: \" + (jade.escape((jade_interp = assetstore.get('mongohost')) == null ? '' : jade_interp)) + \"
\");\nif ( assetstore.get('replicaset'))\n{\nbuf.push(\"
Replica Set: \" + (jade.escape((jade_interp = assetstore.get('replicaset')) == null ? '' : jade_interp)) + \"
\");\n}\n}\n}\nelse if ( assetstore.get('type') === types.S3)\n{\nbuf.push(\"
Type: S3
Bucket: \" + (jade.escape((jade_interp = assetstore.get('bucket')) == null ? '' : jade_interp)) + \"
\");\nif ( assetstore.get('prefix'))\n{\nbuf.push(\"
Path prefix: \" + (jade.escape((jade_interp = assetstore.get('prefix')) == null ? '' : jade_interp)) + \"
\");\n}\nbuf.push(\"
Access key ID: \" + (jade.escape((jade_interp = assetstore.get('accessKeyId')) == null ? '' : jade_interp)) + \"
Secret access key: \" + (jade.escape((jade_interp = assetstore.get('secret')) == null ? '' : jade_interp)) + \"
Service: \" + (jade.escape((jade_interp = assetstore.get('service')) == null ? '' : jade_interp)) + \"
\");\n}\nbuf.push(\"
\");\nif ( assetstore.capacityKnown())\n{\nbuf.push(\"
Capacity: \" + (jade.escape((jade_interp = assetstore.capacityString()) == null ? '' : jade_interp)) + \"
\");\n}\nbuf.push(\"
Edit\");\nif ( !assetstore.get('hasFiles'))\n{\nbuf.push(\"Delete\");\n}\nelse\n{\nbuf.push(\"
Delete
\");\n}\nif ( !assetstore.get('current') && !assetstore.get('readOnly'))\n{\nbuf.push(\"Set as current\");\n}\nif ( importableTypes.indexOf(assetstore.get('type')) !== -1)\n{\nbuf.push(\"
Import data
\");\n}\nbuf.push(\"
\");\n }\n\n } else {\n var $$l = 0;\n for (var $index in $$obj) {\n $$l++; var assetstore = $$obj[$index];\n\nbuf.push(\"
Name: \" + (jade.escape((jade_interp = assetstore.get('name')) == null ? '' : jade_interp)) + \"\");\nif ( assetstore.get('current'))\n{\nbuf.push(\" (Current assetstore)\");\n}\nbuf.push(\"
\");\nif ( assetstore.get('type') === types.FILESYSTEM)\n{\nbuf.push(\"
Type: Filesystem
Root path: \" + (jade.escape((jade_interp = assetstore.get('root')) == null ? '' : jade_interp)) + \"
\");\n}\nelse if ( assetstore.get('type') === types.GRIDFS)\n{\nbuf.push(\"
Type: GridFS
Database name: \" + (jade.escape((jade_interp = assetstore.get('db')) == null ? '' : jade_interp)) + \"
\");\nif ( assetstore.get('mongohost'))\n{\nbuf.push(\"
Mongo Host URI: \" + (jade.escape((jade_interp = assetstore.get('mongohost')) == null ? '' : jade_interp)) + \"
\");\nif ( assetstore.get('replicaset'))\n{\nbuf.push(\"
Replica Set: \" + (jade.escape((jade_interp = assetstore.get('replicaset')) == null ? '' : jade_interp)) + \"
\");\n}\n}\n}\nelse if ( assetstore.get('type') === types.S3)\n{\nbuf.push(\"
Type: S3
Bucket: \" + (jade.escape((jade_interp = assetstore.get('bucket')) == null ? '' : jade_interp)) + \"
\");\nif ( assetstore.get('prefix'))\n{\nbuf.push(\"
Path prefix: \" + (jade.escape((jade_interp = assetstore.get('prefix')) == null ? '' : jade_interp)) + \"
\");\n}\nbuf.push(\"
Access key ID: \" + (jade.escape((jade_interp = assetstore.get('accessKeyId')) == null ? '' : jade_interp)) + \"
Secret access key: \" + (jade.escape((jade_interp = assetstore.get('secret')) == null ? '' : jade_interp)) + \"
Service: \" + (jade.escape((jade_interp = assetstore.get('service')) == null ? '' : jade_interp)) + \"
\");\n}\nbuf.push(\"
\");\nif ( assetstore.capacityKnown())\n{\nbuf.push(\"
Capacity: \" + (jade.escape((jade_interp = assetstore.capacityString()) == null ? '' : jade_interp)) + \"
\");\n}\nbuf.push(\"
Edit\");\nif ( !assetstore.get('hasFiles'))\n{\nbuf.push(\"Delete\");\n}\nelse\n{\nbuf.push(\"
Delete
\");\n}\nif ( !assetstore.get('current') && !assetstore.get('readOnly'))\n{\nbuf.push(\"Set as current\");\n}\nif ( importableTypes.indexOf(assetstore.get('type')) !== -1)\n{\nbuf.push(\"
Import data
\");\n}\nbuf.push(\"
\");\n }\n\n }\n}).call(this);\n\nbuf.push(\"
\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"collectionList\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),girder = locals_.girder,collections = locals_.collections,undefined = locals_.undefined;\nbuf.push(\"
\");\nif ( (girder.currentUser))\n{\nbuf.push(\"\");\n}\nbuf.push(\"
\");\n// iterate collections\n;(function(){\n var $$obj = collections;\n if ('number' == typeof $$obj.length) {\n\n for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {\n var collection = $$obj[$index];\n\nbuf.push(\"
Created on \" + (jade.escape((jade_interp = girder.formatDate(collection.get('created'), girder.DATE_MINUTE)) == null ? '' : jade_interp)) + \"
\");\nif ( (collection.get('size') !== undefined))\n{\nbuf.push(\"
Currently using \" + (jade.escape((jade_interp = girder.formatSize(collection.get('size'))) == null ? '' : jade_interp)) + \"
\");\n}\nbuf.push(\"
\" + (jade.escape((jade_interp = collection.get('name')) == null ? '' : jade_interp)) + \"
\" + (jade.escape((jade_interp = collection.get('description')) == null ? '' : jade_interp)) + \"
\");\n }\n\n } else {\n var $$l = 0;\n for (var $index in $$obj) {\n $$l++; var collection = $$obj[$index];\n\nbuf.push(\"
Created on \" + (jade.escape((jade_interp = girder.formatDate(collection.get('created'), girder.DATE_MINUTE)) == null ? '' : jade_interp)) + \"
\");\nif ( (collection.get('size') !== undefined))\n{\nbuf.push(\"
Currently using \" + (jade.escape((jade_interp = girder.formatSize(collection.get('size'))) == null ? '' : jade_interp)) + \"
\");\n}\nbuf.push(\"
\" + (jade.escape((jade_interp = collection.get('name')) == null ? '' : jade_interp)) + \"
\" + (jade.escape((jade_interp = collection.get('description')) == null ? '' : jade_interp)) + \"
\");\n }\n\n }\n}).call(this);\n;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"collectionPage\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),collection = locals_.collection,girder = locals_.girder;\nbuf.push(\"
\" + (jade.escape((jade_interp = collection.get('name')) == null ? '' : jade_interp)) + \"
\" + (jade.escape((jade_interp = collection.get('description')) == null ? '' : jade_interp)) + \"
\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"filesystemImport\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),assetstore = locals_.assetstore;\nbuf.push(\"
Import existing data from the filesystem
\" + (jade.escape((jade_interp = assetstore.get('name')) == null ? '' : jade_interp)) + \"
Use this page to import existing data from this assetstore's filesystem.\\nSpecify a root directory on the filesystem, and it will be imported recursively.\\nThe directory does not need to be under the assetstore's root dir. You must also\\nspecify a destination collection, user, or folder ID under which to place the\\nimported data. Files that are imported are not managed directly by the server.\\nThey will not be copied, but will be served from their existing location. When\\nthe referencing files in Girder are deleted, the underlying imported file will\\nnot be removed.\\n
\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"frontPage\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),staticRoot = locals_.staticRoot,apiRoot = locals_.apiRoot,currentUser = locals_.currentUser,versionInfo = locals_.versionInfo;\nbuf.push(\"
Girder
Data management platform

Welcome to Girder! If this is your first time here, you might want to check out the User Guide to learn the basics of how to use the application.\\n To browse the data hosted on this server, start on the Collections page. If you want to search for specific data on this server, use the Quick Search box at the top of the screen. Developers who want to use the Girder REST API\\n should check out the interactive web API docs.\");\nif ( !currentUser)\n{\nbuf.push(\"

You are currently browsing anonymously. If you want to create a user\\n account on this server, click the Register link in the upper right corner. If you already have a user, click the link. Otherwise, you will only be able to see publicly visible data\\n in the system.

\");\n}\nelse\n{\nbuf.push(\"

You are currently logged in as \" + (jade.escape((jade_interp = currentUser.get('login')) == null ? '' : jade_interp)) + \". You can view your personal data space or go to your

\");\n}\nbuf.push(\"

\");\nif ( versionInfo.git)\n{\nbuf.push(\"This instance of Girder was built from Git version \" + (jade.escape(null == (jade_interp = versionInfo.shortSHA) ? \"\" : jade_interp)) + \".\");\n}\nelse\n{\nbuf.push(\"This instance of Girder was built on \" + (jade.escape((jade_interp = new Date(versionInfo.date).toLocaleDateString()) == null ? '' : jade_interp)) + \".\");\n}\nif ( versionInfo.apiVersion)\n{\nbuf.push(\" API Version \" + (jade.escape((jade_interp = versionInfo.apiVersion) == null ? '' : jade_interp)) + \".\");\n}\nbuf.push(\"

\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"groupList\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),girder = locals_.girder,groups = locals_.groups;\nbuf.push(\"
\");\nif ( girder.currentUser)\n{\nbuf.push(\"\");\n}\nbuf.push(\"
\");\n// iterate groups\n;(function(){\n var $$obj = groups;\n if ('number' == typeof $$obj.length) {\n\n for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {\n var group = $$obj[$index];\n\nbuf.push(\"
Created on \" + (jade.escape((jade_interp = girder.formatDate(group.get('created'), girder.DATE_DAY)) == null ? '' : jade_interp)) + \"
\");\nif ( (group.get('public')))\n{\nbuf.push(\"Public group\");\n}\nelse\n{\nbuf.push(\"Private group\");\n}\nbuf.push(\"
\" + (jade.escape((jade_interp = group.get('name')) == null ? '' : jade_interp)) + \"
\" + (jade.escape((jade_interp = group.get('description')) == null ? '' : jade_interp)) + \"
\");\n }\n\n } else {\n var $$l = 0;\n for (var $index in $$obj) {\n $$l++; var group = $$obj[$index];\n\nbuf.push(\"
Created on \" + (jade.escape((jade_interp = girder.formatDate(group.get('created'), girder.DATE_DAY)) == null ? '' : jade_interp)) + \"
\");\nif ( (group.get('public')))\n{\nbuf.push(\"Public group\");\n}\nelse\n{\nbuf.push(\"Private group\");\n}\nbuf.push(\"
\" + (jade.escape((jade_interp = group.get('name')) == null ? '' : jade_interp)) + \"
\" + (jade.escape((jade_interp = group.get('description')) == null ? '' : jade_interp)) + \"
\");\n }\n\n }\n}).call(this);\n;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"groupPage\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),isMember = locals_.isMember,isInvited = locals_.isInvited,girder = locals_.girder,group = locals_.group,isAdmin = locals_.isAdmin,isModerator = locals_.isModerator,isRequested = locals_.isRequested;\nbuf.push(\"
\");\nif ( (isMember || isInvited || girder.currentUser || group.get('_accessLevel') >= girder.AccessType.ADMIN))\n{\nbuf.push(\"
    \");\nif ( (isMember))\n{\nbuf.push(\"
  • Leave group
  • \");\n}\nelse if ( (isInvited))\n{\nbuf.push(\"
  • Join group
  • \");\n}\nelse if ( (girder.currentUser))\n{\nbuf.push(\"
  • Request membership
  • \");\n}\nif ( (group.get('_accessLevel') >= girder.AccessType.ADMIN))\n{\nbuf.push(\"
  • Edit group
  • \");\n}\nif ( (group.get('_accessLevel') >= girder.AccessType.ADMIN))\n{\nbuf.push(\"
  • Delete group
  • \");\n}\nbuf.push(\"
\");\n}\nbuf.push(\"
\" + (jade.escape((jade_interp = group.get('name')) == null ? '' : jade_interp)) + \"
\" + (jade.escape((jade_interp = group.get('description')) == null ? '' : jade_interp)) + \"
\");\nif ( (girder.currentUser))\n{\nif ( (isMember))\n{\nbuf.push(\"
\");\nif ( (isAdmin))\n{\nbuf.push(\" You are an administrator of this group.\");\n}\nelse if ( (isModerator))\n{\nbuf.push(\" You are a moderator of this group.\");\n}\nelse\n{\nbuf.push(\" You are a member of this group.\");\n}\nbuf.push(\"
\");\n}\nelse if ( (isInvited))\n{\nbuf.push(\"
You have been invited to this group. Join group
\");\n}\nelse if ( (isRequested))\n{\nbuf.push(\"
You have requested to join this group.
\");\n}\nelse\n{\nbuf.push(\"
You are not a member of this group. Request membership
\");\n}\nif ( (group.get('_accessLevel') >= girder.AccessType.ADMIN && !isAdmin))\n{\nbuf.push(\"
You have administrator privileges.
\");\n}\n}\nbuf.push(\"
Requests for membership
Sent invitations
\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"itemPage\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),accessLevel = locals_.accessLevel,girder = locals_.girder,item = locals_.item;\nbuf.push(\"
\");\nif ( (accessLevel >= girder.AccessType.WRITE))\n{\nbuf.push(\"\");\n}\nbuf.push(\"
\" + (jade.escape((jade_interp = item.get('name')) == null ? '' : jade_interp)) + \"
\" + (jade.escape((jade_interp = item.get('description')) == null ? '' : jade_interp)) + \"
Info
\" + (jade.escape((jade_interp = girder.formatSize(item.get('size'))) == null ? '' : jade_interp)) + \" (\" + (jade.escape((jade_interp = item.get('size')) == null ? '' : jade_interp)) + \" bytes)
Created on \" + (jade.escape((jade_interp = girder.formatDate(item.get('created'), girder.DATE_SECOND)) == null ? '' : jade_interp)) + \"
Updated on \" + (jade.escape((jade_interp = girder.formatDate(item.get('updated'), girder.DATE_SECOND)) == null ? '' : jade_interp)) + \"
Files & links
\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"plugins\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),allPlugins = locals_.allPlugins,undefined = locals_.undefined;\nbuf.push(\"
Plugins
The selected plugins have changed. You must restart the server for the\\nchanges to take effect.
\");\n// iterate allPlugins\n;(function(){\n var $$obj = allPlugins;\n if ('number' == typeof $$obj.length) {\n\n for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {\n var plugin = $$obj[$index];\n\nvar experimental = plugin.value.version ? plugin.value.version.indexOf('0.') === 0 : true\nbuf.push(\"
0, true, false)) + (jade.attr(\"checked\", (plugin.value.enabled ? \"checked\" : undefined), true, false)) + (jade.attr(\"experimental\", (experimental ? \"true\" : undefined), true, false)) + (jade.attr(\"data-on-color\", (experimental ? \"warning\" : \"primary\"), true, false)) + \" class=\\\"g-plugin-switch\\\"/>
\" + (jade.escape(null == (jade_interp = plugin.value.name) ? \"\" : jade_interp)) + \"\");\nif ( plugin.value.version)\n{\nbuf.push(\"Version \" + (jade.escape((jade_interp = plugin.value.version) == null ? '' : jade_interp)) + \"\");\n}\nif ( experimental)\n{\nbuf.push(\"Experimental\");\n}\nif ( plugin.value.configRoute)\n{\nbuf.push(\"\");\n}\nbuf.push(\"
\" + (jade.escape((jade_interp = plugin.value.description) == null ? '' : jade_interp)) + \"\");\nif ( (plugin.value.unmetDependencies.length))\n{\nbuf.push(\"
This plugin has unmet dependencies: \" + (jade.escape((jade_interp = plugin.value.unmetDependencies.join(', ')) == null ? '' : jade_interp)) + \".
\");\n}\nbuf.push(\"
\");\n }\n\n } else {\n var $$l = 0;\n for (var $index in $$obj) {\n $$l++; var plugin = $$obj[$index];\n\nvar experimental = plugin.value.version ? plugin.value.version.indexOf('0.') === 0 : true\nbuf.push(\"
0, true, false)) + (jade.attr(\"checked\", (plugin.value.enabled ? \"checked\" : undefined), true, false)) + (jade.attr(\"experimental\", (experimental ? \"true\" : undefined), true, false)) + (jade.attr(\"data-on-color\", (experimental ? \"warning\" : \"primary\"), true, false)) + \" class=\\\"g-plugin-switch\\\"/>
\" + (jade.escape(null == (jade_interp = plugin.value.name) ? \"\" : jade_interp)) + \"\");\nif ( plugin.value.version)\n{\nbuf.push(\"Version \" + (jade.escape((jade_interp = plugin.value.version) == null ? '' : jade_interp)) + \"\");\n}\nif ( experimental)\n{\nbuf.push(\"Experimental\");\n}\nif ( plugin.value.configRoute)\n{\nbuf.push(\"\");\n}\nbuf.push(\"
\" + (jade.escape((jade_interp = plugin.value.description) == null ? '' : jade_interp)) + \"\");\nif ( (plugin.value.unmetDependencies.length))\n{\nbuf.push(\"
This plugin has unmet dependencies: \" + (jade.escape((jade_interp = plugin.value.unmetDependencies.join(', ')) == null ? '' : jade_interp)) + \".
\");\n}\nbuf.push(\"
\");\n }\n\n }\n}).call(this);\n\nbuf.push(\"
\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"s3Import\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),assetstore = locals_.assetstore;\nbuf.push(\"
Import existing data from S3
\" + (jade.escape((jade_interp = assetstore.get('name')) == null ? '' : jade_interp)) + \"
Use this page to import existing data from this assetstore's S3 bucket\\n(\" + (jade.escape((jade_interp = assetstore.get('bucket')) == null ? '' : jade_interp)) + \"). You may import a specific directory of keys\\nwithin the bucket, or a specific key by path. If you wish to import the entire\\nbucket into the selected destination, simply leave the import path field blank.\\nIf you specify a directory, it will be imported recursively. You must also\\nspecify a destination collection, user, or folder ID under which to place the\\nimported data.\\n
\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"systemConfiguration\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),settings = locals_.settings,defaults = locals_.defaults;\nbuf.push(\"
System configuration

Administrative Policy

Email Creation

Email Delivery

These settings should only be changed if you are certain of what you are doing.


This applies to Filesystem and GridFS assetstores.

CORS

CORS (Cross-origin resource sharing) allows access from other websites.\\nThese settings are described in\\ndetail here.

\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"userList\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),girder = locals_.girder,users = locals_.users,undefined = locals_.undefined;\nbuf.push(\"
\");\nif ( girder.currentUser && girder.currentUser.get('admin'))\n{\nbuf.push(\"\");\n}\nbuf.push(\"
\");\n// iterate users\n;(function(){\n var $$obj = users;\n if ('number' == typeof $$obj.length) {\n\n for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {\n var user = $$obj[$index];\n\nbuf.push(\"
Joined on \" + (jade.escape((jade_interp = girder.formatDate(user.get('created'), girder.DATE_DAY)) == null ? '' : jade_interp)) + \"
\");\nif ( (user.get('size') !== undefined))\n{\nbuf.push(\"
Currently using \" + (jade.escape((jade_interp = girder.formatSize(user.get('size'))) == null ? '' : jade_interp)) + \"
\");\n}\nbuf.push(\"
\" + (jade.escape(null == (jade_interp = user.name()) ? \"\" : jade_interp)) + \"
\" + (jade.escape((jade_interp = user.get('login')) == null ? '' : jade_interp)) + \"
\");\n }\n\n } else {\n var $$l = 0;\n for (var $index in $$obj) {\n $$l++; var user = $$obj[$index];\n\nbuf.push(\"
Joined on \" + (jade.escape((jade_interp = girder.formatDate(user.get('created'), girder.DATE_DAY)) == null ? '' : jade_interp)) + \"
\");\nif ( (user.get('size') !== undefined))\n{\nbuf.push(\"
Currently using \" + (jade.escape((jade_interp = girder.formatSize(user.get('size'))) == null ? '' : jade_interp)) + \"
\");\n}\nbuf.push(\"
\" + (jade.escape(null == (jade_interp = user.name()) ? \"\" : jade_interp)) + \"
\" + (jade.escape((jade_interp = user.get('login')) == null ? '' : jade_interp)) + \"
\");\n }\n\n }\n}).call(this);\n;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"userPage\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),user = locals_.user,girder = locals_.girder;\nbuf.push(\"
\");\nif ( (user.getAccessLevel() >= girder.AccessType.WRITE))\n{\nbuf.push(\"
  • Edit user
  • \");\nif ( (user.getAccessLevel() >= girder.AccessType.ADMIN))\n{\nbuf.push(\"
  • Delete user
  • \");\n}\nbuf.push(\"
\");\n}\nbuf.push(\"
\" + (jade.escape((jade_interp = user.get('firstName')) == null ? '' : jade_interp)) + \" \" + (jade.escape((jade_interp = user.get('lastName')) == null ? '' : jade_interp)) + \"
\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"userSettings\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),user = locals_.user,girder = locals_.girder,temporaryToken = locals_.temporaryToken,isCurrentUser = locals_.isCurrentUser;\nbuf.push(\"
\" + (jade.escape((jade_interp = user.name()) == null ? '' : jade_interp)) + \"
\" + (jade.escape((jade_interp = user.get('login')) == null ? '' : jade_interp)) + \"
\");\nif ( temporaryToken)\n{\nbuf.push(\"\");\n}\nelse if ( isCurrentUser)\n{\nbuf.push(\"
\");\n}\nbuf.push(\"
\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"alert\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),type = locals_.type,icon = locals_.icon,text = locals_.text;\nbuf.push(\"\");\nif ( icon)\n{\nbuf.push(\"\");\n}\nbuf.push(\" \" + (jade.escape((jade_interp = text) == null ? '' : jade_interp)) + \"\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"layout\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\n\nbuf.push(\"
\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"layoutFooter\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),apiRoot = locals_.apiRoot;\nbuf.push(\"\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"layoutGlobalNav\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),navItems = locals_.navItems;\nbuf.push(\"
    \");\n// iterate navItems\n;(function(){\n var $$obj = navItems;\n if ('number' == typeof $$obj.length) {\n\n for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {\n var navItem = $$obj[$index];\n\nbuf.push(\"
  • \" + (jade.escape((jade_interp = navItem.name) == null ? '' : jade_interp)) + \"
  • \");\n }\n\n } else {\n var $$l = 0;\n for (var $index in $$obj) {\n $$l++; var navItem = $$obj[$index];\n\nbuf.push(\"
  • \" + (jade.escape((jade_interp = navItem.name) == null ? '' : jade_interp)) + \"
  • \");\n }\n\n }\n}).call(this);\n\nbuf.push(\"
\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"layoutHeader\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\n\nbuf.push(\"
Girder
\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"layoutHeaderUser\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),user = locals_.user;\nbuf.push(\"\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"layoutProgressArea\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\n\nbuf.push(\"
\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"loginDialog\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\n\nbuf.push(\"

Log in

Don't have an account yet? Register here. | Forgot your password?
Close
\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"registerDialog\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),title = locals_.title,currentUser = locals_.currentUser;\nbuf.push(\"

\" + (jade.escape(null == (jade_interp = title) ? \"\" : jade_interp)) + \"

\");\nif ( !currentUser)\n{\nbuf.push(\"
Already have an account?
\");\n}\nbuf.push(\"
Close
\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"resetPasswordDialog\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\n\nbuf.push(\"

Forgotten password

If you have forgotten your password, enter your email address here.\\nYou will be sent an email with a temporary access link, from\\nwhich you can reset your password.
Close
\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"accessEditor\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),public = locals_.public,undefined = locals_.undefined,modelType = locals_.modelType,model = locals_.model,hideRecurseOption = locals_.hideRecurseOption;\njade_mixins[\"privacyEditor\"] = function(typeName){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nbuf.push(\"
\");\n};\njade_mixins[\"permissionsEditor\"] = function(){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nbuf.push(\"
Permissions
\");\n};\njade_mixins[\"recurseOption\"] = function(typeName){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nbuf.push(\"
\");\n};\njade_mixins[\"saveAccessButton\"] = function(){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nbuf.push(\"\");\n};\nbuf.push(\"

Access control

\");\nif ( (modelType === 'folder'))\n{\nbuf.push(\"\");\n}\nelse if ( (modelType === 'collection'))\n{\nbuf.push(\"\");\n}\nbuf.push(\"\" + (jade.escape((jade_interp = model.name()) == null ? '' : jade_interp)) + \"
\");\njade_mixins[\"privacyEditor\"](modelType);\njade_mixins[\"permissionsEditor\"]();\nif ( !hideRecurseOption)\n{\njade_mixins[\"recurseOption\"](modelType);\n}\nbuf.push(\"
Close\");\njade_mixins[\"saveAccessButton\"]();\nbuf.push(\"
\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"accessEditorMixins\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"accessEditorNonModal\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),public = locals_.public,undefined = locals_.undefined,modelType = locals_.modelType,hideRecurseOption = locals_.hideRecurseOption,hideSaveButton = locals_.hideSaveButton;\njade_mixins[\"privacyEditor\"] = function(typeName){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nbuf.push(\"
\");\n};\njade_mixins[\"permissionsEditor\"] = function(){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nbuf.push(\"
Permissions
\");\n};\njade_mixins[\"recurseOption\"] = function(typeName){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nbuf.push(\"
\");\n};\njade_mixins[\"saveAccessButton\"] = function(){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nbuf.push(\"\");\n};\njade_mixins[\"privacyEditor\"](modelType);\njade_mixins[\"permissionsEditor\"]();\nif ( !hideRecurseOption)\n{\njade_mixins[\"recurseOption\"](modelType);\n}\nif ( !hideSaveButton)\n{\njade_mixins[\"saveAccessButton\"]();\n};return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"accessEntry\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),entry = locals_.entry,type = locals_.type,accessTypes = locals_.accessTypes;\nbuf.push(\"
\");\nvar icon = type === 'group' ? 'users' : 'user';\nbuf.push(\"
\" + (jade.escape((jade_interp = entry.title) == null ? '' : jade_interp)) + \"
\" + (jade.escape((jade_interp = entry.subtitle) == null ? '' : jade_interp)) + \"
\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"checkedActionsMenu\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),folderCount = locals_.folderCount,itemCount = locals_.itemCount,pickedCount = locals_.pickedCount,girder = locals_.girder,pickedMoveAllowed = locals_.pickedMoveAllowed,pickedCopyAllowed = locals_.pickedCopyAllowed,pickedDesc = locals_.pickedDesc,minFolderLevel = locals_.minFolderLevel,AccessType = locals_.AccessType,minItemLevel = locals_.minItemLevel;\nbuf.push(\"
  • \");\nif ( folderCount)\n{\nbuf.push(\"\" + (jade.escape((jade_interp = folderCount) == null ? '' : jade_interp)) + \"\");\n}\nif ( itemCount)\n{\nbuf.push(\"\" + (jade.escape((jade_interp = itemCount) == null ? '' : jade_interp)) + \"\");\n}\nif ( pickedCount)\n{\nbuf.push(\"\" + (jade.escape((jade_interp = pickedCount) == null ? '' : jade_interp)) + \"\");\n}\nbuf.push(\"
  • \");\nif ( folderCount || itemCount)\n{\nbuf.push(\"
  • Download checked resources
  • Pick checked resources for Move or Copy
  • \");\n}\nif ( girder.pickedResources)\n{\nbuf.push(\"
  • \");\nif ( pickedMoveAllowed)\n{\nbuf.push(\"
  • Move picked resources here
  • \");\n}\nif ( pickedCopyAllowed)\n{\nbuf.push(\"
  • Copy picked resources here
  • \");\n}\nbuf.push(\"
  • Clear picked resources\");\nif ( pickedDesc)\n{\nbuf.push(\" (\" + (jade.escape((jade_interp = pickedDesc) == null ? '' : jade_interp)) + \")\");\n}\nbuf.push(\"
  • \");\n}\nif ( folderCount || itemCount)\n{\nif ( (minFolderLevel >= AccessType.ADMIN && minItemLevel >= AccessType.WRITE))\n{\nbuf.push(\"
  • Delete checked resources
  • \");\n}\n};return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"collectionInfoDialog\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),girder = locals_.girder,collection = locals_.collection;\njade_mixins[\"dateInfo\"] = function(intro, property){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nbuf.push(\"\" + (jade.escape(null == (jade_interp = intro) ? \"\" : jade_interp)) + \"\" + (jade.escape(null == (jade_interp = girder.formatDate(collection.get(property), girder.DATE_SECOND)) ? \"\" : jade_interp)) + \"\");\n};\nbuf.push(\"

    Collection information

    \" + (jade.escape(null == (jade_interp = collection.name()) ? \"\" : jade_interp)) + \"
    \");\nif ( collection.get('description'))\n{\nbuf.push(\"
    \" + (null == (jade_interp = girder.renderMarkdown(collection.get('description'))) ? \"\" : jade_interp) + \"
    \");\n}\nbuf.push(\"
    \");\njade_mixins[\"dateInfo\"]('Created ', 'created');\nif ( collection.get('created') !== collection.get('updated'))\n{\njade_mixins[\"dateInfo\"]('Last updated ', 'updated');\n}\nbuf.push(\"
    Total size: \" + (jade.escape(null == (jade_interp = girder.formatSize(collection.get('size'))) ? \"\" : jade_interp)) + \"
    Contains \" + (jade.escape(null == (jade_interp = collection.get('nFolders')) ? \"\" : jade_interp)) + \" subfolders
    Unique ID: \" + (jade.escape(null == (jade_interp = collection.id) ? \"\" : jade_interp)) + \"
    \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"confirmDialog\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),params = locals_.params;\nbuf.push(\"\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"dateTimeRangeWidget\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),fromLabel = locals_.fromLabel,showIcon = locals_.showIcon,toLabel = locals_.toLabel;\nbuf.push(\"
    \");\nif ( showIcon)\n{\nbuf.push(\"
    \");\n}\nelse\n{\nbuf.push(\"
    \");\n}\nbuf.push(\"
    \");\nif ( showIcon)\n{\nbuf.push(\"
    \");\n}\nelse\n{\nbuf.push(\"
    \");\n}\nbuf.push(\"
    \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"dateTimeWidget\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),showIcon = locals_.showIcon;\nif ( showIcon)\n{\nbuf.push(\"
    \");\n}\nelse\n{\nbuf.push(\"
    \");\n};return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"editAssetstoreWidget\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),assetstore = locals_.assetstore,types = locals_.types;\nbuf.push(\"

    Edit assetstore

    \");\nif ( assetstore.get('type') === types.FILESYSTEM)\n{\nbuf.push(\"
    \");\n}\nif ( assetstore.get('type') === types.GRIDFS)\n{\nbuf.push(\"
    \");\n}\nif ( assetstore.get('type') === types.S3)\n{\nbuf.push(\"
    \");\n}\nbuf.push(\"
    \");\nif ( assetstore.get('hasFiles'))\n{\nbuf.push(\"
    Warning: This assetstore contains files. If you edit where the assetstore is located or how it is reached, those files may become unreachable.
    \");\n}\nbuf.push(\"
    Cancel\");\nif ( !assetstore.get('hasFiles'))\n{\nbuf.push(\"\");\n}\nelse\n{\nbuf.push(\"\");\n}\nbuf.push(\"
    \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"editCollectionWidget\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),collection = locals_.collection;\nbuf.push(\"

    \");\nif ( (collection))\n{\nbuf.push(\"Edit collection\");\n}\nelse\n{\nbuf.push(\"Create collection\");\n}\nbuf.push(\"

    Cancel
    \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"editFileWidget\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),file = locals_.file;\nbuf.push(\"

    Edit file

    Cancel
    \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"editFolderWidget\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),folder = locals_.folder;\nbuf.push(\"

    \");\nif ( (folder))\n{\nbuf.push(\"Edit folder\");\n}\nelse\n{\nbuf.push(\"Create folder\");\n}\nbuf.push(\"

    Cancel
    \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"editGroupWidget\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),group = locals_.group,public = locals_.public,undefined = locals_.undefined,groupAddAllowed = locals_.groupAddAllowed,addToGroupPolicy = locals_.addToGroupPolicy,addAllowed = locals_.addAllowed;\nbuf.push(\"

    \");\nif ( (group))\n{\nbuf.push(\"Edit group\");\n}\nelse\n{\nbuf.push(\"Create group\");\n}\nbuf.push(\"

    \");\nif ( groupAddAllowed)\n{\nbuf.push(\"
    \");\n}\nbuf.push(\"
    Cancel
    \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"editItemWidget\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),item = locals_.item;\nbuf.push(\"

    \");\nif ( (item))\n{\nbuf.push(\"Edit item\");\n}\nelse\n{\nbuf.push(\"Create item\");\n}\nbuf.push(\"

    Cancel
    \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"fileList\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),files = locals_.files,girder = locals_.girder,parentItem = locals_.parentItem,hasMore = locals_.hasMore;\nbuf.push(\"
      \");\n// iterate files\n;(function(){\n var $$obj = files;\n if ('number' == typeof $$obj.length) {\n\n for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {\n var file = $$obj[$index];\n\nbuf.push(\"
    • \");\nif ( (file.get('linkUrl')))\n{\nbuf.push(\"\" + (jade.escape((jade_interp = file.get('name')) == null ? '' : jade_interp)) + \"\");\n}\nelse\n{\nbuf.push(\"\" + (jade.escape((jade_interp = file.get('name')) == null ? '' : jade_interp)) + \"\");\n}\nbuf.push(\"\");\nif ( file.has('size'))\n{\nbuf.push(\"
      (\" + (jade.escape((jade_interp = girder.formatSize(file.get('size'))) == null ? '' : jade_interp)) + \")
      \");\n}\nbuf.push(\"\");\nif ( parentItem && parentItem.get('_accessLevel') >= girder.AccessType.WRITE)\n{\nbuf.push(\"\");\n}\nbuf.push(\"
    • \");\n }\n\n } else {\n var $$l = 0;\n for (var $index in $$obj) {\n $$l++; var file = $$obj[$index];\n\nbuf.push(\"
    • \");\nif ( (file.get('linkUrl')))\n{\nbuf.push(\"\" + (jade.escape((jade_interp = file.get('name')) == null ? '' : jade_interp)) + \"\");\n}\nelse\n{\nbuf.push(\"\" + (jade.escape((jade_interp = file.get('name')) == null ? '' : jade_interp)) + \"\");\n}\nbuf.push(\"\");\nif ( file.has('size'))\n{\nbuf.push(\"
      (\" + (jade.escape((jade_interp = girder.formatSize(file.get('size'))) == null ? '' : jade_interp)) + \")
      \");\n}\nbuf.push(\"\");\nif ( parentItem && parentItem.get('_accessLevel') >= girder.AccessType.WRITE)\n{\nbuf.push(\"\");\n}\nbuf.push(\"
    • \");\n }\n\n }\n}).call(this);\n\nif ( (hasMore))\n{\nbuf.push(\"
    • Show more files...
    • \");\n}\nbuf.push(\"
    \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"folderInfoDialog\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),girder = locals_.girder,folder = locals_.folder;\njade_mixins[\"dateInfo\"] = function(intro, property){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nbuf.push(\"\" + (jade.escape(null == (jade_interp = intro) ? \"\" : jade_interp)) + \"\" + (jade.escape(null == (jade_interp = girder.formatDate(folder.get(property), girder.DATE_SECOND)) ? \"\" : jade_interp)) + \"\");\n};\nbuf.push(\"

    Folder information

    \" + (jade.escape(null == (jade_interp = folder.name()) ? \"\" : jade_interp)) + \"
    \");\nif ( folder.get('description'))\n{\nbuf.push(\"
    \" + (null == (jade_interp = girder.renderMarkdown(folder.get('description'))) ? \"\" : jade_interp) + \"
    \");\n}\nbuf.push(\"
    \");\njade_mixins[\"dateInfo\"]('Created ', 'created');\nif ( folder.get('created') !== folder.get('updated'))\n{\njade_mixins[\"dateInfo\"]('Last updated ', 'updated');\n}\nbuf.push(\"
    Contains \" + (jade.escape((jade_interp = folder.get('nItems')) == null ? '' : jade_interp)) + \" items totaling \" + (jade.escape((jade_interp = girder.formatSize(folder.get('size'))) == null ? '' : jade_interp)) + \"
    Contains \" + (jade.escape((jade_interp = folder.get('nFolders')) == null ? '' : jade_interp)) + \" subfolders
    Unique ID: \" + (jade.escape((jade_interp = folder.id) == null ? '' : jade_interp)) + \"
    \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"folderList\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),folders = locals_.folders,checkboxes = locals_.checkboxes,hasMore = locals_.hasMore;\nbuf.push(\"
      \");\n// iterate folders\n;(function(){\n var $$obj = folders;\n if ('number' == typeof $$obj.length) {\n\n for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {\n var folder = $$obj[$index];\n\nbuf.push(\"
    • \");\nif ( checkboxes)\n{\nbuf.push(\"\");\n}\nbuf.push(\"\" + (jade.escape((jade_interp = folder.get('name')) == null ? '' : jade_interp)) + \"
      \");\nif ( folder.get('public'))\n{\nbuf.push(\"Public\");\n}\nelse\n{\nbuf.push(\"Private\");\n}\nbuf.push(\"
    • \");\n }\n\n } else {\n var $$l = 0;\n for (var $index in $$obj) {\n $$l++; var folder = $$obj[$index];\n\nbuf.push(\"
    • \");\nif ( checkboxes)\n{\nbuf.push(\"\");\n}\nbuf.push(\"\" + (jade.escape((jade_interp = folder.get('name')) == null ? '' : jade_interp)) + \"
      \");\nif ( folder.get('public'))\n{\nbuf.push(\"Public\");\n}\nelse\n{\nbuf.push(\"Private\");\n}\nbuf.push(\"
    • \");\n }\n\n }\n}).call(this);\n\nif ( (hasMore))\n{\nbuf.push(\"
    • Show more folders...
    • \");\n}\nbuf.push(\"
    \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"groupAdminList\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),admins = locals_.admins,level = locals_.level,accessType = locals_.accessType;\nbuf.push(\"
    Administrators
    \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"groupInviteDialog\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),user = locals_.user,mayAdd = locals_.mayAdd,level = locals_.level,accessType = locals_.accessType;\nbuf.push(\"

    Invite user to group

    \" + (jade.escape((jade_interp = user.text) == null ? '' : jade_interp)) + \"

    Group members are able to gain all privileges granted to\\nthe group itself on other resources. They are able to view the\\ngroup, but may not change properties of the group.

    Invite as member
    \");\nif ( mayAdd)\n{\nbuf.push(\"
    Add as member
    \");\n}\nbuf.push(\"
    \");\nif ( (level >= accessType.ADMIN))\n{\nbuf.push(\"

    Group moderators are members of the group who are also\\ngranted the power to add and remove users from the group.

    Invite as moderator
    \");\nif ( mayAdd)\n{\nbuf.push(\"
    Add as moderator
    \");\n}\nbuf.push(\"
    \");\n}\nif ( (level >= accessType.ADMIN))\n{\nbuf.push(\"

    Group administrators have all the power of group moderators,\\nand additionally can promote group members to moderators\\nor administrators. They also have the power to delete the\\ngroup entirely.

    Invite as administrator
    \");\nif ( mayAdd)\n{\nbuf.push(\"
    Add as administrator
    \");\n}\nbuf.push(\"
    \");\n}\nbuf.push(\"
    \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"groupInviteList\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),invitees = locals_.invitees,level = locals_.level,accessType = locals_.accessType;\nbuf.push(\"\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"groupMemberList\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),level = locals_.level,accessType = locals_.accessType,members = locals_.members;\nbuf.push(\"
    Members\");\nif ( level >= accessType.WRITE)\n{\nbuf.push(\"
    \");\n}\nbuf.push(\"
    \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"groupModList\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),moderators = locals_.moderators,level = locals_.level,accessType = locals_.accessType;\nbuf.push(\"
    Moderators
    \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"hierarchyBreadcrumb\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),links = locals_.links,current = locals_.current,descriptionText = locals_.descriptionText;\nvar idx = 0\n// iterate links\n;(function(){\n var $$obj = links;\n if ('number' == typeof $$obj.length) {\n\n for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {\n var obj = $$obj[$index];\n\nbuf.push(\"
  • \");\nif ( obj.resourceName === 'user')\n{\nbuf.push(\"\");\n}\nelse if ( obj.resourceName === 'collection')\n{\nbuf.push(\"\");\n}\nbuf.push((jade.escape(null == (jade_interp = obj.name()) ? \"\" : jade_interp)) + \"
  • \");\nidx += 1\n }\n\n } else {\n var $$l = 0;\n for (var $index in $$obj) {\n $$l++; var obj = $$obj[$index];\n\nbuf.push(\"
  • \");\nif ( obj.resourceName === 'user')\n{\nbuf.push(\"\");\n}\nelse if ( obj.resourceName === 'collection')\n{\nbuf.push(\"\");\n}\nbuf.push((jade.escape(null == (jade_interp = obj.name()) ? \"\" : jade_interp)) + \"
  • \");\nidx += 1\n }\n\n }\n}).call(this);\n\nif ( current)\n{\nbuf.push(\"
  • \");\nif ( current.resourceName === 'user')\n{\nbuf.push(\"\");\n}\nelse if ( current.resourceName === 'collection')\n{\nbuf.push(\"\");\n}\nbuf.push((jade.escape(null == (jade_interp = current.name()) ? \"\" : jade_interp)) + \"
  • \");\n}\nif ( descriptionText)\n{\nbuf.push(\"\" + (jade.escape(null == (jade_interp = descriptionText) ? \"\" : jade_interp)) + \"\");\n}\nbuf.push(\"
    \");\nif ( idx > 0)\n{\nbuf.push(\"
    \");\n}\nbuf.push(\"
    \");\nif ( idx > 0)\n{\nbuf.push(\"
    \");\n}\nbuf.push(\"
    \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"hierarchyWidget\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),showActions = locals_.showActions,checkboxes = locals_.checkboxes,type = locals_.type,level = locals_.level,AccessType = locals_.AccessType,girder = locals_.girder,model = locals_.model;\nbuf.push(\"
      \");\nif ( showActions)\n{\nbuf.push(\"
      \");\nif ( checkboxes)\n{\nbuf.push(\"
        \");\n}\nbuf.push(\"
        \");\nif ( (type === 'folder'))\n{\nbuf.push(\"\");\nif ( (level >= AccessType.WRITE))\n{\nbuf.push(\"\");\n}\nif ( (level >= AccessType.ADMIN))\n{\nbuf.push(\"\");\n}\n}\nelse if ( (type === 'collection'))\n{\nbuf.push(\"\");\nif ( (level >= AccessType.ADMIN))\n{\nbuf.push(\"\");\n}\n}\nbuf.push(\"
        \");\n}\nbuf.push(\"
        This folder is empty.
        \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"itemBreadcrumb\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),parentChain = locals_.parentChain;\nbuf.push(\"
          \");\n// iterate parentChain\n;(function(){\n var $$obj = parentChain;\n if ('number' == typeof $$obj.length) {\n\n for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {\n var parent = $$obj[$index];\n\nbuf.push(\"
        1. \");\nif ( (parent.type === \"user\"))\n{\nbuf.push(\"\" + (jade.escape((jade_interp = parent.object.login) == null ? '' : jade_interp)) + \"\");\n}\nelse if ( (parent.type === \"collection\"))\n{\nbuf.push(\"\" + (jade.escape((jade_interp = parent.object.name) == null ? '' : jade_interp)) + \"\");\n}\nelse\n{\nbuf.push(\"\" + (jade.escape((jade_interp = parent.object.name) == null ? '' : jade_interp)) + \"\");\n}\nbuf.push(\"
        2. \");\n }\n\n } else {\n var $$l = 0;\n for (var $index in $$obj) {\n $$l++; var parent = $$obj[$index];\n\nbuf.push(\"
        3. \");\nif ( (parent.type === \"user\"))\n{\nbuf.push(\"\" + (jade.escape((jade_interp = parent.object.login) == null ? '' : jade_interp)) + \"\");\n}\nelse if ( (parent.type === \"collection\"))\n{\nbuf.push(\"\" + (jade.escape((jade_interp = parent.object.name) == null ? '' : jade_interp)) + \"\");\n}\nelse\n{\nbuf.push(\"\" + (jade.escape((jade_interp = parent.object.name) == null ? '' : jade_interp)) + \"\");\n}\nbuf.push(\"
        4. \");\n }\n\n }\n}).call(this);\n\nbuf.push(\"
        \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"itemList\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),items = locals_.items,checkboxes = locals_.checkboxes,girder = locals_.girder,hasMore = locals_.hasMore;\nbuf.push(\"
          \");\n// iterate items\n;(function(){\n var $$obj = items;\n if ('number' == typeof $$obj.length) {\n\n for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {\n var item = $$obj[$index];\n\nbuf.push(\"
        • \");\nif ( checkboxes)\n{\nbuf.push(\"\");\n}\nbuf.push(\"\" + (jade.escape((jade_interp = item.get('name')) == null ? '' : jade_interp)) + \"
          \" + (jade.escape((jade_interp = girder.formatSize(item.get('size'))) == null ? '' : jade_interp)) + \"
        • \");\n }\n\n } else {\n var $$l = 0;\n for (var $index in $$obj) {\n $$l++; var item = $$obj[$index];\n\nbuf.push(\"
        • \");\nif ( checkboxes)\n{\nbuf.push(\"\");\n}\nbuf.push(\"\" + (jade.escape((jade_interp = item.get('name')) == null ? '' : jade_interp)) + \"
          \" + (jade.escape((jade_interp = girder.formatSize(item.get('size'))) == null ? '' : jade_interp)) + \"
        • \");\n }\n\n }\n}).call(this);\n\nif ( (hasMore))\n{\nbuf.push(\"
        • Show more items...
        • \");\n}\nbuf.push(\"
        \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"jsonMetadatumEditWidget\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),key = locals_.key,newDatum = locals_.newDatum;\nbuf.push(\"
        \");\nif ( !newDatum)\n{\nbuf.push(\"\");\n};return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"jsonMetadatumView\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),accessLevel = locals_.accessLevel,girder = locals_.girder,key = locals_.key,value = locals_.value;\nif ( (accessLevel >= girder.AccessType.WRITE))\n{\nbuf.push(\"\");\n}\nbuf.push(\"\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"loadingAnimation\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\n\nbuf.push(\"
        \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"markdownWidget\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),prefix = locals_.prefix,enableUploads = locals_.enableUploads,placeholder = locals_.placeholder,text = locals_.text;\nbuf.push(\"
        \" + (jade.escape(null == (jade_interp = text) ? \"\" : jade_interp)) + \"\");\nif ( enableUploads)\n{\nbuf.push(\"
        Starting upload...
        Add an image by clicking here, or drag\\nand drop one into the editor.
        \");\n}\nbuf.push(\"
        \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"metadataWidget\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),accessLevel = locals_.accessLevel,girder = locals_.girder,title = locals_.title;\nif ( (accessLevel >= girder.AccessType.WRITE))\n{\nbuf.push(\"\");\n}\nbuf.push(\"\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"metadatumEditWidget\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),key = locals_.key,value = locals_.value,newDatum = locals_.newDatum;\nbuf.push(\"\");\nvar rows = value.length <= 40 ? 1 : (value.length <= 100 ? 3 : 5)\nbuf.push(\"\");\nif ( !newDatum)\n{\nbuf.push(\"\");\n};return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"metadatumView\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),accessLevel = locals_.accessLevel,girder = locals_.girder,key = locals_.key,value = locals_.value;\nif ( (accessLevel >= girder.AccessType.WRITE))\n{\nbuf.push(\"\");\n}\nbuf.push(\"\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"newAssetstore\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\n\nbuf.push(\"

        This type of assetstore will store files in a directory on the\\nlocal filesystem, using content-addressed storage to ensure that\\ndata is never duplicated on disk. Just specify the root directory\\nthat files will be stored under.

        If the specified root directory does not already exist, the server\\nwill attempt to create it.

        This type of assetstore uses\\nMongoDB's GridFS\\nstorage engine. The files should be stored in a separate database\\nfrom the rest of the server's information to avoid locking issues.

        This type of assetstore keeps files in\\nan Amazon S3\\nbucket. The service defaults to s3.amazonaws.com. You can specify an\\nalternate service, including an optional protocol and port using the\\nform [http[s]://](service domain)[:(port)].

        \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"paginateWidget\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),collection = locals_.collection;\nbuf.push(\"\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"pluginConfigBreadcrumb\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),pluginName = locals_.pluginName;\nbuf.push(\"
        1. Admin console
        2. Plugins
        3. \" + (jade.escape((jade_interp = pluginName) == null ? '' : jade_interp)) + \"
        \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"searchField\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),placeholder = locals_.placeholder,modes = locals_.modes;\nbuf.push(\"
        1 ? \"on\" : \"off\"), true, false)) + \" class=\\\"g-search-field form-control input-sm\\\"/>
          \");\nif ( modes.length > 1)\n{\nbuf.push(\"\");\n}\nbuf.push(\"
          \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"searchHelp\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),mode = locals_.mode;\nif ( mode === 'prefix')\n{\nbuf.push(\"
          You are searching by prefix. Start typing the first letters of whatever you\\nare searching for.
          \");\n}\nelse if ( mode === 'text')\n{\nbuf.push(\"

          By default, search results will be returned if they contain any of the terms\\nof the search. If you wish to search for documents containing all of the\\nterms, place them in quotes. Examples:\\n

          • cat dog returns documents containing either \\\"cat\\\" or \\\"dog\\\".
          • \\\"cat\\\" \\\"dog\\\" returns documents containing both \\\"cat\\\" and \\\"dog\\\".
          • \\\"cat dog\\\" returns documents containing the phrase \\\"cat dog\\\".
          \");\n};return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"searchModeSelect\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),modes = locals_.modes,currentMode = locals_.currentMode,undefined = locals_.undefined;\nbuf.push(\"

          Choose search mode:

          \");\n// iterate modes\n;(function(){\n var $$obj = modes;\n if ('number' == typeof $$obj.length) {\n\n for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {\n var mode = $$obj[$index];\n\nbuf.push(\"
          \");\n }\n\n } else {\n var $$l = 0;\n for (var $index in $$obj) {\n $$l++; var mode = $$obj[$index];\n\nbuf.push(\"
          \");\n }\n\n }\n}).call(this);\n;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"searchResults\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),results = locals_.results;\n// iterate results\n;(function(){\n var $$obj = results;\n if ('number' == typeof $$obj.length) {\n\n for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {\n var result = $$obj[$index];\n\nbuf.push(\"
        • \" + (jade.escape((jade_interp = result.text) == null ? '' : jade_interp)) + \"
        • \");\n }\n\n } else {\n var $$l = 0;\n for (var $index in $$obj) {\n $$l++; var result = $$obj[$index];\n\nbuf.push(\"
        • \" + (jade.escape((jade_interp = result.text) == null ? '' : jade_interp)) + \"
        • \");\n }\n\n }\n}).call(this);\n\nif ( results.length === 0)\n{\nbuf.push(\"
        • No results found
        • \");\n};return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"taskProgress\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),progressClass = locals_.progressClass,width = locals_.width,barClass = locals_.barClass,percentText = locals_.percentText,timeLeftText = locals_.timeLeftText,progress = locals_.progress;\nbuf.push(\"
          \" + (jade.escape((jade_interp = percentText) == null ? '' : jade_interp)) + \"
          \" + (jade.escape((jade_interp = timeLeftText) == null ? '' : jade_interp)) + \"
          \" + (jade.escape(null == (jade_interp = progress.data.title) ? \"\" : jade_interp)) + \"
          \" + (jade.escape(null == (jade_interp = progress.data.message) ? \"\" : jade_interp)) + \"
          \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"timeline\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),segments = locals_.segments,points = locals_.points,startLabel = locals_.startLabel,undefined = locals_.undefined,endLabel = locals_.endLabel;\nbuf.push(\"
          \");\n// iterate segments\n;(function(){\n var $$obj = segments;\n if ('number' == typeof $$obj.length) {\n\n for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {\n var segment = $$obj[$index];\n\nbuf.push(\"
          \");\n }\n\n } else {\n var $$l = 0;\n for (var $index in $$obj) {\n $$l++; var segment = $$obj[$index];\n\nbuf.push(\"
          \");\n }\n\n }\n}).call(this);\n\n// iterate points\n;(function(){\n var $$obj = points;\n if ('number' == typeof $$obj.length) {\n\n for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {\n var point = $$obj[$index];\n\nbuf.push(\"\");\n }\n\n } else {\n var $$l = 0;\n for (var $index in $$obj) {\n $$l++; var point = $$obj[$index];\n\nbuf.push(\"\");\n }\n\n }\n}).call(this);\n\nbuf.push(\"\");\nif ( startLabel !== undefined || endLabel !== undefined)\n{\nbuf.push(\"
          \");\nif ( startLabel !== undefined)\n{\nbuf.push(\"
          \" + (jade.escape(null == (jade_interp = startLabel) ? \"\" : jade_interp)) + \"
          \");\n}\nif ( endLabel !== undefined)\n{\nbuf.push(\"
          \" + (jade.escape(null == (jade_interp = endLabel) ? \"\" : jade_interp)) + \"
          \");\n}\nbuf.push(\"
          \");\n}\nbuf.push(\"\");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"uploadWidget\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),parent = locals_.parent,parentType = locals_.parentType,title = locals_.title;\njade_mixins[\"g-upload-widget-subtitle\"] = function(){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nif ( parent && parentType)\n{\nbuf.push(\"
          \");\nif ( (parentType === 'folder'))\n{\nbuf.push(\"\");\n}\nelse if ( (parentType === 'item'))\n{\nbuf.push(\"\");\n}\nelse if ( (parentType === 'file'))\n{\nbuf.push(\"\");\n}\nbuf.push(\"\" + (jade.escape((jade_interp = parent.name()) == null ? '' : jade_interp)) + \"
          \");\n}\n};\njade_mixins[\"g-upload-widget-browse-or-drop\"] = function(){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nbuf.push(\"
          \");\nif ( (parentType === 'file'))\n{\nbuf.push(\" Browse or drop a file here\");\n}\nelse\n{\nbuf.push(\" Browse or drop files here\");\n}\nbuf.push(\"
          \");\nif ( (parentType === 'file'))\n{\nbuf.push(\"\");\n}\nelse\n{\nbuf.push(\"\");\n}\nbuf.push(\"
          \");\n};\njade_mixins[\"g-upload-widget-progress\"] = function(){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nbuf.push(\"
          No files selected
          \");\n};\njade_mixins[\"g-upload-widget-start-button\"] = function(){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nbuf.push(\"\");\n};\nbuf.push(\"

          \" + (jade.escape(null == (jade_interp = title) ? \"\" : jade_interp)) + \"

          \");\njade_mixins[\"g-upload-widget-subtitle\"]();\nbuf.push(\"
          \");\njade_mixins[\"g-upload-widget-browse-or-drop\"]();\njade_mixins[\"g-upload-widget-progress\"]();\nbuf.push(\"
          Close\");\njade_mixins[\"g-upload-widget-start-button\"]();\nbuf.push(\"
          \");;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"uploadWidgetMixins\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n;return buf.join(\"\");\n};\n\nthis[\"girder\"][\"templates\"][\"uploadWidgetNonModal\"] = function template(locals) {\nvar buf = [];\nvar jade_mixins = {};\nvar jade_interp;\nvar locals_ = (locals || {}),parent = locals_.parent,parentType = locals_.parentType,title = locals_.title;\njade_mixins[\"g-upload-widget-subtitle\"] = function(){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nif ( parent && parentType)\n{\nbuf.push(\"
          \");\nif ( (parentType === 'folder'))\n{\nbuf.push(\"\");\n}\nelse if ( (parentType === 'item'))\n{\nbuf.push(\"\");\n}\nelse if ( (parentType === 'file'))\n{\nbuf.push(\"\");\n}\nbuf.push(\"\" + (jade.escape((jade_interp = parent.name()) == null ? '' : jade_interp)) + \"
          \");\n}\n};\njade_mixins[\"g-upload-widget-browse-or-drop\"] = function(){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nbuf.push(\"
          \");\nif ( (parentType === 'file'))\n{\nbuf.push(\" Browse or drop a file here\");\n}\nelse\n{\nbuf.push(\" Browse or drop files here\");\n}\nbuf.push(\"
          \");\nif ( (parentType === 'file'))\n{\nbuf.push(\"\");\n}\nelse\n{\nbuf.push(\"\");\n}\nbuf.push(\"
          \");\n};\njade_mixins[\"g-upload-widget-progress\"] = function(){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nbuf.push(\"
          No files selected
          \");\n};\njade_mixins[\"g-upload-widget-start-button\"] = function(){\nvar block = (this && this.block), attributes = (this && this.attributes) || {};\nbuf.push(\"\");\n};\nbuf.push(\"
          \");\nif ( title)\n{\nbuf.push(\"

          \" + (jade.escape(null == (jade_interp = title) ? \"\" : jade_interp)) + \"

          \");\n}\njade_mixins[\"g-upload-widget-subtitle\"]();\njade_mixins[\"g-upload-widget-browse-or-drop\"]();\njade_mixins[\"g-upload-widget-progress\"]();\nbuf.push(\"
          \");\njade_mixins[\"g-upload-widget-start-button\"]();\nbuf.push(\"
          \");;return buf.join(\"\");\n};","/*global girder:true*/\n/*global console:true*/\n\n'use strict';\n\n/*\n * Initialize global girder object\n */\nvar girder = girder || {};\n\n/*\n * Some cross-browser globals\n */\nif (!window.console) {\n var console = {\n log: $.noop,\n error: $.noop\n };\n}\n\n_.extend(girder, {\n models: {},\n collections: {},\n views: {},\n apiRoot: $('#g-global-info-apiroot').text().replace(\n '%HOST%', window.location.origin),\n staticRoot: $('#g-global-info-staticroot').text().replace(\n '%HOST%', window.location.origin),\n currentUser: null,\n currentToken: null,\n events: _.clone(Backbone.Events),\n uploadHandlers: {},\n corsAuth: girder.corsAuth || false,\n\n /**\n * Constants and enums:\n */\n UPLOAD_CHUNK_SIZE: 1024 * 1024 * 64, // 64MB\n SORT_ASC: 1,\n SORT_DESC: -1,\n MONTHS: [\n 'January', 'February', 'March', 'April', 'May', 'June', 'July',\n 'August', 'September', 'October', 'November', 'December'\n ],\n AccessType: {\n NONE: -1,\n READ: 0,\n WRITE: 1,\n ADMIN: 2\n },\n AssetstoreType: {\n FILESYSTEM: 0,\n GRIDFS: 1,\n S3: 2\n },\n Layout: {\n DEFAULT: 'default',\n EMPTY: 'empty'\n },\n layout: 'default',\n\n /**\n * Make a request to the REST API. Bind a \"done\" handler to the return\n * value that will be called when the response is successful. To bind a\n * custom error handler, bind an \"error\" handler to the return promise,\n * which will be executed in addition to the normal behavior of logging\n * the error to the console. To override the default error handling\n * behavior, pass an \"error\" key in your opts object; this should be done\n * any time the server might throw an exception from validating user input,\n * e.g. logging in, registering, or generally filling out forms.\n *\n * @param path The resource path, e.g. \"user/login\"\n * @param data The form parameter object.\n * @param [type='GET'] The HTTP method to invoke.\n * @param [girderToken] An alternative auth token to use for this request.\n */\n restRequest: function (opts) {\n opts = opts || {};\n var defaults = {\n dataType: 'json',\n type: 'GET',\n\n error: function (error, status) {\n var info;\n if (error.status === 401) {\n girder.events.trigger('g:loginUi');\n info = {\n text: 'You must log in to view this resource',\n type: 'warning',\n timeout: 4000,\n icon: 'info'\n };\n } else if (error.status === 403) {\n info = {\n text: 'Access denied. See the console for more details.',\n type: 'danger',\n timeout: 5000,\n icon: 'attention'\n };\n } else if (error.status === 0 && error.statusText === 'abort') {\n /* We expected this abort, so do nothing. */\n return;\n } else if (error.status === 500 && error.responseJSON &&\n error.responseJSON.type === 'girder') {\n info = {\n text: error.responseJSON.message,\n type: 'warning',\n timeout: 5000,\n icon: 'info'\n };\n } else if (status === 'parsererror') {\n info = {\n text: 'A parser error occurred while communicating with the ' +\n 'server (did you use the correct value for `dataType`?). ' +\n 'Details have been logged in the console.',\n type: 'danger',\n timeout: 5000,\n icon: 'attention'\n };\n } else {\n info = {\n text: 'An error occurred while communicating with the ' +\n 'server. Details have been logged in the console.',\n type: 'danger',\n timeout: 5000,\n icon: 'attention'\n };\n }\n girder.events.trigger('g:alert', info);\n console.error(error.status + ' ' + error.statusText, error.responseText);\n girder.lastError = error;\n }\n };\n\n if (opts.path.substring(0, 1) !== '/') {\n opts.path = '/' + opts.path;\n }\n opts.url = girder.apiRoot + opts.path;\n\n opts = _.extend(defaults, opts);\n\n var token = opts.girderToken ||\n girder.currentToken ||\n girder.cookie.find('girderToken');\n if (token) {\n opts.headers = opts.headers || {};\n opts.headers['Girder-Token'] = token;\n }\n return Backbone.ajax(opts);\n },\n\n /**\n * Log in to the server. If successful, sets the value of girder.currentUser\n * and girder.currentToken and triggers the \"g:login\" and \"g:login.success\".\n * On failure, triggers the \"g:login.error\" event.\n *\n * @param username The username or email to login as.\n * @param password The password to use.\n * @param cors If the girder server is on a different origin, set this\n * to \"true\" to save the auth cookie on the current domain. Alternatively,\n * you may set the global option \"girder.corsAuth = true\".\n */\n login: function (username, password, cors) {\n var auth = 'Basic ' + window.btoa(username + ':' + password);\n if (cors === undefined) {\n cors = girder.corsAuth;\n }\n\n return girder.restRequest({\n method: 'GET',\n path: '/user/authentication',\n headers: {\n 'Girder-Authorization': auth\n },\n error: null\n }).then(function (response) {\n response.user.token = response.authToken;\n\n girder.currentUser = new girder.models.UserModel(response.user);\n girder.currentToken = response.user.token.token;\n\n if (cors && !girder.cookie.find('girderToken')) {\n // For cross-origin requests, we should write the token into\n // this document's cookie also.\n document.cookie = 'girderToken=' + girder.currentToken;\n }\n\n girder.events.trigger('g:login.success', response.user);\n girder.events.trigger('g:login', response);\n\n return response.user;\n }, function (jqxhr) {\n girder.events.trigger('g:login.error', jqxhr.status, jqxhr);\n return jqxhr;\n });\n },\n\n logout: function () {\n return girder.restRequest({\n method: 'DELETE',\n path: '/user/authentication'\n }).then(function () {\n girder.currentUser = null;\n girder.currentToken = null;\n\n girder.events.trigger('g:login', null);\n girder.events.trigger('g:logout.success');\n }, function (jqxhr) {\n girder.events.trigger('g:logout.error', jqxhr.status, jqxhr);\n });\n },\n\n fetchCurrentUser: function () {\n return girder.restRequest({\n method: 'GET',\n path: '/user/me'\n });\n }\n});\n\n/**\n * The old \"jade.templates\" namespace is deprecated as of version 1.1, but is\n * retained here for backward compatibility. It will be removed in version 2.0.\n */\n/* jshint -W079 */\nvar jade = jade || {};\njade.templates = girder.templates;\n","/*eslint-disable */\ngirder.versionInfo = \n{\n \"git\": false,\n \"date\": \"2016-06-10T13:50:16\",\n \"apiVersion\": \"1.5.2\"\n}\n;\n/*eslint-enable */\n","girder.View = Backbone.View.extend({\n constructor: function (opts) { // eslint-disable-line backbone/no-constructor\n if (opts && _.has(opts, 'parentView')) {\n if (opts.parentView) {\n opts.parentView.registerChildView(this);\n this.parentView = opts.parentView;\n }\n } else {\n console.error('View created with no parentView property set. ' +\n 'This view may not be garbage collected.');\n }\n Backbone.View.prototype.constructor.apply(this, arguments);\n },\n\n /**\n * Remove a view, unbinding its events and removing its listeners on\n * girder.events so that it can be garbage collected.\n */\n destroy: function () {\n _.each(this._childViews, function (child) {\n child.destroy();\n });\n this._childViews = null;\n\n this.undelegateEvents();\n this.stopListening();\n this.off();\n girder.events.off(null, null, this);\n girder.eventStream.off(null, null, this);\n\n if (this.parentView) {\n this.parentView.unregisterChildView(this);\n }\n\n // Modal views need special cleanup.\n if (this.$el.is('.modal')) {\n var el = this.$el;\n if (el.data('bs.modal') && el.data('bs.modal').isShown) {\n el.on('hidden.bs.modal', function () {\n el.empty().off().removeData();\n }).modal('hide');\n el.modal('removeBackdrop');\n } else {\n el.modal('hideModal');\n el.modal('removeBackdrop');\n el.empty().off().removeData();\n }\n } else {\n this.$el.empty().off().removeData();\n }\n },\n\n /**\n * It's typically not necessary to call this directly. Instead, instantiate\n * child views with the \"parentView\" field.\n */\n registerChildView: function (child) {\n this._childViews = this._childViews || [];\n this._childViews.push(child);\n },\n\n /**\n * Typically, you will not need to call this method directly. Calling\n * destroy on a child element will automatically unregister it from its\n * parent view if the parent view was specified.\n */\n unregisterChildView: function (child) {\n this._childViews = _.without(this._childViews, child);\n }\n});\n","girder.App = girder.View.extend({\n initialize: function () {\n girder.fetchCurrentUser()\n .done(_.bind(function (user) {\n girder.eventStream = new girder.EventStream({\n timeout: girder.sseTimeout || null\n });\n\n this.headerView = new girder.views.LayoutHeaderView({\n parentView: this\n });\n\n this.globalNavView = new girder.views.LayoutGlobalNavView({\n parentView: this\n });\n\n this.footerView = new girder.views.LayoutFooterView({\n parentView: this\n });\n\n this.progressListView = new girder.views.ProgressListView({\n eventStream: girder.eventStream,\n parentView: this\n });\n\n if (user) {\n girder.currentUser = new girder.models.UserModel(user);\n girder.eventStream.open();\n }\n\n this.layoutRenderMap = {};\n this.layoutRenderMap[girder.Layout.DEFAULT] = this._defaultLayout;\n this.layoutRenderMap[girder.Layout.EMPTY] = this._emptyLayout;\n this.render();\n\n // Once we've rendered the layout, we can start up the routing.\n Backbone.history.start({\n pushState: false\n });\n }, this));\n\n girder.events.on('g:navigateTo', this.navigateTo, this);\n girder.events.on('g:loginUi', this.loginDialog, this);\n girder.events.on('g:registerUi', this.registerDialog, this);\n girder.events.on('g:resetPasswordUi', this.resetPasswordDialog, this);\n girder.events.on('g:alert', this.alert, this);\n girder.events.on('g:login', this.login, this);\n },\n\n _defaultLayout: {\n show: function () {\n this.$('#g-app-header-container,#g-global-nav-container,#g-app-footer-container').show();\n this.$('#g-app-body-container').addClass('g-default-layout');\n },\n\n hide: function () {\n this.$('#g-app-header-container,#g-global-nav-container,#g-app-footer-container').hide();\n this.$('#g-app-body-container').removeClass('g-default-layout');\n }\n },\n\n _emptyLayout: {\n show: function () {\n this.$('#g-app-body-container').addClass('g-empty-layout');\n },\n\n hide: function () {\n this.$('#g-app-body-container').removeClass('g-empty-layout');\n }\n },\n\n render: function () {\n this.$el.html(girder.templates.layout());\n\n this.globalNavView.setElement(this.$('#g-global-nav-container')).render();\n this.headerView.setElement(this.$('#g-app-header-container')).render();\n this.footerView.setElement(this.$('#g-app-footer-container')).render();\n this.progressListView.setElement(this.$('#g-app-progress-container')).render();\n\n return this;\n },\n\n /**\n * Changes the current body view to the view class specified by view.\n * @param view The view to display in the body.\n * @param [settings={}] Settings to pass to the view initialize() method.\n * @param opts Additional options for navigateTo, if any.\n */\n navigateTo: function (view, settings, opts) {\n this.globalNavView.deactivateAll();\n\n settings = settings || {};\n opts = opts || {};\n\n if (opts.layout) {\n if (girder.layout !== opts.layout) {\n if (_.has(this.layoutRenderMap, opts.layout)) {\n // set a layout if opts specifies one different from current\n this.layoutRenderMap[girder.layout].hide.call(this, opts);\n girder.layout = opts.layout;\n this.layoutRenderMap[girder.layout].show.call(this, opts);\n } else {\n console.error('Attempting to set unknown layout type: ' + opts.layout);\n }\n }\n } else if (girder.layout !== girder.Layout.DEFAULT) {\n // reset to default as needed when nothing specified in opts\n this.layoutRenderMap[girder.layout].hide.call(this, opts);\n girder.layout = girder.Layout.DEFAULT;\n this.layoutRenderMap[girder.layout].show.call(this, opts);\n }\n\n if (view) {\n if (this.bodyView) {\n this.bodyView.destroy();\n }\n\n settings = _.extend(settings, {\n el: this.$('#g-app-body-container'),\n parentView: this\n });\n\n /* We let the view be created in this way even though it is\n * normally against convention.\n */\n this.bodyView = new view(settings); // eslint-disable-line new-cap\n } else {\n console.error('Undefined page.');\n }\n return this;\n },\n\n /**\n * Close any open dialog if we are already logged in.\n * :returns: true if we have a current user.\n */\n closeDialogIfUser: function () {\n if (girder.currentUser) {\n $('.modal').girderModal('close');\n return true;\n }\n return false;\n },\n\n /**\n * Show a dialog allowing a user to login or register.\n */\n loginDialog: function () {\n if (this.closeDialogIfUser()) {\n return;\n }\n if (!this.loginView) {\n this.loginView = new girder.views.LoginView({\n el: this.$('#g-dialog-container'),\n parentView: this\n });\n }\n this.loginView.render();\n },\n\n registerDialog: function () {\n if (this.closeDialogIfUser()) {\n return;\n }\n if (!this.registerView) {\n this.registerView = new girder.views.RegisterView({\n el: this.$('#g-dialog-container'),\n parentView: this\n });\n }\n this.registerView.render();\n },\n\n resetPasswordDialog: function () {\n if (this.closeDialogIfUser()) {\n return;\n }\n if (!this.resetPasswordView) {\n this.resetPasswordView = new girder.views.ResetPasswordView({\n el: this.$('#g-dialog-container'),\n parentView: this\n });\n }\n this.resetPasswordView.render();\n },\n\n /**\n * Display a brief alert on the screen with the following options:\n * - text: The text to be displayed\n * - [type]: The alert class ('info', 'warning', 'success', 'danger').\n * Default is 'info'.\n * - [icon]: An optional icon to display in the alert.\n * - [timeout]: How long before the alert should automatically disappear.\n * Default is 6000ms. Set to <= 0 to have no timeout.\n */\n alert: function (options) {\n var el = $(girder.templates.alert({\n text: options.text,\n type: options.type || 'info',\n icon: options.icon\n }));\n $('#g-alerts-container').append(el);\n el.fadeIn(500);\n\n if (options.timeout === undefined) {\n options.timeout = 6000;\n }\n if (options.timeout > 0) {\n window.setTimeout(function () {\n el.fadeOut(750, function () {\n $(this).remove();\n });\n }, options.timeout);\n }\n },\n\n /**\n * On login we re-render the current body view; whereas on\n * logout, we redirect to the front page.\n */\n login: function () {\n var route = girder.dialogs.splitRoute(Backbone.history.fragment).base;\n Backbone.history.fragment = null;\n girder.eventStream.close();\n\n if (girder.currentUser) {\n girder.eventStream.open();\n girder.router.navigate(route, {trigger: true});\n } else {\n girder.router.navigate('/', {trigger: true});\n }\n }\n});\n","girder.Router = Backbone.Router.extend({\n initialize: function () {\n this._enabled = true;\n },\n\n execute: function (callback, args) {\n args.push(girder.parseQueryString(args.pop()));\n var queryString = args[args.length - 1];\n if (callback) {\n callback.apply(this, args);\n }\n\n // handle \"top level\" dialogs\n if (queryString.dialog === 'login') {\n girder.events.trigger('g:loginUi');\n } else if (queryString.dialog === 'register') {\n girder.events.trigger('g:registerUi');\n } else if (queryString.dialog === 'resetpassword') {\n girder.events.trigger('g:resetPasswordUi');\n }\n },\n\n /**\n * Set or get the enabled state of the router. Call with a boolean argument\n * to set the enabled state, or with no arguments to get the state.\n */\n enabled: function () {\n if (arguments.length) {\n this._enabled = !!arguments[0];\n }\n return this._enabled;\n },\n\n navigate: function () {\n if (this._enabled) {\n Backbone.Router.prototype.navigate.apply(this, arguments);\n }\n }\n});\n\ngirder.router = new girder.Router();\n\n// When the back button is pressed, we want to close open modals.\ngirder.router.on('route', function (route, params) {\n if (!params.slice(-1)[0].dialog) {\n $('.modal').girderModal('close');\n }\n // get rid of tooltips\n $('.tooltip').remove();\n});\n","\ngirder.dialogs = {\n\n splitRoute: function (route) {\n if (!route) {\n return {base: '', name: ''};\n }\n var firstIndex = route.indexOf('?'),\n lastIndex = route.lastIndexOf('?'),\n dialogName,\n baseRoute;\n\n if (firstIndex === -1) {\n baseRoute = route;\n } else {\n baseRoute = route.slice(0, firstIndex);\n }\n\n if (lastIndex === -1) {\n dialogName = '';\n } else {\n dialogName = route.slice(lastIndex + 1);\n }\n\n return {name: dialogName, base: baseRoute};\n },\n\n handleClose: function (name, options, nameId) {\n if (!girder.router.enabled()) {\n return;\n }\n var curRoute = Backbone.history.fragment,\n routeParts = this.splitRoute(curRoute),\n queryString = girder.parseQueryString(routeParts.name),\n dialogName = queryString.dialog,\n dialogId = queryString.dialogid;\n delete queryString.dialog;\n delete queryString.dialogid;\n var unparsedQueryString = $.param(queryString);\n if (unparsedQueryString.length > 0) {\n unparsedQueryString = '?' + unparsedQueryString;\n }\n if (dialogName === name && dialogId === nameId) {\n girder.router.navigate(routeParts.base + unparsedQueryString, options);\n }\n },\n\n handleOpen: function (name, options, nameId) {\n if (!girder.router.enabled()) {\n return;\n }\n var curRoute = Backbone.history.fragment,\n routeParts = this.splitRoute(curRoute),\n queryString = girder.parseQueryString(routeParts.name),\n dialogName = queryString.dialog,\n dialogId = queryString.dialogid;\n\n if (dialogName !== name || nameId !== dialogId) {\n queryString.dialog = name;\n if (nameId) {\n queryString.dialogid = nameId;\n }\n var unparsedQueryString = $.param(queryString);\n if (unparsedQueryString.length > 0) {\n unparsedQueryString = '?' + unparsedQueryString;\n }\n girder.router.navigate(routeParts.base + unparsedQueryString, options);\n }\n }\n\n};\n","(function () {\n /**\n * The EventStream type wraps window.EventSource to listen to the unified\n * per-user event channel endpoint using the SSE protocol. When events are\n * received on the SSE channel, this triggers a Backbone event of the form\n * 'g:event.' where is the value of the event type field.\n * Listeners can bind to specific event types on the channel.\n */\n girder.EventStream = function (settings) {\n var defaults = {\n timeout: null,\n streamPath: '/notification/stream'\n };\n\n this.settings = _.extend(defaults, settings);\n\n return _.extend(this, Backbone.Events);\n };\n\n var prototype = girder.EventStream.prototype;\n\n prototype.open = function () {\n if (window.EventSource) {\n var stream = this,\n url = girder.apiRoot + this.settings.streamPath;\n\n if (this.settings.timeout) {\n url += '?timeout=' + this.settings.timeout;\n }\n\n this._eventSource = new window.EventSource(url);\n\n this._eventSource.onmessage = function (e) {\n var obj;\n try {\n obj = window.JSON.parse(e.data);\n } catch (err) {\n console.error('Invalid JSON from SSE stream: ' + e.data + ',' + err);\n stream.trigger('g:error', e);\n return;\n }\n stream.trigger('g:event.' + obj.type, obj);\n };\n } else {\n console.error('EventSource is not supported on this platform.');\n }\n };\n\n prototype.close = function () {\n if (this._eventSource) {\n this._eventSource.close();\n this._eventSource = null;\n }\n };\n}());\n","/**\n * Define jQuery plugins within this scope.\n */\n(function ($) {\n /**\n * This should be used instead of calling bootstrap's modal() jQuery\n * method directly. This unbinds all previous events from the dialog,\n * then calls modal on it and binds the bootstrap close events.\n * @param view The view object. Pass \"false\" for special cases where the\n * dialog does not correspond to a View object. Pass 'close'\n * to just close an open modal dialog.\n */\n $.fn.girderModal = function (view) {\n var that = this;\n /* If we have a modal dialog open, or one is in the process of closing,\n * close that dialog before opening the new one. This prevents\n * layering modal dialogs, but also makes sure that we don't have a\n * problem switching from one modal dialog to another. */\n if ($(this).is('.modal')) {\n /* We have to reach into the backbone modal object a little to see\n * if we need to do anything. By turning off the fade as we\n * remove the old dialog, the removal is synchronous and we are\n * sure it is gone before we add the new dialog. */\n if ($(this).data('bs.modal') && $(this).data('bs.modal').isShown) {\n var elem = $($(this).data('bs.modal').$element);\n var hasFade = elem.hasClass('fade');\n elem.removeClass('fade');\n $(this).modal('hide');\n elem.toggleClass('fade', hasFade);\n }\n }\n if (view !== 'close') {\n this.off().modal().find('[data-dismiss=\"modal\"]')\n .unbind('click').click(function () {\n that.modal('hide');\n });\n if (view !== false) {\n view.delegateEvents();\n }\n }\n return this;\n };\n}(jQuery));\n","/**\n * This file contains utility functions for general use in the application\n */\ngirder.DATE_MONTH = 0;\ngirder.DATE_DAY = 1;\ngirder.DATE_MINUTE = 2;\ngirder.DATE_SECOND = 3;\n\n/**\n * Format a date string to the given resolution.\n * @param datestr The date string to format.\n * @param resolution The resolution, defaults to 'day'. Minimum is month.\n */\ngirder.formatDate = function (datestr, resolution) {\n datestr = datestr.replace(' ', 'T'); // Cross-browser accepted date format\n var date = new Date(datestr);\n var output = girder.MONTHS[date.getMonth()];\n\n resolution = resolution || girder.DATE_MONTH;\n\n if (resolution >= girder.DATE_DAY) {\n output += ' ' + date.getDate() + ',';\n }\n\n output += ' ' + date.getFullYear();\n\n if (resolution >= girder.DATE_MINUTE) {\n output += ' at ' + date.getHours() + ':' +\n ('0' + date.getMinutes()).slice(-2);\n }\n if (resolution >= girder.DATE_SECOND) {\n output += ':' + ('0' + date.getSeconds()).slice(-2);\n }\n\n return output;\n};\n\n/**\n * Format a size in bytes into a human-readable string with metric unit\n * prefixes.\n */\ngirder.formatSize = function (sizeBytes) {\n if (sizeBytes < 20000) {\n return sizeBytes + ' B';\n }\n var i, sizeVal = sizeBytes, precision = 1;\n for (i = 0; sizeVal >= 1024; i += 1) {\n sizeVal /= 1024;\n }\n // If we are just reporting a low number, no need for decimal places.\n if (sizeVal < 10) {\n precision = 3;\n } else if (sizeVal < 100) {\n precision = 2;\n }\n return sizeVal.toFixed(precision) + ' ' +\n ['B', 'kB', 'MB', 'GB', 'TB'][Math.min(i, 4)];\n};\n\n/**\n * Like girder.formatSize, but more generic. Returns a human-readable format\n * of an integer using metric prefixes. The caller is expected to append any\n * unit string if necessary.\n *\n * @param {integer} n The number to format.\n * @param {Object} [opts={}] Formatting options. These include:\n * - {integer} [maxLen] Max number of digits in the output.\n * - {integer} [base=1000] Base for the prefixes (usually 1000 or 1024).\n * - {string} [sep=''] Separator between numeric value and metric prefix.\n */\ngirder.formatCount = function (n, opts) {\n n = n || 0;\n opts = opts || {};\n\n var i = 0,\n base = opts.base || 1000,\n sep = opts.sep || '',\n maxLen = opts.maxLen || 3,\n precision = maxLen - 1;\n\n for (; n > base; i += 1) {\n n /= base;\n }\n\n if (!i) {\n precision = 0;\n } else if (n > 100) {\n precision -= 2;\n } else if (n > 10) {\n precision -= 1;\n }\n\n return n.toFixed(Math.max(0, precision)) + sep +\n ['', 'k', 'M', 'G', 'T'][Math.min(i, 4)];\n};\n\n/**\n * Prompt the user to confirm an action.\n * @param [text] The text to prompt the user with.\n * @param [yesText] The text for the confirm button.\n * @param [yesClass] Class string to apply to the confirm button.\n * @param [noText] The text for the no/cancel button.\n * @param [escapedHtml] If you want to render the text as HTML rather than\n * plain text, set this to true to acknowledge that you have escaped any\n * user-created data within the text to prevent XSS exploits.\n * @param confirmCallback Callback function when the user confirms the action.\n */\ngirder.confirm = function (params) {\n params = _.extend({\n text: 'Are you sure?',\n yesText: 'Yes',\n yesClass: 'btn-danger',\n noText: 'Cancel',\n escapedHtml: false\n }, params);\n $('#g-dialog-container').html(girder.templates.confirmDialog({\n params: params\n })).girderModal(false);\n\n var el = $('#g-dialog-container').find('.modal-body>p');\n if (params.escapedHtml) {\n el.html(params.text);\n } else {\n el.text(params.text);\n }\n\n $('#g-confirm-button').unbind('click').click(function () {\n $('#g-dialog-container').modal('hide');\n params.confirmCallback();\n });\n};\n\n/**\n * This comparator can be used by collections that wish to support locale-based\n * sorting. The locale specifies how upper and lower case are compared.\n */\ngirder.localeComparator = function (model1, model2) {\n var a1 = model1.get(this.sortField),\n a2 = model2.get(this.sortField);\n\n if (a1 !== undefined && a1.localeCompare) {\n var result = a1.localeCompare(a2) * this.sortDir;\n if (result || !this.secondarySortField) {\n return result;\n }\n a1 = model1.get(this.secondarySortField);\n a2 = model2.get(this.secondarySortField);\n return a1.localeCompare(a2) * this.sortDir;\n }\n\n return a1 > a2 ? this.sortDir : (a1 < a2 ? -this.sortDir : 0);\n};\n\n/**\n * This comparator can be passed to the sort function on javascript arrays.\n */\ngirder.localeSort = function (a1, a2) {\n if (a1 !== undefined && a1.localeCompare) {\n return a1.localeCompare(a2);\n }\n return a1 > a2 ? 1 : (a1 < a2 ? -1 : 0);\n};\n\n/**\n * Return the model class name given its collection name.\n * @param name Collection name, e.g. 'user'\n */\ngirder.getModelClassByName = function (name) {\n var className = name.charAt(0).toUpperCase();\n return className + name.substr(1) + 'Model';\n};\n\ngirder.parseQueryString = function (queryString) {\n var params = {};\n if (queryString) {\n _.each(queryString.replace(/\\+/g, ' ').split(/&/g), function (el) {\n var aux = el.split('='), val;\n if (aux.length > 1) {\n val = decodeURIComponent(el.substr(aux[0].length + 1));\n }\n params[decodeURIComponent(aux[0])] = val;\n });\n }\n return params;\n};\n\ngirder.cookie = {\n findAll: function () {\n var cookies = {};\n _(document.cookie.split(';'))\n .chain()\n .map(function (m) {\n return m.replace(/^\\s+/, '').replace(/\\s+$/, '');\n })\n .each(function (c) {\n var arr = c.split('='),\n key = arr[0],\n value = null,\n size = _.size(arr);\n if (size > 1) {\n value = arr.slice(1).join('');\n }\n cookies[key] = value;\n });\n return cookies;\n },\n\n find: function (name) {\n var cookie = null,\n list = this.findAll();\n\n _.each(list, function (value, key) {\n if (key === name) {\n cookie = value;\n }\n });\n return cookie;\n }\n};\n\n// Make sure girder.currentToken is set on startup if a cookie exists.\ngirder.currentToken = girder.cookie.find('girderToken');\n\n/**\n * Restart the server, wait until it has restarted, then reload the current\n * page.\n */\ngirder.restartServer = function () {\n function waitForServer() {\n girder.restRequest({\n type: 'GET',\n path: 'system/version',\n error: null\n }).done(_.bind(function (resp) {\n if (resp.serverStartDate !== girder.restartServer._lastStartDate) {\n girder.restartServer._reloadWindow();\n } else {\n window.setTimeout(waitForServer, 1000);\n }\n })).error(_.bind(function () {\n window.setTimeout(waitForServer, 1000);\n }));\n }\n\n girder.restRequest({\n type: 'GET',\n path: 'system/version'\n }).done(_.bind(function (resp) {\n girder.restartServer._lastStartDate = resp.serverStartDate;\n girder.restartServer._callSystemRestart();\n girder.events.trigger('g:alert', {\n icon: 'cw',\n text: 'Restarting server',\n type: 'warning',\n timeout: 60000\n });\n waitForServer();\n }));\n};\n/* Having these as object properties facilitates testing */\ngirder.restartServer._callSystemRestart = function () {\n girder.restRequest({type: 'PUT', path: 'system/restart'});\n};\ngirder.restartServer._reloadWindow = function () {\n window.location.reload();\n};\n\n/**\n * Create a set of flags that can be OR'd (|) together to define a set of\n * options.\n *\n * @param {Array} options An array of strings defining the option names.\n * @param {string} allOption If you want an option that enables all options,\n * pass its name as this parameter.\n * @return {Object} An object mapping the names of options to values.\n */\ngirder.defineFlags = function (options, allOption) {\n var i = 0,\n obj = {};\n\n if (allOption) {\n obj[allOption] = 1;\n }\n _.each(options, function (opt) {\n obj[opt] = 1 << i;\n\n if (allOption) {\n obj[allOption] |= obj[opt];\n }\n\n i += 1;\n });\n\n return obj;\n};\n\n/**\n * Transform markdown into HTML and render it into the given element. If no\n * element is provided, simply returns the HTML.\n *\n * @param val The markdown text input.\n * @param el The element to render the output HTML into, or falsy to simply\n * return the HTML value.\n */\ngirder.renderMarkdown = (function () {\n if (window.Remarkable) {\n var md = new Remarkable({\n linkify: true\n });\n return function (val, el) {\n if (el) {\n $(el).html(md.render(val));\n } else {\n return md.render(val);\n }\n };\n } else {\n return function () {\n throw new Error(\n 'You must include the remarkable library to call this function');\n };\n }\n}());\n\n/**\n * Capitalize the first character of a string.\n */\ngirder.capitalize = function (str) {\n return str.charAt(0).toUpperCase() + str.substring(1);\n};\n\n(function () {\n var _pluginConfigRoutes = {};\n\n /**\n * Expose a plugin configuration page via the admin plugins page.\n * @param pluginName The canonical plugin name, i.e. its directory name\n * @param route The route to trigger that will render the plugin config.\n */\n girder.exposePluginConfig = function (pluginName, route) {\n _pluginConfigRoutes[pluginName] = route;\n };\n\n girder.getPluginConfigRoute = function (pluginName) {\n return _pluginConfigRoutes[pluginName];\n };\n}());\n\n/* Pending rest requests are listed in this pool so that they can be aborted or\n * checked if still processing. */\n(function () {\n var restXhrPool = {};\n var restXhrCount = 0;\n $(document).ajaxSend(function (event, xhr) {\n restXhrCount += 1;\n xhr.girderXhrNumber = restXhrCount;\n restXhrPool[restXhrCount] = xhr;\n });\n $(document).ajaxComplete(function (event, xhr) {\n var num = xhr.girderXhrNumber;\n if (num && restXhrPool[num]) {\n delete restXhrPool[num];\n }\n });\n /* Get the number of outstanding rest requests.\n * :param category: if specified, only count those requests that have\n * xhr.girder.(category) set to a truthy value.\n * :returns: the number of outstanding requests.\n */\n girder.numberOutstandingRestRequests = function (category) {\n if (category) {\n return _.filter(restXhrPool, function (xhr) {\n return xhr.girder && xhr.girder[category];\n }).length;\n }\n return _.size(restXhrPool);\n };\n /* Cancel outstanding rest requests.\n * :param category: if specified, only abort those requests that have\n * xhr.girder.(category) set to a truthy value.\n */\n girder.cancelRestRequests = function (category) {\n _.each(restXhrPool, function (xhr) {\n if (category && (!xhr.girder || !xhr.girder[category])) {\n return;\n }\n if (xhr.abort) {\n xhr.abort();\n }\n });\n };\n}());\n","/**\n * This is the upload handler for the \"s3\" behavior, which is responsible for\n * uploading data to an s3 assetstore type directly from the user agent, using\n * either the single-request or multi-chunk protocol depending on the size of\n * the file.\n *\n * The flow here is to make requests to Girder for each required chunk of\n * the upload, which Girder authorizes and signs using HMAC. Those signatures\n * are sent, along with the bytes, to the appropriate S3 bucket. For multi-\n * chunk uploads, one final request is required after all chunks have been\n * sent in order to create the final unified record in S3.\n */\n(function () {\n // Constructor\n girder.uploadHandlers.s3 = function (params) {\n this.params = params;\n this.startByte = 0;\n return _.extend(this, Backbone.Events);\n };\n\n var prototype = girder.uploadHandlers.s3.prototype;\n\n prototype._xhrProgress = function (event) {\n if (!event.lengthComputable) {\n return;\n }\n\n // We only want to count bytes of the actual file, not the bytes of\n // the request body corresponding to the other form parameters model\n // we are also sending.\n var loaded = this.payloadLength + event.loaded - event.total;\n\n if (loaded >= 0) {\n this.trigger('g:upload.progress', {\n startByte: this.startByte,\n loaded: loaded,\n total: this.params.file.size,\n file: this.params.file\n });\n }\n };\n\n prototype.execute = function () {\n var s3Info = this.params.upload.s3;\n var handler = this;\n\n var xhr = new XMLHttpRequest();\n xhr.open(s3Info.request.method, s3Info.request.url);\n _.each(s3Info.request.headers, function (v, k) {\n xhr.setRequestHeader(k, v);\n });\n\n if (s3Info.chunked) {\n this._multiChunkUpload(xhr);\n } else {\n this.payloadLength = this.params.file.size;\n xhr.onload = function () {\n if (xhr.status === 200) {\n handler.trigger('g:upload.chunkSent', {\n bytes: handler.payloadLength\n });\n\n girder.restRequest({\n path: 'file/completion',\n type: 'POST',\n data: {\n uploadId: handler.params.upload._id\n },\n error: null\n }).done(_.bind(function (resp) {\n this.trigger('g:upload.complete', resp);\n }, handler)).error(_.bind(function (resp) {\n var msg;\n\n if (resp.status === 0) {\n msg = 'Could not connect to the server.';\n } else {\n msg = 'An error occurred when resuming upload, check console.';\n }\n this.trigger('g:upload.error', {\n message: msg\n });\n }, handler));\n } else {\n handler.trigger('g:upload.error', {\n message: 'Error occurred uploading to S3 (' +\n xhr.status + ').'\n });\n }\n };\n\n xhr.upload.addEventListener('progress', function (event) {\n handler._xhrProgress(event);\n });\n\n xhr.addEventListener('error', function (event) {\n handler.trigger('g:upload.error', {\n message: 'Error occurred uploading to S3.',\n event: event\n });\n });\n\n xhr.send(this.params.file);\n }\n };\n\n prototype.resume = function () {\n if (this.params.upload.s3.chunked) {\n return this._sendNextChunk();\n }\n\n // If this is a single-chunk upload, we have to use the offset method\n // to re-generate the initial request with a new timestamp.\n girder.restRequest({\n path: 'file/offset',\n type: 'GET',\n data: {\n uploadId: this.params.upload._id\n },\n error: null\n }).done(_.bind(function (resp) {\n this.params.upload.s3.request = resp;\n this.execute();\n }, this)).error(_.bind(function (resp) {\n var msg;\n\n if (resp.status === 0) {\n msg = 'Could not connect to the Girder server.';\n } else {\n msg = 'An error occurred when resuming upload, check console.';\n }\n this.trigger('g:upload.error', {\n message: msg\n });\n }, this));\n };\n\n /**\n * If the file being uploaded is larger than a single chunk length, it\n * should be uploaded using the S3 multipart protocol.\n */\n prototype._multiChunkUpload = function (xhr) {\n var handler = this;\n this.eTagList = {};\n this.startByte = 0;\n this.chunkN = 1;\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n handler.s3UploadId =\n xhr.responseText.match(/(.*)<\\/UploadId>/).pop();\n handler._sendNextChunk();\n } else {\n handler.trigger('g:upload.error', {\n message: 'Error while initializing multichunk S3 upload.',\n event: event\n });\n }\n };\n\n xhr.addEventListener('error', function (event) {\n handler.trigger('g:upload.error', {\n message: 'Error occurred uploading to S3.',\n event: event\n });\n });\n\n xhr.send();\n };\n\n /**\n * Internal helper method used during multichunk upload protocol. This\n * requests a signed chunk upload request from Girder, then uses that\n * authorized request to send the chunk to S3.\n */\n prototype._sendNextChunk = function () {\n var sliceFn = this.params.file.webkitSlice ? 'webkitSlice' : 'slice';\n var data = this.params.file[sliceFn](this.startByte,\n this.startByte + this.params.upload.s3.chunkLength);\n this.payloadLength = data.size;\n\n // Get the authorized request from Girder\n girder.restRequest({\n path: 'file/chunk',\n type: 'POST',\n data: {\n offset: 0,\n chunk: JSON.stringify({\n s3UploadId: this.s3UploadId,\n partNumber: this.chunkN,\n contentLength: this.payloadLength\n }),\n uploadId: this.params.upload._id\n },\n error: null\n }).done(_.bind(function (resp) {\n // Send the chunk to S3\n var handler = this;\n var xhr = new XMLHttpRequest();\n xhr.open(resp.s3.request.method, resp.s3.request.url);\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n handler.trigger('g:upload.chunkSent', {\n bytes: handler.payloadLength\n });\n // ETag gets sent wrapped in quotes, we must strip them\n handler.eTagList[handler.chunkN] =\n xhr.getResponseHeader('ETag').replace(/\"/g, '');\n handler.startByte += handler.payloadLength;\n handler.chunkN += 1;\n\n if (handler.startByte < handler.params.file.size) {\n handler._sendNextChunk();\n } else {\n handler._finalizeMultiChunkUpload();\n }\n } else {\n handler.trigger('g:upload.error', {\n message: 'Error occurred uploading to S3 (' +\n xhr.status + ').'\n });\n }\n };\n\n xhr.upload.addEventListener('progress', function (event) {\n handler._xhrProgress(event);\n });\n\n xhr.addEventListener('error', function (event) {\n handler.trigger('g:upload.error', {\n message: 'Error occurred uploading to S3.',\n event: event\n });\n });\n\n xhr.send(data);\n }, this)).error(_.bind(function () {\n this.trigger('g:upload.error', {\n message: 'Error getting signed chunk request from Girder.'\n });\n }, this));\n };\n\n /**\n * When all chunks of a multichunk upload have been sent, this must be\n * called in order to finalize the upload.\n */\n prototype._finalizeMultiChunkUpload = function () {\n girder.restRequest({\n path: 'file/completion',\n type: 'POST',\n data: {\n uploadId: this.params.upload._id\n },\n error: null\n }).done(_.bind(function (resp) {\n // Create the XML document that will be the request body to S3\n var handler = this;\n var doc = document.implementation.createDocument(null, null, null);\n var root = doc.createElement('CompleteMultipartUpload');\n\n _.each(this.eTagList, function (etag, partNumber) {\n var partEl = doc.createElement('Part');\n var partNumberEl = doc.createElement('PartNumber');\n var etagEl = doc.createElement('ETag');\n\n partNumberEl.appendChild(doc.createTextNode(partNumber));\n etagEl.appendChild(doc.createTextNode(etag));\n partEl.appendChild(partNumberEl);\n partEl.appendChild(etagEl);\n root.appendChild(partEl);\n });\n\n var req = resp.s3FinalizeRequest;\n var xhr = new XMLHttpRequest();\n\n xhr.open(req.method, req.url);\n\n _.each(req.headers, function (v, k) {\n xhr.setRequestHeader(k, v);\n });\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n delete resp.s3FinalizeRequest;\n handler.trigger('g:upload.complete', resp);\n } else {\n handler.trigger('g:upload.error', {\n message: 'Error occurred uploading to S3 (' +\n xhr.status + ').'\n });\n }\n };\n\n xhr.send(new window.XMLSerializer().serializeToString(root));\n }, this)).error(_.bind(function (resp) {\n var msg;\n\n if (resp.status === 0) {\n msg = 'Could not connect to the server.';\n } else {\n msg = 'Upload error during finalize, check console.';\n }\n this.trigger('g:upload.error', {\n message: msg\n });\n }, this));\n };\n}());\n","/**\n * Wrap the prototype method of a given object.\n *\n * @param obj The object whose prototype to extend, e.g. girder.views.MyView\n * @param funcName The name of the function to wrap, e.g. \"render\"\n * @param wrapper The wrapper function, which should be a function taking the\n * underlying wrapped function as its first argument. The wrapped function\n * should be called with .call(this[, arguments]) inside of the wrapper in\n * order to preserve \"this\" semantics.\n */\ngirder.wrap = function (obj, funcName, wrapper) {\n obj.prototype[funcName] = _.wrap(obj.prototype[funcName], wrapper);\n};\n","/**\n * All collections should descend from this collection base class, which\n * provides nice utilities for pagination and sorting.\n */\ngirder.Collection = Backbone.Collection.extend({\n model: girder.Model,\n resourceName: null,\n\n sortField: 'name',\n sortDir: girder.SORT_ASC,\n comparator: girder.localeComparator,\n\n // Number of records to fetch per page\n pageLimit: 25,\n offset: 0,\n\n // Alternative fetch URL\n altUrl: null,\n\n /**\n * Append mode can be used to append pages to the collection rather than\n * simply replacing its contents when a new page is fetched. For the sake\n * of least surprise, this property should not be changed in the definition\n * of collections, but after they are instantiated.\n */\n append: false,\n\n /**\n * Returns a boolean of whether or not this collection has previous pages,\n * i.e. if the offset of the current page start is > 0\n */\n hasPreviousPage: function () {\n return this.offset - this.length > 0;\n },\n\n /**\n * After you have called fetch() on a collection, this method will tell\n * you whether there are more pages remaining to be fetched, or if you\n * have hit the end.\n */\n hasNextPage: function () {\n return this._hasMorePages;\n },\n\n /**\n * Fetch the previous page of this collection, emitting g:changed when done.\n */\n fetchPreviousPage: function (params) {\n this.offset = Math.max(0, this.offset - this.length - this.pageLimit);\n this.fetch(_.extend({}, this.params, params || {}));\n },\n\n /**\n * Fetch the previous page of this collection, emitting g:changed when done.\n */\n fetchNextPage: function (params) {\n this.fetch(_.extend({}, this.params, params || {}));\n },\n\n /**\n * Return the 0-indexed page number of the current page. Add 1 to this\n * result when displaying it to the user.\n */\n pageNum: function () {\n return Math.ceil((this.offset - this.length) / this.pageLimit);\n },\n\n /**\n * Fetches the next page of this collection, replacing the existing models\n * of this collection with the requested page. If the next page contains\n * any records (i.e. it was not already on the last page), this will\n * trigger g:changed.\n * @param params Any additional parameters to be passed with the request.\n * @param reset Set this to true to re-fetch the current page.\n */\n fetch: function (params, reset) {\n if (this.altUrl === null && this.resourceName === null) {\n alert('Error: You must set an altUrl or resourceName on your collection.');\n return;\n }\n\n if (reset) {\n this.offset = 0;\n } else {\n this.params = params || {};\n }\n\n var xhr = girder.restRequest({\n path: this.altUrl || this.resourceName,\n data: _.extend({\n limit: this.pageLimit + 1,\n offset: this.offset,\n sort: this.sortField,\n sortdir: this.sortDir\n }, this.params)\n }).done(_.bind(function (list) {\n if (list.length > this.pageLimit) {\n // This means we have more pages to display still. Pop off\n // the extra that we fetched.\n list.pop();\n this._hasMorePages = true;\n } else {\n this._hasMorePages = false;\n }\n\n this.offset += list.length;\n\n if (list.length > 0 || reset) {\n if (this.append && !reset) {\n this.add(list);\n } else {\n this.reset(list);\n }\n }\n\n this.trigger('g:changed');\n }, this));\n xhr.girder = {fetch: true};\n }\n});\n","/**\n * All models should descend from this base model, which provides a number\n * of utilities for synchronization.\n */\ngirder.Model = Backbone.Model.extend({\n resourceName: null,\n altUrl: null,\n idAttribute: '_id',\n\n /**\n * Convenience method for incrementing numeric properties.\n * @param {string} attr The attribute to increment.\n * @param {number} [amount] The amount to increment by. Defaults to 1.\n */\n increment: function (attr, amount) {\n if (amount === undefined) {\n amount = 1;\n }\n if (!amount) {\n return;\n }\n return this.set(attr, this.get(attr) + amount);\n },\n\n /**\n * Get the name for this resource. By default, just the name attribute.\n */\n name: function () {\n return this.get('name');\n },\n\n /**\n * Save this model to the server. If this is a new model, meaning it has no\n * _id attribute, this will create it. If the _id is set, we update the\n * existing model. Triggers g:saved on success, and g:error on error.\n */\n save: function () {\n if (this.altUrl === null && this.resourceName === null) {\n alert('Error: You must set an altUrl or resourceName on your model.');\n return;\n }\n\n var path, type;\n if (this.has('_id')) {\n path = (this.altUrl || this.resourceName) + '/' + this.get('_id');\n type = 'PUT';\n } else {\n path = (this.altUrl || this.resourceName);\n type = 'POST';\n }\n /* Don't save attributes which are objects using this call. For\n * instance, if the metadata of an item has keys that contain non-ascii\n * values, they won't get handled the the rest call. */\n var data = {};\n _.each(this.keys(), function (key) {\n var value = this.get(key);\n if (!_.isObject(value)) {\n data[key] = value;\n }\n }, this);\n\n girder.restRequest({\n path: path,\n type: type,\n data: data,\n error: null // don't do default error behavior (validation may fail)\n }).done(_.bind(function (resp) {\n this.set(resp);\n this.trigger('g:saved');\n }, this)).error(_.bind(function (err) {\n this.trigger('g:error', err);\n }, this));\n\n return this;\n },\n\n /**\n * Fetch a single resource from the server. Triggers g:fetched on success,\n * or g:error on error.\n * To ignore the default error handler, pass\n * ignoreError: true\n * in your opts object.\n */\n fetch: function (opts) {\n if (this.altUrl === null && this.resourceName === null) {\n alert('Error: You must set an altUrl or a resourceName on your model.');\n return;\n }\n\n opts = opts || {};\n var restOpts = {\n path: (this.altUrl || this.resourceName) + '/' + this.get('_id')\n };\n if (opts.extraPath) {\n restOpts.path += '/' + opts.extraPath;\n }\n if (opts.ignoreError) {\n restOpts.error = null;\n }\n girder.restRequest(restOpts).done(_.bind(function (resp) {\n this.set(resp);\n if (opts.extraPath) {\n this.trigger('g:fetched.' + opts.extraPath);\n } else {\n this.trigger('g:fetched');\n }\n }, this)).error(_.bind(function (err) {\n this.trigger('g:error', err);\n }, this));\n\n return this;\n },\n\n /**\n * Get the path for downloading this resource via the API. Can be used\n * as the href property of a direct download link.\n */\n downloadUrl: function () {\n return girder.apiRoot + '/' + (this.altUrl || this.resourceName) + '/' +\n this.get('_id') + '/download';\n },\n\n /**\n * For models that can be downloaded, this method can be used to\n * initiate the download in the browser.\n */\n download: function () {\n window.location.assign(this.downloadUrl());\n },\n\n /**\n * Delete the model on the server.\n * @param opts Options, may contain:\n * throwError Whether to throw an error (bool, default=true)\n * progress Whether to record progress (bool, default=false)\n */\n destroy: function (opts) {\n if (this.altUrl === null && this.resourceName === null) {\n alert('Error: You must set an altUrl or a resourceName on your model.');\n return;\n }\n\n var args = {\n path: (this.altUrl || this.resourceName) + '/' + this.get('_id'),\n type: 'DELETE'\n };\n\n opts = opts || {};\n if (opts.progress === true) {\n args.path += '?progress=true';\n }\n\n if (opts.throwError !== false) {\n args.error = null;\n }\n\n girder.restRequest(args).done(_.bind(function () {\n if (this.collection) {\n this.collection.remove(this);\n }\n this.trigger('g:deleted');\n }, this)).error(_.bind(function (err) {\n this.trigger('g:error', err);\n }, this));\n\n return this;\n },\n\n /**\n * Return the access level with respect to the current user\n */\n getAccessLevel: function () {\n return this.get('_accessLevel');\n }\n\n});\n\n/**\n * Models corresponding to AccessControlledModels on the server should extend\n * from this object. It provides utilities for managing and storing the\n * access control list on\n */\ngirder.AccessControlledModel = girder.Model.extend({\n /**\n * Saves the access control list on this model to the server. Saves the\n * state of whatever this model's \"access\" parameter is set to, which\n * should be an object of the form:\n * {groups: [{id: , level: }, ...],\n * users: [{id: , level: }, ...]}\n * The \"public\" attribute of this model should also be set as a boolean.\n * When done, triggers the 'g:accessListSaved' event on the model.\n */\n updateAccess: function (params) {\n if (this.altUrl === null && this.resourceName === null) {\n alert('Error: You must set an altUrl or a resourceName on your model.');\n return;\n }\n\n girder.restRequest({\n path: (this.altUrl || this.resourceName) + '/' + this.get('_id') + '/access',\n type: 'PUT',\n data: _.extend({\n access: JSON.stringify(this.get('access')),\n public: this.get('public')\n }, params || {})\n }).done(_.bind(function () {\n this.trigger('g:accessListSaved');\n }, this)).error(_.bind(function (err) {\n this.trigger('g:error', err);\n }, this));\n\n return this;\n },\n\n /**\n * Fetches the access control list from the server, and sets it as the\n * access property.\n * @param force By default, this only fetches access if it hasn't already\n * been set on the model. If you want to force a refresh\n * anyway, set this param to true.\n */\n fetchAccess: function (force) {\n if (this.altUrl === null && this.resourceName === null) {\n alert('Error: You must set an altUrl or a resourceName on your model.');\n return;\n }\n\n if (!this.get('access') || force) {\n girder.restRequest({\n path: (this.altUrl || this.resourceName) + '/' + this.get('_id') + '/access',\n type: 'GET'\n }).done(_.bind(function (resp) {\n if (resp.access) {\n this.set(resp);\n } else {\n this.set('access', resp);\n }\n this.trigger('g:accessFetched');\n }, this)).error(_.bind(function (err) {\n this.trigger('g:error', err);\n }, this));\n } else {\n this.trigger('g:accessFetched');\n }\n\n return this;\n }\n});\n\ngirder.models.MetadataMixin = {\n _sendMetadata: function (metadata, successCallback, errorCallback, opts) {\n opts = opts || {};\n girder.restRequest({\n path: opts.path ||\n ((this.altUrl || this.resourceName) + '/' + this.get('_id') + '/metadata'),\n contentType: 'application/json',\n data: JSON.stringify(metadata),\n type: 'PUT',\n error: null\n }).done(_.bind(function (resp) {\n this.set(opts.field || 'meta', resp.meta);\n if (_.isFunction(successCallback)) {\n successCallback();\n }\n }, this)).error(_.bind(function (err) {\n err.message = err.responseJSON.message;\n if (_.isFunction(errorCallback)) {\n errorCallback(err);\n }\n }, this));\n },\n\n addMetadata: function (key, value, successCallback, errorCallback, opts) {\n opts = opts || {};\n var datum = {};\n datum[key] = value;\n var meta = this.get(opts.field || 'meta');\n if (meta && _.has(meta, key)) {\n if (_.isFunction(errorCallback)) {\n errorCallback({message: key + ' is already a metadata key'});\n }\n } else {\n this._sendMetadata(datum, successCallback, errorCallback, opts);\n }\n },\n\n removeMetadata: function (key, successCallback, errorCallback, opts) {\n var datum = {};\n datum[key] = null;\n this._sendMetadata(datum, successCallback, errorCallback, opts);\n },\n\n editMetadata: function (newKey, oldKey, value, successCallback, errorCallback, opts) {\n opts = opts || {};\n\n if (newKey === oldKey) {\n var datum = {};\n datum[newKey] = value;\n this._sendMetadata(datum, successCallback, errorCallback, opts);\n } else {\n if (_.has(this.get(opts.field || 'meta'), newKey)) {\n if (_.isFunction(errorCallback)) {\n errorCallback({message: newKey + ' is already a metadata key'});\n }\n } else {\n var metas = {};\n metas[oldKey] = null;\n metas[newKey] = value;\n this._sendMetadata(metas, successCallback, errorCallback, opts);\n }\n }\n }\n};\n","girder.models.AssetstoreModel = girder.Model.extend({\n resourceName: 'assetstore',\n\n capacityKnown: function () {\n var cap = this.get('capacity');\n return cap && cap.free !== null && cap.total !== null;\n },\n\n capacityString: function () {\n var cap = this.get('capacity');\n return girder.formatSize(cap.free) + ' free of ' +\n girder.formatSize(cap.total) + ' total';\n },\n\n import: function (params) {\n girder.restRequest({\n path: 'assetstore/' + this.get('_id') + '/import',\n type: 'POST',\n data: params,\n error: null\n }).done(_.bind(function (resp) {\n this.trigger('g:imported', resp);\n }, this)).error(_.bind(function (resp) {\n this.trigger('g:error', resp);\n }, this));\n\n return this;\n }\n});\n","girder.models.CollectionModel = girder.AccessControlledModel.extend({\n resourceName: 'collection'\n});\n","girder.models.FileModel = girder.Model.extend({\n resourceName: 'file',\n resumeInfo: null,\n\n _wrapData: function (data, type) {\n var wrapped = data;\n\n if (!(data instanceof Blob)) {\n if (!_.isArray(data)) {\n wrapped = [data];\n }\n wrapped = new Blob(wrapped, {\n type: type\n });\n }\n\n return wrapped;\n },\n\n /**\n * Upload into an existing file object (i.e. this model) to change its\n * contents. This does not change the name or MIME type of the existing\n * file.\n * @param data A browser File object, browser Blob object, or raw data to be uploaded.\n */\n updateContents: function (data) {\n data = this._wrapData(data);\n\n this.upload(null, data, {\n path: 'file/' + this.get('_id') + '/contents',\n type: 'PUT',\n data: {\n size: data.size\n }\n });\n },\n\n /**\n * Upload data to a new file in a given container\n * @param Model A constructor for the parent model (either FolderModel or ItemModel).\n * @param model The parent model to upload to, or a string containing the id thereof.\n * @param data The data to upload - either a string, File object, or Blob object.\n * @param name The name of the file to create (optional if data is a File).\n * @param type The mime type of the file (optional).\n */\n _uploadToContainer: function (Model, model, data, name, type) {\n if (_.isString(model)) {\n model = new Model({\n _id: model\n });\n }\n\n data = this._wrapData(data, type);\n data.name = name;\n\n this.upload(model, data);\n },\n\n /**\n * Upload data to a new file in a given folder\n * @param parentFolder The parent folder to upload to, or a string containing the id thereof.\n * @param data The data to upload - either a string, File object, or Blob object.\n * @param name The name of the file to create (optional if data is a File).\n * @param type The mime type of the file (optional).\n */\n uploadToFolder: function (parentFolder, data, name, type) {\n this._uploadToContainer(girder.models.FolderModel, parentFolder, data, name, type);\n },\n\n /**\n * Upload data to a new file in a given folder\n * @param parentItem The parent item to upload to, or a string containing the id thereof.\n * @param data The data to upload - either a string, File object, or Blob object.\n * @param name The name of the file to create (optional if data is a File).\n * @param type The mime type of the file (optional).\n */\n uploadToItem: function (parentItem, data, name, type) {\n this._uploadToContainer(girder.models.ItemModel, parentItem, data, name, type);\n },\n\n /**\n * Upload a file. Handles uploading into all of the core assetstore types.\n * @param parentModel The parent folder or item to upload into.\n * @param file The browser File object to be uploaded.\n * @param [_restParams] Override the rest request parameters. This is meant\n * for internal use; do not pass this parameter.\n */\n upload: function (parentModel, file, _restParams) {\n this.startByte = 0;\n this.resumeInfo = null;\n this.uploadHandler = null;\n _restParams = _restParams || {\n path: 'file',\n type: 'POST',\n data: {\n parentType: parentModel.resourceName,\n parentId: parentModel.get('_id'),\n name: file.name,\n size: file.size,\n mimeType: file.type\n }\n };\n\n // Authenticate and generate the upload token for this file\n girder.restRequest(_restParams).done(_.bind(function (upload) {\n var behavior = upload.behavior;\n if (behavior && girder.uploadHandlers[behavior]) {\n this.uploadHandler = new girder.uploadHandlers[behavior]({\n upload: upload,\n parentModel: parentModel,\n file: file\n });\n this.uploadHandler.on({\n 'g:upload.complete': function (params) {\n this.set(params);\n this.trigger('g:upload.complete', params);\n this.uploadHandler = null;\n },\n 'g:upload.chunkSent': function (params) {\n this.trigger('g:upload.chunkSent', params);\n },\n 'g:upload.error': function (params) {\n this.trigger('g:upload.error', params);\n },\n 'g:upload.errorStarting': function (params) {\n this.trigger('g:upload.errorStarting', params);\n },\n 'g:upload.progress': function (params) {\n this.trigger('g:upload.progress', {\n startByte: params.startByte,\n loaded: params.loaded,\n total: params.file.size,\n file: params.file\n });\n }\n }, this);\n return this.uploadHandler.execute();\n }\n\n if (file.size > 0) {\n // Begin uploading chunks of this file\n this._uploadChunk(file, upload._id);\n } else {\n // Empty file, so we are done\n this.set(upload);\n this.trigger('g:upload.complete');\n }\n }, this)).error(_.bind(function (resp) {\n var text = 'Error: ', identifier;\n\n if (resp.status === 0) {\n text += 'Connection to the server interrupted.';\n } else {\n text += resp.responseJSON.message;\n identifier = resp.responseJSON.identifier;\n }\n this.trigger('g:upload.errorStarting', {\n message: text,\n identifier: identifier,\n response: resp\n });\n }, this));\n },\n\n /**\n * If an error was triggered during the upload of this file, call this\n * in order to attempt to resume it.\n */\n resumeUpload: function () {\n if (this.uploadHandler !== null && this.uploadHandler.resume) {\n return this.uploadHandler.resume();\n }\n\n // Request the actual offset we need to resume at\n girder.restRequest({\n path: 'file/offset',\n type: 'GET',\n data: {\n uploadId: this.resumeInfo.uploadId\n },\n error: null\n }).done(_.bind(function (resp) {\n this.startByte = resp.offset;\n this._uploadChunk(this.resumeInfo.file, this.resumeInfo.uploadId);\n }, this)).error(_.bind(function (resp) {\n var msg;\n\n if (resp.status === 0) {\n msg = 'Could not connect to the server.';\n } else {\n msg = 'An error occurred when resuming upload, check console.';\n }\n this.trigger('g:upload.error', {\n message: msg,\n response: resp\n });\n }, this));\n },\n\n abortUpload: function () {\n if (!this.resumeInfo || !this.resumeInfo.uploadId) {\n return;\n }\n girder.restRequest({\n path: 'system/uploads',\n type: 'DELETE',\n data: {\n uploadId: this.resumeInfo.uploadId\n },\n error: null,\n done: null\n });\n },\n\n _uploadChunk: function (file, uploadId) {\n var endByte = Math.min(this.startByte + girder.UPLOAD_CHUNK_SIZE,\n file.size);\n\n this.chunkLength = endByte - this.startByte;\n var sliceFn = file.webkitSlice ? 'webkitSlice' : 'slice';\n var blob = file[sliceFn](this.startByte, endByte);\n var model = this;\n\n var fd = new FormData();\n fd.append('offset', this.startByte);\n fd.append('uploadId', uploadId);\n fd.append('chunk', blob);\n\n girder._uploadId = uploadId;\n\n girder.restRequest({\n path: 'file/chunk',\n type: 'POST',\n dataType: 'json',\n data: fd,\n contentType: false,\n processData: false,\n success: function (resp) {\n model.trigger('g:upload.chunkSent', {\n bytes: endByte - model.startByte\n });\n\n if (endByte === file.size) {\n model.startByte = 0;\n model.resumeInfo = null;\n model.set(resp);\n model.trigger('g:upload.complete');\n } else {\n model.startByte = endByte;\n model._uploadChunk(file, uploadId);\n }\n },\n error: function (resp) {\n var text = 'Error: ', identifier;\n\n if (resp.status === 0) {\n text += 'Connection to the server interrupted.';\n } else {\n text += resp.responseJSON.message;\n identifier = resp.responseJSON.identifier;\n }\n\n model.resumeInfo = {\n uploadId: uploadId,\n file: file\n };\n\n model.trigger('g:upload.error', {\n message: text,\n identifier: identifier,\n response: resp\n });\n },\n xhr: function () {\n // Custom XHR so we can register a progress handler\n var xhr = new window.XMLHttpRequest();\n xhr.upload.addEventListener('progress', function (e) {\n model._uploadProgress(file, e);\n });\n return xhr;\n }\n });\n },\n\n /**\n * Progress callback from XHR during upload. This will trigger useful\n * progress events under the 'upload.progress' tag.\n */\n _uploadProgress: function (file, event) {\n if (!event.lengthComputable) {\n return;\n }\n\n // We only want to count bytes of the actual file, not the bytes of\n // the request body corresponding to the other form parameters model\n // we are also sending.\n var loaded = this.chunkLength + event.loaded - event.total;\n\n if (loaded >= 0) {\n this.trigger('g:upload.progress', {\n startByte: this.startByte,\n loaded: loaded,\n total: file.size,\n file: file\n });\n }\n }\n});\n","girder.models.FolderModel = girder.AccessControlledModel.extend({\n resourceName: 'folder'\n});\n\n_.extend(girder.models.FolderModel.prototype, girder.models.MetadataMixin);\n","girder.models.GroupModel = girder.AccessControlledModel.extend({\n resourceName: 'group',\n\n /**\n * Send an invitation to this group to the user identified by userId.\n * Requires moderator (write) access on the group.\n * @param userId The ID of the user to invite.\n * @param accessType The access level to invite them as.\n * @param request Set to true if this is accepting a user's request to join.\n * @param [params] Additional parameters to pass with the request.\n */\n sendInvitation: function (userId, accessType, request, params) {\n params = params || {};\n girder.restRequest({\n path: this.resourceName + '/' + this.get('_id') + '/invitation',\n data: _.extend({\n userId: userId,\n level: accessType\n }, params),\n type: 'POST',\n error: null\n }).done(_.bind(function (resp) {\n this.set(resp);\n\n if (!request && userId === girder.currentUser.get('_id')) {\n if (params.force) {\n girder.currentUser.addToGroup(this.get('_id'));\n } else {\n girder.currentUser.addInvitation(this.get('_id'), accessType);\n }\n }\n this.trigger('g:invited');\n }, this)).error(_.bind(function (err) {\n this.trigger('g:error', err);\n }, this));\n },\n\n /**\n * Accept an invitation to join a group. Only call this if the user has\n * already been invited to the group.\n */\n joinGroup: function () {\n girder.restRequest({\n path: this.resourceName + '/' + this.get('_id') + '/member',\n type: 'POST'\n }).done(_.bind(function (resp) {\n girder.currentUser.addToGroup(this.get('_id'));\n girder.currentUser.removeInvitation(this.get('_id'));\n\n this.set(resp);\n\n this.trigger('g:joined');\n }, this)).error(_.bind(function (err) {\n this.trigger('g:error', err);\n }, this));\n },\n\n /**\n * This will create an invitation request on this group for the current\n * user. Requires read access on the group. If the user already has an\n * outstanding invitation to this group, call joinGroup instead.\n */\n requestInvitation: function () {\n girder.restRequest({\n path: this.resourceName + '/' + this.get('_id') + '/member',\n type: 'POST'\n }).done(_.bind(function (resp) {\n this.set(resp);\n\n this.trigger('g:inviteRequested');\n }, this)).error(_.bind(function (err) {\n this.trigger('g:error', err);\n }, this));\n },\n\n /**\n * Promote a user to moderator or administrator. Requires admin access\n * on the group.\n * @param user The user model of the user being promoted\n * @param level The AccessLevel (WRITE or ADMIN) to promote to\n */\n promoteUser: function (user, level) {\n var role;\n if (level === girder.AccessType.WRITE) {\n role = 'moderator';\n } else if (level === girder.AccessType.ADMIN) {\n role = 'admin';\n }\n girder.restRequest({\n path: this.resourceName + '/' + this.get('_id') + '/' + role,\n data: {\n userId: user.get('_id')\n },\n type: 'POST'\n }).done(_.bind(function (resp) {\n this.set(resp);\n\n this.trigger('g:promoted');\n }, this)).error(_.bind(function (err) {\n this.trigger('g:error', err);\n }, this));\n },\n\n /**\n * Demote a user to ordinary member status. Requires admin access on the\n * group.\n * @param userId The id of the user to demote.\n * @param level The current access level of the user.\n */\n demoteUser: function (userId, level) {\n var role;\n if (level === girder.AccessType.WRITE) {\n role = 'moderator';\n } else if (level === girder.AccessType.ADMIN) {\n role = 'admin';\n }\n girder.restRequest({\n path: this.resourceName + '/' + this.get('_id') + '/' + role +\n '?userId=' + userId,\n type: 'DELETE'\n }).done(_.bind(function (resp) {\n this.set(resp);\n\n this.trigger('g:demoted');\n }, this)).error(_.bind(function (err) {\n this.trigger('g:error', err);\n }, this));\n },\n\n /**\n * Remove a member of a group, or if the user is not already a member,\n * this will simply delete any outstanding membership request or\n * invitation for this user.\n * @param userId The ID of the user to remove.\n */\n removeMember: function (userId) {\n girder.restRequest({\n path: this.resourceName + '/' + this.get('_id') +\n '/member?userId=' + userId,\n type: 'DELETE'\n }).done(_.bind(function (resp) {\n if (userId === girder.currentUser.get('_id')) {\n girder.currentUser.removeFromGroup(this.get('_id'));\n }\n\n this.set(resp);\n\n this.trigger('g:removed');\n }, this)).error(_.bind(function (err) {\n this.trigger('g:error', err);\n }, this));\n },\n\n /* Check if the current user has the authority in this group to directly\n * add members.\n *\n * @returns: true if adding members is allowed.\n */\n mayAddMembers: function () {\n if (girder.currentUser.get('admin')) {\n return true;\n }\n var groupAddAllowed;\n var addToGroupPolicy = this.get('_addToGroupPolicy');\n if (addToGroupPolicy === 'nomod' || addToGroupPolicy === 'yesmod') {\n groupAddAllowed = 'mod';\n } else if (addToGroupPolicy === 'noadmin' || addToGroupPolicy === 'yesadmin') {\n groupAddAllowed = 'admin';\n } else {\n return false;\n }\n var addAllowed = this.get('addAllowed') || '';\n if (addAllowed === 'no' || (addToGroupPolicy.substr(0, 3) !== 'yes' &&\n addAllowed.substr(0, 3) !== 'yes')) {\n return false;\n }\n if (addAllowed === 'yesadmin') {\n groupAddAllowed = 'admin';\n }\n if (groupAddAllowed === 'admin' &&\n this.get('_accessLevel') >= girder.AccessType.ADMIN) {\n return true;\n }\n if (groupAddAllowed === 'mod' &&\n this.get('_accessLevel') >= girder.AccessType.WRITE) {\n return true;\n }\n return false;\n }\n});\n","girder.models.ItemModel = girder.Model.extend({\n resourceName: 'item',\n\n /**\n * Get the access level of the item if it is set. Takes an optional callback\n * to be called once the access level is fetched (or immediately if it has\n * already been fetched).\n */\n getAccessLevel: function (callback) {\n callback = callback || $.noop;\n\n if (this.has('_accessLevel')) {\n callback(this.get('_accessLevel'));\n return this.get('_accessLevel');\n }\n if (this.parent && this.parent.getAccessLevel()) {\n this.set('_accessLevel', this.parent.getAccessLevel());\n callback(this.get('_accessLevel'));\n return this.get('_accessLevel');\n } else {\n this.parent = new girder.models.FolderModel();\n this.parent.set({\n _id: this.get('folderId')\n }).once('g:fetched', function () {\n this.set('_accessLevel', this.parent.getAccessLevel());\n callback(this.get('_accessLevel'));\n }, this).fetch();\n }\n },\n\n /**\n * Get the path to the root of the hierarchy\n */\n getRootPath: function (callback) {\n girder.restRequest({\n path: this.resourceName + '/' + this.get('_id') + '/rootpath'\n }).done(_.bind(function (resp) {\n callback(resp);\n }, this)).error(_.bind(function (err) {\n this.trigger('g:error', err);\n }, this));\n }\n});\n\n_.extend(girder.models.ItemModel.prototype, girder.models.MetadataMixin);\n","girder.models.UserModel = girder.Model.extend({\n resourceName: 'user',\n\n /**\n * Calling this function mutates the model in one of two ways: (1) if a user\n * is currently logged into Girder, the model will reflect that user; (2) if\n * no user is logged in, the model will become clear. To know which path\n * occurred, you can call this method, then install a one-time event handler\n * for the model's change event. In that handler, calling isNew() on the\n * model will tell if you if a user is logged in (false) or not (true).\n *\n * This is equivalent to invoking girder.fetchCurrentUser(), then calling\n * clear() or set() on the model depending on whether the result of the call\n * is null or not.\n */\n current: function () {\n girder.fetchCurrentUser()\n .then(_.bind(function (user) {\n if (user) {\n this.set(user);\n } else {\n this.clear();\n }\n }, this));\n },\n\n name: function () {\n return this.get('firstName') + ' ' + this.get('lastName');\n },\n\n /**\n * When this user is added to a group, call this on the user model.\n */\n addToGroup: function (groupId) {\n var groups = this.get('groups') || [];\n groups.push(groupId);\n this.set('groups', groups);\n },\n\n /**\n * When this user is removed from a group, call this on the user model.\n */\n removeFromGroup: function (groupId) {\n var groups = this.get('groups') || [];\n var index = groups.indexOf(groupId);\n\n while (index >= 0) {\n groups.splice(index, 1);\n index = groups.indexOf(groupId);\n }\n\n this.set('groups', groups);\n },\n\n /**\n * When this user is invited to a group, call this on the user model.\n */\n addInvitation: function (groupId, level) {\n var invites = this.get('groupInvites') || [];\n invites.push({\n groupId: groupId,\n level: level\n });\n\n this.set('groupInvites', invites);\n },\n\n /**\n * When this user's invitation is deleted, either by joining the group or\n * having the invitation deleted manually, this should be called on the user\n * model.\n */\n removeInvitation: function (groupId) {\n var invites = this.get('groupInvites') || [];\n var filtered = [];\n\n _.each(invites, function (invite) {\n if (invite.groupId !== groupId) {\n filtered.push(invite);\n }\n }, this);\n\n this.set('groupInvites', filtered);\n },\n\n /**\n * Change the password for this user.\n */\n changePassword: function (oldPassword, newPassword) {\n girder.restRequest({\n path: this.resourceName + '/password',\n data: {\n old: oldPassword,\n new: newPassword\n },\n type: 'PUT',\n error: null\n }).done(_.bind(function () {\n this.trigger('g:passwordChanged');\n }, this)).error(_.bind(function (err) {\n this.trigger('g:error', err);\n }, this));\n },\n\n /**\n * Change the password for another user (as an admin).\n */\n adminChangePassword: function (newPassword) {\n girder.restRequest({\n path: this.resourceName + '/' + this.id + '/password',\n data: {\n password: newPassword\n },\n type: 'PUT',\n error: null\n }).done(_.bind(function () {\n this.trigger('g:passwordChanged');\n }, this)).error(_.bind(function (err) {\n this.trigger('g:error', err);\n }, this));\n }\n});\n","girder.collections.AssetstoreCollection = girder.Collection.extend({\n resourceName: 'assetstore',\n model: girder.models.AssetstoreModel\n});\n","girder.collections.CollectionCollection = girder.Collection.extend({\n resourceName: 'collection',\n model: girder.models.CollectionModel\n});\n","girder.collections.FileCollection = girder.Collection.extend({\n resourceName: 'file',\n\n model: girder.models.FileModel,\n\n pageLimit: 100\n});\n","girder.collections.FolderCollection = girder.Collection.extend({\n resourceName: 'folder',\n model: girder.models.FolderModel,\n\n pageLimit: 100\n});\n","girder.collections.GroupCollection = girder.Collection.extend({\n resourceName: 'group',\n model: girder.models.GroupModel\n});\n","girder.collections.ItemCollection = girder.Collection.extend({\n resourceName: 'item',\n model: girder.models.ItemModel,\n\n pageLimit: 100\n});\n","girder.collections.UserCollection = girder.Collection.extend({\n resourceName: 'user',\n model: girder.models.UserModel,\n\n // Override default sort field\n sortField: 'lastName',\n secondarySortField: 'firstName'\n});\n","/**\n * This view shows the admin console, which links to all available admin pages.\n */\ngirder.views.AdminView = girder.View.extend({\n events: {\n 'click .g-server-config': function () {\n girder.router.navigate('settings', {trigger: true});\n },\n 'click .g-assetstore-config': function () {\n girder.router.navigate('assetstores', {trigger: true});\n },\n 'click .g-plugins-config': function () {\n girder.router.navigate('plugins', {trigger: true});\n }\n },\n\n initialize: function () {\n girder.cancelRestRequests('fetch');\n this.render();\n },\n\n render: function () {\n if (!girder.currentUser || !girder.currentUser.get('admin')) {\n this.$el.text('Must be logged in as admin to view this page.');\n return;\n }\n this.$el.html(girder.templates.adminConsole());\n\n return this;\n }\n});\n\ngirder.router.route('admin', 'admin', function () {\n girder.events.trigger('g:navigateTo', girder.views.AdminView);\n});\n","/**\n * This view shows the admin console, which links to all available admin pages.\n */\ngirder.views.AssetstoresView = girder.View.extend({\n events: {\n 'click .g-set-current': 'setCurrentAssetstore',\n 'click .g-delete-assetstore': 'deleteAssetstore',\n 'click .g-edit-assetstore': 'editAssetstore'\n },\n\n initialize: function (settings) {\n girder.cancelRestRequests('fetch');\n this.assetstoreEdit = settings.assetstoreEdit || false;\n this.importableTypes = [\n girder.AssetstoreType.FILESYSTEM,\n girder.AssetstoreType.S3\n ].concat(settings.importableTypes || []);\n\n this.newAssetstoreWidget = new girder.views.NewAssetstoreWidget({\n parentView: this\n }).on('g:created', this.addAssetstore, this);\n\n // Fetch all of the current assetstores\n this.collection = new girder.collections.AssetstoreCollection();\n this.collection.on('g:changed', function () {\n this.render();\n }, this).fetch();\n },\n\n render: function () {\n if (!girder.currentUser || !girder.currentUser.get('admin')) {\n this.$el.text('Must be logged in as admin to view this page.');\n return;\n }\n this.$el.html(girder.templates.assetstores({\n assetstores: this.collection.toArray(),\n types: girder.AssetstoreType,\n importableTypes: this.importableTypes,\n getAssetstoreImportRoute: this.getAssetstoreImportRoute\n }));\n\n this.newAssetstoreWidget.setElement(this.$('#g-new-assetstore-container')).render();\n this.$('.g-assetstore-button-container[title]').tooltip();\n\n _.each(this.$('.g-assetstore-capacity-chart'),\n this.capacityChart, this);\n\n if (this.assetstoreEdit) {\n this.editAssetstoreDialog(this.assetstoreEdit);\n this.assetstoreEdit = false;\n }\n\n return this;\n },\n\n addAssetstore: function (assetstore) {\n this.collection.add(assetstore);\n this.render();\n },\n\n /**\n * Renders the capacities of the assetstores in a pie chart using Chart.js.\n * @param el The canvas element to render in.\n */\n capacityChart: function (el) {\n var assetstore = this.collection.get($(el).attr('cid'));\n var capacity = assetstore.get('capacity');\n var used = capacity.total - capacity.free;\n var data = [\n ['Used (' + girder.formatSize(used) + ')', used],\n ['Free (' + girder.formatSize(capacity.free) + ')', capacity.free]\n ];\n $(el).jqplot([data], {\n seriesDefaults: {\n renderer: $.jqplot.PieRenderer,\n rendererOptions: {\n sliceMargin: 2,\n shadow: false,\n highlightMouseOver: false,\n showDataLabels: true,\n padding: 5,\n startAngle: 180\n }\n },\n legend: {\n show: true,\n location: 'e',\n background: 'transparent',\n border: 'none'\n },\n grid: {\n background: 'transparent',\n border: 'none',\n borderWidth: 0,\n shadow: false\n },\n gridPadding: {top: 10, right: 10, bottom: 10, left: 10}\n });\n },\n\n setCurrentAssetstore: function (evt) {\n var el = $(evt.currentTarget);\n var assetstore = this.collection.get(el.attr('cid'));\n assetstore.set({current: true});\n assetstore.off('g:saved').on('g:saved', function () {\n girder.events.trigger('g:alert', {\n icon: 'ok',\n text: 'Changed current assetstore.',\n type: 'success',\n timeout: 4000\n });\n this.collection.fetch({}, true);\n }, this).off('g:error').on('g:error', function (err) {\n girder.events.trigger('g:alert', {\n icon: 'cancel',\n text: err.responseJSON.message,\n type: 'danger'\n });\n }).save();\n },\n\n deleteAssetstore: function (evt) {\n var el = $(evt.currentTarget);\n var assetstore = this.collection.get(el.attr('cid'));\n\n girder.confirm({\n text: 'Are you sure you want to delete the assetstore ' +\n assetstore.escape('name') + '? There are no files ' +\n 'stored in it, and no data will be lost.',\n escapedHtml: true,\n yesText: 'Delete',\n confirmCallback: _.bind(function () {\n assetstore.on('g:deleted', function () {\n girder.events.trigger('g:alert', {\n icon: 'ok',\n text: 'Assetstore deleted.',\n type: 'success',\n timeout: 4000\n });\n this.collection.fetch({}, true);\n }, this).off('g:error').on('g:error', function (resp) {\n girder.events.trigger('g:alert', {\n icon: 'attention',\n text: resp.responseJSON.message,\n type: 'danger',\n timeout: 4000\n });\n }, this).destroy();\n }, this)\n });\n },\n\n editAssetstore: function (evt) {\n var cid = $(evt.currentTarget).attr('cid');\n this.editAssetstoreDialog(cid);\n },\n\n editAssetstoreDialog: function (cid) {\n var assetstore = this.collection.get(cid);\n var container = $('#g-dialog-container');\n\n var editAssetstoreWidget = new girder.views.EditAssetstoreWidget({\n el: container,\n model: assetstore,\n parentView: this\n }).off('g:saved').on('g:saved', function () {\n this.render();\n }, this);\n editAssetstoreWidget.render();\n }\n});\n\n/**\n * This data structure is a dynamic way to map assetstore types to the views\n * that should be rendered to import data into them.\n */\ngirder.assetstoreImportViewMap = {};\ngirder.assetstoreImportViewMap[girder.AssetstoreType.FILESYSTEM] = 'FilesystemImportView';\ngirder.assetstoreImportViewMap[girder.AssetstoreType.S3] = 'S3ImportView';\n\ngirder.router.route('assetstores', 'assetstores', function (params) {\n girder.events.trigger('g:navigateTo', girder.views.AssetstoresView, {\n assetstoreEdit: params.dialog === 'assetstoreedit'\n ? params.dialogid : false\n });\n});\n\ngirder.router.route('assetstore/:id/import', 'assetstoreImport', function (assetstoreId) {\n var assetstore = new girder.models.AssetstoreModel({\n _id: assetstoreId\n });\n\n assetstore.once('g:fetched', function () {\n var viewName = girder.assetstoreImportViewMap[assetstore.get('type')],\n view = girder.views[viewName];\n\n if (!view) {\n throw 'No such view: ' + viewName;\n }\n girder.events.trigger('g:navigateTo', view, {\n assetstore: assetstore\n });\n }).fetch();\n});\n","(function () {\n /**\n * This view shows a single collection's page.\n */\n girder.views.CollectionView = girder.View.extend({\n events: {\n 'click .g-edit-collection': 'editCollection',\n 'click .g-collection-access-control': 'editAccess',\n 'click .g-delete-collection': function () {\n girder.confirm({\n text: 'Are you sure you want to delete the collection ' +\n this.model.escape('name') + '?',\n yesText: 'Delete',\n escapedHtml: true,\n confirmCallback: _.bind(function () {\n this.model.destroy().on('g:deleted', function () {\n girder.events.trigger('g:alert', {\n icon: 'ok',\n text: 'Collection deleted.',\n type: 'success',\n timeout: 4000\n });\n girder.router.navigate('collections', {trigger: true});\n });\n }, this)\n });\n }\n },\n\n initialize: function (settings) {\n girder.cancelRestRequests('fetch');\n\n this.upload = settings.upload || false;\n this.access = settings.access || false;\n this.edit = settings.edit || false;\n this.folderAccess = settings.folderAccess || false;\n this.folderCreate = settings.folderCreate || false;\n this.folderEdit = settings.folderEdit || false;\n this.itemCreate = settings.itemCreate || false;\n\n // If collection model is already passed, there is no need to fetch.\n if (settings.collection) {\n this.model = settings.collection;\n\n if (settings.folderId) {\n this.folder = new girder.models.FolderModel();\n this.folder.set({\n _id: settings.folderId\n }).on('g:fetched', function () {\n this._createHierarchyWidget();\n this.render();\n }, this).on('g:error', function () {\n this.folder = null;\n this._createHierarchyWidget();\n this.render();\n }, this).fetch();\n } else {\n this._createHierarchyWidget();\n this.render();\n }\n } else if (settings.id) {\n this.model = new girder.models.CollectionModel();\n this.model.set('_id', settings.id);\n\n this.model.on('g:fetched', function () {\n this._createHierarchyWidget();\n this.render();\n }, this).fetch();\n }\n },\n\n _createHierarchyWidget: function () {\n this.hierarchyWidget = new girder.views.HierarchyWidget({\n parentModel: this.folder || this.model,\n upload: this.upload,\n folderAccess: this.folderAccess,\n folderEdit: this.folderEdit,\n folderCreate: this.folderCreate,\n itemCreate: this.itemCreate,\n parentView: this\n }).on('g:setCurrentModel', function () {\n // When a user descends into the hierarchy, hide the collection\n // actions list to avoid confusion.\n this.$('.g-collection-header .g-collection-actions-button').hide();\n }, this);\n },\n\n editCollection: function () {\n var container = $('#g-dialog-container');\n\n if (!this.editCollectionWidget) {\n this.editCollectionWidget = new girder.views.EditCollectionWidget({\n el: container,\n model: this.model,\n parentView: this\n }).on('g:saved', function () {\n this.render();\n }, this);\n }\n this.editCollectionWidget.render();\n },\n\n render: function () {\n this.$el.html(girder.templates.collectionPage({\n collection: this.model,\n girder: girder\n }));\n\n this.hierarchyWidget.setElement(\n this.$('.g-collection-hierarchy-container')).render();\n\n this.upload = false;\n this.folderAccess = false;\n this.folderEdit = false;\n this.folderCreate = false;\n this.itemCreate = false;\n\n this.$('.g-collection-actions-button').tooltip({\n container: 'body',\n placement: 'left',\n animation: false,\n delay: {show: 100}\n });\n\n if (this.edit) {\n this.editCollection();\n } else if (this.access) {\n this.editAccess();\n }\n\n return this;\n },\n\n editAccess: function () {\n new girder.views.AccessWidget({\n el: $('#g-dialog-container'),\n modelType: 'collection',\n model: this.model,\n parentView: this\n }).on('g:accessListSaved', function (params) {\n if (params.recurse) {\n this.hierarchyWidget.refreshFolderList();\n }\n }, this);\n }\n });\n\n /**\n * Helper function for fetching the user and rendering the view with\n * an arbitrary set of extra parameters.\n */\n var _fetchAndInit = function (collectionId, params) {\n var collection = new girder.models.CollectionModel();\n collection.set({\n _id: collectionId\n }).on('g:fetched', function () {\n girder.events.trigger('g:navigateTo', girder.views.CollectionView, _.extend({\n collection: collection\n }, params || {}));\n }, this).fetch();\n };\n\n girder.router.route('collection/:id', 'collectionAccess', function (collectionId, params) {\n _fetchAndInit(collectionId, {\n access: params.dialog === 'access',\n edit: params.dialog === 'edit',\n folderCreate: params.dialog === 'foldercreate',\n dialog: params.dialog\n });\n });\n\n girder.router.route('collection/:id/folder/:id', 'collectionFolder',\n function (collectionId, folderId, params) {\n _fetchAndInit(collectionId, {\n folderId: folderId,\n upload: params.dialog === 'upload',\n access: params.dialog === 'access',\n edit: params.dialog === 'edit',\n folderAccess: params.dialog === 'folderaccess',\n folderCreate: params.dialog === 'foldercreate',\n folderEdit: params.dialog === 'folderedit',\n itemCreate: params.dialog === 'itemcreate'\n });\n });\n}());\n","/**\n * This view lists the collections.\n */\ngirder.views.CollectionsView = girder.View.extend({\n events: {\n 'click a.g-collection-link': function (event) {\n var cid = $(event.currentTarget).attr('g-collection-cid');\n girder.router.navigate('collection/' + this.collection.get(cid).id, {trigger: true});\n },\n 'click button.g-collection-create-button': 'createCollectionDialog',\n 'submit .g-collections-search-form': function (event) {\n event.preventDefault();\n }\n },\n\n initialize: function (settings) {\n girder.cancelRestRequests('fetch');\n this.collection = new girder.collections.CollectionCollection();\n this.collection.on('g:changed', function () {\n this.render();\n }, this).fetch();\n\n this.paginateWidget = new girder.views.PaginateWidget({\n collection: this.collection,\n parentView: this\n });\n\n this.searchWidget = new girder.views.SearchFieldWidget({\n placeholder: 'Search collections...',\n types: ['collection'],\n parentView: this\n }).on('g:resultClicked', this._gotoCollection, this);\n\n this.create = settings.dialog === 'create';\n },\n\n /**\n * Prompt the user to create a new collection\n */\n createCollectionDialog: function () {\n var container = $('#g-dialog-container');\n\n new girder.views.EditCollectionWidget({\n el: container,\n parentView: this\n }).on('g:saved', function (collection) {\n girder.router.navigate('collection/' + collection.get('_id'),\n {trigger: true});\n }, this).render();\n },\n\n render: function () {\n this.$el.html(girder.templates.collectionList({\n collections: this.collection.toArray(),\n girder: girder\n }));\n\n this.paginateWidget.setElement(this.$('.g-collection-pagination')).render();\n this.searchWidget.setElement(this.$('.g-collections-search-container')).render();\n\n if (this.create) {\n this.createCollectionDialog();\n }\n\n return this;\n },\n\n /**\n * When the user clicks a search result collection, this helper method\n * will navigate them to the view for that specific collection.\n */\n _gotoCollection: function (result) {\n var collection = new girder.models.CollectionModel();\n collection.set('_id', result.id).on('g:fetched', function () {\n girder.router.navigate('/collection/' + collection.get('_id'), {trigger: true});\n }, this).fetch();\n }\n});\n\ngirder.router.route('collections', 'collections', function (params) {\n girder.events.trigger('g:navigateTo', girder.views.CollectionsView, params || {});\n girder.events.trigger('g:highlightItem', 'CollectionsView');\n});\n","girder.views.FilesystemImportView = girder.View.extend({\n events: {\n 'submit .g-filesystem-import-form': function (e) {\n e.preventDefault();\n\n var destId = this.$('#g-filesystem-import-dest-id').val().trim(),\n destType = this.$('#g-filesystem-import-dest-type').val();\n\n this.$('.g-validation-failed-message').empty();\n\n this.assetstore.off('g:imported').on('g:imported', function () {\n girder.router.navigate(destType + '/' + destId, {trigger: true});\n }, this).on('g:error', function (resp) {\n this.$('.g-validation-failed-message').text(resp.responseJSON.message);\n }, this).import({\n importPath: this.$('#g-filesystem-import-path').val().trim(),\n destinationId: destId,\n destinationType: destType,\n progress: true\n });\n }\n },\n\n initialize: function (settings) {\n this.assetstore = settings.assetstore;\n this.render();\n },\n\n render: function () {\n this.$el.html(girder.templates.filesystemImport({\n assetstore: this.assetstore\n }));\n }\n});\n","/**\n * This view shows a single folder as a hierarchy widget.\n */\ngirder.views.FolderView = girder.View.extend({\n initialize: function (settings) {\n girder.cancelRestRequests('fetch');\n this.folder = settings.folder;\n this.upload = settings.upload || false;\n this.folderAccess = settings.folderAccess || false;\n this.folderCreate = settings.folderCreate || false;\n this.folderEdit = settings.folderEdit || false;\n this.itemCreate = settings.itemCreate || false;\n\n this.hierarchyWidget = new girder.views.HierarchyWidget({\n parentModel: this.folder,\n upload: this.upload,\n folderAccess: this.folderAccess,\n folderEdit: this.folderEdit,\n folderCreate: this.folderCreate,\n itemCreate: this.itemCreate,\n parentView: this\n });\n\n this.render();\n },\n\n render: function () {\n this.hierarchyWidget.setElement(this.$el).render();\n return this;\n }\n});\n\ngirder.router.route('folder/:id', 'folder', function (id, params) {\n // Fetch the folder by id, then render the view.\n var folder = new girder.models.FolderModel();\n folder.set({\n _id: id\n }).on('g:fetched', function () {\n girder.events.trigger('g:navigateTo', girder.views.FolderView, _.extend({\n folder: folder,\n upload: params.dialog === 'upload',\n folderAccess: params.dialog === 'folderaccess',\n folderCreate: params.dialog === 'foldercreate',\n folderEdit: params.dialog === 'folderedit',\n itemCreate: params.dialog === 'itemcreate'\n }, params || {}));\n }, this).fetch();\n});\n","/**\n * This is the view for the front page of the app.\n */\ngirder.views.FrontPageView = girder.View.extend({\n events: {\n 'click .g-register-link': function () {\n girder.events.trigger('g:registerUi');\n },\n 'click .g-login-link': function () {\n girder.events.trigger('g:loginUi');\n },\n 'click .g-collections-link': function () {\n girder.router.navigate('collections', {trigger: true});\n },\n 'click .g-quicksearch-link': function () {\n $('.g-quick-search-container .g-search-field').focus();\n },\n 'click .g-my-account-link': function () {\n girder.router.navigate('useraccount/' + girder.currentUser.get('_id') +\n '/info', {trigger: true});\n },\n 'click .g-my-folders-link': function () {\n girder.router.navigate('user/' + girder.currentUser.get('_id'), {trigger: true});\n }\n },\n\n initialize: function () {\n girder.cancelRestRequests('fetch');\n this.render();\n },\n\n render: function () {\n this.$el.html(girder.templates.frontPage({\n apiRoot: girder.apiRoot,\n staticRoot: girder.staticRoot,\n currentUser: girder.currentUser,\n versionInfo: girder.versionInfo\n }));\n\n return this;\n }\n});\n\ngirder.router.route('', 'index', function () {\n girder.events.trigger('g:navigateTo', girder.views.FrontPageView);\n});\n","(function () {\n /**\n * This view shows a single group's page.\n */\n girder.views.GroupView = girder.View.extend({\n events: {\n 'click .g-edit-group': 'editGroup',\n 'click .g-group-join': 'joinGroup',\n 'click .g-group-leave': 'leaveGroup',\n 'click .g-group-delete': 'deleteGroup',\n 'click .g-group-request-invite': 'requestInvitation',\n 'click .g-group-request-accept': 'acceptMembershipRequest',\n 'click .g-group-request-deny': 'denyMembershipRequest',\n\n 'click #g-group-tab-pending a.g-member-name': function (e) {\n var userId = $(e.currentTarget).parents('li').attr('userid');\n girder.router.navigate('user/' + userId, {trigger: true});\n }\n },\n\n initialize: function (settings) {\n girder.cancelRestRequests('fetch');\n this.tab = settings.tab || 'roles';\n this.edit = settings.edit || false;\n\n // If group model is already passed, there is no need to fetch.\n if (settings.group) {\n this.model = settings.group;\n this.model.on('g:accessFetched', function () {\n this.render();\n }, this).fetchAccess();\n } else if (settings.id) {\n this.model = new girder.models.GroupModel();\n this.model.set('_id', settings.id);\n\n this.model.on('g:fetched', function () {\n this.model.on('g:accessFetched', function () {\n this.render();\n }, this).fetchAccess();\n }, this).fetch();\n }\n },\n\n editGroup: function () {\n var container = $('#g-dialog-container');\n\n if (!this.editGroupWidget) {\n this.editGroupWidget = new girder.views.EditGroupWidget({\n el: container,\n model: this.model,\n parentView: this\n }).off('g:saved').on('g:saved', function () {\n this.render();\n }, this);\n }\n this.editGroupWidget.render();\n },\n\n deleteGroup: function () {\n var view = this;\n girder.confirm({\n text: 'Are you sure you want to delete the group ' +\n view.model.escape('name') + '?',\n escapedHtml: true,\n confirmCallback: function () {\n view.model.on('g:deleted', function () {\n girder.router.navigate('groups', {trigger: true});\n }).destroy();\n }\n });\n },\n\n render: function () {\n this.isMember = false;\n this.isInvited = false;\n this.isRequested = false;\n this.isModerator = false;\n this.isAdmin = false;\n\n if (girder.currentUser) {\n _.every(girder.currentUser.get('groups'), function (groupId) {\n if (groupId === this.model.get('_id')) {\n this.isMember = true;\n return false; // 'break;'\n }\n return true;\n }, this);\n\n _.every(girder.currentUser.get('groupInvites'), function (inv) {\n if (inv.groupId === this.model.get('_id')) {\n this.isInvited = true;\n return false; // 'break;'\n }\n return true;\n }, this);\n\n _.every(this.model.get('requests') || [], function (user) {\n if (user.id === girder.currentUser.get('_id')) {\n this.isRequested = true;\n return false; // 'break;'\n }\n return true;\n }, this);\n }\n\n if (this.isMember) {\n _.every(this.model.get('access').users || [], function (access) {\n if (access.id === girder.currentUser.get('_id')) {\n if (access.level === girder.AccessType.WRITE) {\n this.isModerator = true;\n } else if (access.level === girder.AccessType.ADMIN) {\n this.isAdmin = true;\n }\n return false; // 'break';\n }\n return true;\n }, this);\n }\n this.$el.html(girder.templates.groupPage({\n group: this.model,\n girder: girder,\n isInvited: this.isInvited,\n isRequested: this.isRequested,\n isMember: this.isMember,\n isModerator: this.isModerator,\n isAdmin: this.isAdmin\n }));\n\n if (this.invitees) {\n this._renderInvitesWidget();\n } else {\n var container = this.$('.g-group-invites-body');\n new girder.views.LoadingAnimation({\n el: container,\n parentView: this\n }).render();\n\n this.invitees = new girder.collections.UserCollection();\n this.invitees.altUrl =\n 'group/' + this.model.get('_id') + '/invitation';\n var view = this;\n this.invitees.on('g:changed', function () {\n this._renderInvitesWidget();\n view.updatePendingStatus();\n }, this).fetch();\n }\n\n this._updateRolesLists();\n\n this.$('.g-group-actions-button,a[title]').tooltip({\n container: this.$el,\n placement: 'left',\n animation: false,\n delay: {show: 100}\n });\n this.$('.g-group-list-header[title]').tooltip({\n container: this.$el,\n placement: 'top',\n animation: false,\n delay: {show: 100}\n });\n\n girder.router.navigate('group/' + this.model.get('_id') + '/' +\n this.tab, {replace: true});\n\n if (this.edit) {\n if (this.model.get('_accessLevel') >= girder.AccessType.ADMIN) {\n this.editGroup();\n }\n this.edit = false;\n }\n\n _.each($('.g-group-tabs>li>a'), function (el) {\n var tabLink = $(el);\n var view = this;\n tabLink.tab().on('shown.bs.tab', function (e) {\n view.tab = $(e.currentTarget).attr('name');\n girder.router.navigate('group/' + view.model.get('_id') + '/' + view.tab);\n });\n\n if (tabLink.attr('name') === this.tab) {\n tabLink.tab('show');\n }\n }, this);\n\n return this;\n },\n\n _renderInvitesWidget: function () {\n new girder.views.GroupInvitesWidget({\n el: this.$('.g-group-invites-body'),\n invitees: this.invitees,\n group: this.model,\n parentView: this\n }).render();\n this.updatePendingStatus();\n },\n\n updatePendingStatus: function () {\n var count = this.invitees.length +\n this.model.get('requests').length;\n $('#g-group-tab-pending-status').text(' (' + count + ')');\n },\n\n joinGroup: function () {\n this.model.off('g:joined').on('g:joined', function () {\n this.invitees.fetch(null, true);\n }, this).joinGroup();\n },\n\n leaveGroup: function () {\n var view = this;\n girder.confirm({\n text: 'Are you sure you want to leave this group?',\n confirmCallback: function () {\n view.model.off('g:removed').on('g:removed', function () {\n view.render();\n }).removeMember(girder.currentUser.get('_id'));\n }\n });\n },\n\n removeMember: function (user) {\n var id = user;\n if ($.type(user) !== 'string') {\n id = user.get('_id');\n }\n this.model.off('g:removed').on('g:removed', function () {\n this.render();\n }, this).removeMember(id);\n },\n\n requestInvitation: function () {\n this.model.off('g:inviteRequested').on('g:inviteRequested', function () {\n this.render();\n }, this).requestInvitation();\n },\n\n acceptMembershipRequest: function (e) {\n var userId = $(e.currentTarget).parents('li').attr('userid');\n this.model.off('g:invited').on('g:invited', this.render, this)\n .sendInvitation(userId, girder.AccessType.READ, true);\n },\n\n denyMembershipRequest: function (e) {\n var userId = $(e.currentTarget).parents('li').attr('userid');\n this.model.off('g:removed').on('g:removed', this.render, this)\n .removeMember(userId);\n },\n\n _updateRolesLists: function () {\n var mods = [],\n admins = [];\n\n _.each(this.model.get('access').users, function (userAccess) {\n if (userAccess.level === girder.AccessType.WRITE) {\n mods.push(userAccess);\n } else if (userAccess.level === girder.AccessType.ADMIN) {\n admins.push(userAccess);\n }\n }, this);\n\n this.adminsWidget = new girder.views.GroupAdminsWidget({\n el: this.$('.g-group-admins-container'),\n group: this.model,\n admins: admins,\n parentView: this\n }).off().on('g:demoteUser', function (userId) {\n this.model.off('g:demoted').on('g:demoted', this.render, this)\n .demoteUser(userId, girder.AccessType.ADMIN);\n }, this).on('g:removeMember', this.removeMember, this)\n .on('g:moderatorAdded', this.render, this)\n .render();\n\n this.modsWidget = new girder.views.GroupModsWidget({\n el: this.$('.g-group-mods-container'),\n group: this.model,\n moderators: mods,\n parentView: this\n }).on('g:demoteUser', function (userId) {\n this.model.off('g:demoted').on('g:demoted', this.render, this)\n .demoteUser(userId, girder.AccessType.WRITE);\n }, this).on('g:removeMember', this.removeMember, this)\n .on('g:adminAdded', this.render, this)\n .render();\n\n this.membersWidget = new girder.views.GroupMembersWidget({\n el: this.$('.g-group-members-container'),\n group: this.model,\n admins: admins,\n moderators: mods,\n parentView: this\n }).on('g:sendInvite', function (params) {\n var opts = {\n force: params.force || false\n };\n this.model.off('g:invited').on('g:invited', function () {\n this.invitees.fetch(null, true);\n if (params.force) {\n this.model.fetchAccess();\n }\n }, this).off('g:error').on('g:error', function (err) {\n // TODO don't alert, show something useful\n alert(err.responseJSON.message);\n }, this).sendInvitation(params.user.id, params.level, false, opts);\n }, this).on('g:removeMember', this.removeMember, this)\n .on('g:moderatorAdded', this.render, this)\n .on('g:adminAdded', this.render, this);\n }\n });\n\n /**\n * Helper function for fetching the user and rendering the view with\n * an arbitrary set of extra parameters.\n */\n var _fetchAndInit = function (groupId, params) {\n var group = new girder.models.GroupModel();\n group.set({\n _id: groupId\n }).once('g:fetched', function () {\n girder.events.trigger('g:navigateTo', girder.views.GroupView, _.extend({\n group: group\n }, params || {}));\n }, this).fetch();\n };\n\n girder.router.route('group/:id', 'groupView', function (groupId, params) {\n _fetchAndInit(groupId, {\n edit: params.dialog === 'edit'\n });\n });\n\n girder.router.route('group/:id/:tab', 'groupView', function (groupId, tab, params) {\n _fetchAndInit(groupId, {\n edit: params.dialog === 'edit',\n tab: tab\n });\n });\n}());\n","/**\n * This view lists groups.\n */\ngirder.views.GroupsView = girder.View.extend({\n events: {\n 'click a.g-group-link': function (event) {\n var cid = $(event.currentTarget).attr('g-group-cid');\n girder.router.navigate('group/' + this.collection.get(cid).id, {trigger: true});\n },\n 'submit .g-group-search-form': function (event) {\n event.preventDefault();\n },\n 'click .g-group-create-button': function () {\n this.createGroupDialog();\n }\n },\n\n initialize: function (settings) {\n girder.cancelRestRequests('fetch');\n this.collection = new girder.collections.GroupCollection();\n this.collection.on('g:changed', function () {\n this.render();\n }, this).fetch();\n\n this.paginateWidget = new girder.views.PaginateWidget({\n collection: this.collection,\n parentView: this\n });\n\n this.searchWidget = new girder.views.SearchFieldWidget({\n placeholder: 'Search groups...',\n types: ['group'],\n parentView: this\n }).on('g:resultClicked', this._gotoGroup, this);\n\n this.create = settings.dialog === 'create';\n },\n\n render: function () {\n this.$el.html(girder.templates.groupList({\n groups: this.collection.toArray(),\n girder: girder\n }));\n\n this.paginateWidget.setElement(this.$('.g-group-pagination')).render();\n this.searchWidget.setElement(this.$('.g-groups-search-container')).render();\n\n if (this.create) {\n this.createGroupDialog();\n this.create = false;\n }\n\n return this;\n },\n\n /**\n * Prompt the user to create a new group\n */\n createGroupDialog: function () {\n new girder.views.EditGroupWidget({\n el: $('#g-dialog-container'),\n parentView: this\n }).off('g:saved').on('g:saved', function (group) {\n // Since the user has now joined this group, we can append its ID\n // to their groups list\n var userGroups = girder.currentUser.get('groups') || [];\n userGroups.push(group.get('_id'));\n girder.currentUser.set('groups', userGroups);\n\n girder.router.navigate('group/' + group.get('_id'), {trigger: true});\n }, this).render();\n },\n\n /**\n * When the user clicks a search result group, this helper method\n * will navigate them to the view for that group.\n */\n _gotoGroup: function (result) {\n var group = new girder.models.GroupModel();\n group.set('_id', result.id).on('g:fetched', function () {\n girder.router.navigate('group/' + group.get('_id'), {trigger: true});\n }, this).fetch();\n }\n\n});\n\ngirder.router.route('groups', 'groups', function (params) {\n girder.events.trigger('g:navigateTo', girder.views.GroupsView, params || {});\n girder.events.trigger('g:highlightItem', 'GroupsView');\n});\n","(function () {\n /**\n * This view shows a single item's page.\n */\n girder.views.ItemView = girder.View.extend({\n events: {\n 'click .g-edit-item': 'editItem',\n 'click .g-delete-item': 'deleteItem',\n 'click .g-upload-into-item': 'uploadIntoItem'\n },\n\n initialize: function (settings) {\n girder.cancelRestRequests('fetch');\n this.edit = settings.edit || false;\n this.fileEdit = settings.fileEdit || false;\n this.upload = settings.upload || false;\n\n // If collection model is already passed, there is no need to fetch.\n if (settings.item) {\n this.model = settings.item;\n this.render();\n } else {\n console.error('Implement fetch then render item');\n }\n },\n\n uploadIntoItem: function () {\n new girder.views.UploadWidget({\n el: $('#g-dialog-container'),\n parent: this.model,\n parentType: 'item',\n parentView: this\n }).on('g:uploadFinished', function () {\n girder.dialogs.handleClose('upload');\n this.upload = false;\n\n girder.events.trigger('g:alert', {\n icon: 'ok',\n text: 'Files added.',\n type: 'success',\n timeout: 4000\n });\n\n this.fileListWidget.collection.fetch(null, true);\n }, this).render();\n },\n\n editItem: function () {\n var container = $('#g-dialog-container');\n\n if (!this.editItemWidget) {\n this.editItemWidget = new girder.views.EditItemWidget({\n el: container,\n item: this.model,\n parentView: this\n }).off('g:saved').on('g:saved', function () {\n this.render();\n }, this);\n }\n this.editItemWidget.render();\n },\n\n deleteItem: function () {\n var folderId = this.model.get('folderId');\n var parentRoute = this.model.get('baseParentType') + '/' +\n this.model.get('baseParentId') + '/folder/' + folderId;\n var page = this;\n girder.confirm({\n text: 'Are you sure you want to delete ' + this.model.escape('name') + '?',\n yesText: 'Delete',\n escapedHtml: true,\n confirmCallback: _.bind(function () {\n this.model.destroy().on('g:deleted', function () {\n girder.router.navigate(parentRoute, {trigger: true});\n }).off('g:error').on('g:error', function () {\n page.render();\n girder.events.trigger('g:alert', {\n icon: 'cancel',\n text: 'Failed to delete item.',\n type: 'danger',\n timeout: 4000\n });\n });\n }, this)\n });\n },\n\n render: function () {\n // Fetch the access level asynchronously and render once we have\n // it. TODO: load the page and adjust only the action menu once\n // the access level is fetched.\n this.model.getAccessLevel(_.bind(function (accessLevel) {\n this.$el.html(girder.templates.itemPage({\n item: this.model,\n accessLevel: accessLevel,\n girder: girder\n }));\n\n this.$('.g-item-actions-button,.g-upload-into-item').tooltip({\n container: 'body',\n placement: 'left',\n animation: false,\n delay: {show: 100}\n });\n\n this.fileListWidget = new girder.views.FileListWidget({\n el: this.$('.g-item-files-container'),\n item: this.model,\n fileEdit: this.fileEdit,\n upload: this.upload,\n parentView: this\n });\n this.fileListWidget.once('g:changed', function () {\n this.trigger('g:rendered');\n }, this);\n\n this.fileEdit = false;\n this.upload = false;\n\n this.metadataWidget = new girder.views.MetadataWidget({\n el: this.$('.g-item-metadata'),\n item: this.model,\n accessLevel: accessLevel,\n parentView: this\n });\n\n this.model.getRootPath(_.bind(function (resp) {\n this.breadcrumbWidget = new girder.views.ItemBreadcrumbWidget({\n el: this.$('.g-item-breadcrumb-container'),\n parentChain: resp,\n parentView: this\n });\n }, this));\n\n if (this.edit) {\n this.editItem();\n this.edit = false;\n }\n }, this));\n\n return this;\n }\n });\n\n /**\n * Helper function for fetching the user and rendering the view with\n * an arbitrary set of extra parameters.\n */\n var _fetchAndInit = function (itemId, params) {\n var item = new girder.models.ItemModel();\n item.set({\n _id: itemId\n }).on('g:fetched', function () {\n girder.events.trigger('g:navigateTo', girder.views.ItemView, _.extend({\n item: item\n }, params || {}));\n }, this).fetch();\n };\n\n girder.router.route('item/:id', 'item', function (itemId, params) {\n _fetchAndInit(itemId, {\n edit: params.dialog === 'itemedit',\n fileEdit: params.dialog === 'fileedit' ? params.dialogid : false,\n upload: params.dialog === 'upload' ? params.dialogid : false\n });\n });\n}());\n","/**\n * This is the plugin management page for administrators.\n */\ngirder.views.PluginsView = girder.View.extend({\n events: {\n 'click a.g-plugin-config-link': function (evt) {\n var route = $(evt.currentTarget).attr('g-route');\n girder.router.navigate(route, {trigger: true});\n },\n 'click .g-plugin-restart-button': function () {\n var params = {\n text: 'Are you sure you want to restart the server? This ' +\n 'will interrupt all running tasks for all users.',\n yesText: 'Restart',\n confirmCallback: girder.restartServer\n };\n girder.confirm(params);\n }\n },\n\n initialize: function (settings) {\n girder.cancelRestRequests('fetch');\n if (settings.all && settings.enabled) {\n this.enabled = settings.enabled;\n this.allPlugins = settings.all;\n this.render();\n } else {\n // Fetch the plugin list\n girder.restRequest({\n path: 'system/plugins',\n type: 'GET'\n }).done(_.bind(function (resp) {\n this.enabled = resp.enabled;\n this.allPlugins = resp.all;\n this.render();\n }, this));\n }\n },\n\n render: function () {\n _.each(this.allPlugins, function (info, name) {\n info.unmetDependencies = this._unmetDependencies(info);\n if (!_.isEmpty(info.unmetDependencies)) {\n // Disable any plugins with unmet dependencies.\n this.enabled = _.without(this.enabled, name);\n }\n\n if (_.contains(this.enabled, name)) {\n info.enabled = true;\n info.configRoute = girder.getPluginConfigRoute(name);\n }\n }, this);\n\n this.$el.html(girder.templates.plugins({\n allPlugins: this._sortPlugins(this.allPlugins)\n }));\n\n var view = this;\n this.$('.g-plugin-switch').bootstrapSwitch({\n offText: ' '\n }).off('switchChange.bootstrapSwitch')\n .on('switchChange.bootstrapSwitch', function (event, state) {\n var plugin = $(event.currentTarget).attr('key');\n if (state === true) {\n view.enabled.push(plugin);\n } else {\n var idx;\n while ((idx = view.enabled.indexOf(plugin)) >= 0) {\n view.enabled.splice(idx, 1);\n }\n }\n girder.pluginsChanged = true;\n $('.g-plugin-restart').addClass('g-plugin-restart-show');\n view._updatePlugins();\n });\n this.$('.g-plugin-config-link').tooltip({\n container: this.$el,\n animation: false,\n placement: 'bottom',\n delay: {show: 100}\n });\n this.$('.g-experimental-notice').tooltip({\n container: this.$el,\n animation: false,\n delay: {show: 100}\n });\n if (girder.pluginsChanged) {\n $('.g-plugin-restart').addClass('g-plugin-restart-show');\n }\n\n return this;\n },\n\n /**\n * Takes a plugin object and determines if it has any top level\n * unmet dependencies.\n *\n * Given A depends on B, and B depends on C, and C is not present:\n * A will have unmet dependencies of ['B'], and B will have unmet dependencies\n * of ['C'].\n **/\n _unmetDependencies: function (plugin) {\n return _.reject(plugin.dependencies, function (pluginName) {\n return _.has(this.allPlugins, pluginName) &&\n _.isEmpty(this._unmetDependencies(this.allPlugins[pluginName]));\n }, this);\n },\n\n _sortPlugins: function (plugins) {\n /* Sort a dictionary of plugins alphabetically so that the appear in a\n * predictable order to the user.\n *\n * @param plugins: a dictionary to sort. Each entry has a .name\n * attribute used for sorting.\n * @returns sortedPlugins: the sorted list. */\n var sortedPlugins = [];\n _.each(plugins, function (value, key) {\n sortedPlugins.push({key: key, value: value});\n });\n sortedPlugins.sort(function (a, b) {\n return a.value.name.localeCompare(b.value.name);\n });\n return sortedPlugins;\n },\n\n _updatePlugins: function () {\n // Remove any missing plugins from the enabled list. Can happen\n // if the directory of an enabled plugin disappears.\n this.enabled = _.intersection(this.enabled, _.keys(this.allPlugins));\n\n girder.restRequest({\n path: 'system/plugins',\n type: 'PUT',\n data: {\n plugins: JSON.stringify(this.enabled)\n }\n }).done(_.bind(function (resp) {\n this.enabled = resp.value;\n\n _.each(this.enabled, function (plugin) {\n this.$('.g-plugin-switch[key=\"' + plugin + '\"]')\n .attr('checked', 'checked').bootstrapSwitch('state', true, true);\n }, this);\n }, this)); // TODO acknowledge?\n }\n});\n\ngirder.router.route('plugins', 'plugins', function () {\n // Fetch the plugin list\n girder.restRequest({\n path: 'system/plugins',\n type: 'GET'\n }).done(_.bind(function (resp) {\n girder.events.trigger('g:navigateTo', girder.views.PluginsView, resp);\n }, this)).error(_.bind(function () {\n girder.events.trigger('g:navigateTo', girder.views.UsersView);\n }, this));\n});\n","girder.views.S3ImportView = girder.View.extend({\n events: {\n 'submit .g-s3-import-form': function (e) {\n e.preventDefault();\n\n var destId = this.$('#g-s3-import-dest-id').val().trim(),\n destType = this.$('#g-s3-import-dest-type').val();\n\n this.$('.g-validation-failed-message').empty();\n\n this.assetstore.off('g:imported').on('g:imported', function () {\n girder.router.navigate(destType + '/' + destId, {trigger: true});\n }, this).on('g:error', function (resp) {\n this.$('.g-validation-failed-message').text(resp.responseJSON.message);\n }, this).import({\n importPath: this.$('#g-s3-import-path').val().trim(),\n destinationId: destId,\n destinationType: destType,\n progress: true\n });\n }\n },\n\n initialize: function (settings) {\n this.assetstore = settings.assetstore;\n this.render();\n },\n\n render: function () {\n this.$el.html(girder.templates.s3Import({\n assetstore: this.assetstore\n }));\n }\n});\n\n// This route is only preserved for backward compatibility. The generic route\n// \"assetstore/:id/import\" is preferred, and is defined in AssetstoresView.js.\ngirder.router.route('assetstore/:id/s3import', 's3Import', function (assetstoreId) {\n var assetstore = new girder.models.AssetstoreModel({\n _id: assetstoreId\n });\n\n assetstore.once('g:fetched', function () {\n girder.events.trigger('g:navigateTo', girder.views.S3ImportView, {\n assetstore: assetstore\n });\n }).fetch();\n});\n","/**\n * The system config page for administrators.\n */\ngirder.views.SystemConfigurationView = girder.View.extend({\n events: {\n 'submit .g-settings-form': function (event) {\n event.preventDefault();\n this.$('.g-submit-settings').addClass('disabled');\n this.$('#g-settings-error-message').empty();\n\n var settings = _.map(this.settingsKeys, function (key) {\n return {\n key: key,\n value: this.$('#g-' + key.replace(/[_.]/g, '-')).val() || null\n };\n }, this);\n\n girder.restRequest({\n type: 'PUT',\n path: 'system/setting',\n data: {\n list: JSON.stringify(settings)\n },\n error: null\n }).done(_.bind(function () {\n this.$('.g-submit-settings').removeClass('disabled');\n girder.events.trigger('g:alert', {\n icon: 'ok',\n text: 'Settings saved.',\n type: 'success',\n timeout: 4000\n });\n }, this)).error(_.bind(function (resp) {\n this.$('.g-submit-settings').removeClass('disabled');\n this.$('#g-settings-error-message').text(resp.responseJSON.message);\n }, this));\n },\n 'click .g-edit-collection-create-policy': function () {\n this.collectionCreateAccessWidget.render();\n }\n },\n\n initialize: function () {\n girder.cancelRestRequests('fetch');\n\n var keys = [\n 'core.cookie_lifetime',\n 'core.email_from_address',\n 'core.email_host',\n 'core.registration_policy',\n 'core.smtp_host',\n 'core.smtp.port',\n 'core.smtp.encryption',\n 'core.smtp.username',\n 'core.smtp.password',\n 'core.upload_minimum_chunk_size',\n 'core.cors.allow_origin',\n 'core.cors.allow_methods',\n 'core.cors.allow_headers',\n 'core.add_to_group_policy',\n 'core.collection_create_policy',\n 'core.user_default_folders'\n ];\n this.settingsKeys = keys;\n girder.restRequest({\n path: 'system/setting',\n type: 'GET',\n data: {\n list: JSON.stringify(keys),\n default: 'none'\n }\n }).done(_.bind(function (resp) {\n this.settings = resp;\n girder.restRequest({\n path: 'system/setting',\n type: 'GET',\n data: {\n list: JSON.stringify(keys),\n default: 'default'\n }\n }).done(_.bind(function (resp) {\n this.defaults = resp;\n this.render();\n }, this));\n }, this));\n },\n\n render: function () {\n this.$el.html(girder.templates.systemConfiguration({\n settings: this.settings,\n defaults: this.defaults,\n JSON: window.JSON\n }));\n\n this.$('input[title]').tooltip({\n container: this.$el,\n animation: false,\n delay: {show: 200}\n });\n\n this.searchWidget = new girder.views.SearchFieldWidget({\n el: this.$('.g-collection-create-policy-container .g-search-container'),\n parentView: this,\n types: ['user', 'group'],\n placeholder: 'Add a user or group...',\n settingValue: this.settings['core.collection_create_policy'] ||\n this.defaults['core.collection_create_policy']\n }).on('g:resultClicked', function (result) {\n var settingValue = null;\n\n try {\n settingValue = JSON.parse(this.$('#g-core-collection-create-policy').val());\n this.$('#g-settings-error-message').empty();\n } catch (err) {\n this.$('#g-settings-error-message').text('Collection creation policy must be a JSON object.');\n this.searchWidget.resetState();\n return this;\n }\n this.searchWidget.resetState();\n\n if (result.type === 'user') {\n settingValue.users = settingValue.users || [];\n if (!_.contains(settingValue.users, result.id)) {\n settingValue.users.push(result.id);\n } else {\n girder.events.trigger('g:alert', {\n icon: 'ok',\n text: 'User already exists in current policy.',\n type: 'warning',\n timeout: 4000\n });\n }\n } else if (result.type === 'group') {\n settingValue.groups = settingValue.groups || [];\n if (!_.contains(settingValue.groups, result.id)) {\n settingValue.groups.push(result.id);\n } else {\n girder.events.trigger('g:alert', {\n icon: 'ok',\n text: 'Group already exists in current policy.',\n type: 'warning',\n timeout: 4000\n });\n }\n }\n\n this.$('#g-core-collection-create-policy').val(\n JSON.stringify(settingValue, null, 4));\n }, this).render();\n\n return this;\n }\n});\n\ngirder.router.route('settings', 'settings', function () {\n girder.events.trigger('g:navigateTo', girder.views.SystemConfigurationView);\n});\n","/**\n * This is the view for the user account (profile) page.\n */\ngirder.views.UserAccountView = girder.View.extend({\n events: {\n 'submit #g-user-info-form': function (event) {\n event.preventDefault();\n this.$('#g-user-info-error-msg').empty();\n\n var params = {\n email: this.$('#g-email').val(),\n firstName: this.$('#g-firstName').val(),\n lastName: this.$('#g-lastName').val()\n };\n\n if (this.$('#g-admin').length > 0) {\n params.admin = this.$('#g-admin').is(':checked');\n }\n\n this.user.set(params);\n\n this.user.off('g:error').on('g:error', function (err) {\n var msg = err.responseJSON.message;\n this.$('#g-' + err.responseJSON.field).focus();\n this.$('#g-user-info-error-msg').text(msg);\n }, this).off('g:saved')\n .on('g:saved', function () {\n girder.events.trigger('g:alert', {\n icon: 'ok',\n text: 'Info saved.',\n type: 'success',\n timeout: 4000\n });\n }, this).save();\n },\n 'submit #g-password-change-form': function (event) {\n event.preventDefault();\n this.$('#g-password-change-error-msg').empty();\n\n if (this.$('#g-password-new').val() !==\n this.$('#g-password-retype').val()) {\n this.$('#g-password-change-error-msg').text(\n 'Passwords do not match, try again.'\n );\n this.$('#g-password-retype,#g-password-new').val('');\n this.$('#g-password-new').focus();\n return;\n }\n\n this.user.off('g:error').on('g:error', function (err) {\n var msg = err.responseJSON.message;\n this.$('#g-password-change-error-msg').text(msg);\n }, this).off('g:passwordChanged')\n .on('g:passwordChanged', function () {\n girder.events.trigger('g:alert', {\n icon: 'ok',\n text: 'Password changed.',\n type: 'success',\n timeout: 4000\n });\n this.$('#g-password-old,#g-password-new,#g-password-retype').val('');\n }, this);\n\n // here and in the template, an admin user who wants to change their\n // own password is intentionally forced to re-enter their old\n // password\n if (this.isCurrentUser) {\n this.user.changePassword(\n this.$('#g-password-old').val(),\n this.$('#g-password-new').val()\n );\n } else {\n this.user.adminChangePassword(this.$('#g-password-new').val());\n }\n }\n },\n\n initialize: function (settings) {\n this.tab = settings.tab || 'info';\n this.user = settings.user || girder.currentUser;\n this.isCurrentUser = girder.currentUser &&\n settings.user.get('_id') === girder.currentUser.get('_id');\n\n this.model = this.user;\n this.temporary = settings.temporary;\n\n if (!this.user ||\n this.user.getAccessLevel() < girder.AccessType.WRITE) {\n girder.router.navigate('users', {trigger: true});\n return;\n }\n\n girder.cancelRestRequests('fetch');\n this.render();\n },\n\n render: function () {\n if (girder.currentUser === null) {\n girder.router.navigate('users', {trigger: true});\n return;\n }\n\n this.$el.html(girder.templates.userSettings({\n user: this.model,\n isCurrentUser: this.isCurrentUser,\n girder: girder,\n temporaryToken: this.temporary\n }));\n\n _.each($('.g-account-tabs>li>a'), function (el) {\n var tabLink = $(el);\n var view = this;\n tabLink.tab().on('shown.bs.tab', function (e) {\n view.tab = $(e.currentTarget).attr('name');\n girder.router.navigate('useraccount/' +\n view.model.get('_id') + '/' + view.tab);\n });\n\n if (tabLink.attr('name') === this.tab) {\n tabLink.tab('show');\n }\n }, this);\n\n return this;\n }\n});\n\ngirder.router.route('useraccount/:id/:tab', 'accountTab', function (id, tab) {\n var user = new girder.models.UserModel();\n user.set({\n _id: id\n }).on('g:fetched', function () {\n girder.events.trigger('g:navigateTo', girder.views.UserAccountView, {\n user: user,\n tab: tab\n });\n }, this).on('g:error', function () {\n girder.router.navigate('users', {trigger: true});\n }, this).fetch();\n});\n\ngirder.router.route('useraccount/:id/token/:token', 'accountToken', function (id, token) {\n girder.restRequest({\n path: 'user/password/temporary/' + id,\n type: 'GET',\n data: {token: token},\n error: null\n }).done(_.bind(function (resp) {\n resp.user.token = resp.authToken.token;\n girder.eventStream.close();\n girder.currentUser = new girder.models.UserModel(resp.user);\n girder.eventStream.open();\n girder.events.trigger('g:login-changed');\n girder.events.trigger('g:navigateTo', girder.views.UserAccountView, {\n user: girder.currentUser,\n tab: 'password',\n temporary: token\n });\n }, this)).error(_.bind(function () {\n girder.router.navigate('users', {trigger: true});\n }, this));\n});\n","(function () {\n /**\n * This view shows a single user's page.\n */\n girder.views.UserView = girder.View.extend({\n events: {\n 'click a.g-edit-user': function () {\n var editUrl = 'useraccount/' + this.model.get('_id') + '/info';\n girder.router.navigate(editUrl, {trigger: true});\n },\n\n 'click a.g-delete-user': function () {\n girder.confirm({\n text: 'Are you sure you want to delete the user ' +\n this.model.escape('login') + '?',\n yesText: 'Delete',\n escapedHtml: true,\n confirmCallback: _.bind(function () {\n this.model.destroy().on('g:deleted', function () {\n girder.router.navigate('users', {trigger: true});\n });\n }, this)\n });\n }\n },\n\n initialize: function (settings) {\n girder.cancelRestRequests('fetch');\n this.folderId = settings.folderId || null;\n this.upload = settings.upload || false;\n this.folderAccess = settings.folderAccess || false;\n this.folderCreate = settings.folderCreate || false;\n this.folderEdit = settings.folderEdit || false;\n this.itemCreate = settings.itemCreate || false;\n\n if (settings.user) {\n this.model = settings.user;\n\n if (settings.folderId) {\n this.folder = new girder.models.FolderModel();\n this.folder.set({\n _id: settings.folderId\n }).on('g:fetched', function () {\n this._createHierarchyWidget();\n this.render();\n }, this).on('g:error', function () {\n this.folder = null;\n this._createHierarchyWidget();\n\n this.render();\n }, this).fetch();\n } else {\n this._createHierarchyWidget();\n this.render();\n }\n } else if (settings.id) {\n this.model = new girder.models.UserModel();\n this.model.set('_id', settings.id);\n\n this.model.on('g:fetched', function () {\n this._createHierarchyWidget();\n this.render();\n }, this).fetch();\n }\n },\n\n _createHierarchyWidget: function () {\n this.hierarchyWidget = new girder.views.HierarchyWidget({\n parentModel: this.folder || this.model,\n upload: this.upload,\n folderAccess: this.folderAccess,\n folderEdit: this.folderEdit,\n folderCreate: this.folderCreate,\n itemCreate: this.itemCreate,\n parentView: this\n });\n },\n\n render: function () {\n this.$el.html(girder.templates.userPage({\n user: this.model,\n girder: girder\n }));\n\n this.hierarchyWidget.setElement(this.$('.g-user-hierarchy-container')).render();\n\n this.upload = false;\n this.folderAccess = false;\n this.folderEdit = false;\n this.folderCreate = false;\n this.itemCreate = false;\n\n return this;\n }\n });\n\n /**\n * Helper function for fetching the user and rendering the view with\n * an arbitrary set of extra parameters.\n */\n var _fetchAndInit = function (userId, params) {\n var user = new girder.models.UserModel();\n user.set({\n _id: userId\n }).on('g:fetched', function () {\n girder.events.trigger('g:navigateTo', girder.views.UserView, _.extend({\n user: user\n }, params || {}));\n }, this).on('g:error', function () {\n girder.events.trigger('g:navigateTo', girder.views.UsersView);\n }, this).fetch();\n };\n\n girder.router.route('user/:id', 'user', function (userId, params) {\n _fetchAndInit(userId, {\n folderCreate: params.dialog === 'foldercreate',\n dialog: params.dialog\n });\n });\n\n girder.router.route('user/:id/folder/:id', 'userFolder', function (userId, folderId, params) {\n _fetchAndInit(userId, {\n folderId: folderId,\n upload: params.dialog === 'upload',\n folderAccess: params.dialog === 'folderaccess',\n folderCreate: params.dialog === 'foldercreate',\n folderEdit: params.dialog === 'folderedit',\n itemCreate: params.dialog === 'itemcreate'\n });\n });\n}());\n","/**\n * This view lists users.\n */\ngirder.views.UsersView = girder.View.extend({\n events: {\n 'click a.g-user-link': function (event) {\n var cid = $(event.currentTarget).attr('g-user-cid');\n girder.router.navigate('user/' + this.collection.get(cid).id, {trigger: true});\n },\n 'click button.g-user-create-button': 'createUserDialog',\n 'submit .g-user-search-form': function (event) {\n event.preventDefault();\n }\n },\n\n initialize: function (settings) {\n girder.cancelRestRequests('fetch');\n this.collection = new girder.collections.UserCollection();\n this.collection.on('g:changed', function () {\n this.render();\n }, this).fetch();\n\n this.paginateWidget = new girder.views.PaginateWidget({\n collection: this.collection,\n parentView: this\n });\n\n this.searchWidget = new girder.views.SearchFieldWidget({\n placeholder: 'Search users...',\n types: ['user'],\n modes: 'prefix',\n parentView: this\n }).on('g:resultClicked', this._gotoUser, this);\n\n this.register = settings.dialog === 'register' && girder.currentUser &&\n girder.currentUser.get('admin');\n },\n\n render: function () {\n this.$el.html(girder.templates.userList({\n users: this.collection.toArray(),\n girder: girder\n }));\n\n this.paginateWidget.setElement(this.$('.g-user-pagination')).render();\n this.searchWidget.setElement(this.$('.g-users-search-container')).render();\n\n if (this.register) {\n this.createUserDialog();\n }\n\n return this;\n },\n\n /**\n * When the user clicks a search result user, this helper method\n * will navigate them to the view for that specific user.\n */\n _gotoUser: function (result) {\n var user = new girder.models.UserModel();\n user.set('_id', result.id).on('g:fetched', function () {\n girder.router.navigate('user/' + user.get('_id'), {trigger: true});\n }, this).fetch();\n },\n\n createUserDialog: function () {\n var container = $('#g-dialog-container');\n\n new girder.views.RegisterView({\n el: container,\n parentView: this\n }).on('g:userCreated', function (info) {\n girder.router.navigate('user/' + info.user.id, {trigger: true});\n }, this).render();\n }\n});\n\ngirder.router.route('users', 'users', function (params) {\n girder.events.trigger('g:navigateTo', girder.views.UsersView, params || {});\n girder.events.trigger('g:highlightItem', 'UsersView');\n});\n","/**\n * This view shows the footer in the layout.\n */\ngirder.views.LayoutFooterView = girder.View.extend({\n render: function () {\n this.$el.html(girder.templates.layoutFooter({\n apiRoot: girder.apiRoot\n }));\n return this;\n }\n});\n","/**\n * This view shows a list of global navigation links that should be\n * displayed at all times.\n */\ngirder.views.LayoutGlobalNavView = girder.View.extend({\n events: {\n 'click .g-nav-link': function (event) {\n event.preventDefault(); // so we can keep the href\n\n var link = $(event.currentTarget);\n\n girder.router.navigate(link.attr('g-target'), {trigger: true});\n\n // Must call this after calling navigateTo, since that\n // deactivates all global nav links.\n link.parent().addClass('g-active');\n }\n },\n\n initialize: function (settings) {\n girder.events.on('g:highlightItem', this.selectForView, this);\n girder.events.on('g:login', this.render, this);\n girder.events.on('g:logout', this.render, this);\n girder.events.on('g:login-changed', this.render, this);\n\n settings = settings || {};\n if (settings.navItems) {\n this.navItems = settings.navItems;\n } else {\n this.defaultNavItems = [{\n name: 'Collections',\n icon: 'icon-sitemap',\n target: 'collections'\n }, {\n name: 'Users',\n icon: 'icon-user',\n target: 'users'\n }, {\n name: 'Groups',\n icon: 'icon-users',\n target: 'groups'\n }];\n }\n },\n\n render: function () {\n var navItems;\n if (this.navItems) {\n navItems = this.navItems;\n } else {\n navItems = this.defaultNavItems;\n if (girder.currentUser && girder.currentUser.get('admin')) {\n // copy navItems so that this.defaultNavItems is unchanged\n navItems = navItems.slice();\n navItems.push({\n name: 'Admin console',\n icon: 'icon-wrench',\n target: 'admin'\n });\n }\n }\n this.$el.html(girder.templates.layoutGlobalNav({\n navItems: navItems\n }));\n\n if (Backbone.history.fragment) {\n this.$('[g-target=\"' + Backbone.history.fragment + '\"]')\n .parent().addClass('g-active');\n }\n\n return this;\n },\n\n /**\n * Highlight the item with the given target attribute, which is the name\n * of the view it navigates to.\n */\n selectForView: function (viewName) {\n this.deactivateAll();\n this.$('[g-name=\"' + viewName.slice(0, -4) + '\"]').parent().addClass('g-active');\n },\n\n deactivateAll: function () {\n this.$('.g-global-nav-li').removeClass('g-active');\n }\n});\n","/**\n * This view shows the user menu, or register/sign in links if the user is\n * not logged in.\n */\ngirder.views.LayoutHeaderUserView = girder.View.extend({\n events: {\n 'click a.g-login': function () {\n girder.events.trigger('g:loginUi');\n },\n\n 'click a.g-register': function () {\n girder.events.trigger('g:registerUi');\n },\n\n 'click a.g-logout': girder.logout,\n\n 'click a.g-my-folders': function () {\n girder.router.navigate('user/' + girder.currentUser.get('_id'), {trigger: true});\n },\n\n 'click a.g-my-settings': function () {\n girder.router.navigate('useraccount/' + girder.currentUser.get('_id') +\n '/info', {trigger: true});\n }\n },\n\n initialize: function () {\n girder.events.on('g:login', this.render, this);\n girder.events.on('g:login-changed', this.render, this);\n girder.events.on('g:logout', this.render, this);\n },\n\n render: function () {\n this.$el.html(girder.templates.layoutHeaderUser({\n user: girder.currentUser\n }));\n return this;\n }\n});\n","/**\n * This view shows the header in the layout.\n */\ngirder.views.LayoutHeaderView = girder.View.extend({\n events: {\n 'click .g-app-title': function () {\n girder.router.navigate('', {trigger: true});\n }\n },\n\n initialize: function () {\n this.userView = new girder.views.LayoutHeaderUserView({\n parentView: this\n });\n\n this.searchWidget = new girder.views.SearchFieldWidget({\n placeholder: 'Quick search...',\n types: ['item', 'folder', 'group', 'collection', 'user'],\n parentView: this\n }).on('g:resultClicked', function (result) {\n this.searchWidget.resetState();\n girder.router.navigate(result.type + '/' + result.id, {\n trigger: true\n });\n }, this);\n },\n\n render: function () {\n this.$el.html(girder.templates.layoutHeader());\n\n this.userView.setElement(this.$('.g-current-user-wrapper')).render();\n this.searchWidget.setElement(this.$('.g-quick-search-container')).render();\n }\n});\n","/**\n * This view shows a login modal dialog.\n */\ngirder.views.LoginView = girder.View.extend({\n events: {\n 'submit #g-login-form': function (e) {\n e.preventDefault();\n\n girder.login(this.$('#g-login').val(), this.$('#g-password').val());\n\n girder.events.once('g:login.success', function () {\n this.$el.modal('hide');\n }, this);\n\n girder.events.once('g:login.error', function (status, err) {\n this.$('.g-validation-failed-message').text(err.responseJSON.message);\n this.$('#g-login-button').removeClass('disabled');\n }, this);\n\n this.$('#g-login-button').addClass('disabled');\n this.$('.g-validation-failed-message').text('');\n },\n\n 'click a.g-register-link': function () {\n girder.events.trigger('g:registerUi');\n },\n\n 'click a.g-forgot-password': function () {\n girder.events.trigger('g:resetPasswordUi');\n }\n },\n\n render: function () {\n var view = this;\n this.$el.html(girder.templates.loginDialog()).girderModal(this)\n .on('shown.bs.modal', function () {\n view.$('#g-login').focus();\n }).on('hidden.bs.modal', function () {\n girder.dialogs.handleClose('login', {replace: true});\n });\n\n girder.dialogs.handleOpen('login', {replace: true});\n this.$('#g-login').focus();\n\n return this;\n }\n\n});\n","/**\n * Container showing list of active tasks that are reporting progress\n * via a girder.EventStream object.\n */\ngirder.views.ProgressListView = girder.View.extend({\n\n initialize: function (settings) {\n this.eventStream = settings.eventStream;\n this.eventStream.on('g:event.progress', this._handleProgress, this);\n\n // map progress IDs to widgets\n this._map = {};\n },\n\n render: function () {\n this.$el.html(girder.templates.layoutProgressArea());\n\n this._onUpdate();\n\n return this;\n },\n\n _handleProgress: function (progress) {\n if (_.has(this._map, progress._id)) {\n this._map[progress._id].update(progress);\n } else {\n var el = $('
          ', {\n class: 'g-progress-widget-container'\n }).appendTo(this.$('.g-progress-list-container'));\n\n this._map[progress._id] = new girder.views.TaskProgressWidget({\n el: el,\n progress: progress,\n parentView: null\n }).on('g:hide', function (p) {\n this._map[p._id].destroy();\n delete this._map[p._id];\n this._onUpdate();\n }, this).render();\n }\n this._onUpdate();\n },\n\n _onUpdate: function () {\n if (_.isEmpty(this._map)) {\n this.$el.hide();\n } else {\n this.$el.show();\n }\n }\n});\n","/**\n * This view shows a register modal dialog.\n */\ngirder.views.RegisterView = girder.View.extend({\n events: {\n 'submit #g-register-form': function (e) {\n e.preventDefault();\n\n this.$('.form-group').removeClass('has-error');\n\n if (this.$('#g-password').val() !== this.$('#g-password2').val()) {\n this.$('#g-group-password,#g-group-password2').addClass('has-error');\n this.$('#g-password').focus();\n this.$('.g-validation-failed-message').text('Passwords must match.');\n return;\n }\n\n var user = new girder.models.UserModel({\n login: this.$('#g-login').val(),\n password: this.$('#g-password').val(),\n email: this.$('#g-email').val(),\n firstName: this.$('#g-firstName').val(),\n lastName: this.$('#g-lastName').val()\n });\n user.on('g:saved', function () {\n if (girder.currentUser) {\n this.trigger('g:userCreated', {\n user: user\n });\n } else {\n var authToken = user.get('authToken') || {};\n\n girder.currentUser = user;\n girder.currentToken = authToken.token;\n\n if (girder.corsAuth) {\n document.cookie = 'girderToken=' + girder.currentToken;\n }\n\n girder.dialogs.handleClose('register', {replace: true});\n girder.events.trigger('g:login');\n }\n\n this.$el.modal('hide');\n }, this).on('g:error', function (err) {\n var resp = err.responseJSON;\n this.$('.g-validation-failed-message').text(resp.message);\n if (resp.field) {\n this.$('#g-group-' + resp.field).addClass('has-error');\n this.$('#g-' + resp.field).focus();\n }\n this.$('#g-register-button').removeClass('disabled');\n }, this).save();\n\n this.$('#g-register-button').addClass('disabled');\n this.$('.g-validation-failed-message').text('');\n },\n\n 'click a.g-login-link': function () {\n girder.events.trigger('g:loginUi');\n }\n },\n\n render: function () {\n var view = this;\n this.$el.html(girder.templates.registerDialog({\n currentUser: girder.currentUser,\n title: girder.currentUser ? 'Create new user' : 'Sign up'\n })).girderModal(this)\n .on('shown.bs.modal', function () {\n view.$('#g-login').focus();\n }).on('hidden.bs.modal', function () {\n girder.dialogs.handleClose('register', {replace: true});\n });\n this.$('#g-login').focus();\n\n girder.dialogs.handleOpen('register', {replace: true});\n\n return this;\n }\n\n});\n","/**\n * This view shows a modal dialog for resetting a forgotten password.\n */\ngirder.views.ResetPasswordView = girder.View.extend({\n events: {\n 'submit #g-reset-password-form': function (e) {\n e.preventDefault();\n girder.restRequest({\n path: 'user/password/temporary?email=' + this.$('#g-email')\n .val().trim(),\n type: 'PUT',\n error: null // don't do default error behavior\n }).done(_.bind(function () {\n this.$el.modal('hide');\n girder.events.trigger('g:alert', {\n icon: 'mail-alt',\n text: 'Password reset email sent.',\n type: 'success'\n });\n }, this)).error(_.bind(function (err) {\n this.$('.g-validation-failed-message').text(err.responseJSON.message);\n this.$('#g-reset-password-button').removeClass('disabled');\n }, this));\n\n this.$('#g-reset-password-button').addClass('disabled');\n this.$('.g-validation-failed-message').text('');\n },\n\n 'click a.g-register-link': function () {\n girder.events.trigger('g:registerUi');\n },\n\n 'click a.g-login-link': function () {\n girder.events.trigger('g:loginUi');\n }\n },\n\n render: function () {\n var view = this;\n this.$el.html(girder.templates.resetPasswordDialog(\n )).girderModal(this).on('shown.bs.modal', function () {\n view.$('#g-email').focus();\n }).on('hidden.bs.modal', function () {\n girder.dialogs.handleClose('resetpassword', {replace: true});\n });\n this.$('#g-email').focus();\n\n girder.dialogs.handleOpen('resetpassword', {replace: true});\n\n return this;\n }\n});\n","/**\n * This view allows users to see and control access on a resource.\n */\ngirder.views.AccessWidget = girder.View.extend({\n events: {\n 'click button.g-save-access-list': function (e) {\n $(e.currentTarget).attr('disabled', 'disabled');\n this.saveAccessList();\n },\n 'click a.g-action-remove-access': 'removeAccessEntry',\n 'change .g-public-container .radio input': 'privacyChanged'\n },\n\n /**\n * @param settings.modelType {string} Display name for the resource type\n * being edited.\n * @param [settings.hideRecurseOption=false] {bool} Whether to hide the recursive\n * propagation setting widgets.\n * @param [settings.hideSaveButton=false] {bool} Whether to hide the \"save\"\n * button in non-modal view. This allows for users of this widget to\n * provide their own save button elsewhere on the page that can call the\n * saveAccessList() method of this widget when pressed.\n * @param [settings.modal=true] {bool} Whether to render the widget as a\n * modal dialog or not.\n */\n initialize: function (settings) {\n this.modelType = settings.modelType;\n this.hideRecurseOption = settings.hideRecurseOption || false;\n this.hideSaveButton = settings.hideSaveButton || false;\n this.modal = _.has(settings, 'modal') ? settings.modal : true;\n\n this.searchWidget = new girder.views.SearchFieldWidget({\n placeholder: 'Start typing a name...',\n modes: ['prefix', 'text'],\n types: ['group', 'user'],\n parentView: this\n }).on('g:resultClicked', this.addEntry, this);\n\n if (this.model.get('access')) {\n this.render();\n } else {\n this.model.on('g:accessFetched', function () {\n this.render();\n }, this).fetchAccess();\n }\n },\n\n render: function () {\n if (!this.model.get('access')) {\n new girder.views.LoadingAnimation({\n el: this.$el,\n parentView: this\n }).render();\n return;\n }\n\n var closeFunction;\n if (this.modal && this.modelType === 'folder') {\n girder.dialogs.handleOpen('folderaccess');\n closeFunction = function () {\n girder.dialogs.handleClose('folderaccess');\n };\n } else if (this.modal) {\n girder.dialogs.handleOpen('access');\n closeFunction = function () {\n girder.dialogs.handleClose('access');\n };\n }\n\n var template = this.modal ? girder.templates.accessEditor\n : girder.templates.accessEditorNonModal;\n this.$el.html(template({\n model: this.model,\n modelType: this.modelType,\n public: this.model.get('public'),\n hideRecurseOption: this.hideRecurseOption,\n hideSaveButton: this.hideSaveButton\n }));\n\n if (this.modal) {\n this.$el.girderModal(this).on('hidden.bs.modal', closeFunction);\n }\n\n _.each(this.model.get('access').groups, function (groupAccess) {\n this.$('#g-ac-list-groups').append(girder.templates.accessEntry({\n accessTypes: girder.AccessType,\n type: 'group',\n entry: _.extend(groupAccess, {\n title: groupAccess.name,\n subtitle: groupAccess.description\n })\n }));\n }, this);\n\n _.each(this.model.get('access').users, function (userAccess) {\n this.$('#g-ac-list-users').append(girder.templates.accessEntry({\n accessTypes: girder.AccessType,\n type: 'user',\n entry: _.extend(userAccess, {\n title: userAccess.name,\n subtitle: userAccess.login\n })\n }));\n }, this);\n\n this._makeTooltips();\n\n this.searchWidget.setElement(this.$('.g-search-field-container')).render();\n\n this.privacyChanged();\n\n return this;\n },\n\n _makeTooltips: function () {\n this.$('.g-action-remove-access').tooltip({\n placement: 'bottom',\n animation: false,\n delay: {show: 100}\n });\n },\n\n /**\n * Add a new user or group entry to the access control list UI. If the\n * given user or group already has an entry there, this does nothing.\n */\n addEntry: function (entry) {\n this.searchWidget.resetState();\n if (entry.type === 'user') {\n this._addUserEntry(entry);\n } else if (entry.type === 'group') {\n this._addGroupEntry(entry);\n }\n },\n\n _addUserEntry: function (entry) {\n var exists = false;\n _.every(this.$('.g-user-access-entry'), function (el) {\n if ($(el).attr('resourceid') === entry.id) {\n exists = true;\n }\n return !exists;\n }, this);\n\n if (!exists) {\n var model = new girder.models.UserModel();\n model.set('_id', entry.id).on('g:fetched', function () {\n this.$('#g-ac-list-users').append(girder.templates.accessEntry({\n accessTypes: girder.AccessType,\n type: 'user',\n entry: {\n title: model.name(),\n subtitle: model.get('login'),\n id: entry.id,\n level: girder.AccessType.READ\n }\n }));\n\n this._makeTooltips();\n }, this).fetch();\n }\n },\n\n _addGroupEntry: function (entry) {\n var exists = false;\n _.every(this.$('.g-group-access-entry'), function (el) {\n if ($(el).attr('resourceid') === entry.id) {\n exists = true;\n }\n return !exists;\n }, this);\n\n if (!exists) {\n var model = new girder.models.GroupModel();\n model.set('_id', entry.id).on('g:fetched', function () {\n this.$('#g-ac-list-groups').append(girder.templates.accessEntry({\n accessTypes: girder.AccessType,\n type: 'group',\n entry: {\n title: model.name(),\n subtitle: model.get('description'),\n id: entry.id,\n level: girder.AccessType.READ\n }\n }));\n\n this._makeTooltips();\n }, this).fetch();\n }\n },\n\n saveAccessList: function () {\n // Rebuild the access list\n var acList = {\n users: [],\n groups: []\n };\n\n _.each(this.$('.g-group-access-entry'), function (el) {\n var $el = $(el);\n acList.groups.push({\n name: $el.find('.g-desc-title').html(),\n id: $el.attr('resourceid'),\n level: parseInt(\n $el.find('.g-access-col-right>select').val(),\n 10\n )\n });\n }, this);\n\n _.each(this.$('.g-user-access-entry'), function (el) {\n var $el = $(el);\n acList.users.push({\n login: $el.find('.g-desc-subtitle').html(),\n name: $el.find('.g-desc-title').html(),\n id: $el.attr('resourceid'),\n level: parseInt(\n $el.find('.g-access-col-right>select').val(),\n 10\n )\n });\n }, this);\n\n this.model.set({\n access: acList,\n public: this.$('#g-access-public').is(':checked')\n });\n\n var recurse = this.$('#g-apply-recursive').is(':checked');\n\n this.model.off('g:accessListSaved')\n .on('g:accessListSaved', function () {\n if (this.modal) {\n this.$el.modal('hide');\n }\n\n this.trigger('g:accessListSaved', {\n recurse: recurse\n });\n }, this).updateAccess({\n recurse: recurse,\n progress: true\n });\n },\n\n removeAccessEntry: function (event) {\n var sel = '.g-user-access-entry,.g-group-access-entry';\n $(event.currentTarget).tooltip('hide').parents(sel).remove();\n },\n\n privacyChanged: function () {\n this.$('.g-public-container .radio').removeClass('g-selected');\n var selected = this.$('.g-public-container .radio input:checked');\n selected.parents('.radio').addClass('g-selected');\n }\n});\n","/**\n * This widget presents a list of available batch actions\n * on a set of selected resources.\n */\ngirder.views.CheckedMenuWidget = girder.View.extend({\n\n initialize: function (params) {\n this._fetchAndInit(params);\n this.dropdownToggle = params.dropdownToggle;\n },\n\n render: function () {\n // If nothing is checked, disable the parent element and return\n if (this.folderCount + this.itemCount + this.pickedCount === 0) {\n this.dropdownToggle.attr('disabled', 'disabled');\n return;\n }\n\n this.dropdownToggle.removeAttr('disabled');\n this.$el.html(girder.templates.checkedActionsMenu({\n minFolderLevel: this.minFolderLevel,\n minItemLevel: this.minItemLevel,\n folderCount: this.folderCount,\n itemCount: this.itemCount,\n AccessType: girder.AccessType,\n pickedCount: this.pickedCount,\n pickedCopyAllowed: this.pickedCopyAllowed,\n pickedMoveAllowed: this.pickedMoveAllowed,\n pickedDesc: this.pickedDesc,\n girder: girder\n }));\n },\n\n /**\n * This should be called when the checkbox selection changes. It will\n * update and re-render the checked action menu.\n * @param minLevel The minimum access level across the checked resource set.\n * @param folderCount The number of checked folders.\n * @param itemCount The number of checked items.\n */\n update: function (params) {\n this._fetchAndInit(params);\n this.render();\n },\n\n _fetchAndInit: function (params) {\n this.minFolderLevel = params.minFolderLevel || girder.AccessType.READ;\n this.minItemLevel = params.minItemLevel || girder.AccessType.READ;\n this.folderCount = params.folderCount || 0;\n this.itemCount = params.itemCount || 0;\n this.pickedCount = params.pickedCount || 0;\n this.pickedCopyAllowed = params.pickedCopyAllowed || false;\n this.pickedMoveAllowed = params.pickedMoveAllowed || false;\n this.pickedDesc = params.pickedDesc || '';\n }\n});\n","/**\n * This view shows a dialog containing detailed collection information.\n */\ngirder.views.CollectionInfoWidget = girder.View.extend({\n initialize: function () {\n this.needToFetch = !this.model.has('nFolders');\n if (this.needToFetch) {\n this.model.fetch({extraPath: 'details'}).once('g:fetched.details', function () {\n this.needToFetch = false;\n this.render();\n }, this);\n }\n },\n\n render: function () {\n if (this.needToFetch) {\n return;\n }\n\n this.$el.html(girder.templates.collectionInfoDialog({\n collection: this.model,\n girder: girder\n })).girderModal(this);\n }\n});\n","/* globals moment */\n\n/**\n * This widget provides a text input field to specify a date/time. The user\n * chooses the date/time using a popup picker.\n */\ngirder.views.DateTimeWidget = girder.View.extend({\n\n /**\n * @param [settings.defaultDate=false] The default date/time when not set\n * explicitly. Set to false to have no default.\n * @param [settings.showIcon=true] Whether to show a calendar icon beside\n * the input field. When true, clicking the icon shows the popup. Otherwise,\n * focusing the input field shows the popup.\n */\n initialize: function (settings) {\n this.defaultDate = settings.defaultDate || false;\n this.showIcon = _.has(settings, 'showIcon') ? settings.showIcon : true;\n },\n\n render: function () {\n this.$el.html(girder.templates.dateTimeWidget({\n showIcon: this.showIcon\n }));\n\n this.$('.g-datetime-widget').datetimepicker({\n showClear: true,\n showTodayButton: true,\n useCurrent: 'day',\n icons: {\n time: 'icon-clock',\n date: 'icon-calendar',\n up: 'icon-up-open',\n down: 'icon-down-open',\n previous: 'icon-left-open',\n next: 'icon-right-open',\n clear: 'icon-trash',\n close: 'icon-cancel',\n today: 'icon-target'\n },\n defaultDate: this.defaultDate\n });\n\n return this;\n },\n\n /**\n * Set date/time. Argument can be an ISO 8601-formatted date string, a\n * moment object, or a Date object. Call with null or the empty string to\n * clear. When called with a string, the widget displays in local time.\n *\n * @param date Date/time to display.\n */\n setDate: function (date) {\n var picker = this._picker();\n if (_.isEmpty(date)) {\n picker.clear();\n } else if (_.isString(date)) {\n var localDate = moment.utc(date).local();\n picker.date(localDate);\n } else {\n picker.date(date);\n }\n },\n\n /**\n * Get the date/time as a moment object in UTC. Returns null if no date is\n * set.\n */\n date: function () {\n var picker = this._picker();\n var date = picker.date();\n if (date !== null) {\n date = moment(date);\n date.utc();\n }\n return date;\n },\n\n /**\n * Convenience function to return the date/time as a string in UTC. Returns\n * the empty string if no date is set.\n */\n dateString: function () {\n var date = this.date();\n if (date === null) {\n return '';\n }\n return date.format();\n },\n\n /**\n * Convenience function to access the datetimepicker on an element.\n */\n _picker: function () {\n var picker = this.$('.g-datetime-widget').data('DateTimePicker');\n return picker;\n }\n});\n\n/**\n * This widget provides text input fields to specify a range of dates/times.\n * That is, the first field specifies \"from\" and the second field specifies\n * \"to.\" The user chooses each date/time using a popup picker.\n */\ngirder.views.DateTimeRangeWidget = girder.View.extend({\n\n /**\n * @param [settings.defaultFromDate=false] The default \"from\" date/time when\n * not set explicitly. Set to false to have no default.\n * @param [settings.defaultToDate=false] The default \"to\" date/time when not\n * set explicitly. Set to false to have no default.\n * @param [settings.showIcon=true] Whether to show calendar icons beside\n * the input fields. When true, clicking the icon shows the popup. Otherwise,\n * focusing the input field shows the popup.\n * @param [settings.fromLabel='Start date'] The label text for the \"from\"\n * input field.\n * @param [settings.toLabel='End date'] The label text for the \"to\" input\n * field.\n */\n initialize: function (settings) {\n this.defaultFromDate = settings.defaultFromDate || false;\n this.defaultToDate = settings.defaultToDate || false;\n this.showIcon = _.has(settings, 'showIcon') ? settings.showIcon : true;\n this.fromLabel = settings.fromLabel || 'Start date';\n this.toLabel = settings.toLabel || 'End date';\n },\n\n render: function () {\n this.$el.html(girder.templates.dateTimeRangeWidget({\n showIcon: this.showIcon,\n fromLabel: this.fromLabel,\n toLabel: this.toLabel\n }));\n\n // Link datetimepickers to disallow choosing range where \"from\" date is\n // after \"to\" date\n\n var options = {\n showClear: true,\n showTodayButton: true,\n icons: {\n time: 'icon-clock',\n date: 'icon-calendar',\n up: 'icon-up-open',\n down: 'icon-down-open',\n previous: 'icon-left-open',\n next: 'icon-right-open',\n clear: 'icon-trash',\n close: 'icon-cancel',\n today: 'icon-target'\n }\n };\n options.useCurrent = 'day';\n options.defaultDate = this.defaultFromDate;\n this.$('.g-datetime-widget-from').datetimepicker(options);\n\n options.useCurrent = false;\n options.defaultDate = this.defaultToDate;\n this.$('.g-datetime-widget-to').datetimepicker(options);\n\n this.$('.g-datetime-widget-from').on('dp.change', _.bind(function (e) {\n var picker = this._picker('.g-datetime-widget-to');\n picker.minDate(e.date);\n }, this));\n this.$('.g-datetime-widget-to').on('dp.change', _.bind(function (e) {\n var picker = this._picker('.g-datetime-widget-from');\n picker.maxDate(e.date);\n }, this));\n\n return this;\n },\n\n /**\n * Set \"from\" date/time. Argument can be an ISO 8601-formatted date string,\n * a moment object, or a Date object. Call with null or the empty string to\n * clear. When called with a string, the widget displays in local time.\n *\n * @param date From date/time to display.\n */\n setFromDate: function (date) {\n this._setDate('.g-datetime-widget-from', date);\n },\n\n /**\n * Set \"to\" date/time. Argument can be an ISO 8601-formatted date string,\n * a moment object, or a Date object. Call with null or the empty string to\n * clear. When called with a string, the widget displays in local time.\n *\n * @param date To date/time to display.\n */\n setToDate: function (date) {\n this._setDate('.g-datetime-widget-to', date);\n },\n\n /*\n * Convenience function to set date/time for a specified datetimepicker.\n *\n * @param [id] Element ID on which to access the datetimepicker.\n */\n _setDate: function (id, date) {\n var picker = this._picker(id);\n if (_.isEmpty(date)) {\n picker.clear();\n } else if (_.isString(date)) {\n var localDate = moment.utc(date).local();\n picker.date(localDate);\n } else {\n picker.date(date);\n }\n },\n\n /**\n * Get the \"from\" date/time as a moment object in UTC. Returns null if no\n * date is set.\n */\n fromDate: function () {\n return this._date('.g-datetime-widget-from');\n },\n\n /**\n * Get the \"to\" date/time as a moment object in UTC. Returns null if no date\n * is set.\n */\n toDate: function () {\n return this._date('.g-datetime-widget-to');\n },\n\n /**\n * Convenience function to return \"from\" the date/time as a string in UTC.\n * Returns the empty string if no date is set.\n */\n fromDateString: function () {\n return this._dateString('.g-datetime-widget-from');\n },\n\n /**\n * Convenience function to return the \"to\" date/time as a string in UTC.\n * Returns the empty string if no date is set.\n */\n toDateString: function () {\n return this._dateString('.g-datetime-widget-to');\n },\n\n _picker: function (id) {\n var picker = this.$(id).data('DateTimePicker');\n return picker;\n },\n\n _date: function (id) {\n var picker = this._picker(id);\n var date = picker.date();\n if (date !== null) {\n date = moment(date);\n date.utc();\n }\n return date;\n },\n\n _dateString: function (id) {\n var date = this._date(id);\n if (date === null) {\n return '';\n }\n return date.format();\n }\n});\n","/**\n * This widget is used to edit an existing assetstore.\n */\ngirder.views.EditAssetstoreWidget = girder.View.extend({\n events: {\n 'submit #g-assetstore-edit-form': function (e) {\n e.preventDefault();\n\n var fields = this.fieldsMap[this.model.get('type')].get.call(this);\n fields.name = this.$('#g-edit-name').val();\n\n this.updateAssetstore(fields);\n\n this.$('button.g-save-assetstore').addClass('disabled');\n this.$('.g-validation-failed-message').text('');\n }\n },\n\n initialize: function (settings) {\n this.model = settings.model || null;\n },\n\n /**\n * This maps each type of assetstore to a function to getter and setter\n * functions. The set functions are reponsible for populating the dialog\n * fields with the appropriate current model values, and the get functions\n * are responsible for reading the user input values from the dialog and\n * returning a set of fields (excluding the name field) to set on the model.\n *\n * This is meant to make it easy for plugins that add new assetstore types\n * to extend this dialog to allow the setting of custom fields using whatever\n * widgets make the most sense. By adding a new field to this object, this\n * edit dialog can support any type of assetstore dynamically.\n *\n * Since the keys of this array are values defined by variables,\n * we set them after this class rather than inline with object creation syntax.\n */\n fieldsMap: {},\n\n render: function () {\n var view = this;\n var modal = this.$el.html(girder.templates.editAssetstoreWidget({\n assetstore: view.model,\n types: girder.AssetstoreType\n })).girderModal(this).on('shown.bs.modal', function () {\n view.$('#g-edit-name').focus();\n girder.dialogs.handleOpen('assetstoreedit', undefined, view.model.get('id'));\n view.$('#g-edit-name').val(view.model.get('name'));\n view.fieldsMap[view.model.get('type')].set.call(view);\n }).on('hidden.bs.modal', function () {\n girder.dialogs.handleClose('assetstoreedit', undefined, view.model.get('id'));\n });\n modal.trigger($.Event('ready.girder.modal', {relatedTarget: modal}));\n return this;\n },\n\n updateAssetstore: function (fields) {\n var oldfields = {};\n var model = this.model;\n _.each(fields, function (value, key) {\n oldfields[key] = model.get(key);\n });\n this.model.set(fields);\n this.model.on('g:saved', function () {\n this.$el.modal('hide');\n this.trigger('g:saved', this.model);\n }, this).on('g:error', function (err) {\n this.$('.g-validation-failed-message').text(err.responseJSON.message);\n this.$('button.g-save-assetstore').removeClass('disabled');\n this.$('#g-' + err.responseJSON.field).focus();\n this.model.set(oldfields);\n }, this).save();\n }\n});\n\n(function () {\n var fieldsMap = girder.views.EditAssetstoreWidget.prototype.fieldsMap;\n\n fieldsMap[girder.AssetstoreType.FILESYSTEM] = {\n get: function () {\n return {\n root: this.$('#g-edit-fs-root').val()\n };\n },\n set: function () {\n this.$('#g-edit-fs-root').val(this.model.get('root'));\n }\n };\n\n fieldsMap[girder.AssetstoreType.GRIDFS] = {\n get: function () {\n return {\n db: this.$('#g-edit-gridfs-db').val(),\n mongohost: this.$('#g-edit-gridfs-mongohost').val(),\n replicaset: this.$('#g-edit-gridfs-replicaset').val()\n };\n },\n set: function () {\n this.$('#g-edit-gridfs-db').val(this.model.get('db'));\n this.$('#g-edit-gridfs-mongohost').val(this.model.get('mongohost'));\n this.$('#g-edit-gridfs-replicaset').val(this.model.get('replicaset'));\n }\n };\n\n fieldsMap[girder.AssetstoreType.S3] = {\n get: function () {\n return {\n bucket: this.$('#g-edit-s3-bucket').val(),\n prefix: this.$('#g-edit-s3-prefix').val(),\n accessKeyId: this.$('#g-edit-s3-access-key-id').val(),\n secret: this.$('#g-edit-s3-secret').val(),\n service: this.$('#g-edit-s3-service').val(),\n readOnly: this.$('#g-edit-s3-readonly').is(':checked')\n };\n },\n set: function () {\n this.$('#g-edit-s3-bucket').val(this.model.get('bucket'));\n this.$('#g-edit-s3-prefix').val(this.model.get('prefix'));\n this.$('#g-edit-s3-access-key-id').val(this.model.get('accessKeyId'));\n this.$('#g-edit-s3-secret').val(this.model.get('secret'));\n this.$('#g-edit-s3-service').val(this.model.get('service'));\n this.$('#g-edit-s3-readonly').attr('checked', this.model.get('readOnly') ? 'checked' : undefined);\n }\n };\n})();\n","/**\n * This widget is used to create a new collection or edit an existing one.\n */\ngirder.views.EditCollectionWidget = girder.View.extend({\n events: {\n 'submit #g-collection-edit-form': function (e) {\n e.preventDefault();\n\n var fields = {\n name: this.$('#g-name').val(),\n description: this.$('#g-description').val()\n };\n\n if (this.model) {\n this.updateCollection(fields);\n } else {\n this.createCollection(fields);\n }\n\n this.$('button.g-save-collection').addClass('disabled');\n this.$('.g-validation-failed-message').text('');\n }\n },\n\n initialize: function (settings) {\n this.model = settings.model || null;\n },\n\n render: function () {\n var view = this;\n var modal = this.$el.html(girder.templates.editCollectionWidget({\n collection: view.model\n })).girderModal(this).on('shown.bs.modal', function () {\n view.$('#g-name').focus();\n }).on('hidden.bs.modal', function () {\n if (view.create) {\n girder.dialogs.handleClose('create');\n } else {\n girder.dialogs.handleClose('edit');\n }\n }).on('ready.girder.modal', function () {\n if (view.model) {\n view.$('#g-name').val(view.model.get('name'));\n view.$('#g-description').val(view.model.get('description'));\n view.create = false;\n } else {\n view.create = true;\n }\n });\n modal.trigger($.Event('ready.girder.modal', {relatedTarget: modal}));\n this.$('#g-name').focus();\n\n if (view.model) {\n girder.dialogs.handleOpen('edit');\n } else {\n girder.dialogs.handleOpen('create');\n }\n\n return this;\n },\n\n createCollection: function (fields) {\n var collection = new girder.models.CollectionModel();\n collection.set(fields);\n collection.on('g:saved', function () {\n this.$el.modal('hide');\n this.trigger('g:saved', collection);\n }, this).off('g:error').on('g:error', function (err) {\n this.$('.g-validation-failed-message').text(err.responseJSON.message);\n this.$('button.g-save-collection').removeClass('disabled');\n this.$('#g-' + err.responseJSON.field).focus();\n }, this).save();\n },\n\n updateCollection: function (fields) {\n this.model.set(fields);\n this.model.on('g:saved', function () {\n this.$el.modal('hide');\n this.trigger('g:saved', this.model);\n }, this).off('g:error').on('g:error', function (err) {\n this.$('.g-validation-failed-message').text(err.responseJSON.message);\n this.$('button.g-save-collection').removeClass('disabled');\n this.$('#g-' + err.responseJSON.field).focus();\n }, this).save();\n }\n});\n","/**\n * This widget is used to edit file information.\n */\ngirder.views.EditFileWidget = girder.View.extend({\n events: {\n 'submit #g-file-edit-form': function () {\n var fields = {\n name: this.$('#g-name').val(),\n mimeType: this.$('#g-mimetype').val()\n };\n\n this.file.set(fields);\n this.file.off(null, null, this).on('g:saved', function () {\n this.$el.modal('hide');\n this.trigger('g:saved', this.file);\n }, this).on('g:error', function (err) {\n this.$('.g-validation-failed-message').text(err.responseJSON.message);\n this.$('button.g-save-file').removeClass('disabled');\n this.$('#g-' + err.responseJSON.field).focus();\n }, this).save();\n\n this.$('button.g-save-file').addClass('disabled');\n this.$('.g-validation-failed-message').empty();\n\n return false;\n }\n },\n\n initialize: function (settings) {\n this.file = settings.file || null;\n },\n\n render: function () {\n var view = this;\n if (this.file.get('mimeType') === undefined) {\n this.file.set('mimeType', '');\n }\n this.$el.html(girder.templates.editFileWidget({file: this.file}))\n .girderModal(this).on('shown.bs.modal', function () {\n view.$('#g-name').select().focus();\n }).on('hidden.bs.modal', function () {\n girder.dialogs.handleClose('fileedit', undefined,\n view.file.get('_id'));\n });\n girder.dialogs.handleOpen('fileedit', undefined, this.file.get('_id'));\n return this;\n }\n});\n","/**\n * This widget is used to create a new folder or edit an existing one.\n */\ngirder.views.EditFolderWidget = girder.View.extend({\n events: {\n 'submit #g-folder-edit-form': function (e) {\n e.preventDefault();\n var fields = {\n name: this.$('#g-name').val(),\n description: this.descriptionEditor.val()\n };\n\n if (this.folder) {\n this.updateFolder(fields);\n } else {\n this.createFolder(fields);\n }\n\n this.$('button.g-save-folder').addClass('disabled');\n this.$('.g-validation-failed-message').text('');\n }\n },\n\n initialize: function (settings) {\n this.folder = settings.folder || null;\n this.parentModel = settings.parentModel;\n this.descriptionEditor = new girder.views.MarkdownWidget({\n text: this.folder ? this.folder.get('description') : '',\n prefix: 'folder-description',\n placeholder: 'Enter a description',\n parent: this.folder,\n allowedExtensions: ['png', 'jpg', 'jpeg', 'gif'],\n enableUploads: !!this.folder,\n parentView: this\n }).on('g:fileUploaded', function (args) {\n this.trigger('g:fileUploaded', args);\n }, this);\n },\n\n render: function () {\n var view = this;\n var modal = this.$el.html(girder.templates.editFolderWidget({\n folder: this.folder\n })).girderModal(this).on('shown.bs.modal', function () {\n view.$('#g-name').focus();\n if (view.folder) {\n girder.dialogs.handleOpen('folderedit');\n } else {\n girder.dialogs.handleOpen('foldercreate');\n }\n }).on('hidden.bs.modal', function () {\n if (view.create) {\n girder.dialogs.handleClose('foldercreate');\n } else {\n girder.dialogs.handleClose('folderedit');\n }\n }).on('ready.girder.modal', function () {\n if (view.folder) {\n view.$('#g-name').val(view.folder.get('name'));\n view.descriptionEditor.val(view.folder.get('description'));\n view.create = false;\n } else {\n view.create = true;\n }\n });\n modal.trigger($.Event('ready.girder.modal', {relatedTarget: modal}));\n this.$('#g-name').focus();\n this.descriptionEditor.setElement(\n this.$('.g-description-editor-container')).render();\n\n return this;\n },\n\n createFolder: function (fields) {\n var folder = new girder.models.FolderModel();\n folder.set(_.extend(fields, {\n parentType: this.parentModel.resourceName,\n parentId: this.parentModel.get('_id')\n }));\n folder.on('g:saved', function () {\n this.$el.modal('hide');\n this.trigger('g:saved', folder);\n }, this).on('g:error', function (err) {\n this.$('.g-validation-failed-message').text(err.responseJSON.message);\n this.$('button.g-save-folder').removeClass('disabled');\n this.$('#g-' + err.responseJSON.field).focus();\n }, this).save();\n },\n\n updateFolder: function (fields) {\n this.folder.set(fields);\n this.folder.off().on('g:saved', function () {\n this.$el.modal('hide');\n this.trigger('g:saved', this.folder);\n }, this).on('g:error', function (err) {\n this.$('.g-validation-failed-message').text(err.responseJSON.message);\n this.$('button.g-save-folder').removeClass('disabled');\n this.$('#g-' + err.responseJSON.field).focus();\n }, this).save();\n }\n});\n","/**\n * This widget is used to create a new group or edit an existing one.\n */\ngirder.views.EditGroupWidget = girder.View.extend({\n events: {\n 'submit #g-group-edit-form': function (e) {\n e.preventDefault();\n\n var fields = {\n name: this.$('#g-name').val(),\n description: this.$('#g-description').val(),\n public: this.$('#g-access-public').is(':checked')\n };\n if (this.$('#g-add-to-group').length) {\n fields.addAllowed = this.$('#g-add-to-group').val();\n }\n\n if (this.model) {\n this.updateGroup(fields);\n } else {\n this.createGroup(fields);\n }\n\n this.$('button.g-save-group').addClass('disabled');\n this.$('.g-validation-failed-message').text('');\n },\n\n 'change .g-public-container .radio input': 'privacyChanged'\n },\n\n initialize: function (settings) {\n this.model = settings.model || null;\n },\n\n render: function () {\n var view = this;\n var pub = this.model ? this.model.get('public') : false;\n var groupAddAllowed;\n var addToGroupPolicy = this.model ? this.model.get('_addToGroupPolicy') : null;\n if (girder.currentUser.get('admin')) {\n if (addToGroupPolicy === 'nomod' || addToGroupPolicy === 'yesmod') {\n groupAddAllowed = 'mod';\n } else if (addToGroupPolicy === 'noadmin' || addToGroupPolicy === 'yesadmin') {\n groupAddAllowed = 'admin';\n }\n }\n var modal = this.$el.html(girder.templates.editGroupWidget({\n group: this.model,\n public: pub,\n addToGroupPolicy: addToGroupPolicy,\n groupAddAllowed: groupAddAllowed,\n addAllowed: this.model ? this.model.get('addAllowed') : false\n })).girderModal(this).on('shown.bs.modal', function () {\n view.$('#g-name').focus();\n if (view.model) {\n girder.dialogs.handleOpen('edit');\n } else {\n girder.dialogs.handleOpen('create');\n }\n }).on('hidden.bs.modal', function () {\n if (view.create) {\n girder.dialogs.handleClose('create');\n } else {\n girder.dialogs.handleClose('edit');\n }\n }).on('ready.girder.modal', function () {\n if (view.model) {\n view.$('#g-name').val(view.model.get('name'));\n view.$('#g-description').val(view.model.get('description'));\n view.create = false;\n } else {\n view.create = true;\n }\n });\n modal.trigger($.Event('ready.girder.modal', {relatedTarget: modal}));\n this.$('#g-name').focus();\n\n this.privacyChanged();\n\n return this;\n },\n\n createGroup: function (fields) {\n var group = new girder.models.GroupModel();\n group.set(fields);\n group.on('g:saved', function () {\n this.$el.modal('hide');\n this.trigger('g:saved', group);\n }, this).on('g:error', function (err) {\n this.$('.g-validation-failed-message').text(err.responseJSON.message);\n this.$('button.g-save-group').removeClass('disabled');\n this.$('#g-' + err.responseJSON.field).focus();\n }, this).save();\n },\n\n updateGroup: function (fields) {\n this.model.set(fields);\n this.model.off().on('g:saved', function () {\n this.$el.modal('hide');\n this.trigger('g:saved', this.model);\n }, this).on('g:error', function (err) {\n this.$('.g-validation-failed-message').text(err.responseJSON.message);\n this.$('button.g-save-group').removeClass('disabled');\n this.$('#g-' + err.responseJSON.field).focus();\n }, this).save();\n },\n\n privacyChanged: function () {\n this.$('.g-public-container .radio').removeClass('g-selected');\n var selected = this.$('.g-public-container .radio input:checked');\n selected.parents('.radio').addClass('g-selected');\n }\n});\n","/**\n * This widget is used to create a new item or edit an existing one.\n */\ngirder.views.EditItemWidget = girder.View.extend({\n events: {\n 'submit #g-item-edit-form': function () {\n var fields = {\n name: this.$('#g-name').val(),\n description: this.$('#g-description').val()\n };\n\n if (this.item) {\n this.updateItem(fields);\n } else {\n this.createItem(fields);\n }\n\n this.$('button.g-save-item').addClass('disabled');\n this.$('.g-validation-failed-message').empty();\n\n return false;\n }\n },\n\n initialize: function (settings) {\n this.item = settings.item || null;\n this.parentModel = settings.parentModel;\n },\n\n render: function () {\n var view = this;\n var modal = this.$el.html(girder.templates.editItemWidget({\n item: this.item}))\n .girderModal(this).on('shown.bs.modal', function () {\n view.$('#g-name').focus();\n if (view.item) {\n girder.dialogs.handleOpen('itemedit');\n } else {\n girder.dialogs.handleOpen('itemcreate');\n }\n }).on('hidden.bs.modal', function () {\n if (view.create) {\n girder.dialogs.handleClose('itemcreate');\n } else {\n girder.dialogs.handleClose('itemedit');\n }\n }).on('ready.girder.modal', function () {\n if (view.item) {\n view.$('#g-name').val(view.item.get('name'));\n view.$('#g-description').val(view.item.get('description'));\n view.create = false;\n } else {\n view.create = true;\n }\n });\n modal.trigger($.Event('ready.girder.modal', {relatedTarget: modal}));\n\n return this;\n },\n\n createItem: function (fields) {\n var item = new girder.models.ItemModel();\n item.set(_.extend(fields, {\n folderId: this.parentModel.get('_id')\n }));\n item.on('g:saved', function () {\n this.$el.modal('hide');\n this.trigger('g:saved', item);\n }, this).on('g:error', function (err) {\n this.$('.g-validation-failed-message').text(err.responseJSON.message);\n this.$('button.g-save-item').removeClass('disabled');\n this.$('#g-' + err.responseJSON.field).focus();\n }, this).save();\n },\n\n updateItem: function (fields) {\n this.item.set(fields);\n this.item.off().on('g:saved', function () {\n this.$el.modal('hide');\n this.trigger('g:saved', this.item);\n }, this).on('g:error', function (err) {\n this.$('.g-validation-failed-message').text(err.responseJSON.message);\n this.$('button.g-save-item').removeClass('disabled');\n this.$('#g-' + err.responseJSON.field).focus();\n }, this).save();\n }\n});\n","/**\n * This widget shows a list of files in a given item.\n */\ngirder.views.FileListWidget = girder.View.extend({\n events: {\n 'click a.g-show-more-files': function () {\n this.collection.fetchNextPage();\n },\n\n 'click a.g-update-contents': function (e) {\n var cid = $(e.currentTarget).parent().attr('file-cid');\n this.uploadDialog(cid);\n },\n\n 'click a.g-update-info': function (e) {\n var cid = $(e.currentTarget).parent().attr('file-cid');\n this.editFileDialog(cid);\n },\n\n 'click a.g-delete-file': function (e) {\n var cid = $(e.currentTarget).parent().attr('file-cid');\n var file = this.collection.get(cid);\n\n girder.confirm({\n text: 'Are you sure you want to delete the file ' +\n file.escape('name') + '?',\n yesText: 'Delete',\n escapedHtml: true,\n confirmCallback: _.bind(function () {\n file.once('g:deleted', function () {\n girder.events.trigger('g:alert', {\n icon: 'ok',\n type: 'success',\n text: 'File deleted.',\n timeout: 4000\n });\n\n this.render();\n }, this).once('g:error', function () {\n girder.events.trigger('g:alert', {\n icon: 'cancel',\n text: 'Failed to delete file.',\n type: 'danger',\n timeout: 4000\n });\n }).destroy();\n }, this)\n });\n }\n },\n\n initialize: function (settings) {\n this.upload = settings.upload;\n this.fileEdit = settings.fileEdit;\n this.checked = [];\n this.collection = new girder.collections.FileCollection();\n this.collection.altUrl = 'item/' +\n (settings.itemId || settings.item.get('_id')) + '/files';\n this.collection.append = true; // Append, don't replace pages\n this.collection.on('g:changed', function () {\n this.render();\n this.trigger('g:changed');\n }, this).fetch();\n\n this.parentItem = settings.item;\n },\n\n editFileDialog: function (cid) {\n this.editFileWidget = new girder.views.EditFileWidget({\n el: $('#g-dialog-container'),\n file: this.collection.get(cid),\n parentView: this\n }).off('g:saved', null, this).on('g:saved', function () {\n this.render();\n }, this);\n this.editFileWidget.render();\n },\n\n uploadDialog: function (cid) {\n new girder.views.UploadWidget({\n el: $('#g-dialog-container'),\n title: 'Replace file contents',\n parent: this.collection.get(cid),\n parentType: 'file',\n parentView: this\n }).on('g:uploadFinished', function () {\n girder.events.trigger('g:alert', {\n icon: 'ok',\n text: 'File contents updated.',\n type: 'success',\n timeout: 4000\n });\n }, this).render();\n },\n\n render: function () {\n this.checked = [];\n this.$el.html(girder.templates.fileList({\n files: this.collection.toArray(),\n hasMore: this.collection.hasNextPage(),\n girder: girder,\n parentItem: this.parentItem\n }));\n\n this.$('.g-file-actions-container a[title]').tooltip({\n container: 'body',\n placement: 'auto',\n delay: 100\n });\n\n if (this.fileEdit) {\n this.editFileDialog(this.fileEdit);\n this.fileEdit = false;\n } else if (this.upload) {\n this.uploadDialog(this.upload);\n this.upload = false;\n }\n\n return this;\n },\n\n /**\n * Insert a file into the collection and re-render it.\n */\n insertFile: function (file) {\n this.collection.add(file);\n this.render();\n this.trigger('g:changed');\n }\n});\n","/**\n * This view shows a dialog container detailed folder information.\n */\ngirder.views.FolderInfoWidget = girder.View.extend({\n initialize: function () {\n this.needToFetch = !this.model.has('nItems') || !this.model.has('nFolders');\n if (this.needToFetch) {\n this.model.fetch({extraPath: 'details'}).once('g:fetched.details', function () {\n this.needToFetch = false;\n this.render();\n }, this);\n }\n },\n\n render: function () {\n if (this.needToFetch) {\n return;\n }\n\n this.$el.html(girder.templates.folderInfoDialog({\n folder: this.model,\n girder: girder\n })).girderModal(this);\n }\n});\n","/**\n * This widget shows a list of folders under a given parent.\n * Initialize this with a \"parentType\" and \"parentId\" value, which will\n * be passed to the folder GET endpoint.\n */\ngirder.views.FolderListWidget = girder.View.extend({\n events: {\n 'click a.g-folder-list-link': function (event) {\n var cid = $(event.currentTarget).attr('g-folder-cid');\n this.trigger('g:folderClicked', this.collection.get(cid));\n },\n 'click a.g-show-more-folders': function () {\n this.collection.fetchNextPage();\n }\n },\n\n initialize: function (settings) {\n this.checked = [];\n this._checkboxes = settings.checkboxes;\n\n new girder.views.LoadingAnimation({\n el: this.$el,\n parentView: this\n }).render();\n\n this.collection = new girder.collections.FolderCollection();\n this.collection.append = true; // Append, don't replace pages\n this.collection.on('g:changed', function () {\n this.render();\n this.trigger('g:changed');\n }, this).fetch({\n parentType: settings.parentType || 'folder',\n parentId: settings.parentId\n });\n },\n\n render: function () {\n this.checked = [];\n this.$el.html(girder.templates.folderList({\n folders: this.collection.toArray(),\n hasMore: this.collection.hasNextPage(),\n checkboxes: this._checkboxes\n }));\n\n var view = this;\n this.$('.g-list-checkbox').change(function () {\n var cid = $(this).attr('g-folder-cid');\n if (this.checked) {\n view.checked.push(cid);\n } else {\n var idx = view.checked.indexOf(cid);\n if (idx !== -1) {\n view.checked.splice(idx, 1);\n }\n }\n view.trigger('g:checkboxesChanged');\n });\n return this;\n },\n\n /**\n * Insert a folder into the collection and re-render it.\n */\n insertFolder: function (folder) {\n this.collection.add(folder);\n this.trigger('g:changed');\n this.render();\n },\n\n /**\n * Set all folder checkboxes to a certain checked state. The event\n * g:checkboxesChanged is triggered once after checking/unchecking everything.\n * @param {bool} checked The checked state.\n */\n checkAll: function (checked) {\n this.$('.g-list-checkbox').prop('checked', checked);\n\n this.checked = [];\n if (checked) {\n this.collection.each(function (model) {\n this.checked.push(model.cid);\n }, this);\n }\n\n this.trigger('g:checkboxesChanged');\n },\n\n recomputeChecked: function () {\n this.checked = _.map(this.$('.g-list-checkbox:checked'), function (checkbox) {\n return $(checkbox).attr('g-folder-cid');\n }, this);\n }\n});\n","/**\n * This view shows a list of administrators of a group.\n */\ngirder.views.GroupAdminsWidget = girder.View.extend({\n events: {\n 'click .g-demote-moderator': function (e) {\n var li = $(e.currentTarget).parents('.g-group-admins>li');\n var userid = li.attr('userid');\n var view = this;\n\n girder.confirm({\n text: 'Are you sure you want to demote ' +\n _.escape(li.attr('username')) + ' to a moderator?',\n escapedHtml: true,\n confirmCallback: function () {\n var user = new girder.models.UserModel({_id: userid});\n view.model.off('g:promoted').on('g:promoted', function () {\n this.trigger('g:moderatorAdded');\n }, view).promoteUser(user, girder.AccessType.WRITE);\n }\n });\n },\n\n 'click .g-demote-member': function (e) {\n var li = $(e.currentTarget).parents('.g-group-admins>li');\n var view = this;\n\n girder.confirm({\n text: 'Are you sure you want to remove admin privileges ' +\n 'from ' + _.escape(li.attr('username')) + '?',\n escapedHtml: true,\n confirmCallback: function () {\n view.trigger('g:demoteUser', li.attr('userid'));\n }\n });\n },\n\n 'click a.g-group-admin-remove': function (e) {\n var view = this;\n var li = $(e.currentTarget).parents('li');\n\n girder.confirm({\n text: 'Are you sure you want to remove ' +\n _.escape(li.attr('username')) +\n ' from this group?',\n escapedHtml: true,\n confirmCallback: function () {\n view.trigger('g:removeMember', li.attr('userid'));\n }\n });\n },\n\n 'click a.g-member-name': function (e) {\n girder.events.trigger('g:navigateTo', girder.views.UserView, {\n id: $(e.currentTarget).parents('li').attr('userid')\n });\n }\n },\n\n initialize: function (settings) {\n this.model = settings.group;\n this.admins = settings.admins;\n },\n\n render: function () {\n this.$el.html(girder.templates.groupAdminList({\n group: this.model,\n level: this.model.get('_accessLevel'),\n admins: this.admins,\n accessType: girder.AccessType\n }));\n\n this.$('.g-group-admin-demote').tooltip({\n container: 'body',\n placement: 'left',\n animation: false,\n delay: {show: 100}\n });\n\n return this;\n }\n});\n","/**\n * This view shows a list of pending invitations to the group.\n */\ngirder.views.GroupInvitesWidget = girder.View.extend({\n events: {\n 'click .g-group-uninvite': function (e) {\n var li = $(e.currentTarget).parents('li');\n var view = this;\n\n girder.confirm({\n text: 'Are you sure you want to remove the invitation ' +\n 'for ' + _.escape(li.attr('username')) + '?',\n escapedHtml: true,\n confirmCallback: function () {\n var user = view.collection.get(li.attr('cid'));\n view.group.off('g:removed').on('g:removed', function () {\n view.collection.remove(user);\n view.render();\n view.parentView.render();\n }).removeMember(user.get('_id'));\n }\n });\n },\n\n 'click a.g-member-name': function (e) {\n var user = this.collection.get($(e.currentTarget).parents('li').attr('cid'));\n girder.router.navigate('user/' + user.get('_id'), {trigger: true});\n }\n },\n\n initialize: function (settings) {\n this.collection = settings.invitees;\n this.group = settings.group;\n },\n\n render: function () {\n this.$el.html(girder.templates.groupInviteList({\n level: this.group.get('_accessLevel'),\n invitees: this.collection.toArray(),\n accessType: girder.AccessType\n }));\n\n this.$('a[title]').tooltip({\n container: this.$el,\n placement: 'left',\n animation: false,\n delay: {show: 100}\n });\n\n return this;\n }\n});\n","/**\n * This view shows a list of members of a group.\n */\ngirder.views.GroupMembersWidget = girder.View.extend({\n events: {\n 'click a.g-member-name': function (e) {\n var model = this.membersColl.get(\n $(e.currentTarget).parents('li').attr('cid')\n );\n girder.router.navigate('user/' + model.get('_id'), {trigger: true});\n },\n\n 'click a.g-group-member-remove': function (e) {\n var view = this;\n var user = this.membersColl.get(\n $(e.currentTarget).parents('li').attr('cid')\n );\n\n girder.confirm({\n text: 'Are you sure you want to remove ' + _.escape(user.name()) +\n ' from this group?',\n escapedHtml: true,\n confirmCallback: function () {\n view.trigger('g:removeMember', user);\n }\n });\n },\n\n 'click .g-promote-moderator': function (e) {\n var cid = $(e.currentTarget).parents('.g-group-members>li')\n .attr('cid');\n var user = this.membersColl.get(cid);\n this.model.off('g:promoted').on('g:promoted', function () {\n this.trigger('g:moderatorAdded');\n }, this).promoteUser(user, girder.AccessType.WRITE);\n },\n\n 'click .g-promote-admin': function (e) {\n var cid = $(e.currentTarget).parents('.g-group-members>li')\n .attr('cid');\n var user = this.membersColl.get(cid);\n this.model.off('g:promoted').on('g:promoted', function () {\n this.trigger('g:adminAdded');\n }, this).promoteUser(user, girder.AccessType.ADMIN);\n }\n },\n\n initialize: function (settings) {\n this.model = settings.group;\n this.modsAndAdmins = [];\n var view = this;\n _.each(settings.admins, function (user) {\n view.modsAndAdmins.push(user.id);\n });\n _.each(settings.moderators, function (user) {\n view.modsAndAdmins.push(user.id);\n });\n this.membersColl = new girder.collections.UserCollection();\n this.membersColl.altUrl =\n 'group/' + this.model.get('_id') + '/member';\n this.membersColl.on('g:changed', function () {\n this.render();\n }, this).fetch();\n },\n\n render: function () {\n var members = [];\n for (var i = 0; i < this.membersColl.models.length; i += 1) {\n var member = this.membersColl.models[i];\n if ($.inArray(member.id, this.modsAndAdmins) < 0) {\n members.push(member);\n }\n }\n this.$el.html(girder.templates.groupMemberList({\n group: this.model,\n members: members,\n level: this.model.get('_accessLevel'),\n accessType: girder.AccessType\n }));\n\n new girder.views.PaginateWidget({\n el: this.$('.g-member-pagination'),\n collection: this.membersColl,\n parentView: this\n }).render();\n\n this.userSearch = new girder.views.SearchFieldWidget({\n el: this.$('.g-group-invite-container'),\n placeholder: 'Invite a user to join...',\n types: ['user'],\n parentView: this\n }).off().on('g:resultClicked', this._inviteUser, this).render();\n\n this.$('.g-group-member-remove,.g-group-member-promote').tooltip({\n container: 'body',\n placement: 'left',\n animation: false,\n delay: {show: 100}\n });\n\n return this;\n },\n\n /**\n * When user searches and clicks a user, this method is called and a\n * dialog is opened allowing the user to select a role to invite into.\n */\n _inviteUser: function (user) {\n this.userSearch.resetState();\n\n new girder.views.InviteUserDialog({\n el: $('#g-dialog-container'),\n group: this.model,\n user: user,\n parentView: this\n }).on('g:sendInvite', function (params) {\n this.trigger('g:sendInvite', params);\n }, this).render();\n }\n});\n\ngirder.views.InviteUserDialog = girder.View.extend({\n events: {\n 'click .g-invite-as-member': function () {\n this._sendInvitation(girder.AccessType.READ);\n },\n\n 'click .g-invite-as-moderator': function () {\n this._sendInvitation(girder.AccessType.WRITE);\n },\n\n 'click .g-invite-as-admin': function () {\n this._sendInvitation(girder.AccessType.ADMIN);\n },\n\n 'click .g-add-as-member': function () {\n this._sendInvitation(girder.AccessType.READ, true);\n },\n\n 'click .g-add-as-moderator': function () {\n this._sendInvitation(girder.AccessType.WRITE, true);\n },\n\n 'click .g-add-as-admin': function () {\n this._sendInvitation(girder.AccessType.ADMIN, true);\n }\n },\n\n initialize: function (settings) {\n this.group = settings.group;\n this.user = settings.user;\n },\n\n render: function () {\n this.$el.html(girder.templates.groupInviteDialog({\n group: this.group,\n user: this.user,\n level: this.group.get('_accessLevel'),\n accessType: girder.AccessType,\n mayAdd: this.group.mayAddMembers()\n })).girderModal(this);\n\n return this;\n },\n\n _sendInvitation: function (level, force) {\n this.$el.modal('hide');\n this.trigger('g:sendInvite', {\n user: this.user,\n group: this.group,\n level: level,\n force: force\n });\n }\n});\n","/**\n * This view shows a list of moderators of a group.\n */\ngirder.views.GroupModsWidget = girder.View.extend({\n events: {\n 'click .g-group-mod-promote': function (e) {\n var userid = $(e.currentTarget).parents('li').attr('userid');\n var user = new girder.models.UserModel({_id: userid});\n this.model.off('g:promoted').on('g:promoted', function () {\n this.trigger('g:adminAdded');\n }, this).promoteUser(user, girder.AccessType.ADMIN);\n },\n\n 'click .g-group-mod-demote': function (e) {\n var li = $(e.currentTarget).parents('li');\n var view = this;\n\n girder.confirm({\n text: 'Are you sure you want to remove moderator privileges ' +\n 'from ' + _.escape(li.attr('username')) + '?',\n escapedHtml: true,\n confirmCallback: function () {\n view.trigger('g:demoteUser', li.attr('userid'));\n }\n });\n },\n\n 'click a.g-group-mod-remove': function (e) {\n var view = this;\n var li = $(e.currentTarget).parents('li');\n\n girder.confirm({\n text: 'Are you sure you want to remove ' +\n _.escape(li.attr('username')) +\n ' from this group?',\n escapedHtml: true,\n confirmCallback: function () {\n view.trigger('g:removeMember', li.attr('userid'));\n }\n });\n },\n\n 'click a.g-member-name': function (e) {\n girder.events.trigger('g:navigateTo', girder.views.UserView, {\n id: $(e.currentTarget).parents('li').attr('userid')\n });\n }\n },\n\n initialize: function (settings) {\n this.model = settings.group;\n this.moderators = settings.moderators;\n },\n\n render: function () {\n this.$el.html(girder.templates.groupModList({\n group: this.model,\n level: this.model.get('_accessLevel'),\n moderators: this.moderators,\n accessType: girder.AccessType\n }));\n\n this.$('.g-group-mod-demote.g-group-mod-promote,.g-group-mod-remove').tooltip({\n container: 'body',\n placement: 'left',\n animation: false,\n delay: {show: 100}\n });\n\n return this;\n }\n});\n","/**\n * This widget is used to navigate the data hierarchy of folders and items.\n */\ngirder.views.HierarchyWidget = girder.View.extend({\n events: {\n 'click a.g-create-subfolder': 'createFolderDialog',\n 'click a.g-edit-folder': 'editFolderDialog',\n 'click a.g-delete-folder': 'deleteFolderDialog',\n 'click .g-folder-info-button': 'showInfoDialog',\n 'click .g-collection-info-button': 'showInfoDialog',\n 'click .g-description-preview': 'showInfoDialog',\n 'click a.g-create-item': 'createItemDialog',\n 'click .g-upload-here-button': 'uploadDialog',\n 'click .g-edit-access': 'editAccess',\n 'click .g-hierarchy-level-up': 'upOneLevel',\n 'click a.g-download-checked': 'downloadChecked',\n 'click a.g-pick-checked': 'pickChecked',\n 'click a.g-move-picked': 'movePickedResources',\n 'click a.g-copy-picked': 'copyPickedResources',\n 'click a.g-clear-picked': 'clearPickedResources',\n 'click a.g-delete-checked': 'deleteCheckedDialog',\n 'click .g-list-checkbox': 'checkboxListener',\n 'change .g-select-all': function (e) {\n this.folderListView.checkAll(e.currentTarget.checked);\n\n if (this.itemListView) {\n this.itemListView.checkAll(e.currentTarget.checked);\n }\n }\n },\n\n /**\n * This should be instantiated with the following settings:\n * parentModel: The model representing the root node. Must be a User,\n * Collection, or Folder model.\n * [showActions=true]: Whether to show the action bar.\n * [showItems=true]: Whether to show items in the list (or just folders).\n * [checkboxes=true]: Whether to show checkboxes next to each resource.\n * [routing=true]: Whether the route should be updated by this widget.\n * [appendPages=false]: Whether new pages should be appended instead of\n * replaced.\n * [onItemClick]: A function that will be called when an item is clicked,\n * passed the Item model as its first argument and the\n * event as its second.\n */\n initialize: function (settings) {\n this.parentModel = settings.parentModel;\n this.upload = settings.upload;\n\n this._showActions = _.has(settings, 'showActions') ? settings.showActions : true;\n this._showItems = _.has(settings, 'showItems') ? settings.showItems : true;\n this._checkboxes = _.has(settings, 'checkboxes') ? settings.checkboxes : true;\n this._routing = _.has(settings, 'routing') ? settings.routing : true;\n this._appendPages = _.has(settings, 'appendPages') ? settings.appendPages : false;\n this._onItemClick = settings.onItemClick || function (item) {\n girder.router.navigate('item/' + item.get('_id'), {trigger: true});\n };\n\n this.folderAccess = settings.folderAccess;\n this.folderCreate = settings.folderCreate;\n this.folderEdit = settings.folderEdit;\n this.itemCreate = settings.itemCreate;\n this.breadcrumbs = [this.parentModel];\n\n // Initialize the breadcrumb bar state\n this.breadcrumbView = new girder.views.HierarchyBreadcrumbView({\n objects: this.breadcrumbs,\n parentView: this\n });\n this.breadcrumbView.on('g:breadcrumbClicked', function (idx) {\n this.breadcrumbs = this.breadcrumbs.slice(0, idx + 1);\n this.setCurrentModel(this.breadcrumbs[idx]);\n this._setRoute();\n }, this);\n\n this.checkedMenuWidget = new girder.views.CheckedMenuWidget({\n pickedCount: this.getPickedCount(),\n pickedCopyAllowed: this.getPickedCopyAllowed(),\n pickedMoveAllowed: this.getPickedMoveAllowed(),\n pickedDesc: this.getPickedDescription(),\n parentView: this\n });\n\n this.folderListView = new girder.views.FolderListWidget({\n parentType: this.parentModel.resourceName,\n parentId: this.parentModel.get('_id'),\n checkboxes: this._checkboxes,\n parentView: this\n });\n this.folderListView.on('g:folderClicked', function (folder) {\n this.descend(folder);\n\n if (this.uploadWidget) {\n this.uploadWidget.folder = folder;\n }\n }, this).off('g:checkboxesChanged')\n .on('g:checkboxesChanged', this.updateChecked, this)\n .off('g:changed').on('g:changed', function () {\n this.folderCount = this.folderListView.collection.length;\n this._childCountCheck();\n }, this);\n\n if (this.parentModel.resourceName === 'folder') {\n this._initFolderViewSubwidgets();\n } else {\n this.itemCount = 0;\n }\n\n if (this.parentModel.resourceName === 'folder') {\n this._fetchToRoot(this.parentModel);\n } else {\n this.render();\n }\n girder.events.on('g:login', girder.resetPickedResources, this);\n },\n\n /**\n * If both the child folders and child items have been fetched, and\n * there are neither of either type in this parent container, we should\n * show the \"empty container\" message.\n */\n _childCountCheck: function () {\n var container = this.$('.g-empty-parent-message').addClass('hide');\n if (this.folderCount === 0 && this.itemCount === 0) {\n container.removeClass('hide');\n }\n },\n\n /**\n * Initializes the subwidgets that are only shown when the parent resource\n * is a folder type.\n */\n _initFolderViewSubwidgets: function () {\n this.itemListView = new girder.views.ItemListWidget({\n folderId: this.parentModel.get('_id'),\n checkboxes: this._checkboxes,\n parentView: this\n });\n this.itemListView.on('g:itemClicked', this._onItemClick, this)\n .off('g:checkboxesChanged')\n .on('g:checkboxesChanged', this.updateChecked, this)\n .off('g:changed').on('g:changed', function () {\n this.itemCount = this.itemListView.collection.length;\n this._childCountCheck();\n }, this);\n\n this.metadataWidget = new girder.views.MetadataWidget({\n item: this.parentModel,\n parentView: this,\n accessLevel: this.parentModel.getAccessLevel()\n });\n },\n\n _setRoute: function () {\n if (this._routing) {\n var route = this.breadcrumbs[0].resourceName + '/' +\n this.breadcrumbs[0].get('_id');\n if (this.parentModel.resourceName === 'folder') {\n route += '/folder/' + this.parentModel.get('_id');\n }\n girder.router.navigate(route);\n girder.events.trigger('g:hierarchy.route', {route: route});\n }\n },\n\n _fetchToRoot: function (folder) {\n var parentId = folder.get('parentId');\n var parentType = folder.get('parentCollection');\n var parent = new girder.models[girder.getModelClassByName(parentType)]();\n parent.set({\n _id: parentId\n }).once('g:fetched', function () {\n this.breadcrumbs.push(parent);\n\n if (parentType === 'folder') {\n this._fetchToRoot(parent);\n } else {\n this.breadcrumbs.reverse();\n this.render();\n }\n }, this).fetch();\n },\n\n render: function () {\n this.folderCount = null;\n this.itemCount = null;\n\n this.$el.html(girder.templates.hierarchyWidget({\n type: this.parentModel.resourceName,\n model: this.parentModel,\n level: this.parentModel.getAccessLevel(),\n AccessType: girder.AccessType,\n showActions: this._showActions,\n checkboxes: this._checkboxes,\n girder: girder\n }));\n\n if (this.$('.g-folder-actions-menu>li>a').length === 0) {\n // Disable the actions button if actions list is empty\n this.$('.g-folder-actions-button').attr('disabled', 'disabled');\n }\n\n this.breadcrumbView.setElement(this.$('.g-hierarchy-breadcrumb-bar>ol')).render();\n this.checkedMenuWidget.dropdownToggle = this.$('.g-checked-actions-button');\n this.checkedMenuWidget.setElement(this.$('.g-checked-actions-menu')).render();\n this.folderListView.setElement(this.$('.g-folder-list-container')).render();\n\n if (this.parentModel.resourceName === 'folder' && this._showItems) {\n this.itemListView.setElement(this.$('.g-item-list-container')).render();\n this.metadataWidget.setItem(this.parentModel);\n this.metadataWidget.setElement(this.$('.g-folder-metadata')).render();\n }\n\n this.$('[title]').tooltip({\n container: this.$el,\n animation: false,\n delay: {\n show: 100\n },\n placement: function () {\n return this.$element.attr('placement') || 'top';\n }\n });\n\n if (this.upload) {\n this.uploadDialog();\n } else if (this.folderAccess) {\n this.editAccess();\n } else if (this.folderCreate) {\n this.createFolderDialog();\n } else if (this.folderEdit) {\n this.editFolderDialog();\n } else if (this.itemCreate) {\n this.createItemDialog();\n }\n\n this.fetchAndShowChildCount();\n\n return this;\n },\n\n /**\n * Descend into the given folder.\n */\n descend: function (folder) {\n this.breadcrumbs.push(folder);\n this.setCurrentModel(folder);\n },\n\n /**\n * Go to the parent of the current folder\n */\n upOneLevel: function () {\n this.breadcrumbs.pop();\n this.setCurrentModel(this.breadcrumbs[this.breadcrumbs.length - 1]);\n },\n\n /**\n * Prompt the user to create a new subfolder in the current folder.\n */\n createFolderDialog: function () {\n new girder.views.EditFolderWidget({\n el: $('#g-dialog-container'),\n parentModel: this.parentModel,\n parentView: this\n }).on('g:saved', function (folder) {\n this.folderListView.insertFolder(folder);\n if (this.parentModel.has('nFolders')) {\n this.parentModel.increment('nFolders');\n }\n this.updateChecked();\n }, this).render();\n },\n\n /**\n * Prompt the user to create a new item in the current folder\n */\n createItemDialog: function () {\n new girder.views.EditItemWidget({\n el: $('#g-dialog-container'),\n parentModel: this.parentModel,\n parentView: this\n }).on('g:saved', function (item) {\n this.itemListView.insertItem(item);\n if (this.parentModel.has('nItems')) {\n this.parentModel.increment('nItems');\n }\n this.updateChecked();\n }, this).render();\n },\n\n /**\n * Prompt user to edit the current folder or collection.\n */\n editFolderDialog: function () {\n if (this.parentModel.resourceName === 'folder') {\n new girder.views.EditFolderWidget({\n el: $('#g-dialog-container'),\n parentModel: this.parentModel,\n folder: this.parentModel,\n parentView: this\n }).on('g:saved', function () {\n girder.events.trigger('g:alert', {\n icon: 'ok',\n text: 'Folder info updated.',\n type: 'success',\n timeout: 4000\n });\n this.breadcrumbView.render();\n }, this).on('g:fileUploaded', function (args) {\n var item = new girder.models.ItemModel({\n _id: args.model.get('itemId')\n });\n\n item.once('g:fetched', function () {\n this.itemListView.insertItem(item);\n if (this.parentModel.has('nItems')) {\n this.parentModel.increment('nItems');\n }\n this.updateChecked();\n }, this).fetch();\n }, this).render();\n } else if (this.parentModel.resourceName === 'collection') {\n new girder.views.EditCollectionWidget({\n el: $('#g-dialog-container'),\n model: this.parentModel,\n parentView: this\n }).on('g:saved', function () {\n this.breadcrumbView.render();\n this.trigger('g:collectionChanged');\n }, this).render();\n }\n },\n\n /**\n * Prompt the user to delete the currently viewed folder or collection.\n */\n deleteFolderDialog: function () {\n var type = this.parentModel.resourceName;\n var params = {\n text: 'Are you sure you want to delete the ' + type + ' ' +\n this.parentModel.escape('name') + '?',\n escapedHtml: true,\n yesText: 'Delete',\n confirmCallback: _.bind(function () {\n this.parentModel.destroy({\n throwError: true,\n progress: true\n }).on('g:deleted', function () {\n if (type === 'collection') {\n girder.router.navigate('collections', {trigger: true});\n } else if (type === 'folder') {\n this.breadcrumbs.pop();\n this.setCurrentModel(this.breadcrumbs.slice(-1)[0]);\n }\n }, this);\n }, this)\n };\n girder.confirm(params);\n },\n\n /**\n * Deprecated alias for showInfoDialog.\n * @deprecated\n */\n folderInfoDialog: function () {\n this.showInfoDialog();\n },\n\n showInfoDialog: function () {\n var opts = {\n el: $('#g-dialog-container'),\n model: this.parentModel,\n parentView: this\n };\n\n if (this.parentModel.resourceName === 'collection') {\n new girder.views.CollectionInfoWidget(opts).render();\n } else if (this.parentModel.resourceName === 'folder') {\n new girder.views.FolderInfoWidget(opts).render();\n }\n },\n\n fetchAndShowChildCount: function () {\n this.$('.g-child-count-container').addClass('hide');\n\n var showCounts = _.bind(function () {\n this.$('.g-child-count-container').removeClass('hide');\n this.$('.g-subfolder-count').text(\n girder.formatCount(this.parentModel.get('nFolders')));\n if (this.parentModel.has('nItems')) {\n this.$('.g-item-count').text(\n girder.formatCount(this.parentModel.get('nItems')));\n }\n }, this);\n\n if (this.parentModel.has('nFolders')) {\n showCounts();\n } else {\n this.parentModel.set('nFolders', 0); // prevents fetching details twice\n this.parentModel.once('g:fetched.details', function () {\n showCounts();\n }, this).fetch({extraPath: 'details'});\n }\n\n this.parentModel.off('change:nItems', showCounts, this)\n .on('change:nItems', showCounts, this)\n .off('change:nFolders', showCounts, this)\n .on('change:nFolders', showCounts, this);\n\n return this;\n },\n\n /**\n * Change the current parent model, i.e. the resource being shown currently.\n *\n * @param parent The parent model to change to.\n */\n setCurrentModel: function (parent, opts) {\n opts = opts || {};\n this.parentModel = parent;\n\n this.breadcrumbView.objects = this.breadcrumbs;\n\n this.folderListView.initialize({\n parentType: parent.resourceName,\n parentId: parent.get('_id'),\n checkboxes: this._checkboxes\n });\n\n this.updateChecked();\n\n if (parent.resourceName === 'folder') {\n if (this.itemListView) {\n this.itemListView.initialize({\n folderId: parent.get('_id'),\n checkboxes: this._checkboxes\n });\n } else {\n this._initFolderViewSubwidgets();\n }\n }\n\n this.render();\n if (!_.has(opts, 'setRoute') || opts.setRoute) {\n this._setRoute();\n }\n this.trigger('g:setCurrentModel');\n },\n\n /**\n * Based on a resource collection with either has model references or\n * checkbox references, return a string that describes the collection.\n * :param resources: a hash with different resources.\n * :returns: description of the resources.\n */\n _describeResources: function (resources) {\n /* If the resources aren't English words or don't have simple plurals,\n * this will need to be refactored. */\n var kinds = ['folder', 'item'];\n\n var desc = [];\n for (var i = 0; i < kinds.length; i += 1) {\n var kind = kinds[i];\n if (resources[kind] && resources[kind].length) {\n desc.push(resources[kind].length + ' ' + kind +\n (resources[kind].length !== 1 ? 's' : ''));\n }\n }\n switch (desc.length) {\n case 0:\n return 'nothing';\n case 1:\n return desc[0];\n case 2:\n return desc[0] + ' and ' + desc [1];\n /* If we add a third model type, enable this:\n default:\n desc[desc.length-1] = 'and ' + desc[desc.length-1];\n return ', '.join(desc);\n */\n }\n },\n\n /**\n * Prompt the user to delete the currently checked items.\n */\n deleteCheckedDialog: function () {\n var view = this;\n var folders = this.folderListView.checked;\n var items;\n if (this.itemListView && this.itemListView.checked.length) {\n items = this.itemListView.checked;\n }\n var desc = this._describeResources({folder: folders, item: items});\n\n var params = {\n text: 'Are you sure you want to delete the checked resources (' +\n desc + ')?',\n\n yesText: 'Delete',\n confirmCallback: function () {\n var resources = view._getCheckedResourceParam();\n /* Content on DELETE requests is somewhat oddly supported (I\n * can't get it to work under jasmine/phantom), so override the\n * method. */\n girder.restRequest({\n path: 'resource',\n type: 'POST',\n data: {resources: resources, progress: true},\n headers: {'X-HTTP-Method-Override': 'DELETE'}\n }).done(function () {\n if (items && items.length && view.parentModel.has('nItems')) {\n view.parentModel.increment('nItems', -items.length);\n }\n if (folders.length && view.parentModel.has('nFolders')) {\n view.parentModel.increment('nFolders', -folders.length);\n }\n\n view.setCurrentModel(view.parentModel, {setRoute: false});\n });\n }\n };\n girder.confirm(params);\n },\n\n /**\n * Show and handle the upload dialog\n */\n uploadDialog: function () {\n var container = $('#g-dialog-container');\n\n new girder.views.UploadWidget({\n el: container,\n parent: this.parentModel,\n parentType: this.parentType,\n parentView: this\n }).on('g:uploadFinished', function (info) {\n girder.dialogs.handleClose('upload');\n this.upload = false;\n if (this.parentModel.has('nItems')) {\n this.parentModel.increment('nItems', info.files.length);\n }\n if (this.parentModel.has('size')) {\n this.parentModel.increment('size', info.totalSize);\n }\n this.setCurrentModel(this.parentModel, {setRoute: false});\n }, this).render();\n },\n\n /**\n * When any of the checkboxes is changed, this will be called to update\n * the checked menu state.\n */\n updateChecked: function () {\n var folders = this.folderListView.checked,\n items = [];\n\n // Only show actions corresponding to the minimum access level over\n // the whole set of checked resources.\n var minFolderLevel = girder.AccessType.ADMIN;\n _.every(folders, function (cid) {\n var folder = this.folderListView.collection.get(cid);\n minFolderLevel = Math.min(minFolderLevel, folder.getAccessLevel());\n return minFolderLevel > girder.AccessType.READ; // acts as 'break'\n }, this);\n\n var minItemLevel = girder.AccessType.ADMIN;\n if (this.itemListView) {\n items = this.itemListView.checked;\n if (items.length) {\n minItemLevel = Math.min(minItemLevel, this.parentModel.getAccessLevel());\n }\n }\n\n if (folders.length + items.length) {\n // Disable folder actions if checkboxes are checked\n this.$('.g-folder-actions-button').attr('disabled', 'disabled');\n } else {\n this.$('.g-folder-actions-button').removeAttr('disabled');\n }\n\n this.checkedMenuWidget.update({\n minFolderLevel: minFolderLevel,\n minItemLevel: minItemLevel,\n folderCount: folders.length,\n itemCount: items.length,\n pickedCount: this.getPickedCount(),\n pickedCopyAllowed: this.getPickedCopyAllowed(),\n pickedMoveAllowed: this.getPickedMoveAllowed(),\n pickedDesc: this.getPickedDescription()\n });\n },\n\n getPickedCount: function () {\n var pickedCount = 0;\n if (girder.pickedResources && girder.pickedResources.resources) {\n _.each(girder.pickedResources.resources, function (list) {\n pickedCount += list.length;\n });\n }\n return pickedCount;\n },\n\n getPickedCopyAllowed: function () {\n /* We must have something picked */\n if (!girder.pickedResources) {\n return false;\n }\n /* If we have an item picked but this page isn't a folder's list, then\n * you can't move or copy them here. */\n if (this.parentModel.resourceName !== 'folder') {\n if (girder.pickedResources.resources.item &&\n girder.pickedResources.resources.item.length) {\n return false;\n }\n }\n /* We must have permission to write to this folder to be allowed to\n * copy. */\n if (this.parentModel.getAccessLevel() < girder.AccessType.WRITE) {\n return false;\n }\n return true;\n },\n\n getPickedMoveAllowed: function () {\n /* All of the restrictions for copy are the same */\n if (!this.getPickedCopyAllowed()) {\n return false;\n }\n /* We also can't move an item or folder if we don't have permission to\n * delete that item or folder (since a move deletes it from the\n * original spot). */\n if (girder.pickedResources.minFolderLevel < girder.AccessType.ADMIN) {\n return false;\n }\n if (girder.pickedResources.minItemLevel < girder.AccessType.WRITE) {\n return false;\n }\n return true;\n },\n\n getPickedDescription: function () {\n if (!girder.pickedResources || !girder.pickedResources.resources) {\n return '';\n }\n return this._describeResources(girder.pickedResources.resources);\n },\n\n /**\n * Get a parameter that can be added to a url for the checked resources.\n */\n _getCheckedResourceParam: function (asObject) {\n var resources = {folder: [], item: []};\n var folders = this.folderListView.checked;\n _.each(folders, function (cid) {\n var folder = this.folderListView.collection.get(cid);\n resources.folder.push(folder.id);\n }, this);\n if (this.itemListView) {\n var items = this.itemListView.checked;\n _.each(items, function (cid) {\n var item = this.itemListView.collection.get(cid);\n resources.item.push(item.id);\n return true;\n }, this);\n }\n _.each(resources, function (list, key) {\n if (!list.length) {\n delete resources[key];\n }\n });\n if (asObject) {\n return resources;\n }\n return JSON.stringify(resources);\n },\n\n downloadChecked: function () {\n var url = girder.apiRoot + '/resource/download';\n var resources = this._getCheckedResourceParam();\n var data = {resources: resources};\n\n this.redirectViaForm('POST', url, data);\n },\n\n pickChecked: function () {\n if (!girder.pickedResources) {\n girder.pickedResources = {\n resources: {},\n minItemLevel: girder.AccessType.ADMIN,\n minFolderLevel: girder.AccessType.ADMIN\n };\n }\n /* Maintain our minimum permissions. It is expensive to compute them\n * arbitrarily later. */\n var folders = this.folderListView.checked;\n _.every(folders, function (cid) {\n var folder = this.folderListView.collection.get(cid);\n girder.pickedResources.minFolderLevel = Math.min(\n girder.pickedResources.minFolderLevel,\n folder.getAccessLevel());\n return (girder.pickedResources.minFolderLevel >\n girder.AccessType.READ); // acts as 'break'\n }, this);\n if (this.itemListView) {\n var items = this.itemListView.checked;\n if (items.length) {\n girder.pickedResources.minItemLevel = Math.min(\n girder.pickedResources.minItemLevel,\n this.parentModel.getAccessLevel());\n }\n }\n var resources = this._getCheckedResourceParam(true);\n var pickDesc = this._describeResources(resources);\n /* Merge these resources with any that are already picked */\n var existing = girder.pickedResources.resources;\n _.each(existing, function (list, resource) {\n if (!resources[resource]) {\n resources[resource] = list;\n } else {\n resources[resource] = _.union(list, resources[resource]);\n }\n });\n girder.pickedResources.resources = resources;\n this.updateChecked();\n var totalPickDesc = this.getPickedDescription();\n var desc = totalPickDesc + ' picked.';\n if (pickDesc !== totalPickDesc) {\n desc = pickDesc + ' added to picked resources. Now ' + desc;\n }\n girder.events.trigger('g:alert', {\n icon: 'ok',\n text: desc,\n type: 'info',\n timeout: 4000\n });\n },\n\n _incrementCounts: function (nFolders, nItems) {\n if (this.parentModel.has('nItems')) {\n this.parentModel.increment('nItems', nItems);\n }\n if (this.parentModel.has('nFolders')) {\n this.parentModel.increment('nFolders', nFolders);\n }\n },\n\n movePickedResources: function () {\n if (!this.getPickedMoveAllowed()) {\n return;\n }\n var resources = JSON.stringify(girder.pickedResources.resources);\n var nFolders = (girder.pickedResources.resources.folder || []).length;\n var nItems = (girder.pickedResources.resources.item || []).length;\n girder.restRequest({\n path: 'resource/move',\n type: 'PUT',\n data: {\n resources: resources,\n parentType: this.parentModel.resourceName,\n parentId: this.parentModel.get('_id'),\n progress: true\n }\n }).done(_.bind(function () {\n this._incrementCounts(nFolders, nItems);\n this.setCurrentModel(this.parentModel, {setRoute: false});\n }, this));\n this.clearPickedResources();\n },\n\n copyPickedResources: function () {\n if (!this.getPickedCopyAllowed()) {\n return;\n }\n var resources = JSON.stringify(girder.pickedResources.resources);\n var nFolders = (girder.pickedResources.resources.folder || []).length;\n var nItems = (girder.pickedResources.resources.item || []).length;\n girder.restRequest({\n path: 'resource/copy',\n type: 'POST',\n data: {\n resources: resources,\n parentType: this.parentModel.resourceName,\n parentId: this.parentModel.get('_id'),\n progress: true\n }\n }).done(_.bind(function () {\n this._incrementCounts(nFolders, nItems);\n this.setCurrentModel(this.parentModel, {setRoute: false});\n }, this));\n this.clearPickedResources();\n },\n\n clearPickedResources: function (event) {\n girder.resetPickedResources();\n this.updateChecked();\n if (event) {\n girder.events.trigger('g:alert', {\n icon: 'ok',\n text: 'Cleared picked resources',\n type: 'info',\n timeout: 4000\n });\n }\n },\n\n redirectViaForm: function (method, url, data) {\n var form = $('
          ');\n _.each(data, function (value, key) {\n form.append($('').attr(\n {type: 'text', name: key, value: value}));\n });\n $(form).submit();\n },\n\n editAccess: function () {\n new girder.views.AccessWidget({\n el: $('#g-dialog-container'),\n modelType: this.parentModel.resourceName,\n model: this.parentModel,\n parentView: this\n }).on('g:accessListSaved', function (params) {\n if (params.recurse) {\n // Refresh list since the public flag may have changed on the children.\n this.refreshFolderList();\n }\n }, this);\n },\n\n /**\n * Deprecated alias for editAccess.\n * @deprecated\n */\n editFolderAccess: function () {\n this.editAccess();\n },\n\n /**\n * Reloads the folder list view.\n */\n refreshFolderList: function () {\n this.folderListView.collection.fetch(null, true);\n },\n\n /**\n * Select (highlight) an item in the list.\n * @param item An ItemModel instance representing the item to select.\n */\n selectItem: function (item) {\n this.itemListView.selectItem(item);\n },\n\n /**\n * Return the currently selected item, or null if there is no selected item.\n */\n getSelectedItem: function () {\n return this.itemListView.getSelectedItem();\n },\n\n /**\n * In order to handle range selection, we must listen to checkbox changes\n * at this level, in case a range selection crosses the boundary between\n * folders and items.\n */\n checkboxListener: function (e) {\n var checkbox = $(e.currentTarget);\n\n if (this._lastCheckbox) {\n if (e.shiftKey) {\n var checkboxes = this.$el.find(':checkbox');\n var from = checkboxes.index(this._lastCheckbox);\n var to = checkboxes.index(checkbox);\n\n checkboxes.slice(Math.min(from, to), Math.max(from, to) + 1)\n .prop('checked', checkbox.prop('checked'));\n\n this.folderListView.recomputeChecked();\n\n if (this.itemListView) {\n this.itemListView.recomputeChecked();\n }\n\n this.updateChecked();\n }\n }\n this._lastCheckbox = checkbox;\n }\n});\n\n/* Because we need to be able to clear picked resources when the current user\n * changes, this function is placed in the girder namespace. */\ngirder.resetPickedResources = function () {\n girder.pickedResources = null;\n};\n\n/**\n * Renders the breadcrumb list in the hierarchy widget.\n */\ngirder.views.HierarchyBreadcrumbView = girder.View.extend({\n events: {\n 'click a.g-breadcrumb-link': function (event) {\n var link = $(event.currentTarget);\n this.trigger('g:breadcrumbClicked', parseInt(link.attr('g-index'), 10));\n }\n },\n\n initialize: function (settings) {\n this.objects = settings.objects;\n },\n\n render: function () {\n // Clone the array so we don't alter the instance's copy\n var objects = this.objects.slice(0);\n\n // Pop off the last object, it refers to the currently viewed\n // object and should be the \"active\" class, and not a link.\n var active = objects.pop();\n\n var descriptionText = $(girder.renderMarkdown(\n active.get('description') || '')).text();\n\n this.$el.html(girder.templates.hierarchyBreadcrumb({\n links: objects,\n current: active,\n descriptionText: descriptionText\n }));\n }\n});\n","/**\n * Renders the a breadcrumb for the item page\n */\ngirder.views.ItemBreadcrumbWidget = girder.View.extend({\n events: {\n 'click a.g-item-breadcrumb-link': function (event) {\n var link = $(event.currentTarget);\n girder.router.navigate(link.data('type') + '/' + link.data('id'),\n {trigger: true});\n },\n 'click a.g-hierarchy-level-up': function () {\n var folder = this.parentChain.pop().object;\n girder.router.navigate('folder/' + folder._id, {trigger: true});\n }\n },\n\n initialize: function (settings) {\n this.parentChain = settings.parentChain;\n this.render();\n },\n\n render: function () {\n this.$el.html(girder.templates.itemBreadcrumb({\n parentChain: this.parentChain\n }));\n\n this.$('.g-hierarchy-level-up').tooltip({\n container: this.$el,\n placement: 'left',\n animation: false,\n delay: {show: 100}\n });\n }\n});\n","/**\n * This widget shows a list of items under a given folder.\n */\ngirder.views.ItemListWidget = girder.View.extend({\n events: {\n 'click a.g-item-list-link': function (event) {\n var cid = $(event.currentTarget).attr('g-item-cid');\n this.trigger('g:itemClicked', this.collection.get(cid), event);\n },\n 'click a.g-show-more-items': function () {\n this.collection.fetchNextPage();\n }\n },\n\n initialize: function (settings) {\n this.checked = [];\n this._checkboxes = settings.checkboxes;\n\n new girder.views.LoadingAnimation({\n el: this.$el,\n parentView: this\n }).render();\n\n this.collection = new girder.collections.ItemCollection();\n this.collection.append = true; // Append, don't replace pages\n this.collection.on('g:changed', function () {\n this.render();\n this.trigger('g:changed');\n }, this).fetch({\n folderId: settings.folderId\n });\n },\n\n render: function () {\n this.checked = [];\n this.$el.html(girder.templates.itemList({\n items: this.collection.toArray(),\n hasMore: this.collection.hasNextPage(),\n girder: girder,\n checkboxes: this._checkboxes\n }));\n\n var view = this;\n this.$('.g-list-checkbox').change(function () {\n var cid = $(this).attr('g-item-cid');\n if (this.checked) {\n view.checked.push(cid);\n } else {\n var idx = view.checked.indexOf(cid);\n if (idx !== -1) {\n view.checked.splice(idx, 1);\n }\n }\n view.trigger('g:checkboxesChanged');\n });\n return this;\n },\n\n /**\n * Insert an item into the collection and re-render it.\n */\n insertItem: function (item) {\n this.collection.add(item);\n this.trigger('g:changed');\n this.render();\n },\n\n /**\n * Set all item checkboxes to a certain checked state. The event\n * g:checkboxesChanged is triggered once after checking/unchecking everything.\n * @param {bool} checked The checked state.\n */\n checkAll: function (checked) {\n this.$('.g-list-checkbox').prop('checked', checked);\n\n this.checked = [];\n if (checked) {\n this.collection.each(function (model) {\n this.checked.push(model.cid);\n }, this);\n }\n\n this.trigger('g:checkboxesChanged');\n },\n\n /**\n * Select (highlight) an item in the list.\n * @param item An ItemModel instance representing the item to select.\n */\n selectItem: function (item) {\n this.$('li.g-item-list-entry').removeClass('g-selected');\n this.$('a.g-item-list-link[g-item-cid=' + item.cid + ']')\n .parents('li.g-item-list-entry').addClass('g-selected');\n },\n\n /**\n * Return the currently selected item, or null if there is no selected item.\n */\n getSelectedItem: function () {\n var el = this.$('li.g-item-list-entry.g-selected');\n if (!el.length) {\n return null;\n }\n var cid = $('.g-item-list-link', $(el[0])).attr('g-item-cid');\n return this.collection.get(cid);\n },\n\n recomputeChecked: function () {\n this.checked = _.map(this.$('.g-list-checkbox:checked'), function (checkbox) {\n return $(checkbox).attr('g-item-cid');\n }, this);\n }\n});\n","/**\n * This widget can be used to display a small loading animation.\n */\ngirder.views.LoadingAnimation = girder.View.extend({\n render: function () {\n this.$el.html(girder.templates.loadingAnimation());\n return this;\n }\n});\n","/**\n * A simple widget for editing markdown text with a preview tab.\n */\ngirder.views.MarkdownWidget = girder.View.extend({\n events: {\n 'show.bs.tab .g-preview-link': function () {\n girder.renderMarkdown(this.val().trim() || 'Nothing to show',\n this.$('.g-markdown-preview'));\n },\n\n 'shown.bs.tab .g-write-link': function () {\n this.$('.g-markdown-text').focus();\n },\n\n 'click .g-browse': function () {\n this.$('.g-file-input').click();\n },\n\n 'change .g-file-input': function (e) {\n var files = e.target.files;\n\n if (files.length) {\n this.files = files;\n this.filesAdded();\n }\n },\n\n 'dragenter .g-markdown-drop-zone': function (e) {\n e.stopPropagation();\n e.preventDefault();\n e.originalEvent.dataTransfer.dropEffect = 'copy';\n this.$('.g-markdown-text,.g-upload-footer').addClass('dragover');\n },\n\n 'dragleave .g-markdown-drop-zone': function (e) {\n e.stopPropagation();\n e.preventDefault();\n this.$('.g-markdown-text,.g-upload-footer').removeClass('dragover');\n },\n\n 'dragover .g-markdown-drop-zone': function (e) {\n e.originalEvent.dataTransfer.dropEffect = 'copy';\n this.$('.g-markdown-text,.g-upload-footer').addClass('dragover');\n },\n\n 'drop .g-markdown-drop-zone': function (e) {\n e.stopPropagation();\n e.preventDefault();\n this.$('.g-markdown-text,.g-upload-footer').removeClass('dragover');\n this.files = e.originalEvent.dataTransfer.files;\n this.filesAdded();\n }\n },\n\n /**\n * @param [settings.text=''] Initial markdown text.\n * @param [settings.placeholder=''] Text area placeholder.\n * @param [settings.prefix='markdown'] Prefix for element IDs in case\n * multiple of these widgets are rendered simultaneously.\n * @param [settings.enableUploads=false] Whether to allow uploading files\n * inline into the markdown.\n * @param [settings.maxUploadSize=10 MB] Max upload size in bytes.\n * @param [settings.parent] If enableUploads is true, set this to the object\n * into which files should be uploaded.\n * @param [settings.allowedExtensions=null] If you want to restrict to\n * certain file extensions, set this to a list of (lowercase) extensions,\n * not including periods. E.g.: [\"png\", \"jpg\", \"jpeg\"]\n */\n initialize: function (settings) {\n this.text = settings.text || '';\n this.placeholder = settings.placeholder || '';\n this.prefix = settings.prefix || 'markdown';\n this.enableUploads = settings.enableUploads || false;\n this.parent = settings.parent || null;\n this.maxUploadSize = settings.maxUploadSize || 1024 * 1024 * 10;\n this.allowedExtensions = settings.allowedExtensions || null;\n this.files = [];\n },\n\n filesAdded: function () {\n try {\n this.validateFiles();\n } catch (err) {\n girder.events.trigger('g:alert', {\n type: 'danger',\n text: err.message,\n icon: 'cancel',\n timeout: 5000\n });\n return;\n }\n\n var file = this.files[0];\n var fileModel = new girder.models.FileModel();\n\n fileModel.on('g:upload.complete', function () {\n var val = this.$('.g-markdown-text').val();\n val += '![' + file.name + '](' + fileModel.downloadUrl() + ')\\n';\n\n this.$('.g-upload-overlay').addClass('hide');\n this.$('.g-markdown-text').removeAttr('disabled').val(val);\n\n this.trigger('g:fileUploaded', {\n file: file,\n model: fileModel\n });\n }, this).on('g:upload.progress', function (info) {\n var currentProgress = info.startByte + info.loaded;\n this.$('.g-markdown-upload-progress>.progress-bar').css('width',\n Math.ceil(100 * currentProgress / info.total) + '%');\n this.$('.g-markdown-upload-progress-message').text(\n 'Uploading ' + info.file.name + ' - ' +\n girder.formatSize(currentProgress) + ' / ' +\n girder.formatSize(info.total)\n );\n }, this).on('g:upload.error', function (info) {\n girder.events.trigger('g:alert', {\n type: 'danger',\n text: info.message,\n icon: 'cancel',\n timeout: 5000\n });\n this.$('.g-upload-overlay').addClass('hide');\n this.$('.g-markdown-text').removeAttr('disabled');\n }, this).on('g:upload.errorStarting', function (info) {\n girder.events.trigger('g:alert', {\n type: 'danger',\n text: info.message,\n icon: 'cancel',\n timeout: 5000\n });\n this.$('.g-upload-overlay').addClass('hide');\n this.$('.g-markdown-text').removeAttr('disabled');\n }, this).upload(this.parent, file);\n\n this.$('.g-upload-overlay').removeClass('hide');\n this.$('.g-markdown-text').attr('disabled', true);\n },\n\n /**\n * Validate a selection of files. If invalid, throws an object containing\n * a \"message\" field.\n */\n validateFiles: function (files) {\n files = files || this.files;\n\n if (this.files.length !== 1) {\n throw {message: 'Please add only one file at a time.'};\n }\n\n var file = files[0],\n ext = file.name.split('.').pop().toLowerCase();\n\n if (this.maxUploadSize && file.size > this.maxUploadSize) {\n throw {\n message: 'That file is too large. You may only attach files ' +\n 'up to ' + girder.formatSize(this.maxUploadSize) + '.'\n };\n }\n\n if (this.allowedExtensions && !_.contains(this.allowedExtensions, ext)) {\n throw {\n message: 'Only files with the following extensions are allowed: ' +\n this.allowedExtensions.join(', ') + '.'\n };\n }\n },\n\n render: function () {\n this.$el.html(girder.templates.markdownWidget({\n text: this.text,\n placeholder: this.placeholder,\n prefix: this.prefix,\n enableUploads: this.enableUploads\n }));\n\n return this;\n },\n\n /**\n * Get or set the current markdown text. Call with no arguments to return\n * the current value, or call with one argument to set the value to that.\n */\n val: function () {\n if (arguments.length) {\n return this.$('.g-markdown-text').val(arguments[0]);\n } else {\n return this.$('.g-markdown-text').val();\n }\n }\n});\n","/**\n * This widget shows a list of metadata in a given item.\n */\ngirder.views.MetadataWidget = girder.View.extend({\n events: {\n 'click .g-add-json-metadata': function (event) {\n this.addMetadata(event, 'json');\n },\n 'click .g-add-simple-metadata': function (event) {\n this.addMetadata(event, 'simple');\n }\n },\n\n /**\n * Creates a widget to display and optionally edit metadata fields.\n *\n * @param settings.item {girder.Model} The model object whose metadata to display.\n * Can be any model type that inherits girder.models.MetadataMixin.\n * @param [settings.fieldName='meta'] {string} The name of the model attribute\n * to display/edit. The model attribute with this name should be an object\n * whose top level keys represent metadata keys.\n * @param [settings.title='Metadata'] {string} Title for the widget.\n * @param [settings.apiPath] {string} The relative API path to use when editing\n * metadata keys for this model. Defaults to using the MetadataMixin default path.\n * @param [settings.accessLevel=girder.AccessType.READ] {girder.AccessType} The\n * access level for this widget. Use READ for read-only, or WRITE (or greater)\n * for adding editing capabilities as well.\n * @param [settings.onMetadataAdded] {Function} A custom callback for when a\n * new metadata key is added to the list. If passed, will override the\n * default behavior of calling MetadataMixin.addMetadata.\n * @param [settings.onMetadataEdited] {Function} A custom callback for when an\n * existing metadata key is updated. If passed, will override the default\n * behavior of calling MetadataMixin.editMetadata.\n */\n initialize: function (settings) {\n this.item = settings.item;\n this.fieldName = settings.fieldName || 'meta';\n this.title = settings.title || 'Metadata';\n this.apiPath = settings.apiPath;\n this.accessLevel = settings.accessLevel;\n this.onMetadataEdited = settings.onMetadataEdited;\n this.onMetadataAdded = settings.onMetadataAdded;\n\n this.item.on('g:changed', function () {\n this.render();\n }, this);\n this.render();\n },\n\n modes: {\n simple: {\n editor: function (args) {\n return new girder.views.MetadatumEditWidget(args);\n },\n displayValue: function () {\n return this.value;\n },\n template: girder.templates.metadatumView\n },\n json: {\n editor: function (args) {\n if (args.value !== undefined) {\n args.value = JSON.parse(args.value);\n }\n return new girder.views.JsonMetadatumEditWidget(args);\n },\n displayValue: function () {\n return JSON.stringify(this.value, null, 4);\n },\n validation: {\n from: {\n simple: [\n function (value) {\n try {\n JSON.parse(value);\n return true;\n } catch (e) {}\n\n return false;\n },\n 'The simple field is not valid JSON and can not be converted.'\n ]\n }\n },\n template: girder.templates.jsonMetadatumView\n }\n },\n\n setItem: function (item) {\n this.item = item;\n return this;\n },\n\n // Does not support modal editing\n getModeFromValue: function (value) {\n return _.isString(value) ? 'simple' : 'json';\n },\n\n addMetadata: function (event, mode) {\n var EditWidget = this.modes[mode].editor;\n var newRow = $('
          ').attr({\n class: 'g-widget-metadata-row editing'\n }).appendTo(this.$el.find('.g-widget-metadata-container'));\n var value = (mode === 'json') ? '{}' : '';\n\n var widget = new girder.views.MetadatumWidget({\n el: newRow,\n mode: mode,\n key: '',\n value: value,\n item: this.item,\n fieldName: this.fieldName,\n apiPath: this.apiPath,\n accessLevel: this.accessLevel,\n girder: girder,\n parentView: this,\n onMetadataEdited: this.onMetadataEdited,\n onMetadataAdded: this.onMetadataAdded\n });\n\n var newEditRow = $('
          ').appendTo(widget.$el);\n\n new EditWidget({\n el: newEditRow,\n item: this.item,\n key: '',\n value: value,\n fieldName: this.fieldName,\n apiPath: this.apiPath,\n accessLevel: this.accessLevel,\n newDatum: true,\n parentView: widget,\n onMetadataEdited: this.onMetadataEdited,\n onMetadataAdded: this.onMetadataAdded\n }).render();\n },\n\n render: function () {\n var metaDict = this.item.get(this.fieldName) || {};\n var metaKeys = Object.keys(metaDict);\n metaKeys.sort(girder.localeSort);\n\n // Metadata header\n this.$el.html(girder.templates.metadataWidget({\n item: this.item,\n title: this.title,\n accessLevel: this.accessLevel,\n girder: girder\n }));\n\n // Append each metadatum\n _.each(metaKeys, function (metaKey) {\n this.$el.find('.g-widget-metadata-container').append(new girder.views.MetadatumWidget({\n mode: this.getModeFromValue(metaDict[metaKey]),\n key: metaKey,\n value: metaDict[metaKey],\n accessLevel: this.accessLevel,\n girder: girder,\n parentView: this,\n fieldName: this.fieldName,\n apiPath: this.apiPath,\n onMetadataEdited: this.onMetadataEdited,\n onMetadataAdded: this.onMetadataAdded\n }).render().$el);\n }, this);\n\n this.$('.g-widget-metadata-add-button').tooltip({\n container: this.$el,\n placement: 'left',\n animation: false,\n delay: {show: 100}\n });\n\n return this;\n }\n});\n\ngirder.views.MetadatumWidget = girder.View.extend({\n events: {\n 'click .g-widget-metadata-edit-button': 'editMetadata'\n },\n\n initialize: function (settings) {\n if (!_.has(this.parentView.modes, settings.mode)) {\n throw 'Unsupported metadatum mode ' + settings.mode + ' detected.';\n }\n\n this.mode = settings.mode;\n this.key = settings.key;\n this.value = settings.value;\n this.accessLevel = settings.accessLevel;\n this.parentView = settings.parentView;\n this.fieldName = settings.fieldName;\n this.apiPath = settings.apiPath;\n this.onMetadataEdited = settings.onMetadataEdited;\n this.onMetadataAdded = settings.onMetadataAdded;\n },\n\n _validate: function (from, to, value) {\n var newMode = this.parentView.modes[to];\n\n if (_.has(newMode, 'validation') &&\n _.has(newMode.validation, 'from') &&\n _.has(newMode.validation.from, from)) {\n var validate = newMode.validation.from[from][0];\n var msg = newMode.validation.from[from][1];\n\n if (!validate(value)) {\n girder.events.trigger('g:alert', {\n text: msg,\n type: 'warning'\n });\n return false;\n }\n }\n\n return true;\n },\n\n // @todo too much duplication with editMetadata\n toggleEditor: function (event, newEditorMode, existingEditor, overrides) {\n var fromEditorMode =\n (existingEditor instanceof girder.views.JsonMetadatumEditWidget)\n ? 'json' : 'simple';\n var newValue = (overrides || {}).value || existingEditor.$el.attr('g-value');\n if (!this._validate(fromEditorMode, newEditorMode, newValue)) {\n return;\n }\n\n var row = existingEditor.$el;\n existingEditor.destroy();\n row.addClass('editing').empty();\n\n var opts = _.extend({\n el: row,\n item: this.parentView.item,\n key: row.attr('g-key'),\n value: row.attr('g-value'),\n accessLevel: this.accessLevel,\n newDatum: false,\n parentView: this,\n fieldName: this.fieldName,\n apiPath: this.apiPath,\n onMetadataEdited: this.onMetadataEdited,\n onMetadataAdded: this.onMetadataAdded\n }, overrides || {});\n\n this.parentView.modes[newEditorMode].editor(opts).render();\n },\n\n editMetadata: function (event) {\n var row = $(event.currentTarget.parentElement);\n row.addClass('editing').empty();\n\n var newEditRow = row.append('
          ');\n\n var opts = {\n el: newEditRow.find('div'),\n item: this.parentView.item,\n key: row.attr('g-key'),\n value: row.attr('g-value'),\n accessLevel: this.accessLevel,\n newDatum: false,\n parentView: this,\n fieldName: this.fieldName,\n apiPath: this.apiPath,\n onMetadataEdited: this.onMetadataEdited,\n onMetadataAdded: this.onMetadataAdded\n };\n\n // If they're trying to open false, null, 6, etc which are not stored as strings\n if (this.mode === 'json') {\n try {\n var jsonValue = JSON.parse(row.attr('g-value'));\n\n if (jsonValue !== undefined && !_.isObject(jsonValue)) {\n opts.value = jsonValue;\n }\n } catch (e) {}\n }\n\n this.parentView.modes[this.mode].editor(opts).render();\n },\n\n render: function () {\n this.$el.attr({\n class: 'g-widget-metadata-row',\n 'g-key': this.key,\n 'g-value': _.bind(this.parentView.modes[this.mode].displayValue, this)()\n }).empty();\n\n this.$el.html(this.parentView.modes[this.mode].template({\n key: this.key,\n value: _.bind(this.parentView.modes[this.mode].displayValue, this)(),\n accessLevel: this.accessLevel,\n girder: girder\n }));\n\n return this;\n }\n});\n\ngirder.views.MetadatumEditWidget = girder.View.extend({\n events: {\n 'click .g-widget-metadata-cancel-button': 'cancelEdit',\n 'click .g-widget-metadata-save-button': 'save',\n 'click .g-widget-metadata-delete-button': 'deleteMetadatum',\n 'click .g-widget-metadata-toggle-button': function (event) {\n var editorType;\n // @todo modal\n // in the future this event will have the new editorType (assuming a dropdown)\n if (this instanceof girder.views.JsonMetadatumEditWidget) {\n editorType = 'simple';\n } else {\n editorType = 'json';\n }\n\n this.parentView.toggleEditor(event, editorType, this, {\n // Save state before toggling editor\n key: this.$el.find('.g-widget-metadata-key-input').val(),\n value: this.getCurrentValue()\n });\n }\n },\n\n initialize: function (settings) {\n this.item = settings.item;\n this.key = settings.key || '';\n this.fieldName = settings.fieldName || 'meta';\n this.value = (settings.value !== undefined) ? settings.value : '';\n this.accessLevel = settings.accessLevel;\n this.newDatum = settings.newDatum;\n this.fieldName = settings.fieldName;\n this.apiPath = settings.apiPath;\n this.onMetadataEdited = settings.onMetadataEdited;\n this.onMetadataAdded = settings.onMetadataAdded;\n },\n\n editTemplate: girder.templates.metadatumEditWidget,\n\n getCurrentValue: function () {\n return this.$el.find('.g-widget-metadata-value-input').val();\n },\n\n deleteMetadatum: function (event) {\n event.stopImmediatePropagation();\n var metadataList = $(event.currentTarget.parentElement).parent();\n var params = {\n text: 'Are you sure you want to delete the metadatum ' +\n _.escape(this.key) + '?',\n escapedHtml: true,\n yesText: 'Delete',\n confirmCallback: _.bind(function () {\n this.item.removeMetadata(this.key, function () {\n metadataList.remove();\n }, null, {\n field: this.fieldName,\n path: this.apiPath\n });\n }, this)\n };\n girder.confirm(params);\n },\n\n cancelEdit: function (event) {\n event.stopImmediatePropagation();\n var curRow = $(event.currentTarget.parentElement).parent();\n if (this.newDatum) {\n curRow.remove();\n } else {\n this.parentView.render();\n }\n },\n\n save: function (event, value) {\n event.stopImmediatePropagation();\n var curRow = $(event.currentTarget.parentElement),\n tempKey = curRow.find('.g-widget-metadata-key-input').val(),\n tempValue = (value !== undefined) ? value : curRow.find('.g-widget-metadata-value-input').val();\n\n if (this.newDatum && tempKey === '') {\n girder.events.trigger('g:alert', {\n text: 'A key is required for all metadata.',\n type: 'warning'\n });\n return;\n }\n\n var saveCallback = _.bind(function () {\n this.key = tempKey;\n this.value = tempValue;\n\n this.parentView.key = this.key;\n this.parentView.value = this.value;\n\n if (this instanceof girder.views.JsonMetadatumEditWidget) {\n this.parentView.mode = 'json';\n } else {\n this.parentView.mode = 'simple';\n }\n\n this.parentView.render();\n\n this.newDatum = false;\n }, this);\n\n var errorCallback = function (out) {\n girder.events.trigger('g:alert', {\n text: out.message,\n type: 'danger'\n });\n };\n\n if (this.newDatum) {\n if (this.onMetadataAdded) {\n this.onMetadataAdded(tempKey, tempValue, saveCallback, errorCallback);\n } else {\n this.item.addMetadata(tempKey, tempValue, saveCallback, errorCallback, {\n field: this.fieldName,\n path: this.apiPath\n });\n }\n } else {\n if (this.onMetadataEdited) {\n this.onMetadataEdited(tempKey, this.key, tempValue, saveCallback, errorCallback);\n } else {\n this.item.editMetadata(tempKey, this.key, tempValue, saveCallback, errorCallback, {\n field: this.fieldName,\n path: this.apiPath\n });\n }\n }\n },\n\n render: function () {\n this.$el.html(this.editTemplate({\n item: this.item,\n key: this.key,\n value: this.value,\n accessLevel: this.accessLevel,\n newDatum: this.newDatum,\n girder: girder\n }));\n this.$el.find('.g-widget-metadata-key-input').focus();\n\n this.$('[title]').tooltip({\n container: this.$el,\n placement: 'bottom',\n animation: false,\n delay: {show: 100}\n });\n\n return this;\n }\n});\n\ngirder.views.JsonMetadatumEditWidget = girder.views.MetadatumEditWidget.extend({\n editTemplate: girder.templates.jsonMetadatumEditWidget,\n\n getCurrentValue: function () {\n return this.editor.getText();\n },\n\n save: function (event) {\n try {\n girder.views.MetadatumEditWidget.prototype.save.call(\n this, event, this.editor.get());\n } catch (err) {\n girder.events.trigger('g:alert', {\n text: 'The field contains invalid JSON and can not be saved.',\n type: 'warning'\n });\n }\n },\n\n render: function () {\n girder.views.MetadatumEditWidget.prototype.render.apply(this, arguments);\n\n this.editor = new JSONEditor(this.$el.find('.g-json-editor')[0], {\n mode: 'tree',\n modes: ['code', 'tree'],\n error: function () {\n girder.events.trigger('g:alert', {\n text: 'The field contains invalid JSON and can not be viewed in Tree Mode.',\n type: 'warning'\n });\n }\n });\n\n if (this.value !== undefined) {\n this.editor.setText(JSON.stringify(this.value));\n this.editor.expandAll();\n }\n\n return this;\n }\n});\n","/**\n * This widget is for creating new assetstores. The parent view is responsible\n * for checking admin privileges before rendering this widget.\n */\ngirder.views.NewAssetstoreWidget = girder.View.extend({\n events: {\n 'submit #g-new-fs-form': function (e) {\n this.createAssetstore(e, this.$('#g-new-fs-error'), {\n type: girder.AssetstoreType.FILESYSTEM,\n name: this.$('#g-new-fs-name').val(),\n root: this.$('#g-new-fs-root').val()\n });\n },\n\n 'submit #g-new-gridfs-form': function (e) {\n this.createAssetstore(e, this.$('#g-new-gridfs-error'), {\n type: girder.AssetstoreType.GRIDFS,\n name: this.$('#g-new-gridfs-name').val(),\n db: this.$('#g-new-gridfs-db').val(),\n mongohost: this.$('#g-new-gridfs-mongohost').val(),\n replicaset: this.$('#g-new-gridfs-replicaset').val()\n });\n },\n\n 'submit #g-new-s3-form': function (e) {\n this.createAssetstore(e, this.$('#g-new-s3-error'), {\n type: girder.AssetstoreType.S3,\n name: this.$('#g-new-s3-name').val(),\n bucket: this.$('#g-new-s3-bucket').val(),\n prefix: this.$('#g-new-s3-prefix').val(),\n accessKeyId: this.$('#g-new-s3-access-key-id').val(),\n secret: this.$('#g-new-s3-secret').val(),\n service: this.$('#g-new-s3-service').val(),\n readOnly: this.$('#g-new-s3-readonly').is(':checked')\n });\n }\n },\n\n render: function () {\n this.$el.html(girder.templates.newAssetstore());\n return this;\n },\n\n /**\n * Call this to make the request to the server to create the assetstore.\n * @param e The submit event from the form.\n * @param container The element to write the error message into.\n * @param data The form data to POST to /assetstore\n */\n createAssetstore: function (e, container, data) {\n e.preventDefault();\n this.$('.g-new-assetstore-submit').addClass('disabled');\n container.empty();\n\n var assetstore = new girder.models.AssetstoreModel();\n assetstore.set(data);\n assetstore.on('g:saved', function () {\n this.$('.g-new-assetstore-submit').removeClass('disabled');\n this.trigger('g:created', assetstore);\n }, this).on('g:error', function (err) {\n this.$('.g-new-assetstore-submit').removeClass('disabled');\n container.text(err.responseJSON.message);\n }, this).save();\n }\n});\n","/**\n * This widget is used to provide a consistent widget for iterating amongst\n * pages of a girder.Collection.\n */\ngirder.views.PaginateWidget = girder.View.extend({\n events: {\n 'click .g-page-next': function (e) {\n if (!$(e.currentTarget).hasClass('disabled')) {\n this.collection.fetchNextPage();\n }\n },\n 'click .g-page-prev': function (e) {\n if (!$(e.currentTarget).hasClass('disabled')) {\n this.collection.fetchPreviousPage();\n }\n }\n },\n\n initialize: function (settings) {\n this.collection = settings.collection;\n },\n\n /**\n * Do not call render() until the collection has been fetched once.\n */\n render: function () {\n this.$el.html(girder.templates.paginateWidget({\n collection: this.collection\n }));\n\n if (this.collection.hasNextPage()) {\n this.$('.g-page-next').removeClass('disabled');\n } else {\n this.$('.g-page-next').addClass('disabled');\n }\n\n if (this.collection.hasPreviousPage()) {\n this.$('.g-page-prev').removeClass('disabled');\n } else {\n this.$('.g-page-prev').addClass('disabled');\n }\n return this;\n }\n});\n","/**\n * This widget provides a consistent breadcrumb to be displayed on the admin\n * configuration pages for plugins.\n */\ngirder.views.PluginConfigBreadcrumbWidget = girder.View.extend({\n events: {\n 'click a.g-admin-console-link': function () {\n girder.router.navigate('admin', {trigger: true});\n },\n 'click a.g-plugins-link': function () {\n girder.router.navigate('plugins', {trigger: true});\n }\n },\n\n initialize: function (settings) {\n this.pluginName = settings.pluginName;\n },\n\n render: function () {\n this.$el.html(girder.templates.pluginConfigBreadcrumb({\n pluginName: this.pluginName\n }));\n\n return this;\n }\n});\n","/**\n * This widget provides a text field that will search any set of data types\n * and show matching results as the user types. Results can be clicked,\n * triggering a callback.\n */\ngirder.views.SearchFieldWidget = girder.View.extend({\n events: {\n 'input .g-search-field': 'search',\n\n 'click .g-search-mode-radio': function (e) {\n this.currentMode = $(e.target).val();\n this.hideResults().search();\n\n window.setTimeout(_.bind(function () {\n this.$('.g-search-mode-choose').popover('hide');\n }, this), 250);\n },\n\n 'click .g-search-result>a': function (e) {\n this._resultClicked($(e.currentTarget));\n },\n\n 'keydown .g-search-field': function (e) {\n var code = e.keyCode || e.which;\n var list, pos;\n if (code === 40) { /* down arrow */\n list = this.$('.g-search-result');\n pos = list.index(list.filter('.g-search-selected')) + 1;\n list.removeClass('g-search-selected');\n if (pos < list.length) {\n list.eq(pos).addClass('g-search-selected');\n }\n } else if (code === 38) { /* up arrow */\n list = this.$('.g-search-result');\n pos = list.index(list.filter('.g-search-selected')) - 1;\n list.removeClass('g-search-selected');\n if (pos === -2) {\n pos = list.length - 1;\n }\n if (pos >= 0) {\n list.eq(pos).addClass('g-search-selected');\n }\n } else if (code === 13) { /* enter */\n var link = this.$('.g-search-result.g-search-selected>a');\n if (link.length) {\n this._resultClicked(link);\n }\n }\n }\n },\n\n /**\n * @param [settings.placeholder=\"Search...\"] The placeholder text for the input field.\n * @param [settings.getInfoCallback] For custom resource types, this callback can\n * be passed in to resolve their title and icon. This callback should\n * return an object with \"icon\" and \"text\" fields if it can resolve\n * the result, or return falsy otherwise.\n * @param [settings.modes=[\"text\", \"prefix\"]] A string or list of strings\n * representing the allowed search modes. Supported modes: \"text\", \"prefix\".\n * If multiple are allowed, users are able to select which one to use\n * via a dropdown.\n */\n initialize: function (settings) {\n this.ajaxLock = false;\n this.pending = null;\n\n this.placeholder = settings.placeholder || 'Search...';\n this.getInfoCallback = settings.getInfoCallback || null;\n this.types = settings.types || [];\n this.modes = settings.modes || ['text', 'prefix'];\n\n if (!_.isArray(this.modes)) {\n this.modes = [this.modes];\n }\n\n this.currentMode = this.modes[0];\n },\n\n search: function () {\n var q = this.$('.g-search-field').val();\n\n if (!q) {\n this.hideResults();\n return this;\n }\n\n if (this.ajaxLock) {\n this.pending = q;\n } else {\n this._doSearch(q);\n }\n\n return this;\n },\n\n _resultClicked: function (link) {\n this.trigger('g:resultClicked', {\n type: link.attr('resourcetype'),\n id: link.attr('resourceid'),\n text: link.text().trim(),\n icon: link.attr('g-icon')\n });\n },\n\n render: function () {\n this.$el.html(girder.templates.searchField({\n placeholder: this.placeholder,\n modes: this.modes,\n currentMode: this.currentMode\n }));\n\n this.$('[title]').tooltip({\n placement: 'auto'\n });\n\n this.$('.g-search-options-button').popover({\n trigger: 'manual',\n html: true,\n viewport: {\n selector: 'body',\n padding: 10\n },\n content: _.bind(function () {\n return girder.templates.searchHelp({\n mode: this.currentMode\n });\n }, this)\n }).click(function () {\n $(this).popover('toggle');\n });\n\n this.$('.g-search-mode-choose').popover({\n trigger: 'manual',\n html: true,\n viewport: {\n selector: 'body',\n padding: 10\n },\n content: _.bind(function () {\n return girder.templates.searchModeSelect({\n modes: this.modes,\n currentMode: this.currentMode\n });\n }, this)\n }).click(function () {\n $(this).popover('toggle');\n });\n\n return this;\n },\n\n /**\n * Parent views should call this if they wish to hide the result list.\n */\n hideResults: function () {\n this.$('.dropdown').removeClass('open');\n return this;\n },\n\n /**\n * Parent views should call this if they wish to clear the search text.\n */\n clearText: function () {\n this.$('.g-search-field').val('');\n return this;\n },\n\n /**\n * Parent views should call this if they wish to reset the search widget,\n * i.e. clear it and hide any results.\n */\n resetState: function () {\n return this.hideResults().clearText();\n },\n\n _doSearch: function (q) {\n this.ajaxLock = true;\n this.pending = null;\n\n girder.restRequest({\n path: 'resource/search',\n data: {\n q: q,\n mode: this.currentMode,\n types: JSON.stringify(this.types)\n }\n }).done(_.bind(function (results) {\n this.ajaxLock = false;\n\n if (this.pending) {\n this._doSearch(this.pending);\n } else {\n var list = this.$('.g-search-results>ul');\n var resources = [];\n _.each(this.types, function (type) {\n _.each(results[type] || [], function (result) {\n var text, icon;\n if (type === 'user') {\n text = result.firstName + ' ' + result.lastName +\n ' (' + result.login + ')';\n icon = 'user';\n } else if (type === 'group') {\n text = result.name;\n icon = 'users';\n } else if (type === 'collection') {\n text = result.name;\n icon = 'sitemap';\n } else if (type === 'folder') {\n text = result.name;\n icon = 'folder';\n } else if (type === 'item') {\n text = result.name;\n icon = 'doc-text-inv';\n } else {\n if (this.getInfoCallback) {\n var res = this.getInfoCallback(type, result);\n if (res) {\n text = res.text;\n icon = res.icon;\n }\n }\n if (!text || !icon) {\n text = '[unknown type]';\n icon = 'attention';\n }\n }\n resources.push({\n type: type,\n id: result._id,\n text: text,\n icon: icon\n });\n }, this);\n }, this);\n list.html(girder.templates.searchResults({\n results: resources\n }));\n\n this.$('.dropdown').addClass('open');\n }\n }, this));\n }\n});\n","/**\n * This widget renders the state of a progress notification.\n */\ngirder.views.TaskProgressWidget = girder.View.extend({\n\n initialize: function (settings) {\n this.progress = settings.progress;\n },\n\n render: function () {\n var width = '0', barClass = [], progressClass = [], percentText = '',\n timeLeftText = '';\n\n if (this.progress.data.state === 'active') {\n if (this.progress.data.total <= 0) {\n width = '100%';\n barClass.push('progress-bar-warning');\n progressClass.push('progress-striped', 'active');\n } else if (this.progress.data.current <= 0) {\n width = '0';\n percentText = '0%';\n } else if (this.progress.data.current >= this.progress.data.total) {\n percentText = width = '100%';\n } else {\n var percent = (100 * this.progress.data.current /\n this.progress.data.total);\n width = Math.round(percent) + '%';\n percentText = percent.toFixed(1) + '%';\n var timeLeft = parseInt(this.progress.estimatedTotalTime - (\n this.progress.updatedTime - this.progress.startTime), 10);\n if (timeLeft >= 3600) {\n timeLeftText = sprintf('%d:%02d:%02d left',\n timeLeft / 3600, (timeLeft / 60) % 60, timeLeft % 60);\n } else if (timeLeft > 0) {\n timeLeftText = sprintf('%d:%02d left',\n timeLeft / 60, timeLeft % 60);\n }\n }\n } else if (this.progress.data.state === 'success') {\n width = '100%';\n barClass.push('progress-bar-success');\n\n this._scheduleHide(5000);\n } else if (this.progress.data.state === 'error') {\n width = '100%';\n barClass.push('progress-bar-danger');\n\n this._scheduleHide(10000);\n }\n\n this.$el.html(girder.templates.taskProgress({\n progress: this.progress,\n width: width,\n barClass: barClass.join(' '),\n progressClass: progressClass.join(' '),\n percentText: percentText,\n timeLeftText: timeLeftText\n }));\n return this;\n },\n\n /**\n * Renders an update of the progress object.\n */\n update: function (progress) {\n this.progress = progress;\n this.render();\n },\n\n /**\n * Schedule a hide event to be triggered in the future.\n */\n _scheduleHide: function (ms) {\n var widget = this;\n window.setTimeout(function () {\n widget.$el.fadeOut(500, function () {\n widget.remove();\n widget.trigger('g:hide', widget.progress);\n });\n }, ms);\n }\n});\n","/**\n * This widget displays a timeline of events. This is visualized as a line (a bar)\n * with two sorts of primitives overlaid:\n *\n * 1. Segments: spans of time, with a start and end.\n * 2. Points: a single point in time. Points always display on top of segments.\n *\n * Any number of these primitives can be displayed on the timeline, so long as they\n * are bounded between the specified startTime and endTime. The time values for\n * startTime, endTime, and for the primitives can be specified either as numeric\n * values (i.e. a relative offset in time), or as date strings that can be parsed\n * by JavaScript, or as Date objects. For obvious reasons, in a single instance of\n * this widget, it is not possible to mix the numeric/relative values with datestamp\n * values.\n */\ngirder.views.TimelineWidget = girder.View.extend({\n /**\n * Initialize the timeline widget.\n *\n * @param settings.startTime The numeric value or timestamp representing where\n * the timeline should start.\n * @param settings.endTime The numeric value or timestamp representing where\n * the timeline should end. Must be greater than the startTime value. All\n * segments and points should be bounded within the interval [startTime, endTime].\n * @param [settings.numeric=false] If the time values being passed in are simply\n * relative, scalar values (e.g. number of seconds since start) rather than\n * timestamps, set this to true.\n * @param [settings.startLabel] Pass to show a label for the start of the timeline.\n * @param [settings.endLabel] Pass to show a label for the end of the timeline.\n * @param [settings.defaultSegmentClass='g-segment-default'] A CSS class set\n * on segments that do not specify a class.\n * @param [settings.defaultPointClass='g-point-default'] A CSS class set\n * on points that do not specify a class.\n * @param [settings.segments=[]] A list of segments. Each element of the list\n * should be an object with the following keys:\n * - start: A number or timestamp representing\n * - end: A numer of timestamp representing the end of this segment.\n * - [class]: A CSS class name to apply to the segment. Uses the\n * widget's defaultSegmentClass if this key is not set.\n * - [tooltip]: A tooltip value for this segment. Tooltips containing the\n * special token \"%r\" will have that token expanded into the\n * elapsed time between start and end.\n * @param [settings.points=[]] A list of points. Each element of the list should\n * be an object with the following keys:\n * - time: A number or timestamp representing the location of the point.\n * - [class]: A CSS class name to apply to the point. Uses the\n * widget's defaultPointClass if this key is not set.\n * - [tooltip]: A tooltip value for this point. Tooltips containing the\n * special token \"%t\" will have that token expanded into the\n * time value for that point.\n */\n initialize: function (settings) {\n this.startTime = settings.startTime;\n this.endTime = settings.endTime;\n this.segments = settings.segments || [];\n this.points = settings.points || [];\n this.numeric = !!settings.numeric;\n this.startLabel = settings.startLabel;\n this.endLabel = settings.endLabel;\n this.defaultSegmentClass = settings.defaultSegmentClass || 'g-segment-default';\n this.defaultPointClass = settings.defaultPointClass || 'g-point-default';\n\n this._processData();\n },\n\n // Processes the points and segments for display in the widget\n _processData: function () {\n if (!this.numeric) {\n this.startTime = new Date(this.startTime);\n this.endTime = new Date(this.endTime);\n }\n\n if (this.endTime <= this.startTime) {\n console.error('Timeline widget: end time must be after start time.');\n this._processedSegments = [];\n this._processedPoints = [];\n return;\n }\n\n var range = this.endTime - this.startTime;\n\n this._processedSegments = _.map(this.segments, function (segment) {\n var start = this.numeric ? segment.start : new Date(segment.start);\n var end = this.numeric ? segment.end : new Date(segment.end);\n var classes = segment.class ? [segment.class] : [this.defaultSegmentClass];\n\n if (segment.tooltip) {\n classes.push('g-tooltip');\n }\n\n return {\n class: classes.join(' '),\n left: (100 * (start - this.startTime) / range).toFixed(1) + '%',\n width: (100 * (end - start) / range).toFixed(1) + '%',\n tooltip: this._segmentTooltip(segment, {\n range: this.numeric ? end - start : (end - start) / 1000\n })\n };\n }, this);\n\n this._processedPoints = _.map(this.points, function (point) {\n var time = this.numeric ? point.time : new Date(point.time);\n var classes = point.class ? [point.class] : [this.defaultPointClass];\n\n if (point.tooltip) {\n classes.push('g-tooltip');\n }\n\n return {\n class: classes.join(' '),\n left: (100 * (time - this.startTime) / range).toFixed(1) + '%',\n tooltip: this._pointTooltip(point, {\n time: time\n })\n };\n }, this);\n },\n\n _segmentTooltip: function (segment, info) {\n if (!segment.tooltip) {\n return null;\n }\n\n return segment.tooltip.replace('%r', info.range);\n },\n\n _pointTooltip: function (point, info) {\n if (!point.tooltip) {\n return null;\n }\n\n if (this.numeric) {\n return point.tooltip.replace('%t', info.time);\n } else {\n return point.tooltip.replace('%t', info.time.toISOString());\n }\n },\n\n render: function () {\n this.$el.html(girder.templates.timeline({\n segments: this._processedSegments,\n points: this._processedPoints,\n startLabel: this.startLabel,\n endLabel: this.endLabel\n }));\n\n this.$('.g-tooltip').tooltip({\n delay: 100,\n container: this.$el\n });\n\n return this;\n }\n});\n","/**\n * This widget is used to upload files to a folder. Pass a folder model\n * to its constructor as the parent folder that will be uploaded into.\n * Events:\n * itemComplete: Triggered each time an individual item is finished uploading.\n * finished: Triggered when the entire set of items is uploaded.\n */\ngirder.views.UploadWidget = girder.View.extend({\n events: {\n 'submit #g-upload-form': function (e) {\n e.preventDefault();\n this.startUpload();\n },\n 'click .g-resume-upload': function () {\n this.$('.g-upload-error-message').html('');\n this.currentFile.resumeUpload();\n },\n 'click .g-restart-upload': function () {\n this.$('.g-upload-error-message').html('');\n this.uploadNextFile();\n },\n 'change #g-files': function () {\n var files = this.$('#g-files')[0].files;\n\n if (files.length) {\n this.files = files;\n this.filesChanged();\n }\n },\n 'click .g-drop-zone': function () {\n this.$('#g-files').click();\n },\n 'dragenter .g-drop-zone': function (e) {\n e.stopPropagation();\n e.preventDefault();\n e.originalEvent.dataTransfer.dropEffect = 'copy';\n this.$('.g-drop-zone')\n .addClass('g-dropzone-show')\n .html(' Drop files here');\n },\n 'dragleave .g-drop-zone': function (e) {\n e.stopPropagation();\n e.preventDefault();\n this.$('.g-drop-zone')\n .removeClass('g-dropzone-show')\n .html(' Browse or drop files');\n },\n 'dragover .g-drop-zone': function (e) {\n e.preventDefault();\n },\n 'drop .g-drop-zone': 'filesDropped'\n },\n\n /**\n * This widget has several configuration options to control its view and\n * behavior. The following keys can be passed in the settings object:\n *\n * @param [parent] If the parent object is known when instantiating this\n * upload widget, pass the object here.\n * @param [parentType=folder] If the parent type is known when instantiating this\n * upload widget, pass the object here. Otherwise set noParent: true and\n * set it later, prior to starting the upload.\n * @param [noParent=false] If the parent object being uploaded into is not known\n * at the time of widget instantiation, pass noParent: true. Callers must\n * ensure that the parent is set by the time uploadNextFile() actually gets\n * called.\n * @param [title=\"Upload files\"] Title for the widget. This is highly recommended\n * when rendering as a modal dialog. To disable rendering of the title, simply\n * pass a falsy object.\n * @param [modal=true] This widget normally renders as a modal dialog. Pass\n * modal: false to disable the modal behavior and simply render underneath a\n * parent element.\n * @param [overrideStart=false] Some callers will want to hook into the pressing\n * of the start upload button and add their own logic prior to actually sending\n * the files. To do so, set overrideStart: true and bind to the \"g:uploadStarted\"\n * event of this widget. The caller is then responsible for calling \"uploadNextFile()\"\n * on the widget when they have completed their actions and are ready to actually\n * send the files.\n *\n * Other events:\n * - \"g:filesChanged\": This is triggered any time the user changes the\n * file selection, either by dropping or browsing and selecting new files.\n * Handlers will receive a single argument, which is the list of chosen files.\n * - \"g:uploadFinished\": When all files have been successfully uploaded,\n * this event is fired.\n */\n initialize: function (settings) {\n if (settings.noParent) {\n this.parent = null;\n this.parentType = null;\n } else {\n this.parent = settings.parent || settings.folder;\n this.parentType = settings.parentType || 'folder';\n }\n this.files = [];\n this.totalSize = 0;\n this.title = _.has(settings, 'title') ? settings.title : 'Upload files';\n this.modal = _.has(settings, 'modal') ? settings.modal : true;\n this.overrideStart = settings.overrideStart || false;\n },\n\n render: function () {\n if (this.modal) {\n this.$el.html(girder.templates.uploadWidget({\n parent: this.parent,\n parentType: this.parentType,\n title: this.title\n }));\n\n var base = this;\n var dialogid;\n if (this.parentType === 'file') {\n dialogid = this.parent.get('_id');\n }\n\n this.$el.girderModal(this).on('hidden.bs.modal', function () {\n /* If we are showing the resume option, we have a partial upload\n * that should be deleted, since the user has no way to get back\n * to it. */\n if ($('.g-resume-upload').length && base.currentFile) {\n base.currentFile.abortUpload();\n }\n girder.dialogs.handleClose('upload', undefined, dialogid);\n });\n\n girder.dialogs.handleOpen('upload', undefined, dialogid);\n } else {\n this.$el.html(girder.templates.uploadWidgetNonModal({\n parent: this.parent,\n parentType: this.parentType,\n title: this.title\n }));\n }\n return this;\n },\n\n filesDropped: function (e) {\n e.stopPropagation();\n e.preventDefault();\n this.$('.g-drop-zone')\n .removeClass('g-dropzone-show')\n .html(' Browse or drop files');\n this.files = e.originalEvent.dataTransfer.files;\n this.filesChanged();\n },\n\n filesChanged: function () {\n if (this.files.length === 0) {\n this.$('.g-overall-progress-message').text('No files selected');\n this.setUploadEnabled(false);\n } else {\n this.totalSize = 0;\n _.each(this.files, function (file) {\n this.totalSize += file.size;\n }, this);\n\n var msg;\n\n if (this.files.length > 1) {\n msg = 'Selected ' + this.files.length + ' files';\n } else {\n msg = 'Selected ' + this.files[0].name + '';\n }\n this.$('.g-overall-progress-message').html(' ' +\n msg + ' (' + girder.formatSize(this.totalSize) +\n ') -- Press start button');\n this.setUploadEnabled(true);\n this.$('.g-progress-overall,.g-progress-current').addClass('hide');\n this.$('.g-current-progress-message').empty();\n this.$('.g-upload-error-message').empty();\n }\n\n this.trigger('g:filesChanged', this.files);\n },\n\n startUpload: function () {\n this.setUploadEnabled(false);\n this.$('.g-drop-zone').addClass('hide');\n this.$('.g-progress-overall,.g-progress-current').removeClass('hide');\n this.$('.g-upload-error-message').empty();\n\n this.currentIndex = 0;\n this.overallProgress = 0;\n this.trigger('g:uploadStarted');\n\n if (!this.overrideStart) {\n this.uploadNextFile();\n }\n },\n\n /**\n * Enable or disable the start upload button.\n *\n * @param state {bool} Truthy for enabled, falsy for disabled.\n */\n setUploadEnabled: function (state) {\n if (state) {\n this.$('.g-start-upload').removeClass('disabled');\n } else {\n this.$('.g-start-upload').addClass('disabled');\n }\n },\n\n /**\n * Initializes the upload of a file by requesting the upload token\n * from the server. If successful, this will call _uploadChunk to send the\n * actual bytes from the file if it is of non-zero length.\n */\n uploadNextFile: function () {\n if (this.currentIndex >= this.files.length) {\n // All files have finished\n if (this.modal) {\n this.$el.modal('hide');\n }\n this.trigger('g:uploadFinished', {\n files: this.files,\n totalSize: this.totalSize\n });\n return;\n }\n\n this.currentFile = this.parentType === 'file'\n ? this.parent : new girder.models.FileModel();\n\n this.currentFile.on('g:upload.complete', function () {\n this.currentIndex += 1;\n this.uploadNextFile();\n }, this).on('g:upload.chunkSent', function (info) {\n this.overallProgress += info.bytes;\n }, this).on('g:upload.progress', function (info) {\n var currentProgress = info.startByte + info.loaded;\n\n this.$('.g-progress-current>.progress-bar').css('width',\n Math.ceil(100 * currentProgress / info.total) + '%');\n this.$('.g-progress-overall>.progress-bar').css('width',\n Math.ceil(100 * (this.overallProgress + info.loaded) /\n this.totalSize) + '%');\n this.$('.g-current-progress-message').html(\n '' + (this.currentIndex + 1) + ' of ' +\n this.files.length + ' - ' + info.file.name + ': ' +\n girder.formatSize(currentProgress) + ' / ' +\n girder.formatSize(info.total)\n );\n this.$('.g-overall-progress-message').html('Overall progress: ' +\n girder.formatSize(this.overallProgress + info.loaded) + ' / ' +\n girder.formatSize(this.totalSize));\n }, this).on('g:upload.error', function (info) {\n var html = info.message + ' ' +\n 'Click to resume upload';\n $('.g-upload-error-message').html(html);\n }, this).on('g:upload.errorStarting', function (info) {\n var html = info.message + ' ' +\n 'Click to restart upload';\n $('.g-upload-error-message').html(html);\n }, this);\n\n if (this.parentType === 'file') {\n this.currentFile.updateContents(this.files[this.currentIndex]);\n } else {\n this.currentFile.upload(this.parent, this.files[this.currentIndex]);\n }\n }\n});\n"]}