summaryrefslogtreecommitdiffstats
path: root/wp-includes/js/customize-views.js
diff options
context:
space:
mode:
Diffstat (limited to 'wp-includes/js/customize-views.js')
-rw-r--r--wp-includes/js/customize-views.js202
1 files changed, 202 insertions, 0 deletions
diff --git a/wp-includes/js/customize-views.js b/wp-includes/js/customize-views.js
new file mode 100644
index 0000000..a7125e0
--- /dev/null
+++ b/wp-includes/js/customize-views.js
@@ -0,0 +1,202 @@
+/**
+ * @output wp-includes/js/customize-views.js
+ */
+
+(function( $, wp, _ ) {
+
+ if ( ! wp || ! wp.customize ) { return; }
+ var api = wp.customize;
+
+ /**
+ * wp.customize.HeaderTool.CurrentView
+ *
+ * Displays the currently selected header image, or a placeholder in lack
+ * thereof.
+ *
+ * Instantiate with model wp.customize.HeaderTool.currentHeader.
+ *
+ * @memberOf wp.customize.HeaderTool
+ * @alias wp.customize.HeaderTool.CurrentView
+ *
+ * @constructor
+ * @augments wp.Backbone.View
+ */
+ api.HeaderTool.CurrentView = wp.Backbone.View.extend(/** @lends wp.customize.HeaderTool.CurrentView.prototype */{
+ template: wp.template('header-current'),
+
+ initialize: function() {
+ this.listenTo(this.model, 'change', this.render);
+ this.render();
+ },
+
+ render: function() {
+ this.$el.html(this.template(this.model.toJSON()));
+ this.setButtons();
+ return this;
+ },
+
+ setButtons: function() {
+ var elements = $('#customize-control-header_image .actions .remove');
+ if (this.model.get('choice')) {
+ elements.show();
+ } else {
+ elements.hide();
+ }
+ }
+ });
+
+
+ /**
+ * wp.customize.HeaderTool.ChoiceView
+ *
+ * Represents a choosable header image, be it user-uploaded,
+ * theme-suggested or a special Randomize choice.
+ *
+ * Takes a wp.customize.HeaderTool.ImageModel.
+ *
+ * Manually changes model wp.customize.HeaderTool.currentHeader via the
+ * `select` method.
+ *
+ * @memberOf wp.customize.HeaderTool
+ * @alias wp.customize.HeaderTool.ChoiceView
+ *
+ * @constructor
+ * @augments wp.Backbone.View
+ */
+ api.HeaderTool.ChoiceView = wp.Backbone.View.extend(/** @lends wp.customize.HeaderTool.ChoiceView.prototype */{
+ template: wp.template('header-choice'),
+
+ className: 'header-view',
+
+ events: {
+ 'click .choice,.random': 'select',
+ 'click .close': 'removeImage'
+ },
+
+ initialize: function() {
+ var properties = [
+ this.model.get('header').url,
+ this.model.get('choice')
+ ];
+
+ this.listenTo(this.model, 'change:selected', this.toggleSelected);
+
+ if (_.contains(properties, api.get().header_image)) {
+ api.HeaderTool.currentHeader.set(this.extendedModel());
+ }
+ },
+
+ render: function() {
+ this.$el.html(this.template(this.extendedModel()));
+
+ this.toggleSelected();
+ return this;
+ },
+
+ toggleSelected: function() {
+ this.$el.toggleClass('selected', this.model.get('selected'));
+ },
+
+ extendedModel: function() {
+ var c = this.model.get('collection');
+ return _.extend(this.model.toJSON(), {
+ type: c.type
+ });
+ },
+
+ select: function() {
+ this.preventJump();
+ this.model.save();
+ api.HeaderTool.currentHeader.set(this.extendedModel());
+ },
+
+ preventJump: function() {
+ var container = $('.wp-full-overlay-sidebar-content'),
+ scroll = container.scrollTop();
+
+ _.defer(function() {
+ container.scrollTop(scroll);
+ });
+ },
+
+ removeImage: function(e) {
+ e.stopPropagation();
+ this.model.destroy();
+ this.remove();
+ }
+ });
+
+
+ /**
+ * wp.customize.HeaderTool.ChoiceListView
+ *
+ * A container for ChoiceViews. These choices should be of one same type:
+ * user-uploaded headers or theme-defined ones.
+ *
+ * Takes a wp.customize.HeaderTool.ChoiceList.
+ *
+ * @memberOf wp.customize.HeaderTool
+ * @alias wp.customize.HeaderTool.ChoiceListView
+ *
+ * @constructor
+ * @augments wp.Backbone.View
+ */
+ api.HeaderTool.ChoiceListView = wp.Backbone.View.extend(/** @lends wp.customize.HeaderTool.ChoiceListView.prototype */{
+ initialize: function() {
+ this.listenTo(this.collection, 'add', this.addOne);
+ this.listenTo(this.collection, 'remove', this.render);
+ this.listenTo(this.collection, 'sort', this.render);
+ this.listenTo(this.collection, 'change', this.toggleList);
+ this.render();
+ },
+
+ render: function() {
+ this.$el.empty();
+ this.collection.each(this.addOne, this);
+ this.toggleList();
+ },
+
+ addOne: function(choice) {
+ var view;
+ choice.set({ collection: this.collection });
+ view = new api.HeaderTool.ChoiceView({ model: choice });
+ this.$el.append(view.render().el);
+ },
+
+ toggleList: function() {
+ var title = this.$el.parents().prev('.customize-control-title'),
+ randomButton = this.$el.find('.random').parent();
+ if (this.collection.shouldHideTitle()) {
+ title.add(randomButton).hide();
+ } else {
+ title.add(randomButton).show();
+ }
+ }
+ });
+
+
+ /**
+ * wp.customize.HeaderTool.CombinedList
+ *
+ * Aggregates wp.customize.HeaderTool.ChoiceList collections (or any
+ * Backbone object, really) and acts as a bus to feed them events.
+ *
+ * @memberOf wp.customize.HeaderTool
+ * @alias wp.customize.HeaderTool.CombinedList
+ *
+ * @constructor
+ * @augments wp.Backbone.View
+ */
+ api.HeaderTool.CombinedList = wp.Backbone.View.extend(/** @lends wp.customize.HeaderTool.CombinedList.prototype */{
+ initialize: function(collections) {
+ this.collections = collections;
+ this.on('all', this.propagate, this);
+ },
+ propagate: function(event, arg) {
+ _.each(this.collections, function(collection) {
+ collection.trigger(event, arg);
+ });
+ }
+ });
+
+})( jQuery, window.wp, _ );