template(name="setting") .setting-content unless currentUser.isAdmin | {{_ 'error-notAuthorized'}} else .content-title.ext-box if isGeneralSetting span | 🔑 | {{_ 'registration'}} else if isEmailSetting span | ✉️ | {{_ 'email'}} else if isAccountSetting span | 👥 | {{_ 'accounts'}} else if isTableVisibilityModeSetting span | 👁️ | {{_ 'tableVisibilityMode'}} else if isAnnouncementSetting span | 📢 | {{_ 'admin-announcement'}} else if isAccessibilitySetting span | ♿ | {{_ 'accessibility'}} else if isLayoutSetting span | 🔗 | {{_ 'layout'}} else if isWebhookSetting span | 🌐 | {{_ 'global-webhook'}} else if isAttachmentSettings span | 📎 | {{_ 'attachments'}} else if isCronSettings span | ⏰ | {{_ 'cron'}} .content-body .side-menu ul li(class="{{#if isGeneralSetting}}active{{/if}}") a.js-setting-menu(data-id="registration-setting") | 🔑 | {{_ 'registration'}} unless isSandstorm li(class="{{#if isEmailSetting}}active{{/if}}") a.js-setting-menu(data-id="email-setting") | ✉️ | {{_ 'email'}} li(class="{{#if isAccountSetting}}active{{/if}}") a.js-setting-menu(data-id="account-setting") | 👥 | {{_ 'accounts'}} li(class="{{#if isTableVisibilityModeSetting}}active{{/if}}") a.js-setting-menu(data-id="tableVisibilityMode-setting") | 👁️ | {{_ 'tableVisibilityMode'}} li(class="{{#if isAnnouncementSetting}}active{{/if}}") a.js-setting-menu(data-id="announcement-setting") | 📢 | {{_ 'admin-announcement'}} li(class="{{#if isAccessibilitySetting}}active{{/if}}") a.js-setting-menu(data-id="accessibility-setting") | ♿ | {{_ 'accessibility'}} li(class="{{#if isLayoutSetting}}active{{/if}}") a.js-setting-menu(data-id="layout-setting") | 🔗 | {{_ 'layout'}} li(class="{{#if isWebhookSetting}}active{{/if}}") a.js-setting-menu(data-id="webhook-setting") | 🌐 | {{_ 'global-webhook'}} li(class="{{#if isAttachmentSettings}}active{{/if}}") a.js-setting-menu(data-id="attachment-settings") | 📎 | {{_ 'attachments'}} li(class="{{#if isCronSettings}}active{{/if}}") a.js-setting-menu(data-id="cron-settings") | ⏰ | {{_ 'cron'}} .main-body if isLoading +spinner else if isAttachmentSettings ul#attachment-setting.setting-detail li h3 {{_ 'attachment-storage-configuration'}} .form-group label {{_ 'writable-path'}} input.wekan-form-control#filesystem-path(type="text" value="{{filesystemPath}}" readonly) small.form-text.text-muted {{_ 'filesystem-path-description'}} .form-group label {{_ 'attachments-path'}} input.wekan-form-control#attachments-path(type="text" value="{{attachmentsPath}}" readonly) small.form-text.text-muted {{_ 'attachments-path-description'}} .form-group label {{_ 'avatars-path'}} input.wekan-form-control#avatars-path(type="text" value="{{avatarsPath}}" readonly) small.form-text.text-muted {{_ 'avatars-path-description'}} li h3 {{_ 'mongodb-gridfs-storage'}} .form-group label {{_ 'gridfs-enabled'}} input.wekan-form-control#gridfs-enabled(type="checkbox" checked="{{gridfsEnabled}}" disabled) small.form-text.text-muted {{_ 'gridfs-enabled-description'}} li h3 {{_ 's3-minio-storage'}} .form-group label {{_ 's3-enabled'}} input.wekan-form-control#s3-enabled(type="checkbox" checked="{{s3Enabled}}" disabled) small.form-text.text-muted {{_ 's3-enabled-description'}} .form-group label {{_ 's3-endpoint'}} input.wekan-form-control#s3-endpoint(type="text" value="{{s3Endpoint}}" readonly) small.form-text.text-muted {{_ 's3-endpoint-description'}} .form-group label {{_ 's3-bucket'}} input.wekan-form-control#s3-bucket(type="text" value="{{s3Bucket}}" readonly) small.form-text.text-muted {{_ 's3-bucket-description'}} .form-group label {{_ 's3-region'}} input.wekan-form-control#s3-region(type="text" value="{{s3Region}}" readonly) small.form-text.text-muted {{_ 's3-region-description'}} .form-group label {{_ 's3-access-key'}} input.wekan-form-control#s3-access-key(type="text" placeholder="{{_ 's3-access-key-placeholder'}}" readonly) small.form-text.text-muted {{_ 's3-access-key-description'}} .form-group label {{_ 's3-secret-key'}} input.wekan-form-control#s3-secret-key(type="password" placeholder="{{_ 's3-secret-key-placeholder'}}") small.form-text.text-muted {{_ 's3-secret-key-description'}} .form-group label {{_ 's3-ssl-enabled'}} input.wekan-form-control#s3-ssl-enabled(type="checkbox" checked="{{s3SslEnabled}}" disabled) small.form-text.text-muted {{_ 's3-ssl-enabled-description'}} .form-group label {{_ 's3-port'}} input.wekan-form-control#s3-port(type="number" value="{{s3Port}}" readonly) small.form-text.text-muted {{_ 's3-port-description'}} .form-group button.js-test-s3-connection.btn.btn-secondary {{_ 'test-s3-connection'}} button.js-save-s3-settings.btn.btn-primary {{_ 'save-s3-settings'}} else if isCronSettings ul#cron-setting.setting-detail li h3 {{_ 'cron-migrations'}} .form-group label {{_ 'migration-status'}} .status-indicator span.status-label {{_ 'status'}}: span.status-value {{migrationStatus}} .progress-section .progress .progress-bar(role="progressbar" style="width: {{migrationProgress}}%" aria-valuenow="{{migrationProgress}}" aria-valuemin="0" aria-valuemax="100") | {{migrationProgress}}% .progress-text | {{migrationProgress}}% {{_ 'complete'}} .form-group button.js-start-all-migrations.btn.btn-primary {{_ 'start-all-migrations'}} button.js-pause-all-migrations.btn.btn-warning {{_ 'pause-all-migrations'}} button.js-stop-all-migrations.btn.btn-danger {{_ 'stop-all-migrations'}} li h3 {{_ 'board-operations'}} .form-group label {{_ 'scheduled-board-operations'}} button.js-schedule-board-cleanup.btn.btn-primary {{_ 'schedule-board-cleanup'}} button.js-schedule-board-archive.btn.btn-warning {{_ 'schedule-board-archive'}} button.js-schedule-board-backup.btn.btn-info {{_ 'schedule-board-backup'}} li h3 {{_ 'cron-jobs'}} .form-group label {{_ 'active-cron-jobs'}} each cronJobs .job-item .job-info .job-name {{name}} .job-schedule {{schedule}} .job-description {{description}} .job-actions button.js-pause-job.btn.btn-sm.btn-warning(data-job-id="{{_id}}") {{_ 'pause'}} button.js-delete-job.btn.btn-sm.btn-danger(data-job-id="{{_id}}") {{_ 'delete'}} .add-job-section button.js-add-cron-job.btn.btn-success {{_ 'add-cron-job'}} else if isGeneralSetting +general else if isEmailSetting unless isSandstorm +email else if isAccountSetting +accountSettings else if isTableVisibilityModeSetting +tableVisibilityModeSettings else if isAnnouncementSetting +announcementSettings else if isAccessibilitySetting +accessibilitySettings else if isLayoutSetting +layoutSettings else if isWebhookSetting +webhookSettings template(name="webhookSettings") span +outgoingWebhooksPopup template(name="general") ul#registration-setting.setting-detail li a.flex.js-toggle-forgot-password .materialCheckBox(class="{{#if currentSetting.disableForgotPassword}}is-checked{{/if}}") span {{_ 'disable-forgot-password'}} li a.flex.js-toggle-registration .materialCheckBox(class="{{#if currentSetting.disableRegistration}}is-checked{{/if}}") span {{_ 'disable-self-registration'}} li .invite-people(class="{{#if currentSetting.disableRegistration}}{{else}}hide{{/if}}") ul li .title {{_ 'invite-people'}} textarea#email-to-invite.wekan-form-control(rows='5', placeholder="{{_ 'email-addresses'}}") li .title {{_ 'to-boards'}} .bg-white each boards a.option.flex.js-toggle-board-choose(id= _id) .materialCheckBox(data-id= _id) span= title li button.js-email-invite.primary {{_ 'invite'}} template(name='email') ul#email-setting.setting-detail //if isSandstorm // li.smtp-form // .title {{_ 'smtp-host'}} // .description {{_ 'smtp-host-description'}} // .form-group // input.wekan-form-control#mail-server-host(type="text", placeholder="smtp.domain.com" value="{{currentSetting.mailServer.host}}") // li.smtp-form // .title {{_ 'smtp-port'}} // .description {{_ 'smtp-port-description'}} // .form-group // input.wekan-form-control#mail-server-port(type="text", placeholder="25" value="{{currentSetting.mailServer.port}}") // li.smtp-form // .title {{_ 'smtp-username'}} // .form-group // input.wekan-form-control#mail-server-u"accounts-allowUserNameChange": "Allow Username Change",sername(type="text", placeholder="{{_ 'username'}}" value="{{currentSetting.mailServer.username}}") // li.smtp-form // .title {{_ 'smtp-password'}} // .form-group // input.wekan-form-control#mail-server-password(type="password", placeholder="{{_ 'password'}}" value="") // li.smtp-form // .title {{_ 'smtp-tls'}} // .form-group // a.flex.js-toggle-tls // .materialCheckBox#mail-server-tls(class="{{#if currentSetting.mailServer.enableTLS}}is-checked{{/if}}") // // span {{_ 'smtp-tls-description'}} // // li.smtp-form // .title {{_ 'send-from'}} // .form-group // input.wekan-form-control#mail-server-from(type="email", placeholder="no-reply@domain.com" value="{{currentSetting.mailServer.from}}") // // li // button.js-save.primary {{_ 'save'}} li button.js-send-smtp-test-email.primary {{_ 'send-smtp-test'}} template(name='tableVisibilityModeSettings') ul#tableVisibilityMode-setting.setting-detail li.tableVisibilityMode-form .title {{_ 'tableVisibilityMode-allowPrivateOnly'}} .form-group.flex input.wekan-form-control#accounts-allowPrivateOnly(type="radio" name="allowPrivateOnly" value="true" checked="{{#if allowPrivateOnly}}checked{{/if}}") label {{_ 'yes'}} input.wekan-form-control#accounts-allowPrivateOnly(type="radio" name="allowPrivateOnly" value="false" checked="{{#unless allowPrivateOnly}}checked{{/unless}}") label {{_ 'no'}} button.js-tableVisibilityMode-save.primary {{_ 'save'}} template(name='accountSettings') ul#account-setting.setting-detail li.accounts-form .title {{_ 'accounts-allowEmailChange'}} .form-group.flex input.wekan-form-control#accounts-allowEmailChange(type="radio" name="allowEmailChange" value="true" checked="{{#if allowEmailChange}}checked{{/if}}") label {{_ 'yes'}} input.wekan-form-control#accounts-allowEmailChange(type="radio" name="allowEmailChange" value="false" checked="{{#unless allowEmailChange}}checked{{/unless}}") label {{_ 'no'}} .title {{_ 'accounts-allowUserNameChange'}} .form-group.flex input.wekan-form-control#accounts-allowUserNameChange(type="radio" name="allowUserNameChange" value="true" checked="{{#if allowUserNameChange}}checked{{/if}}") label {{_ 'yes'}} input.wekan-form-control#accounts-allowUserNameChange(type="radio" name="allowUserNameChange" value="false" checked="{{#unless allowUserNameChange}}checked{{/unless}}") label {{_ 'no'}} .title {{_ 'accounts-allowUserDelete'}} .form-group.flex input.wekan-form-control#accounts-allowUserDelete(type="radio" name="allowUserDelete" value="true" checked="{{#if allowUserDelete}}checked{{/if}}") label {{_ 'yes'}} input.wekan-form-control#accounts-allowUserDelete(type="radio" name="allowUserDelete" value="false" checked="{{#unless allowUserDelete}}checked{{/unless}}") label {{_ 'no'}} button.js-accounts-save.primary {{_ 'save'}} // Brute force lockout settings moved to People/Locked Users section template(name='announcementSettings') ul#announcement-setting.setting-detail li a.flex.js-toggle-activemessage .materialCheckBox(class="{{#if currentAnnouncements.enabled}}is-checked{{/if}}") span {{_ 'admin-announcement-active'}} li .admin-announcement(class="{{#if currentAnnouncements.enabled}}{{else}}hide{{/if}}") ul li .title {{_ 'admin-announcement-title'}} textarea#admin-announcement.wekan-form-control= currentAnnouncements.body li button.js-announcement-save.primary {{_ 'save'}} template(name='accessibilitySettings') ul#accessibility-setting.setting-detail li a(href="/accessibility" style="text-decoration: underline; color: blue;") {{_ 'accessibility'}} li a.flex.js-toggle-accessibility .materialCheckBox(class="{{#if currentAccessibility.enabled}}is-checked{{/if}}") span {{_ 'accessibility-page-enabled'}} li .accessibility-content(class="{{#if currentAccessibility.enabled}}{{else}}hide{{/if}}") ul li .title {{_ 'accessibility-title'}} textarea#admin-accessibility-title.wekan-form-control= currentAccessibility.title li .title {{_ 'accessibility-content'}} textarea#admin-accessibility-content.wekan-form-control= currentAccessibility.body li button.js-accessibility-save.primary {{_ 'save'}} template(name='layoutSettings') ul#layout-setting.setting-detail li button.js-all-boards-hide-activities.primary {{_ 'hide-activities-of-all-boards'}} li.layout-form .title {{_ 'oidc-button-text'}} .form-group input.wekan-form-control#oidcBtnTextvalue(type="text", placeholder="" value="{{currentSetting.oidcBtnText}}") li.layout-form .title {{_ 'can-invite-if-same-mailDomainName'}} .form-group input.wekan-form-control#mailDomainNamevalue(type="text", placeholder="" value="{{currentSetting.mailDomainName}}") li.layout-form .title {{_ 'custom-legal-notice-link-url'}} .form-group input.wekan-form-control#legalNoticevalue(type="text", placeholder="" value="{{currentSetting.legalNotice}}") li.layout-form .title {{_ 'display-authentication-method'}} .form-group.flex input.wekan-form-control#display-authentication-method(type="radio" name="displayAuthenticationMethod" value="true" checked="{{#if currentSetting.displayAuthenticationMethod}}checked{{/if}}") label {{_ 'yes'}} input.wekan-form-control#display-authentication-method(type="radio" name="displayAuthenticationMethod" value="false" checked="{{#unless currentSetting.displayAuthenticationMethod}}checked{{/unless}}") label {{_ 'no'}} li.layout-form .title {{_ 'default-authentication-method'}} +selectAuthenticationMethod(authenticationMethod=currentSetting.defaultAuthenticationMethod) li.layout-form .title {{_ 'wait-spinner'}} +selectSpinnerName(spinnerName=currentSetting.spinnerName) li.layout-form .title {{_ 'custom-product-name'}} .form-group input.wekan-form-control#product-name(type="text", placeholder="" value="{{currentSetting.productName}}") li.layout-form .title {{_ 'hide-logo'}} .form-group.flex input.wekan-form-control#hide-logo(type="radio" name="hideLogo" value="true" checked="{{#if currentSetting.hideLogo}}checked{{/if}}") label {{_ 'yes'}} input.wekan-form-control#hide-logo(type="radio" name="hideLogo" value="false" checked="{{#unless currentSetting.hideLogo}}checked{{/unless}}") label {{_ 'no'}} li.layout-form .title {{_ 'custom-login-logo-image-url'}} .form-group input.wekan-form-control#custom-login-logo-image-url(type="text", placeholder="" value="{{currentSetting.customLoginLogoImageUrl}}") li.layout-form .title {{_ 'custom-login-logo-link-url'}} .form-group input.wekan-form-control#custom-login-logo-link-url(type="text", placeholder="" value="{{currentSetting.customLoginLogoLinkUrl}}") li.layout-form .title {{_ 'custom-help-link-url'}} .form-group input.wekan-form-control#custom-help-link-url(type="text", placeholder="" value="{{currentSetting.customHelpLinkUrl}}") li.layout-form .title {{_ 'text-below-custom-login-logo'}} .form-group textarea#text-below-custom-login-logo.wekan-form-control= currentSetting.textBelowCustomLoginLogo li.layout-form .title {{_ 'custom-top-left-corner-logo-image-url'}} .form-group input.wekan-form-control#custom-top-left-corner-logo-image-url(type="text", placeholder="" value="{{currentSetting.customTopLeftCornerLogoImageUrl}}") li.layout-form .title {{_ 'custom-top-left-corner-logo-link-url'}} .form-group input.wekan-form-control#custom-top-left-corner-logo-link-url(type="text", placeholder="" value="{{currentSetting.customTopLeftCornerLogoLinkUrl}}") li.layout-form .title {{_ 'custom-top-left-corner-logo-height'}} .form-group input.wekan-form-control#custom-top-left-corner-logo-height(type="text", placeholder="" value="{{currentSetting.customTopLeftCornerLogoHeight}}") li.layout-form .title {{_ 'automatic-linked-url-schemes'}} .form-group textarea#automatic-linked-url-schemes.wekan-form-control= currentSetting.automaticLinkedUrlSchemes li.layout-form .title {{_ 'hide-card-counter-list'}} .form-group.flex input.wekan-form-control#hide-card-counter-list(type="radio" name="hideCardCounterList" value="true" checked="{{#if currentSetting.hideCardCounterList}}checked{{/if}}") label {{_ 'yes'}} input.wekan-form-control#hide-card-counter-list(type="radio" name="hideCardCounterList" value="false" checked="{{#unless currentSetting.hideCardCounterList}}checked{{/unless}}") label {{_ 'no'}} li.layout-form .title {{_ 'hide-board-member-list'}} .form-group.flex input.wekan-form-control#hide-board-member-list(type="radio" name="hideBoardMemberList" value="true" checked="{{#if currentSetting.hideBoardMemberList}}checked{{/if}}") label {{_ 'yes'}} input.wekan-form-control#hide-board-member-list(type="radio" name="hideBoardMemberList" value="false" checked="{{#unless currentSetting.hideBoardMemberList}}checked{{/unless}}") label {{_ 'no'}} li button.js-save-layout.primary {{_ 'save'}} template(name='selectAuthenticationMethod') select#defaultAuthenticationMethod each authentications if isSelected value option(value="{{value}}" selected) {{_ value}} else option(value="{{value}}") {{_ value}} template(name='selectSpinnerName') select#spinnerName each spinner in spinners if isSelected spinner option(value="{{spinner}}" selected) {{_ spinner}} else option(value="{{spinner}}") {{_ spinner}}