mirror of
				https://github.com/ohwgiles/laminar.git
				synced 2025-06-13 12:54:29 +00:00 
			
		
		
		
	resolves #23: In-browser notification
This implements web notifications on job completion. Opt-in by default, the preference is saved in js localStorage and can be toggled directly on any page
This commit is contained in:
		
							parent
							
								
									93b428529e
								
							
						
					
					
						commit
						3b0efcac9d
					
				@ -25,6 +25,9 @@
 | 
			
		||||
  a.navbar-btn.active { color: #fff; }
 | 
			
		||||
  a.navbar-btn:hover { color: #fff; text-decoration: none; }
 | 
			
		||||
  a.navbar-btn:focus { color: #fff; }
 | 
			
		||||
  .bell { margin: 8px 15px; color: #9d9d9d; }
 | 
			
		||||
  .bell:hover { text-decoration: none; color: #9d9d9d; cursor: pointer; }
 | 
			
		||||
  .bell.active { color: #333; }
 | 
			
		||||
  dt,dd { line-height: 2; }
 | 
			
		||||
  canvas {
 | 
			
		||||
   width: 100% !important;
 | 
			
		||||
@ -219,13 +222,12 @@
 | 
			
		||||
 | 
			
		||||
 <div id="app">
 | 
			
		||||
  <nav class="navbar navbar-inverse">
 | 
			
		||||
   <div class="container-fluid">
 | 
			
		||||
    <div>
 | 
			
		||||
     <router-link to="/" class="navbar-brand"><img src="/icon.png">{{title}}</router-link>
 | 
			
		||||
     <router-link to="/jobs" class="btn navbar-btn pull-right">Jobs</router-link>
 | 
			
		||||
    </div>
 | 
			
		||||
   <div>
 | 
			
		||||
    <router-link to="/" class="navbar-brand"><img src="/icon.png">{{title}}</router-link>
 | 
			
		||||
    <router-link to="/jobs" class="btn navbar-btn pull-right">Jobs</router-link>
 | 
			
		||||
   </div>
 | 
			
		||||
  </nav>
 | 
			
		||||
  <a v-on:click="toggleNotifications(!notify)" v-show="supportsNotifications" class="bell pull-right" :class="{'active':notify}" :title="(notify?'Disable':'Enable')+' notifications'">🔔</a>
 | 
			
		||||
  <router-view></router-view>
 | 
			
		||||
  <div v-show="!connected" id="popup-connecting"><img src="/spin.gif"> Connecting...</div>
 | 
			
		||||
 </div>
 | 
			
		||||
 | 
			
		||||
@ -32,8 +32,11 @@ const WebsocketHandler = function() {
 | 
			
		||||
        // at this point, the component must be defined
 | 
			
		||||
        if (!this.comp)
 | 
			
		||||
          return console.error("Page component was undefined");
 | 
			
		||||
        else if (typeof this.comp[msg.type] === 'function')
 | 
			
		||||
          this.comp[msg.type](msg.data);
 | 
			
		||||
        else {
 | 
			
		||||
          this.comp.$root.showNotify(msg.type, msg.data);
 | 
			
		||||
          if(typeof this.comp[msg.type] === 'function')
 | 
			
		||||
            this.comp[msg.type](msg.data);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
    ws.onclose = function(ev) {
 | 
			
		||||
@ -513,7 +516,28 @@ new Vue({
 | 
			
		||||
  el: '#app',
 | 
			
		||||
  data: {
 | 
			
		||||
    title: '', // populated by status ws message
 | 
			
		||||
    connected: false
 | 
			
		||||
    connected: false,
 | 
			
		||||
    notify: 'localStorage' in window && localStorage.getItem('showNotifications') == 1
 | 
			
		||||
  },
 | 
			
		||||
  computed: {
 | 
			
		||||
    supportsNotifications() {
 | 
			
		||||
      return 'Notification' in window && Notification.permission !== 'denied';
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    toggleNotifications(en) {
 | 
			
		||||
      if(Notification.permission !== 'granted')
 | 
			
		||||
        Notification.requestPermission(p => this.notify = (p === 'granted'))
 | 
			
		||||
      else
 | 
			
		||||
        this.notify = en;
 | 
			
		||||
    },
 | 
			
		||||
    showNotify(msg, data) {
 | 
			
		||||
      if(this.notify && msg === 'job_completed')
 | 
			
		||||
        new Notification(data.name + ' ' + '#' + data.number +' completed');
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  watch: {
 | 
			
		||||
    notify(e) { localStorage.setItem('showNotifications', e ? 1 : 0); }
 | 
			
		||||
  },
 | 
			
		||||
  router: new VueRouter({
 | 
			
		||||
    mode: 'history',
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user