adminview-cache.js 5.38 KB
/*
 *
 * ADOBE CONFIDENTIAL
 * __________________
 *
 *  Copyright 2014 Adobe Systems Incorporated
 *  All Rights Reserved.
 *
 * NOTICE:  All information contained herein is, and remains
 * the property of Adobe Systems Incorporated and its suppliers,
 * if any.  The intellectual and technical concepts contained
 * herein are proprietary to Adobe Systems Incorporated and its
 * suppliers and are protected by trade secret or copyright law.
 * Dissemination of this information or reproduction of this material
 * is strictly forbidden unless prior written permission is obtained
 * from Adobe Systems Incorporated.
 */

define('screens/player/ui/adminview-cache', [
    'underscore',
    'jquery',
    'screens/player/shared/util',
    './baseview',
    'screens/player/shared/serviceadmin',
    'screens/player/firmware/storage/storage',
    'screens/player/firmware/cache/cache',
    'screens/player/store/store'
], function(_, $, Util, BaseView, ServiceAdmin, Storage, Cache, Store) {
    'use strict';

    var DEFAULT_OPTIONS = {
    };

    function _toggleClearCacheButtons(cache) {
        $('.cache-clear').attr('disabled', !!cache.clearing);
    }

    var CacheAdminView = BaseView.extend(/** @lends CacheAdminView.prototype */{

        template: function(state) {
            function fu(size) {
                return Util.formatUnit(size, Util.UNITS_DI_IEC, 1);
            }

            var usageStr = 'n/a';

            if (state) {
                var usage = Util.get(state, 'status.usage');
            }

            if (usage && usage.used) {
                // Usage:
                // %d free on storage %s
                // %d of %d used.
                usageStr = fu(usage.free) + ' free on storage \'' + usage.volume + '\'<br>';
                usageStr += fu(usage.used) + ' of ' + fu(usage.total) + ' used';
            }
            var html = '<h1>Content Cache</h1>';
            html += '<h2>Usage</h2>';
            html += '<h3 class="aem-ScreensPlayer-channelsUsage">' + usageStr + '</h3>';
            html += '<h2>Clear Cache</h2>';
            html += '<h3>';
            html += '<button class="cache-clear" id="cache-clear-channels">Channels</button>';
            html += '<button class="cache-clear" id="cache-clear-app">Application</button>';
            html += '</h3>';
            html += '<h3><button class="cache-clear" id="cache-clear-all">All</button></h3>';

            return html;
        },

        className: 'aem-ScreensPlayer-admin-view',

        events: {
            'click #cache-clear-channels': 'clearChannelsData',
            'click #cache-clear-app': 'clearAppCache',
            'click #cache-clear-all': 'clearAll'
        },

        /**
         * @classdesc View that renders the admin menu
         * @class AdminView
         * @extends BaseView
         *
         * @param {Object} [options] An object of configurable options.
         */
        constructor: function(options) {
            this._initOptions(options, DEFAULT_OPTIONS);
            CacheAdminView.__super__.constructor.apply(this, arguments);

            this.$el.on('show', this.onShow.bind(this));
            this.$el.on('hide', this.onHide.bind(this));
        },

        /**
         * Event handler for when this view's contents are hidden
         */
        onHide: function() {
            var store = ServiceAdmin.getService(Store.serviceName);
            if (this._storageChangeListener) {
                store.unsubscribe(this._storageChangeListener);
                this._storageChangeListener = null;
            }
            if (this._cacheChangeListener) {
                store.unsubscribe(this._cacheChangeListener);
                this._cacheChangeListener = null;
            }
        },

        /**
         * Event handler for when this view's contents are shown
         */
        onShow: function() {
            var store = ServiceAdmin.getService(Store.serviceName);
            if (this._storageChangeListener) {
                store.unsubscribe(this._storageChangeListener);
            }
            if (this._cacheChangeListener) {
                store.unsubscribe(this._cacheChangeListener);
            }

            this._storageChangeListener = store.subscribe(this.render.bind(this), Storage.NAMESPACE);
            this._cacheChangeListener = store.subscribe(_toggleClearCacheButtons, Cache.NAMESPACE);

            var state = store.getState();
            this.render(state[Storage.NAMESPACE]);
            _toggleClearCacheButtons(state[Cache.NAMESPACE]);
        },

        render: function(state) {
            this.$el.html(this.template(state));
            return this;
        },

        clearChannelsData: function() {
            var flags = {};
            flags[Cache.FLAGS.REBOOT_ON_COMPLETE] = true;
            var cacheSvc = ServiceAdmin.getService(Cache.serviceName);
            cacheSvc.clearChannelsData(flags);
        },

        clearAppCache: function() {
            var flags = {};
            flags[Cache.FLAGS.REBOOT_ON_COMPLETE] = true;
            var cacheSvc = ServiceAdmin.getService(Cache.serviceName);
            cacheSvc.clearAppCache(flags);
        },

        clearAll: function() {
            var flags = {};
            flags[Cache.FLAGS.REBOOT_ON_COMPLETE] = true;
            var cacheSvc = ServiceAdmin.getService(Cache.serviceName);
            cacheSvc.clearAll(flags);
        }

    });

    // return module exports
    return CacheAdminView;
});