From aa1876f94c71d252d427f298e9b37c87f2fe4127 Mon Sep 17 00:00:00 2001 From: nztqa Date: Thu, 28 Sep 2017 16:57:04 +0900 Subject: [PATCH 1/2] Add message from service administrator --- .eslintrc.json | 3 +- client/components/main/header.jade | 7 ++++ client/components/main/header.js | 14 +++++++ client/components/main/header.styl | 1 + client/components/settings/settingBody.jade | 20 +++++++++ client/components/settings/settingBody.js | 45 +++++++++++++++++++++ client/components/settings/settingBody.styl | 7 ++-- i18n/en.i18n.json | 3 ++ models/notices.js | 36 +++++++++++++++++ server/publications/notices.js | 3 ++ 10 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 models/notices.js create mode 100644 server/publications/notices.js diff --git a/.eslintrc.json b/.eslintrc.json index 51b2037f7..2a55dcc3d 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -130,6 +130,7 @@ "Authentication": true, "Integrations": true, "HTTP": true, - "AccountSettings": true + "AccountSettings": true, + "Notices": true } } diff --git a/client/components/main/header.jade b/client/components/main/header.jade index bd0af880b..613dd736e 100644 --- a/client/components/main/header.jade +++ b/client/components/main/header.jade @@ -49,6 +49,13 @@ template(name="header") if appIsOffline +offlineWarning + if hasAnnouncement + .announcement + p + i.fa.fa-bullhorn + | #{announcement} + i.fa.fa-times-circle.js-close-announcement + template(name="offlineWarning") .offline-warning p diff --git a/client/components/main/header.js b/client/components/main/header.js index 49acbfef2..3b7246518 100644 --- a/client/components/main/header.js +++ b/client/components/main/header.js @@ -10,8 +10,22 @@ Template.header.helpers({ appIsOffline() { return !Meteor.status().connected; }, + + hasAnnouncement() { + const notice = Notices.findOne(); + return notice && notice.enabled; + }, + + announcement() { + $('.announcement').show(); + const notice = Notices.findOne(); + return notice && notice.body; + }, }); Template.header.events({ 'click .js-create-board': Popup.open('headerBarCreateBoard'), + 'click .js-close-announcement'() { + $('.announcement').hide(); + }, }); diff --git a/client/components/main/header.styl b/client/components/main/header.styl index 0e35d38af..191e88930 100644 --- a/client/components/main/header.styl +++ b/client/components/main/header.styl @@ -197,6 +197,7 @@ li height: 28px +.announcement, .offline-warning width: 100% text-align: center diff --git a/client/components/settings/settingBody.jade b/client/components/settings/settingBody.jade index 5864efd5b..a3b534f4c 100644 --- a/client/components/settings/settingBody.jade +++ b/client/components/settings/settingBody.jade @@ -14,6 +14,8 @@ template(name="setting") a.js-setting-menu(data-id="email-setting") {{_ 'email'}} li a.js-setting-menu(data-id="account-setting") {{_ 'accounts'}} + li + a.js-setting-menu(data-id="notice-setting") {{_ 'admin-notice'}} .main-body if loading.get +spinner @@ -23,6 +25,8 @@ template(name="setting") +email else if accountSetting.get +accountSettings + else if noticeSetting.get + +administratorNoticeSettings template(name="general") ul#registration-setting.setting-detail @@ -96,3 +100,19 @@ template(name='accountSettings') span {{_ 'no'}} li button.js-accounts-save.primary {{_ 'save'}} + +template(name='administratorNoticeSettings') + ul#notice-setting.setting-detail + li + a.flex.js-toggle-activemessage + .materialCheckBox(class="{{#if currentSetting.enabled}}is-checked{{/if}}") + + span {{_ 'admin-notice-active'}} + li + .admin-notice(class="{{#if currentSetting.enabled}}{{else}}hide{{/if}}") + ul + li + .title {{_ 'admin-notice-title'}} + textarea#admin-notice.form-control= currentSetting.body + li + button.js-notice-save.primary {{_ 'save'}} diff --git a/client/components/settings/settingBody.js b/client/components/settings/settingBody.js index a29934260..382138288 100644 --- a/client/components/settings/settingBody.js +++ b/client/components/settings/settingBody.js @@ -1,6 +1,7 @@ Meteor.subscribe('setting'); Meteor.subscribe('mailServer'); Meteor.subscribe('accountSettings'); +Meteor.subscribe('notices'); BlazeComponent.extendComponent({ onCreated() { @@ -9,6 +10,7 @@ BlazeComponent.extendComponent({ this.generalSetting = new ReactiveVar(true); this.emailSetting = new ReactiveVar(false); this.accountSetting = new ReactiveVar(false); + this.noticeSetting = new ReactiveVar(false); }, setError(error) { @@ -65,6 +67,7 @@ BlazeComponent.extendComponent({ this.generalSetting.set('registration-setting' === targetID); this.emailSetting.set('email-setting' === targetID); this.accountSetting.set('account-setting' === targetID); + this.noticeSetting.set('notice-setting' === targetID); } }, @@ -152,3 +155,45 @@ BlazeComponent.extendComponent({ }]; }, }).register('accountSettings'); + +BlazeComponent.extendComponent({ + onCreated() { + this.loading = new ReactiveVar(false); + }, + + setLoading(w) { + this.loading.set(w); + }, + + currentSetting(){ + return Notices.findOne(); + }, + + saveMessage() { + const message = $('#admin-notice').val().trim(); + Notices.update(Notices.findOne()._id, { + $set: { 'body': message }, + }); + }, + + toggleActive(){ + this.setLoading(true); + const isActive = this.currentSetting().enabled; + Notices.update(Notices.findOne()._id, { + $set:{ 'enabled': !isActive}, + }); + this.setLoading(false); + if(isActive){ + $('.admin-notice').slideUp(); + }else{ + $('.admin-notice').slideDown(); + } + }, + + events() { + return [{ + 'click a.js-toggle-activemessage': this.toggleActive, + 'click button.js-notice-save': this.saveMessage, + }]; + }, +}).register('administratorNoticeSettings'); diff --git a/client/components/settings/settingBody.styl b/client/components/settings/settingBody.styl index 118d364c8..d28ae2688 100644 --- a/client/components/settings/settingBody.styl +++ b/client/components/settings/settingBody.styl @@ -61,10 +61,11 @@ .is-checked border-bottom: 2px solid #2980b9; border-right: 2px solid #2980b9; - - span + + span padding: 0 0.5rem - + + .admin-notice, .invite-people padding-left 20px; li diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index 64a720db0..a87c45e5b 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -54,6 +54,9 @@ "addMemberPopup-title": "Members", "admin": "Admin", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", + "admin-notice": "Notice", + "admin-notice-active": "Active message", + "admin-notice-title": "Message from service administrator", "all-boards": "All boards", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", diff --git a/models/notices.js b/models/notices.js new file mode 100644 index 000000000..d62f6797e --- /dev/null +++ b/models/notices.js @@ -0,0 +1,36 @@ +Notices = new Mongo.Collection('notices'); + +Notices.attachSchema(new SimpleSchema({ + enabled: { + type: Boolean, + defaultValue: false, + }, + title: { + type: String, + optional: true, + }, + body: { + type: String, + optional: true, + }, + sort: { + type: Number, + decimal: true, + }, +})); + +Notices.allow({ + update(userId) { + const user = Users.findOne(userId); + return user && user.isAdmin; + }, +}); + +if (Meteor.isServer) { + Meteor.startup(() => { + const notices = Notices.findOne({}); + if(!notices){ + Notices.insert({enabled: false, sort: 0}); + } + }); +} diff --git a/server/publications/notices.js b/server/publications/notices.js new file mode 100644 index 000000000..8910d7404 --- /dev/null +++ b/server/publications/notices.js @@ -0,0 +1,3 @@ +Meteor.publish('notices', function() { + return Notices.find(); +}); From a88ac6113e5f7f428d0f021bbcb213cc517c177e Mon Sep 17 00:00:00 2001 From: nztqa Date: Sun, 1 Oct 2017 12:43:15 +0900 Subject: [PATCH 2/2] Rename notice -> announcement --- .eslintrc.json | 2 +- client/components/main/header.js | 8 ++++---- client/components/settings/settingBody.jade | 20 +++++++++---------- client/components/settings/settingBody.js | 22 ++++++++++----------- client/components/settings/settingBody.styl | 2 +- i18n/en.i18n.json | 6 +++--- models/{notices.js => announcements.js} | 12 +++++------ server/publications/announcements.js | 3 +++ server/publications/notices.js | 3 --- 9 files changed, 39 insertions(+), 39 deletions(-) rename models/{notices.js => announcements.js} (60%) create mode 100644 server/publications/announcements.js delete mode 100644 server/publications/notices.js diff --git a/.eslintrc.json b/.eslintrc.json index 2a55dcc3d..b93dd9166 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -131,6 +131,6 @@ "Integrations": true, "HTTP": true, "AccountSettings": true, - "Notices": true + "Announcements": true } } diff --git a/client/components/main/header.js b/client/components/main/header.js index 3b7246518..c8f415dfa 100644 --- a/client/components/main/header.js +++ b/client/components/main/header.js @@ -12,14 +12,14 @@ Template.header.helpers({ }, hasAnnouncement() { - const notice = Notices.findOne(); - return notice && notice.enabled; + const announcements = Announcements.findOne(); + return announcements && announcements.enabled; }, announcement() { $('.announcement').show(); - const notice = Notices.findOne(); - return notice && notice.body; + const announcements = Announcements.findOne(); + return announcements && announcements.body; }, }); diff --git a/client/components/settings/settingBody.jade b/client/components/settings/settingBody.jade index a3b534f4c..2152cc2ce 100644 --- a/client/components/settings/settingBody.jade +++ b/client/components/settings/settingBody.jade @@ -15,7 +15,7 @@ template(name="setting") li a.js-setting-menu(data-id="account-setting") {{_ 'accounts'}} li - a.js-setting-menu(data-id="notice-setting") {{_ 'admin-notice'}} + a.js-setting-menu(data-id="announcement-setting") {{_ 'admin-announcement'}} .main-body if loading.get +spinner @@ -25,8 +25,8 @@ template(name="setting") +email else if accountSetting.get +accountSettings - else if noticeSetting.get - +administratorNoticeSettings + else if announcementSetting.get + +announcementSettings template(name="general") ul#registration-setting.setting-detail @@ -101,18 +101,18 @@ template(name='accountSettings') li button.js-accounts-save.primary {{_ 'save'}} -template(name='administratorNoticeSettings') - ul#notice-setting.setting-detail +template(name='announcementSettings') + ul#announcement-setting.setting-detail li a.flex.js-toggle-activemessage .materialCheckBox(class="{{#if currentSetting.enabled}}is-checked{{/if}}") - span {{_ 'admin-notice-active'}} + span {{_ 'admin-announcement-active'}} li - .admin-notice(class="{{#if currentSetting.enabled}}{{else}}hide{{/if}}") + .admin-announcement(class="{{#if currentSetting.enabled}}{{else}}hide{{/if}}") ul li - .title {{_ 'admin-notice-title'}} - textarea#admin-notice.form-control= currentSetting.body + .title {{_ 'admin-announcement-title'}} + textarea#admin-announcement.form-control= currentSetting.body li - button.js-notice-save.primary {{_ 'save'}} + button.js-announcement-save.primary {{_ 'save'}} diff --git a/client/components/settings/settingBody.js b/client/components/settings/settingBody.js index 382138288..27f690ee5 100644 --- a/client/components/settings/settingBody.js +++ b/client/components/settings/settingBody.js @@ -1,7 +1,7 @@ Meteor.subscribe('setting'); Meteor.subscribe('mailServer'); Meteor.subscribe('accountSettings'); -Meteor.subscribe('notices'); +Meteor.subscribe('announcements'); BlazeComponent.extendComponent({ onCreated() { @@ -10,7 +10,7 @@ BlazeComponent.extendComponent({ this.generalSetting = new ReactiveVar(true); this.emailSetting = new ReactiveVar(false); this.accountSetting = new ReactiveVar(false); - this.noticeSetting = new ReactiveVar(false); + this.announcementSetting = new ReactiveVar(false); }, setError(error) { @@ -67,7 +67,7 @@ BlazeComponent.extendComponent({ this.generalSetting.set('registration-setting' === targetID); this.emailSetting.set('email-setting' === targetID); this.accountSetting.set('account-setting' === targetID); - this.noticeSetting.set('notice-setting' === targetID); + this.announcementSetting.set('announcement-setting' === targetID); } }, @@ -166,12 +166,12 @@ BlazeComponent.extendComponent({ }, currentSetting(){ - return Notices.findOne(); + return Announcements.findOne(); }, saveMessage() { - const message = $('#admin-notice').val().trim(); - Notices.update(Notices.findOne()._id, { + const message = $('#admin-announcement').val().trim(); + Announcements.update(Announcements.findOne()._id, { $set: { 'body': message }, }); }, @@ -179,21 +179,21 @@ BlazeComponent.extendComponent({ toggleActive(){ this.setLoading(true); const isActive = this.currentSetting().enabled; - Notices.update(Notices.findOne()._id, { + Announcements.update(Announcements.findOne()._id, { $set:{ 'enabled': !isActive}, }); this.setLoading(false); if(isActive){ - $('.admin-notice').slideUp(); + $('.admin-announcement').slideUp(); }else{ - $('.admin-notice').slideDown(); + $('.admin-announcement').slideDown(); } }, events() { return [{ 'click a.js-toggle-activemessage': this.toggleActive, - 'click button.js-notice-save': this.saveMessage, + 'click button.js-announcement-save': this.saveMessage, }]; }, -}).register('administratorNoticeSettings'); +}).register('announcementSettings'); diff --git a/client/components/settings/settingBody.styl b/client/components/settings/settingBody.styl index d28ae2688..fec64cee6 100644 --- a/client/components/settings/settingBody.styl +++ b/client/components/settings/settingBody.styl @@ -65,7 +65,7 @@ span padding: 0 0.5rem - .admin-notice, + .admin-announcement, .invite-people padding-left 20px; li diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index a87c45e5b..a33d55d11 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -54,9 +54,9 @@ "addMemberPopup-title": "Members", "admin": "Admin", "admin-desc": "Can view and edit cards, remove members, and change settings for the board.", - "admin-notice": "Notice", - "admin-notice-active": "Active message", - "admin-notice-title": "Message from service administrator", + "admin-announcement": "Announcement", + "admin-announcement-active": "Active System-Wide Announcement", + "admin-announcement-title": "Announcement from Administrator", "all-boards": "All boards", "and-n-other-card": "And __count__ other card", "and-n-other-card_plural": "And __count__ other cards", diff --git a/models/notices.js b/models/announcements.js similarity index 60% rename from models/notices.js rename to models/announcements.js index d62f6797e..2cb1e1b75 100644 --- a/models/notices.js +++ b/models/announcements.js @@ -1,6 +1,6 @@ -Notices = new Mongo.Collection('notices'); +Announcements = new Mongo.Collection('announcements'); -Notices.attachSchema(new SimpleSchema({ +Announcements.attachSchema(new SimpleSchema({ enabled: { type: Boolean, defaultValue: false, @@ -19,7 +19,7 @@ Notices.attachSchema(new SimpleSchema({ }, })); -Notices.allow({ +Announcements.allow({ update(userId) { const user = Users.findOne(userId); return user && user.isAdmin; @@ -28,9 +28,9 @@ Notices.allow({ if (Meteor.isServer) { Meteor.startup(() => { - const notices = Notices.findOne({}); - if(!notices){ - Notices.insert({enabled: false, sort: 0}); + const announcements = Announcements.findOne({}); + if(!announcements){ + Announcements.insert({enabled: false, sort: 0}); } }); } diff --git a/server/publications/announcements.js b/server/publications/announcements.js new file mode 100644 index 000000000..efebf640e --- /dev/null +++ b/server/publications/announcements.js @@ -0,0 +1,3 @@ +Meteor.publish('announcements', function() { + return Announcements.find(); +}); diff --git a/server/publications/notices.js b/server/publications/notices.js deleted file mode 100644 index 8910d7404..000000000 --- a/server/publications/notices.js +++ /dev/null @@ -1,3 +0,0 @@ -Meteor.publish('notices', function() { - return Notices.find(); -});