From a7c3317ed696fad8e211b22afbb3012f3a4f2ddb Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Fri, 18 Sep 2020 18:45:48 +0300 Subject: [PATCH] Custom Logo for Login and Top Left Corner. Optional link when clicking logo. Settings at Admin Panel / Layout. Thanks to xet7 ! Fixes #1493, fixes #2721, fixes #2681, fixes #1583, fixes #1196, fixes #336, fixes wekan/wekan-snap#130 --- client/components/main/header.jade | 24 ++++++++-------- client/components/main/layouts.jade | 17 +++++++++++ client/components/main/layouts.styl | 1 - client/components/settings/settingBody.jade | 31 +++++++++++++++------ client/components/settings/settingBody.js | 20 +++++++++++++ i18n/en.i18n.json | 6 ++++ models/settings.js | 16 +++++++++++ public/wekan-logo.svg | 1 + server/migrations.js | 16 +++++++++++ server/publications/settings.js | 4 +++ 10 files changed, 116 insertions(+), 20 deletions(-) create mode 100644 public/wekan-logo.svg diff --git a/client/components/main/header.jade b/client/components/main/header.jade index de7ead938..41b2cce4b 100644 --- a/client/components/main/header.jade +++ b/client/components/main/header.jade @@ -19,6 +19,19 @@ template(name="header") = title #header-new-board-icon else + //- + On sandstorm, the logo shouldn't be clickable, because we only have one + page/document on it, and we don't want to see the home page containing + the list of all boards. + unless currentSetting.hideLogo + if currentSetting.customTopLeftCornerLogoImageUrl + if currentSetting.customTopLeftCornerLogoTargetUrl + a(href="{{currentSetting.customTopLeftCornerLogoTargetUrl}}") + img(src="{{currentSetting.customTopLeftCornerLogoImageUrl}}" height="27" width="auto" margin="0" padding="0") + unless currentSetting.customTopLeftCornerLogoTargetUrl + img(src="{{currentSetting.customTopLeftCornerLogoImageUrl}}" height="27" width="auto" margin="0" padding="0") + unless currentSetting.customTopLeftCornerLogoImageUrl + img(src="{{pathFor '/logo-header.png'}}" alt="") ul li a(href="{{pathFor 'home'}}") @@ -52,17 +65,6 @@ template(name="header") #header-main-bar(class="{{#if wrappedHeader}}wrapper{{/if}}") +Template.dynamic(template=headerBar) - //unless hideLogo - - //- - On sandstorm, the logo shouldn't be clickable, because we only have one - page/document on it, and we don't want to see the home page containing - the list of all boards. - - // unless currentSetting.hideLogo - // a.wekan-logo(href="{{pathFor 'home'}}" title="{{_ 'header-logo-title'}}") - // img(src="{{pathFor '/logo-header.png'}}" alt="") - if appIsOffline +offlineWarning diff --git a/client/components/main/layouts.jade b/client/components/main/layouts.jade index 08dfc58cd..690faed4d 100644 --- a/client/components/main/layouts.jade +++ b/client/components/main/layouts.jade @@ -19,6 +19,23 @@ head template(name="userFormsLayout") section.auth-layout + if currentSetting.hideLogo + h1.at-form-landing-logo + br + br + unless currentSetting.hideLogo + h1.at-form-landing-logo + if currentSetting.customLoginLogoImageUrl + if currentSetting.customLoginLogoTargetUrl + a(href="{{currentSetting.customLoginLogoTargetUrl}}") + img(src="{{currentSetting.customLoginLogoImageUrl}}" width="300" height="auto") + br + unless currentSetting.customLoginLogoTargetUrl + img(src="{{currentSetting.customLoginLogoImageUrl}}" width="300" height="auto") + br + unless currentSetting.customLoginLogoImageUrl + img(src="{{pathFor '/wekan-logo.svg'}}" alt="" width="300" height="auto") + br section.auth-dialog if isLoading +loader diff --git a/client/components/main/layouts.styl b/client/components/main/layouts.styl index 85a5f1b22..895aedd01 100644 --- a/client/components/main/layouts.styl +++ b/client/components/main/layouts.styl @@ -447,7 +447,6 @@ a flex-direction: column align-items: center justify-content: center - height: 100% .auth-dialog margin: 0 !important diff --git a/client/components/settings/settingBody.jade b/client/components/settings/settingBody.jade index 835a3b814..a850c621c 100644 --- a/client/components/settings/settingBody.jade +++ b/client/components/settings/settingBody.jade @@ -163,13 +163,6 @@ template(name='announcementSettings') template(name='layoutSettings') ul#layout-setting.setting-detail - //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}}") - span {{_ 'yes'}} - input.wekan-form-control#hide-logo(type="radio" name="hideLogo" value="false" checked="{{#unless currentSetting.hideLogo}}checked{{/unless}}") - span {{_ 'no'}} li.layout-form .title {{_ 'display-authentication-method'}} .form-group.flex @@ -184,10 +177,32 @@ template(name='layoutSettings') .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}}") + span {{_ 'yes'}} + input.wekan-form-control#hide-logo(type="radio" name="hideLogo" value="false" checked="{{#unless currentSetting.hideLogo}}checked{{/unless}}") + span {{_ '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-target-url'}} + .form-group + input.wekan-form-control#custom-login-logo-target-url(type="text", placeholder="" value="{{currentSetting.customLoginLogoTargetUrl}}") + 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-target-url'}} + .form-group + input.wekan-form-control#custom-top-left-corner-logo-target-url(type="text", placeholder="" value="{{currentSetting.customTopLeftCornerLogoTargetUrl}}") li button.js-save-layout.primary {{_ 'save'}} - template(name='selectAuthenticationMethod') select#defaultAuthenticationMethod each authentications diff --git a/client/components/settings/settingBody.js b/client/components/settings/settingBody.js index 62752084b..f6874fb1b 100644 --- a/client/components/settings/settingBody.js +++ b/client/components/settings/settingBody.js @@ -167,6 +167,22 @@ BlazeComponent.extendComponent({ const productName = $('#product-name') .val() .trim(); + const customLoginLogoImageUrl = $('#custom-login-logo-image-url') + .val() + .trim(); + const customLoginLogoTargetUrl = $('#custom-login-logo-target-url') + .val() + .trim(); + const customTopLeftCornerLogoImageUrl = $( + '#custom-top-left-corner-logo-image-url', + ) + .val() + .trim(); + const customTopLeftCornerLogoTargetUrl = $( + '#custom-top-left-corner-logo-target-url', + ) + .val() + .trim(); const hideLogoChange = $('input[name=hideLogo]:checked').val() === 'true'; const displayAuthenticationMethod = $('input[name=displayAuthenticationMethod]:checked').val() === 'true'; @@ -177,6 +193,10 @@ BlazeComponent.extendComponent({ $set: { productName, hideLogo: hideLogoChange, + customLoginLogoImageUrl, + customLoginLogoTargetUrl, + customTopLeftCornerLogoImageUrl, + customTopLeftCornerLogoTargetUrl, displayAuthenticationMethod, defaultAuthenticationMethod, }, diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index a64806727..81ed896ea 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -511,9 +511,15 @@ "unassign-member": "Unassign member", "unsaved-description": "You have an unsaved description.", "unwatch": "Unwatch", + "url-when-custom-login-logo-clicked": "URL when Custom Login Logo clicked", + "url-when-custom-top-left-corner-logo-clicked": "URL when Custom Top Left Corner Logo clicked", "upload": "Upload", "upload-avatar": "Upload an avatar", "uploaded-avatar": "Uploaded an avatar", + "custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL", + "custom-top-left-corner-logo-target-url": "Custom Top Left Corner Logo Target URL", + "custom-login-logo-image-url": "Custom Login Logo Image URL", + "custom-login-logo-target-url": "Custom Login Logo Target URL", "username": "Username", "view-it": "View it", "warn-list-archived": "warning: this card is in an list at Archive", diff --git a/models/settings.js b/models/settings.js index 8845fbd54..e6094ccee 100644 --- a/models/settings.js +++ b/models/settings.js @@ -45,6 +45,22 @@ Settings.attachSchema( type: Boolean, optional: true, }, + customLoginLogoImageUrl: { + type: String, + optional: true, + }, + customLoginLogoTargetUrl: { + type: String, + optional: true, + }, + customTopLeftCornerLogoImageUrl: { + type: String, + optional: true, + }, + customTopLeftCornerLogoTargetUrl: { + type: String, + optional: true, + }, createdAt: { type: Date, denyUpdate: true, diff --git a/public/wekan-logo.svg b/public/wekan-logo.svg new file mode 100644 index 000000000..da34a07ac --- /dev/null +++ b/public/wekan-logo.svg @@ -0,0 +1 @@ +wekan-1_2 \ No newline at end of file diff --git a/server/migrations.js b/server/migrations.js index 85d10c8e1..157165a53 100644 --- a/server/migrations.js +++ b/server/migrations.js @@ -1044,3 +1044,19 @@ Migrations.add('add-default-profile-view', () => { } }); }); + +Migrations.add('add-hide-logo-by-default', () => { + Settings.update( + { + hideLogo: { + hideLogo: false, + }, + }, + { + $set: { + hideLogo: true, + }, + }, + noValidateMulti, + ); +}); diff --git a/server/publications/settings.js b/server/publications/settings.js index 034737e7c..a26004100 100644 --- a/server/publications/settings.js +++ b/server/publications/settings.js @@ -12,6 +12,10 @@ Meteor.publish('setting', () => { disableRegistration: 1, productName: 1, hideLogo: 1, + customLoginLogoImageUrl: 1, + customLoginLogoTargetUrl: 1, + customTopLeftCornerLogoImageUrl: 1, + customTopLeftCornerLogoTargetUrl: 1, customHTMLafterBodyStart: 1, customHTMLbeforeBodyEnd: 1, displayAuthenticationMethod: 1,