Source: widgets/SpwSnapshots.js

Retour à la documentation
/**
 * @class spw.widgets.SpwSnapshots
 */
define(
[
    "dojo/_base/declare",
    "dojo/text!./templates/SpwSnapshots.html",
    "dojo/i18n!./nls/SpwSnapshots",
    "dojo/_base/lang",
    "dojo/_base/array",
    "dojo/dom-construct",
    "dojo/on",
    "dojo/date/locale",

    "spw/api/SpwBaseTemplatedWidget",
    "spw/api/ConfigLoader",
    "spw/api/ContextManager",
    "spw/api/Utils",
    "spw/api/StateManager",
    "spw/api/LocalStorageManager",
    "spw/api/MessageManager",

    "dijit/layout/ContentPane"
],
function(declare, template, labels, lang, array, domConstruct, on, locale,
         SpwBaseTemplatedWidget, ConfigLoader, ContextManager, Utils, StateManager,
         LocalStorageManager, MessageManager) {

    return declare("spw.widgets.SpwSnapshots", [SpwBaseTemplatedWidget], /** @lends spw.widgets.SpwSnapshots.prototype */ {

        templateString: template,

        labels: labels,

        // description du widget (s'affiche avant la liste)
        description: labels.description,

        // clé de l'objet stocké dans le localstorage
        localKey: 'GeoviewerSnapshots',

        constructor: function() {
            this.inherited(arguments);
        },

        postCreate: function() {
            this.inherited(arguments);

            this.own(on(this.saveButton, 'click', lang.hitch(this, this.checkFormAndSave)));
        },

        refreshList: function() {
            domConstruct.empty(this.tbodyNode);

            var snapshots = LocalStorageManager.instance().getItem(this.localKey);

            if (snapshots == null || snapshots.length === 0) {
                var tr = domConstruct.create('tr', null, this.tbodyNode);
                domConstruct.create('td', {
                    style: 'padding: 15px;',
                    innerHTML: 'Aucun instantané sauvegardé.'
                }, tr);
            }
            else {
                array.forEach(snapshots, lang.hitch(this, this.addToList));
            }
        },

        addToList: function(snap, idx) {
            if (snap.name == null || snap.description == null || snap.date == null ||
                snap.anchors == null || snap.anchors.length === 0) {
                return;
            }

            var tr = domConstruct.create('tr', null, this.tbodyNode, 'last');
            var td = domConstruct.create('td', null, tr, 'last');

            domConstruct.create('span', {
                style: 'font-weight: bold; font-size: 1.5em; font-variant: small-caps;',
                innerHTML: snap.name
            }, td, 'last');

            domConstruct.create('span', {
                innerHTML: ' - ' + locale.format(new Date(snap.date), {selector: 'date', formatLength: 'short'})
            }, td, 'last');

            domConstruct.create('p', {
                innerHTML: snap.description
            }, td, 'last');

            var del = domConstruct.create('span', {
                'class': 'delete'
            }, td, 'last');

            var add = domConstruct.create('span', {
                'class': 'add'
            }, td, 'last');

            this.own(
                on(add, 'click', lang.hitch(this, this.loadSnapshot, snap)),
                on(del, 'click', lang.hitch(this, this.deleteSnapshot, idx))
            );
        },

        checkFormAndSave: function() {
            if (!this.nameNode.validate() || !this.descriptionNode.validate()) {
                return;
            }

            this.saveSnapshot(this.nameNode.get('value'), this.descriptionNode.get('value'));
            this.refreshList();
        },

        loadSnapshot: function(snap) {
            if (snap.anchors == null || snap.anchors.length === 0) {
                return;
            }

            array.forEach(snap.anchors, function(a) {
                Utils.sua(a.key, a.value);
            });

            ConfigLoader.getInstance().load(ConfigLoader.getInstance().currentContext);
            ContextManager.getInstance().applyContext();
        },

        deleteSnapshot: function(index) {
            var removed = LocalStorageManager.instance().removeItem(this.localKey, index);

            this.refreshList();

            if (removed == null) {
                return;
            }

            if (removed.anchors == null || removed.anchors.length === 0) {
                return;
            }

            array.some(removed.anchors, function(a) {
                if (a.key === StateManager.MAP_SERVICES_ID) {
                    var cfg = JSON.parse(a.value);

                    array.forEach(cfg, function(c) {
                        if (c.storage && c.storage === 'local') {
                            LocalStorageManager.instance().deleteItem(c.serviceId);
                        }
                    });

                    return true;
                }

                return false;
            });
        },

        saveSnapshot: function(name, description) {
            var anchors = StateManager.getInstance().getAnchors({
                full: true,
                storage: 'local',
                extent: this.spwViewer.get('spwMap').getCurrentExtent()
            });

            if (anchors == null) {
                MessageManager.getInstance().notifyError('Impossible de stocker davantage dans la mémoire du navigateur. Essayez de supprimer des données et réessayer.');
                return;
            }

            var snapshot = {
                name: name,
                description: description,
                date: new Date().getTime(),
                anchors: anchors
            };

            LocalStorageManager.instance().addItem(this.localKey, snapshot);
        },

        onDeactivate: function() {
            this.inherited(arguments);
        },

        onActivate: function() {
            this.inherited(arguments);
            this.refreshList();
        }
    });

});