@girder/core 3.2.3 → 5.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -0
- package/package.json +79 -31
- package/assets/Girder_Mark.png +0 -0
- package/auth.js +0 -152
- package/collections/ApiKeyCollection.js +0 -9
- package/collections/AssetstoreCollection.js +0 -9
- package/collections/Collection.js +0 -295
- package/collections/CollectionCollection.js +0 -9
- package/collections/FileCollection.js +0 -11
- package/collections/FolderCollection.js +0 -11
- package/collections/GroupCollection.js +0 -9
- package/collections/ItemCollection.js +0 -11
- package/collections/UserCollection.js +0 -24
- package/collections/index.js +0 -21
- package/constants.js +0 -33
- package/dialog.js +0 -128
- package/events.js +0 -6
- package/index.js +0 -31
- package/main.js +0 -21
- package/misc.js +0 -260
- package/models/AccessControlledModel.js +0 -76
- package/models/ApiKeyModel.js +0 -31
- package/models/AssetstoreModel.js +0 -43
- package/models/CollectionCreationPolicyModel.js +0 -20
- package/models/CollectionModel.js +0 -12
- package/models/FileModel.js +0 -310
- package/models/FolderModel.js +0 -33
- package/models/GroupModel.js +0 -197
- package/models/ItemModel.js +0 -72
- package/models/MetadataMixin.js +0 -88
- package/models/Model.js +0 -187
- package/models/UserModel.js +0 -189
- package/models/index.js +0 -25
- package/pluginUtils.js +0 -11
- package/rest.js +0 -216
- package/router.js +0 -58
- package/routes.js +0 -231
- package/stylesheets/apidocs/apidocs.styl +0 -50
- package/stylesheets/body/adminConsole.styl +0 -21
- package/stylesheets/body/assetstores.styl +0 -46
- package/stylesheets/body/collectionList.styl +0 -39
- package/stylesheets/body/collectionPage.styl +0 -6
- package/stylesheets/body/frontPage.styl +0 -48
- package/stylesheets/body/groupList.styl +0 -43
- package/stylesheets/body/groupPage.styl +0 -116
- package/stylesheets/body/itemPage.styl +0 -81
- package/stylesheets/body/plugins.styl +0 -61
- package/stylesheets/body/searchResultsList.styl +0 -51
- package/stylesheets/body/systemConfig.styl +0 -56
- package/stylesheets/body/userAccount.styl +0 -57
- package/stylesheets/body/userList.styl +0 -79
- package/stylesheets/body/userPage.styl +0 -6
- package/stylesheets/layout/footer.styl +0 -19
- package/stylesheets/layout/global.styl +0 -154
- package/stylesheets/layout/globalNav.styl +0 -89
- package/stylesheets/layout/header.styl +0 -29
- package/stylesheets/layout/headerUser.styl +0 -33
- package/stylesheets/layout/layout.styl +0 -75
- package/stylesheets/layout/layoutVars.styl +0 -9
- package/stylesheets/layout/loading.styl +0 -37
- package/stylesheets/layout/progressArea.styl +0 -17
- package/stylesheets/widgets/accessWidget.styl +0 -106
- package/stylesheets/widgets/browserWidget.styl +0 -9
- package/stylesheets/widgets/hierarchyWidget.styl +0 -188
- package/stylesheets/widgets/markdownWidget.styl +0 -92
- package/stylesheets/widgets/metadataWidget.styl +0 -92
- package/stylesheets/widgets/searchFieldWidget.styl +0 -70
- package/stylesheets/widgets/taskProgress.styl +0 -41
- package/stylesheets/widgets/timelineWidget.styl +0 -41
- package/stylesheets/widgets/uploadWidget.styl +0 -43
- package/stylesheets/widgets/userOtpManagementWidget.styl +0 -159
- package/templates/body/adminConsole.pug +0 -13
- package/templates/body/assetstores.pug +0 -98
- package/templates/body/collectionList.pug +0 -40
- package/templates/body/collectionPage.pug +0 -36
- package/templates/body/filesystemImport.pug +0 -41
- package/templates/body/frontPage.pug +0 -84
- package/templates/body/groupList.pug +0 -30
- package/templates/body/groupPage.pug +0 -116
- package/templates/body/itemPage.pug +0 -61
- package/templates/body/plugins.pug +0 -20
- package/templates/body/s3Import.pug +0 -35
- package/templates/body/searchResults.pug +0 -15
- package/templates/body/searchResultsType.pug +0 -13
- package/templates/body/systemConfiguration.pug +0 -221
- package/templates/body/userAccount.pug +0 -83
- package/templates/body/userList.pug +0 -43
- package/templates/body/userPage.pug +0 -40
- package/templates/layout/alert.pug +0 -5
- package/templates/layout/layout.pug +0 -12
- package/templates/layout/layoutFooter.pug +0 -11
- package/templates/layout/layoutGlobalNav.pug +0 -7
- package/templates/layout/layoutHeader.pug +0 -8
- package/templates/layout/layoutHeaderUser.pug +0 -26
- package/templates/layout/layoutProgressArea.pug +0 -1
- package/templates/layout/loginDialog.pug +0 -30
- package/templates/layout/registerDialog.pug +0 -35
- package/templates/layout/resetPasswordDialog.pug +0 -25
- package/templates/widgets/accessEditor.pug +0 -23
- package/templates/widgets/accessEditorMixins.pug +0 -57
- package/templates/widgets/accessEditorNonModal.pug +0 -11
- package/templates/widgets/accessEntry.pug +0 -32
- package/templates/widgets/apiKeyList.pug +0 -50
- package/templates/widgets/browserWidget.pug +0 -32
- package/templates/widgets/checkedActionsMenu.pug +0 -46
- package/templates/widgets/collectionInfoDialog.pug +0 -37
- package/templates/widgets/confirmDialog.pug +0 -14
- package/templates/widgets/dateTimeRangeWidget.pug +0 -20
- package/templates/widgets/dateTimeWidget.pug +0 -8
- package/templates/widgets/editApiKeyWidget.pug +0 -43
- package/templates/widgets/editAssetstoreWidget.pug +0 -78
- package/templates/widgets/editCollectionWidget.pug +0 -27
- package/templates/widgets/editFileWidget.pug +0 -21
- package/templates/widgets/editFolderWidget.pug +0 -27
- package/templates/widgets/editGroupWidget.pug +0 -54
- package/templates/widgets/editItemWidget.pug +0 -27
- package/templates/widgets/fileInfoDialog.pug +0 -33
- package/templates/widgets/fileList.pug +0 -33
- package/templates/widgets/folderInfoDialog.pug +0 -42
- package/templates/widgets/folderList.pug +0 -21
- package/templates/widgets/groupAdminList.pug +0 -33
- package/templates/widgets/groupInviteDialog.pug +0 -76
- package/templates/widgets/groupInviteList.pug +0 -14
- package/templates/widgets/groupMemberList.pug +0 -39
- package/templates/widgets/groupModList.pug +0 -23
- package/templates/widgets/hierarchyBreadcrumb.pug +0 -37
- package/templates/widgets/hierarchyPaginated.pug +0 -19
- package/templates/widgets/hierarchyWidget.pug +0 -96
- package/templates/widgets/itemBreadcrumb.pug +0 -16
- package/templates/widgets/itemList.pug +0 -27
- package/templates/widgets/jsonMetadatumEditWidget.pug +0 -13
- package/templates/widgets/jsonMetadatumView.pug +0 -6
- package/templates/widgets/loadingAnimation.pug +0 -4
- package/templates/widgets/markdownWidget.pug +0 -34
- package/templates/widgets/metadataWidget.pug +0 -16
- package/templates/widgets/metadatumEditWidget.pug +0 -15
- package/templates/widgets/metadatumView.pug +0 -5
- package/templates/widgets/newAssetstore.pug +0 -118
- package/templates/widgets/paginateWidget.pug +0 -7
- package/templates/widgets/pluginConfigBreadcrumb.pug +0 -13
- package/templates/widgets/rootSelectorWidget.pug +0 -13
- package/templates/widgets/searchField.pug +0 -10
- package/templates/widgets/searchHelp.pug +0 -12
- package/templates/widgets/searchModeSelect.pug +0 -9
- package/templates/widgets/searchResults.pug +0 -14
- package/templates/widgets/sortCollectionWidget.pug +0 -14
- package/templates/widgets/taskProgress.pug +0 -16
- package/templates/widgets/timeline.pug +0 -15
- package/templates/widgets/uploadWidget.pug +0 -15
- package/templates/widgets/uploadWidgetMixins.pug +0 -31
- package/templates/widgets/uploadWidgetNonModal.pug +0 -10
- package/templates/widgets/userOtpBegin.pug +0 -4
- package/templates/widgets/userOtpDisable.pug +0 -6
- package/templates/widgets/userOtpEnable.pug +0 -44
- package/utilities/EventStream.js +0 -177
- package/utilities/PluginUtils.js +0 -36
- package/utilities/S3UploadHandler.js +0 -303
- package/utilities/index.js +0 -9
- package/utilities/jquery/girderEnable.js +0 -19
- package/utilities/jquery/girderModal.js +0 -48
- package/version.js +0 -10
- package/views/App.js +0 -359
- package/views/View.js +0 -78
- package/views/body/AdminView.js +0 -29
- package/views/body/AssetstoresView.js +0 -235
- package/views/body/CollectionView.js +0 -188
- package/views/body/CollectionsView.js +0 -120
- package/views/body/FilesystemImportView.js +0 -83
- package/views/body/FolderView.js +0 -54
- package/views/body/FrontPageView.js +0 -47
- package/views/body/GroupView.js +0 -336
- package/views/body/GroupsView.js +0 -106
- package/views/body/ItemView.js +0 -177
- package/views/body/PluginsView.js +0 -73
- package/views/body/S3ImportView.js +0 -80
- package/views/body/SearchResultsView.js +0 -162
- package/views/body/SystemConfigurationView.js +0 -196
- package/views/body/UserAccountView.js +0 -179
- package/views/body/UserView.js +0 -165
- package/views/body/UsersView.js +0 -124
- package/views/body/index.js +0 -37
- package/views/index.js +0 -13
- package/views/layout/FooterView.js +0 -29
- package/views/layout/GlobalNavView.js +0 -103
- package/views/layout/HeaderUserView.js +0 -45
- package/views/layout/HeaderView.js +0 -83
- package/views/layout/LoginView.js +0 -100
- package/views/layout/ProgressListView.js +0 -70
- package/views/layout/RegisterView.js +0 -101
- package/views/layout/ResetPasswordView.js +0 -70
- package/views/layout/index.js +0 -19
- package/views/widgets/AccessWidget.js +0 -427
- package/views/widgets/ApiKeyListWidget.js +0 -140
- package/views/widgets/BrowserWidget.js +0 -317
- package/views/widgets/CheckedMenuWidget.js +0 -68
- package/views/widgets/CollectionInfoWidget.js +0 -40
- package/views/widgets/DateTimeRangeWidget.js +0 -179
- package/views/widgets/DateTimeWidget.js +0 -109
- package/views/widgets/EditApiKeyWidget.js +0 -122
- package/views/widgets/EditAssetstoreWidget.js +0 -148
- package/views/widgets/EditCollectionWidget.js +0 -93
- package/views/widgets/EditFileWidget.js +0 -56
- package/views/widgets/EditFolderWidget.js +0 -116
- package/views/widgets/EditGroupWidget.js +0 -125
- package/views/widgets/EditItemWidget.js +0 -110
- package/views/widgets/FileInfoWidget.js +0 -26
- package/views/widgets/FileListWidget.js +0 -151
- package/views/widgets/FolderInfoWidget.js +0 -39
- package/views/widgets/FolderListWidget.js +0 -106
- package/views/widgets/GroupAdminsWidget.js +0 -88
- package/views/widgets/GroupInvitesWidget.js +0 -56
- package/views/widgets/GroupMembersWidget.js +0 -185
- package/views/widgets/GroupModsWidget.js +0 -77
- package/views/widgets/HierarchyWidget.js +0 -1097
- package/views/widgets/ItemBreadcrumbWidget.js +0 -38
- package/views/widgets/ItemListWidget.js +0 -345
- package/views/widgets/LoadingAnimation.js +0 -17
- package/views/widgets/MarkdownWidget.js +0 -217
- package/views/widgets/MetadataWidget.js +0 -504
- package/views/widgets/NewAssetstoreWidget.js +0 -81
- package/views/widgets/PaginateWidget.js +0 -37
- package/views/widgets/PluginConfigBreadcrumbWidget.js +0 -33
- package/views/widgets/RootSelectorWidget.js +0 -192
- package/views/widgets/SearchFieldWidget.js +0 -365
- package/views/widgets/SearchPaginateWidget.js +0 -149
- package/views/widgets/SortCollectionWidget.js +0 -53
- package/views/widgets/TaskProgressWidget.js +0 -91
- package/views/widgets/TimelineWidget.js +0 -155
- package/views/widgets/UploadWidget.js +0 -340
- package/views/widgets/UserOtpManagementWidget.js +0 -105
- package/views/widgets/index.js +0 -75
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
.g-body-title System configuration
|
|
2
|
-
form.g-settings-form(role="form")
|
|
3
|
-
.g-settings-form-container
|
|
4
|
-
h4 Instance Branding
|
|
5
|
-
.form-group
|
|
6
|
-
label(for="g-core-brand-name") Brand Name
|
|
7
|
-
input#g-core-brand-name.form-control.input-sm(
|
|
8
|
-
type="text", value=settings['core.brand_name'] || '',
|
|
9
|
-
title="The brand name of the application.")
|
|
10
|
-
.form-group
|
|
11
|
-
label(for="g-core-contact-email-address") Contact email address
|
|
12
|
-
input#g-core-contact-email-address.form-control.input-sm(
|
|
13
|
-
type="text", value=settings['core.contact_email_address'] || '',
|
|
14
|
-
title="The contact email address for users to obtain support with this instance.")
|
|
15
|
-
.form-group
|
|
16
|
-
label(for="g-core-banner-color") Banner Color
|
|
17
|
-
#g-core-banner-color-container
|
|
18
|
-
input#g-core-banner-color.form-control.input-sm(
|
|
19
|
-
type="color", value=settings['core.banner_color'],
|
|
20
|
-
title="The banner color of the application.")
|
|
21
|
-
button#g-core-banner-default-color.form-control.input-sm(
|
|
22
|
-
type="button", title="Default color") default
|
|
23
|
-
.form-group
|
|
24
|
-
label(for="g-core-privacy-notice") Privacy Notice Link
|
|
25
|
-
input#g-core-privacy-notice.form-control.input-sm(
|
|
26
|
-
type="text", value=settings['core.privacy_notice'] || '',
|
|
27
|
-
title="The privacy notice link.")
|
|
28
|
-
.form-group
|
|
29
|
-
label(for="g-core-cookie-lifetime") Cookie duration (days)
|
|
30
|
-
input#g-core-cookie-lifetime.form-control.input-sm(
|
|
31
|
-
type="text", value=settings['core.cookie_lifetime'] || '',
|
|
32
|
-
title="How long users will stay logged in.")
|
|
33
|
-
.g-settings-form-container
|
|
34
|
-
h4 Administrative Policy
|
|
35
|
-
.form-group
|
|
36
|
-
label(for="g-core-registration-policy") Registration policy
|
|
37
|
-
select#g-core-registration-policy.form-control.input-sm
|
|
38
|
-
option(value="open",
|
|
39
|
-
selected=(settings['core.registration_policy'] === "open")) Open registration
|
|
40
|
-
option(value="closed",
|
|
41
|
-
selected=(settings['core.registration_policy'] === "closed")) Closed registration
|
|
42
|
-
option(value="approve",
|
|
43
|
-
selected=(settings['core.registration_policy'] === "approve")) Admin approval required
|
|
44
|
-
.form-group
|
|
45
|
-
label(for="g-core-email-verification") Email verification
|
|
46
|
-
select#g-core-email-verification.form-control.input-sm
|
|
47
|
-
option(value="required",
|
|
48
|
-
selected=(settings['core.email_verification'] === "required")) Required
|
|
49
|
-
option(value="optional",
|
|
50
|
-
selected=(settings['core.email_verification'] === "optional")) Optional
|
|
51
|
-
option(value="disabled",
|
|
52
|
-
selected=(settings['core.email_verification'] === "disabled")) Disabled
|
|
53
|
-
.form-group
|
|
54
|
-
label(for="g-core-add-to-group-policy") Allow members to be directly added to groups
|
|
55
|
-
select#g-core-add-to-group-policy.form-control.input-sm
|
|
56
|
-
option(value="never",
|
|
57
|
-
selected=(settings['core.add_to_group_policy'] === "never"))
|
|
58
|
-
| No, members must be invited and accept invitations
|
|
59
|
-
option(value="noadmin",
|
|
60
|
-
selected=(settings['core.add_to_group_policy'] === "noadmin"))
|
|
61
|
-
| No, except for group administrators when enabled per group
|
|
62
|
-
option(value="nomod",
|
|
63
|
-
selected=(settings['core.add_to_group_policy'] === "nomod"))
|
|
64
|
-
| No, except for group administrators and moderators when enabled per group
|
|
65
|
-
option(value="yesadmin",
|
|
66
|
-
selected=(settings['core.add_to_group_policy'] === "yesadmin"))
|
|
67
|
-
| Yes, by group administrators unless disabled per group
|
|
68
|
-
option(value="yesmod",
|
|
69
|
-
selected=(settings['core.add_to_group_policy'] === "yesmod"))
|
|
70
|
-
| Yes, by group administrators and moderators unless disabled per group
|
|
71
|
-
.g-collection-create-policy-container
|
|
72
|
-
label Collection creation policy
|
|
73
|
-
p.
|
|
74
|
-
Allow additional users and groups to create collections.
|
|
75
|
-
input.g-setting-switch(type="checkbox",
|
|
76
|
-
checked="checked", data-size="mini", data-on-color="primary")
|
|
77
|
-
.access-widget-container
|
|
78
|
-
textarea#g-core-collection-create-policy.hide
|
|
79
|
-
= JSON.stringify(settings['core.collection_create_policy'])
|
|
80
|
-
.form-group
|
|
81
|
-
label(for="g-core-user-default-folders") Create default folders for new users
|
|
82
|
-
select#g-core-user-default-folders.form-control.input-sm
|
|
83
|
-
option(value="none",
|
|
84
|
-
selected=(settings['core.user_default_folders'] === "none")) No
|
|
85
|
-
option(value="public_private",
|
|
86
|
-
selected=(settings['core.user_default_folders'] === "public_private")) Yes, "Public" and "Private"
|
|
87
|
-
.form-group
|
|
88
|
-
.checkbox
|
|
89
|
-
label(for="g-core-api-keys")
|
|
90
|
-
input#g-core-api-keys(type="checkbox", checked=settings['core.api_keys'])
|
|
91
|
-
| Enable API keys
|
|
92
|
-
.form-group
|
|
93
|
-
.checkbox
|
|
94
|
-
label(for="g-core-enable-password-login")
|
|
95
|
-
input#g-core-enable-password-login(
|
|
96
|
-
type="checkbox", checked=settings['core.enable_password_login'])
|
|
97
|
-
| Enable password login
|
|
98
|
-
.g-settings-form-container
|
|
99
|
-
h4 Email Creation
|
|
100
|
-
.form-group
|
|
101
|
-
label(for="g-core-email-from-address") Email from address
|
|
102
|
-
input#g-core-email-from-address.form-control.input-sm(
|
|
103
|
-
type="text", value=settings['core.email_from_address'] || '',
|
|
104
|
-
title="The email address the system will use when sending emails.")
|
|
105
|
-
.form-group
|
|
106
|
-
label(for="g-core-email-host") Email host
|
|
107
|
-
input#g-core-email-host.form-control.input-sm(
|
|
108
|
-
type="text", value=settings['core.email_host'] || '',
|
|
109
|
-
title="The host email server that is shown as a link in the footer of emails.")
|
|
110
|
-
.g-settings-form-container
|
|
111
|
-
h4 Email Delivery
|
|
112
|
-
.form-group
|
|
113
|
-
label(for="g-core-smtp-host") SMTP host
|
|
114
|
-
input#g-core-smtp-host.form-control.input-sm(
|
|
115
|
-
type="text", value=settings['core.smtp_host'] || '',
|
|
116
|
-
title="The hostname of the SMTP server used to send emails.")
|
|
117
|
-
.form-group
|
|
118
|
-
label(for="g-core-smtp-port") SMTP port
|
|
119
|
-
input#g-core-smtp-port.form-control.input-sm(
|
|
120
|
-
type="text", value=settings['core.smtp.port'] || '',
|
|
121
|
-
title="The port number of the SMTP server used to send emails.")
|
|
122
|
-
.form-group
|
|
123
|
-
label(for="g-core-smtp-encryption") SMTP encryption
|
|
124
|
-
select#g-core-smtp-encryption.form-control.input-sm
|
|
125
|
-
option(value="none",
|
|
126
|
-
selected=(settings['core.smtp.encryption'] === "none")) None
|
|
127
|
-
option(value="starttls",
|
|
128
|
-
selected=(settings['core.smtp.encryption'] === "starttls")) Use STARTTLS
|
|
129
|
-
option(value="ssl",
|
|
130
|
-
selected=(settings['core.smtp.encryption'] === "ssl")) Use SSL/TLS
|
|
131
|
-
.form-group
|
|
132
|
-
label(for="g-core-smtp-username") SMTP username
|
|
133
|
-
input#g-core-smtp-username.form-control.input-sm(
|
|
134
|
-
type="text", value=settings['core.smtp.username'] || '',
|
|
135
|
-
title="The username, if any, used to authenticate to the SMTP server used to send emails.")
|
|
136
|
-
.form-group
|
|
137
|
-
label(for="g-core-smtp-password") SMTP password
|
|
138
|
-
input#g-core-smtp-password.form-control.input-sm(
|
|
139
|
-
type="password", value=settings['core.smtp.password'] || '',
|
|
140
|
-
title="The password, if any, used to authenticate to the SMTP server used to send emails.")
|
|
141
|
-
|
|
142
|
-
.g-settings-form-container
|
|
143
|
-
h4 Routing
|
|
144
|
-
p.
|
|
145
|
-
Altering routes requires a restart of the Girder server to take effect.
|
|
146
|
-
.g-settings-form-container
|
|
147
|
-
h5 Core Routes
|
|
148
|
-
label core_girder
|
|
149
|
-
input.g-core-route-table.form-control.input-sm(
|
|
150
|
-
type="text",
|
|
151
|
-
value=routes['core_girder'] || '',
|
|
152
|
-
data-webroot-name="core_girder",
|
|
153
|
-
title="The path to place core_girder.")
|
|
154
|
-
if routeKeys.length > 2
|
|
155
|
-
.form-group
|
|
156
|
-
h5 Other Routes
|
|
157
|
-
each name in routeKeys.slice(2)
|
|
158
|
-
label= name
|
|
159
|
-
input.g-core-route-table.form-control.input-sm(
|
|
160
|
-
type="text",
|
|
161
|
-
value=routes[name] || '',
|
|
162
|
-
data-webroot-name=name,
|
|
163
|
-
title="The path to place ${name}.")
|
|
164
|
-
#g-configuration-accordion.panel-group
|
|
165
|
-
.panel.panel-default
|
|
166
|
-
.panel-heading(data-toggle="collapse",
|
|
167
|
-
data-parent="#g-configuration-accordion",
|
|
168
|
-
data-target="#g-advanced-settings-tab")
|
|
169
|
-
.panel-title
|
|
170
|
-
a
|
|
171
|
-
b Advanced Settings
|
|
172
|
-
#g-advanced-settings-tab.panel-collapse.collapse
|
|
173
|
-
.panel-body
|
|
174
|
-
p These settings should only be changed if you are certain of what you are doing.
|
|
175
|
-
.form-group
|
|
176
|
-
label(for="g-core-server-root") Server root URL
|
|
177
|
-
input#g-core-server-root.form-control.input-sm(
|
|
178
|
-
type="text", value=settings['core.server_root'] || '',
|
|
179
|
-
placeholder='Detect automatically')
|
|
180
|
-
.form-group
|
|
181
|
-
label(for="g-core-upload-minimum-chunk-size") Upload minimum chunk size (bytes)
|
|
182
|
-
br
|
|
183
|
-
span This applies to Filesystem and GridFS assetstores.
|
|
184
|
-
input#g-core-upload-minimum-chunk-size.form-control.input-sm(
|
|
185
|
-
type="text", value=settings['core.upload_minimum_chunk_size'] || '',
|
|
186
|
-
title="For large files, the minimum size of all but the last chunk.")
|
|
187
|
-
.form-group
|
|
188
|
-
label Server Notification Stream
|
|
189
|
-
br
|
|
190
|
-
span Disabling this may improve server performance with many concurrent web client users.
|
|
191
|
-
.checkbox
|
|
192
|
-
label(for="g-core-enable-notification-stream")
|
|
193
|
-
input#g-core-enable-notification-stream(
|
|
194
|
-
type="checkbox", checked=(settings['core.enable_notification_stream']))
|
|
195
|
-
| Enabled
|
|
196
|
-
.g-settings-form-container
|
|
197
|
-
h4 CORS
|
|
198
|
-
p.
|
|
199
|
-
CORS (Cross-origin resource sharing) allows access from other websites.
|
|
200
|
-
These settings are described in
|
|
201
|
-
detail #[a(href="http://girder.readthedocs.org/en/latest/security.html#cors-cross-origin-resource-sharing", target="_blank") here].
|
|
202
|
-
.form-group
|
|
203
|
-
label(for="g-core-cors-allow-origin") CORS Allowed Origins
|
|
204
|
-
input#g-core-cors-allow-origin.form-control.input-sm(
|
|
205
|
-
type="text", value=settings['core.cors.allow_origin'] || '',
|
|
206
|
-
title="A comma-separated list of allowed base URLs that can make cross-site requests. This may include *.")
|
|
207
|
-
.form-group
|
|
208
|
-
label(for="g-core-cors-allow-methods") CORS Allowed Methods
|
|
209
|
-
input#g-core-cors-allow-methods.form-control.input-sm(
|
|
210
|
-
type="text", value=settings['core.cors.allow_methods'] || '',
|
|
211
|
-
placeholder="Default: allow all methods",
|
|
212
|
-
title="A comma-separated list of allowed methods")
|
|
213
|
-
.form-group
|
|
214
|
-
label(for="g-core-cors-allow-headers") CORS Allowed Headers
|
|
215
|
-
input#g-core-cors-allow-headers.form-control.input-sm(
|
|
216
|
-
type="text", value=settings['core.cors.allow_headers'] || '',
|
|
217
|
-
title="A comma-separated list of allowed headers.")
|
|
218
|
-
p
|
|
219
|
-
.form-group
|
|
220
|
-
button.g-submit-settings.btn.btn-default.btn-sm #[i.icon-ok] Save
|
|
221
|
-
#g-settings-error-message.g-validation-failed-message
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
.g-account-header
|
|
2
|
-
.g-user-name.g-body-title= user.name()
|
|
3
|
-
.g-user-description.g-body-subtitle= user.get('login')
|
|
4
|
-
|
|
5
|
-
ul.g-account-tabs.nav.nav-tabs
|
|
6
|
-
li.active
|
|
7
|
-
a(href="#g-account-tab-info", data-toggle="tab", name="info")
|
|
8
|
-
i.icon-info-circled
|
|
9
|
-
| Profile
|
|
10
|
-
li
|
|
11
|
-
a(href="#g-account-tab-password", data-toggle="tab", name="password")
|
|
12
|
-
i.icon-lock
|
|
13
|
-
| Password
|
|
14
|
-
li
|
|
15
|
-
a(href="#g-account-tab-api-keys", data-toggle="tab", name="apikeys")
|
|
16
|
-
i.icon-key-inv
|
|
17
|
-
| API keys
|
|
18
|
-
li
|
|
19
|
-
a(href="#g-account-tab-otp", data-toggle="tab", name="otp")
|
|
20
|
-
i.icon-mobile
|
|
21
|
-
| Two-factor authentication
|
|
22
|
-
|
|
23
|
-
.tab-content
|
|
24
|
-
#g-account-tab-info.tab-pane.active
|
|
25
|
-
.g-user-info-container.g-user-settings-container
|
|
26
|
-
form#g-user-info-form(role="form")
|
|
27
|
-
.form-group
|
|
28
|
-
label(for="g-login") Login
|
|
29
|
-
p.form-control-static= user.get('login')
|
|
30
|
-
.form-group
|
|
31
|
-
label(for="g-email") Email
|
|
32
|
-
input#g-email.input-sm.form-control(type="text", value=user.get('email'))
|
|
33
|
-
.form-group
|
|
34
|
-
label(for="g-firstName") First name
|
|
35
|
-
input#g-firstName.input-sm.form-control(type="text", value=user.get('firstName'))
|
|
36
|
-
.form-group
|
|
37
|
-
label(for="g-lastName") Last name
|
|
38
|
-
input#g-lastName.input-sm.form-control(type="text", value=user.get('lastName'))
|
|
39
|
-
if getCurrentUser().get('admin')
|
|
40
|
-
.form-group
|
|
41
|
-
label(for="g-admin") User is site admin
|
|
42
|
-
input#g-admin.input-sm-form-control(type="checkbox", checked=user.get('admin'))
|
|
43
|
-
button.btn.btn-default.btn-sm(type="submit")
|
|
44
|
-
i.icon-edit
|
|
45
|
-
| Save
|
|
46
|
-
#g-user-info-error-msg.g-validation-failed-message
|
|
47
|
-
|
|
48
|
-
#g-account-tab-password.tab-pane
|
|
49
|
-
.g-password-change-container.g-user-settings-container
|
|
50
|
-
form#g-password-change-form(role="form")
|
|
51
|
-
if temporaryToken
|
|
52
|
-
input#g-password-old.input-sm.form-control(type="hidden", value=temporaryToken)
|
|
53
|
-
else if isCurrentUser
|
|
54
|
-
.form-group
|
|
55
|
-
label(for="g-password-old") Current password
|
|
56
|
-
input#g-password-old.input-sm.form-control(type="password", placeholder="Enter current password")
|
|
57
|
-
.form-group
|
|
58
|
-
label(for="g-password-new") New password
|
|
59
|
-
input#g-password-new.input-sm.form-control(type="password", placeholder="Enter new password")
|
|
60
|
-
.form-group
|
|
61
|
-
label(for="g-password-retype") Retype new password
|
|
62
|
-
input#g-password-retype.input-sm.form-control(type="password", placeholder="Retype new password")
|
|
63
|
-
button.btn.btn-default.btn-sm(type="submit")
|
|
64
|
-
i.icon-lock
|
|
65
|
-
| Change
|
|
66
|
-
#g-password-change-error-msg.g-validation-failed-message
|
|
67
|
-
#g-account-tab-api-keys.tab-pane
|
|
68
|
-
.g-api-keys-container.g-user-settings-container
|
|
69
|
-
.g-api-keys-info-text.
|
|
70
|
-
API keys can be used to grant limited or total access to client applications on your behalf.
|
|
71
|
-
Clients can use these keys to create tokens that can be used for authenticated access. You may
|
|
72
|
-
limit the tokens created with a given key to certain authorization scopes, or allow the tokens
|
|
73
|
-
complete access to everything your user can do. You may also choose the maximum time that
|
|
74
|
-
tokens created with a given key will last before expiration. If you do not specify a duration,
|
|
75
|
-
the default expiration for user login sessions will be used.
|
|
76
|
-
|
|
77
|
-
.g-api-keys-list-container
|
|
78
|
-
#g-account-tab-otp.tab-pane
|
|
79
|
-
.g-user-settings-container
|
|
80
|
-
.g-account-otp-info-text.
|
|
81
|
-
Two-factor authentication adds another level of authentication to your account log-in.
|
|
82
|
-
|
|
83
|
-
.g-account-otp-container
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
- const isAdmin = currentUser && currentUser.get('admin');
|
|
2
|
-
- const userTooltip = usersCount === 1 ? `${usersCount} total user` : `${usersCount} total users`;
|
|
3
|
-
.g-user-list-header
|
|
4
|
-
.g-user-pagination
|
|
5
|
-
if currentUser
|
|
6
|
-
.g-user-count-container(title=userTooltip)
|
|
7
|
-
i.icon-user
|
|
8
|
-
span.g-user-count= usersCount
|
|
9
|
-
|
|
10
|
-
.g-user-sort
|
|
11
|
-
form.g-user-search-form.form-inline(role="form")
|
|
12
|
-
.form-group.g-users-search-container
|
|
13
|
-
if isAdmin
|
|
14
|
-
button.g-user-create-button.btn.btn-sm.btn-default
|
|
15
|
-
i.icon-plus-squared
|
|
16
|
-
| Create user
|
|
17
|
-
|
|
18
|
-
each user in users
|
|
19
|
-
.g-user-list-entry
|
|
20
|
-
.g-user-right-column
|
|
21
|
-
.g-user-joined
|
|
22
|
-
i.icon-clock
|
|
23
|
-
| Joined on
|
|
24
|
-
span.g-user-joined-date #{formatDate(user.get('created'), DATE_DAY)}
|
|
25
|
-
if user.get('size') !== undefined
|
|
26
|
-
.g-space-used
|
|
27
|
-
i.icon-floppy
|
|
28
|
-
| Currently using
|
|
29
|
-
span.g-user-space-used #{formatSize(user.get('size'))}
|
|
30
|
-
if user.get('status') === 'disabled'
|
|
31
|
-
.g-user-status
|
|
32
|
-
i.icon-cancel-circled
|
|
33
|
-
| Account disabled
|
|
34
|
-
else if user.get('status') === 'pending'
|
|
35
|
-
.g-user-status
|
|
36
|
-
i.icon-attention-circled
|
|
37
|
-
| Account pending approval
|
|
38
|
-
.g-user-title
|
|
39
|
-
a.g-user-link(g-user-cid=user.cid)
|
|
40
|
-
b= user.name()
|
|
41
|
-
.g-user-subtitle
|
|
42
|
-
span.g-user-login #{user.get('login')}
|
|
43
|
-
.g-clear-right
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
.g-user-header
|
|
2
|
-
|
|
3
|
-
if user.getAccessLevel() >= AccessType.WRITE
|
|
4
|
-
.btn-group.pull-right
|
|
5
|
-
button.g-user-actions-button.btn.btn-default.dropdown-toggle(
|
|
6
|
-
data-toggle="dropdown", title="Item actions")
|
|
7
|
-
i.icon-user
|
|
8
|
-
| Actions
|
|
9
|
-
i.icon-down-dir
|
|
10
|
-
ul.g-item-actions-menu.dropdown-menu.pull-right(role="menu")
|
|
11
|
-
li(role="presentation")
|
|
12
|
-
a.g-edit-user(role="menuitem")
|
|
13
|
-
i.icon-edit
|
|
14
|
-
| Edit user
|
|
15
|
-
if user.getAccessLevel() >= AccessType.ADMIN
|
|
16
|
-
li.divider(role="presentation")
|
|
17
|
-
if user.get('status') === 'pending'
|
|
18
|
-
li(role="presentation")
|
|
19
|
-
a.g-approve-user(role="menuitem")
|
|
20
|
-
i.icon-ok-squared
|
|
21
|
-
| Approve account
|
|
22
|
-
else if user.get('status') === 'enabled'
|
|
23
|
-
li(role="presentation")
|
|
24
|
-
a.g-disable-user(role="menuitem")
|
|
25
|
-
i.icon-cancel
|
|
26
|
-
| Disable account
|
|
27
|
-
else if user.get('status') === 'disabled'
|
|
28
|
-
li(role="presentation")
|
|
29
|
-
a.g-enable-user(role="menuitem")
|
|
30
|
-
i.icon-ok
|
|
31
|
-
| Enable account
|
|
32
|
-
li(role="presentation")
|
|
33
|
-
a.g-delete-user(role="menuitem")
|
|
34
|
-
i.icon-trash
|
|
35
|
-
| Delete user
|
|
36
|
-
|
|
37
|
-
.g-user-name.g-body-title #{user.get('firstName')} #{user.get('lastName')}
|
|
38
|
-
.g-user-login.g-body-subtitle #{user.get('login')}
|
|
39
|
-
|
|
40
|
-
.g-user-hierarchy-container
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
#g-app-header-container
|
|
2
|
-
#g-global-nav-container
|
|
3
|
-
#g-app-body-container.g-default-layout
|
|
4
|
-
#g-app-footer-container
|
|
5
|
-
|
|
6
|
-
#g-app-progress-container
|
|
7
|
-
|
|
8
|
-
//- Set tabindex on modal element to allow closing modal by pressing Escape. See:
|
|
9
|
-
//- - http://getbootstrap.com/javascript/#modals-examples
|
|
10
|
-
//- - http://stackoverflow.com/questions/12630156/
|
|
11
|
-
#g-dialog-container.modal.fade(tabindex="-1")
|
|
12
|
-
#g-alerts-container
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
.g-footer-links
|
|
2
|
-
a#g-about-link(href="http://girder.readthedocs.org/en/latest/user-guide.html") About
|
|
3
|
-
if contactHref
|
|
4
|
-
a#g-contact-link(href=contactHref) Contact
|
|
5
|
-
a(href=apiRoot) Web API
|
|
6
|
-
a#g-bug-link(href="https://github.com/girder/girder/issues/new") Report a bug
|
|
7
|
-
if privacyNoticeLink
|
|
8
|
-
a#g-privacy-notice-link(href=privacyNoticeLink) Privacy Notice
|
|
9
|
-
|
|
10
|
-
.g-footer-info
|
|
11
|
-
| © Kitware, Inc.
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
.g-user-text
|
|
2
|
-
if user
|
|
3
|
-
a.g-user-dropdown-link(data-toggle="dropdown", data-target="#g-user-action-menu")
|
|
4
|
-
| #[i.icon-user] #{user.get('login')}
|
|
5
|
-
i.icon-down-open
|
|
6
|
-
#g-user-action-menu.dropdown
|
|
7
|
-
ul.dropdown-menu(role="menu")
|
|
8
|
-
li(role="presentation")
|
|
9
|
-
a.g-my-folders(href=`#user/${user.id}`)
|
|
10
|
-
i.icon-folder
|
|
11
|
-
| My folders
|
|
12
|
-
li(role="presentation")
|
|
13
|
-
a.g-my-settings(href=`#useraccount/${user.id}/info`)
|
|
14
|
-
i.icon-cog
|
|
15
|
-
| My account
|
|
16
|
-
li.divider(role="presentation")
|
|
17
|
-
li(role="presentation")
|
|
18
|
-
a.g-logout
|
|
19
|
-
i.icon-logout
|
|
20
|
-
| Log out
|
|
21
|
-
else
|
|
22
|
-
if registrationPolicy !== 'closed'
|
|
23
|
-
a.g-register Register
|
|
24
|
-
.g-or-text or
|
|
25
|
-
a.g-login Log In
|
|
26
|
-
i.icon-login
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.g-progress-list-container
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
.modal-dialog
|
|
2
|
-
.modal-content
|
|
3
|
-
form#g-login-form.modal-form(role="form")
|
|
4
|
-
.modal-header
|
|
5
|
-
button.close(data-dismiss="modal", aria-hidden="true", type="button") ×
|
|
6
|
-
h4.modal-title Log in
|
|
7
|
-
.modal-body
|
|
8
|
-
if enablePasswordLogin
|
|
9
|
-
.form-group
|
|
10
|
-
label.control-label(for="g-login") Login or email
|
|
11
|
-
input#g-login.input-sm.form-control(type="text", placeholder="Enter login")
|
|
12
|
-
.form-group
|
|
13
|
-
label.control-label(for="g-password") Password
|
|
14
|
-
input#g-password.input-sm.form-control(type="password", placeholder="Enter password")
|
|
15
|
-
#g-login-otp-group.form-group.hidden
|
|
16
|
-
label.control-label(for="g-login-otp") Two-factor code
|
|
17
|
-
input#g-login-otp.input-sm.form-control(
|
|
18
|
-
type='text', minlength=6, maxlength=6, placeholder="Your 6-digit two-factor authentication code, if enabled")
|
|
19
|
-
.g-validation-failed-message
|
|
20
|
-
.g-bottom-message
|
|
21
|
-
if registrationPolicy !== 'closed'
|
|
22
|
-
| Don't have an account yet?
|
|
23
|
-
a.g-register-link Register here.
|
|
24
|
-
| |
|
|
25
|
-
a.g-forgot-password Forgot your password?
|
|
26
|
-
.modal-footer
|
|
27
|
-
a.btn.btn-default(data-dismiss="modal") Close
|
|
28
|
-
button#g-login-button.btn.btn-primary(type="submit")
|
|
29
|
-
i.icon-login
|
|
30
|
-
| Login
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
.modal-dialog
|
|
2
|
-
.modal-content
|
|
3
|
-
form#g-register-form.modal-form(role="form")
|
|
4
|
-
.modal-header
|
|
5
|
-
button.close(data-dismiss="modal", aria-hidden="true", type="button") ×
|
|
6
|
-
h4.modal-title= title
|
|
7
|
-
.modal-body
|
|
8
|
-
#g-group-login.form-group
|
|
9
|
-
label.control-label(for="g-login") Choose a login name
|
|
10
|
-
input#g-login.input-sm.form-control(type="text", placeholder="Login")
|
|
11
|
-
#g-group-email.form-group
|
|
12
|
-
label.control-label(for="g-email") Enter email address
|
|
13
|
-
input#g-email.input-sm.form-control(type="text", placeholder="Email")
|
|
14
|
-
#g-group-firstName.form-group
|
|
15
|
-
label.control-label(for="g-firstName") Enter first name
|
|
16
|
-
input#g-firstName.input-sm.form-control(type="text", placeholder="First name")
|
|
17
|
-
#g-group-lastName.form-group
|
|
18
|
-
label.control-label(for="g-lastName") Enter last name
|
|
19
|
-
input#g-lastName.input-sm.form-control(type="text", placeholder="Last name")
|
|
20
|
-
#g-group-password.form-group
|
|
21
|
-
label.control-label(for="g-password") Choose a password
|
|
22
|
-
input#g-password.input-sm.form-control(type="password", placeholder="Password")
|
|
23
|
-
#g-group-password2.form-group
|
|
24
|
-
label.control-label(for="g-password2") Retype password
|
|
25
|
-
input#g-password2.input-sm.form-control(type="password", placeholder="Password")
|
|
26
|
-
.g-validation-failed-message
|
|
27
|
-
if !currentUser
|
|
28
|
-
.g-bottom-message
|
|
29
|
-
| Already have an account?
|
|
30
|
-
a.g-login-link Log in here.
|
|
31
|
-
.modal-footer
|
|
32
|
-
a.btn.btn-default(data-dismiss="modal") Close
|
|
33
|
-
button#g-register-button.btn.btn-primary(type="submit")
|
|
34
|
-
i.icon-plus-circled
|
|
35
|
-
| Register
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
.modal-dialog
|
|
2
|
-
.modal-content
|
|
3
|
-
form#g-reset-password-form.modal-form(role="form")
|
|
4
|
-
.modal-header
|
|
5
|
-
button.close(data-dismiss="modal", aria-hidden="true", type="button") ×
|
|
6
|
-
h4.modal-title Forgotten password
|
|
7
|
-
.modal-body
|
|
8
|
-
.g-password-reset-explanation
|
|
9
|
-
| If you have forgotten your password, enter your email address here.
|
|
10
|
-
| You will be sent an email with a temporary access link, from
|
|
11
|
-
| which you can reset your password.
|
|
12
|
-
.form-group
|
|
13
|
-
label.control-label(for="g-email") Email
|
|
14
|
-
input#g-email.input-sm.form-control(type="text", placeholder="Enter your email")
|
|
15
|
-
.g-validation-failed-message
|
|
16
|
-
.g-bottom-message
|
|
17
|
-
if registrationPolicy !== 'closed'
|
|
18
|
-
a.g-register-link Register
|
|
19
|
-
| |
|
|
20
|
-
a.g-login-link Login
|
|
21
|
-
.modal-footer
|
|
22
|
-
a.btn.btn-default(data-dismiss="modal") Close
|
|
23
|
-
button#g-reset-password-button.btn.btn-primary(type="submit")
|
|
24
|
-
i.icon-mail
|
|
25
|
-
| Submit
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
include accessEditorMixins
|
|
2
|
-
|
|
3
|
-
.modal-dialog
|
|
4
|
-
.modal-content
|
|
5
|
-
.modal-header
|
|
6
|
-
button.close(data-dismiss="modal", aria-hidden="true", type="button") ×
|
|
7
|
-
h4.modal-title Access control
|
|
8
|
-
.g-dialog-subtitle
|
|
9
|
-
if (modelType === 'folder')
|
|
10
|
-
i.icon-folder
|
|
11
|
-
else if (modelType === 'collection')
|
|
12
|
-
i.icon-sitemap
|
|
13
|
-
= model.name()
|
|
14
|
-
.modal-body.g-access-modal-body
|
|
15
|
-
if !hidePrivacyEditor
|
|
16
|
-
+privacyEditor(modelType)
|
|
17
|
-
+permissionsEditor
|
|
18
|
-
if !hideRecurseOption
|
|
19
|
-
+recurseOption(modelType)
|
|
20
|
-
|
|
21
|
-
.modal-footer
|
|
22
|
-
a.btn.btn-small.btn-default(data-dismiss="modal") Close
|
|
23
|
-
+saveAccessButton
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
mixin privacyEditor(typeName)
|
|
2
|
-
.g-public-container
|
|
3
|
-
.radio
|
|
4
|
-
label
|
|
5
|
-
input#g-access-private(type="radio", name="privacy",
|
|
6
|
-
checked=(publicFlag ? undefined : "checked"))
|
|
7
|
-
i.icon-lock
|
|
8
|
-
| #[b Private] — Access is required to view this #{typeName}
|
|
9
|
-
.radio
|
|
10
|
-
label
|
|
11
|
-
input#g-access-public(type="radio", name="privacy",
|
|
12
|
-
checked=(publicFlag ? "checked" : undefined))
|
|
13
|
-
i.icon-globe
|
|
14
|
-
| #[b Public] — Anyone can view this #{typeName}
|
|
15
|
-
|
|
16
|
-
if _.keys(flagList).length
|
|
17
|
-
a.g-action-manage-public-flags.hide(title="Public access flags")
|
|
18
|
-
i.g-flag-icon.icon-flag
|
|
19
|
-
- var flagLen = (publicFlags && publicFlags.length) || 0
|
|
20
|
-
.g-flag-count-indicator(class=(flagLen ? null : "hide"))= flagLen
|
|
21
|
-
| Manage public access flags...
|
|
22
|
-
.g-public-flags-popover-container.hide
|
|
23
|
-
each flag, key in flagList
|
|
24
|
-
- var checked = _.contains(publicFlags, key) ? 'checked' : null;
|
|
25
|
-
- var disabled = (!isAdmin && flag.admin) ? 'disabled' : null;
|
|
26
|
-
.checkbox(class=disabled)
|
|
27
|
-
label.g-flag-label(title=flag.description)
|
|
28
|
-
input.g-public-flag-checkbox(flag=key, type="checkbox", checked=checked, disabled=disabled)
|
|
29
|
-
span= flag.name
|
|
30
|
-
button.g-close-public-flags-popover.btn.btn-xs.btn-default Close
|
|
31
|
-
|
|
32
|
-
mixin permissionsEditor
|
|
33
|
-
.g-permissions-editor
|
|
34
|
-
.g-ac-list-title #[i.icon-key-1] Permissions
|
|
35
|
-
.g-ac-list
|
|
36
|
-
#g-ac-list-groups
|
|
37
|
-
#g-ac-list-users
|
|
38
|
-
|
|
39
|
-
.g-grant-access-container
|
|
40
|
-
form(role="form")
|
|
41
|
-
.form-group
|
|
42
|
-
label(for="addAccess") Grant access to another group or user
|
|
43
|
-
.g-search-field-container
|
|
44
|
-
|
|
45
|
-
mixin recurseOption(typeName)
|
|
46
|
-
.g-recursive-container
|
|
47
|
-
.radio
|
|
48
|
-
label
|
|
49
|
-
input#g-apply-nonrecursive(type="radio", name="recurse", checked="checked")
|
|
50
|
-
| Apply permissions only to this #{typeName}, not its subfolders
|
|
51
|
-
.radio
|
|
52
|
-
label
|
|
53
|
-
input#g-apply-recursive(type="radio", name="recurse")
|
|
54
|
-
| Also set permissions on all subfolders to match this #{typeName}'s permissions
|
|
55
|
-
|
|
56
|
-
mixin saveAccessButton
|
|
57
|
-
button.g-save-access-list.btn.btn-small.btn-primary #[i.icon-ok] Save
|