Source: media/utils/selection-sync.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/**
 * wp.media.selectionSync
 *
 * Sync an attachments selection in a state with another state.
 *
 * Allows for selecting multiple images in the Add Media workflow, and then
 * switching to the Insert Gallery workflow while preserving the attachments selection.
 *
 * @memberOf wp.media
 *
 * @mixin
 */
var selectionSync = {
    /**
     * @since 3.5.0
     */
    syncSelection: function() {
        var selection = this.get('selection'),
            manager = this.frame._selection;

        if ( ! this.get('syncSelection') || ! manager || ! selection ) {
            return;
        }

        /*
         * If the selection supports multiple items, validate the stored
         * attachments based on the new selection's conditions. Record
         * the attachments that are not included; we'll maintain a
         * reference to those. Other attachments are considered in flux.
         */
        if ( selection.multiple ) {
            selection.reset( [], { silent: true });
            selection.validateAll( manager.attachments );
            manager.difference = _.difference( manager.attachments.models, selection.models );
        }

        // Sync the selection's single item with the master.
        selection.single( manager.single );
    },

    /**
     * Record the currently active attachments, which is a combination
     * of the selection's attachments and the set of selected
     * attachments that this specific selection considered invalid.
     * Reset the difference and record the single attachment.
     *
     * @since 3.5.0
     */
    recordSelection: function() {
        var selection = this.get('selection'),
            manager = this.frame._selection;

        if ( ! this.get('syncSelection') || ! manager || ! selection ) {
            return;
        }

        if ( selection.multiple ) {
            manager.attachments.reset( selection.toArray().concat( manager.difference ) );
            manager.difference = [];
        } else {
            manager.attachments.add( selection.toArray() );
        }

        manager.single = selection._single;
    }
};

module.exports = selectionSync;