2
0
Эх сурвалжийг харах

Add message from service administrator

nztqa 7 жил өмнө
parent
commit
aa1876f94c

+ 2 - 1
.eslintrc.json

@@ -130,6 +130,7 @@
     "Authentication": true,
     "Integrations": true,
     "HTTP": true,
-    "AccountSettings": true
+    "AccountSettings": true,
+    "Notices": true
   }
 }

+ 7 - 0
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

+ 14 - 0
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();
+  },
 });

+ 1 - 0
client/components/main/header.styl

@@ -197,6 +197,7 @@
       li
         height: 28px
 
+.announcement,
 .offline-warning
   width: 100%
   text-align: center

+ 20 - 0
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'}}

+ 45 - 0
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');

+ 4 - 3
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

+ 3 - 0
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",

+ 36 - 0
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});
+    }
+  });
+}

+ 3 - 0
server/publications/notices.js

@@ -0,0 +1,3 @@
+Meteor.publish('notices', function() {
+  return Notices.find();
+});