mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-02-17 23:44:39 -05:00
In order to remove the iiwf we need to be able to lint backend and frontend code separately. Changed our devDependency for grunt-jslint to use a fork which has multiTask (PR sent to main repo) Updated Gruntfile with split rules for the jslint tasks As a result, a few files failed to pass the new rules, these have been fixed and added to the commit
172 lines
No EOL
5.4 KiB
JavaScript
172 lines
No EOL
5.4 KiB
JavaScript
/*global window, document, localStorage, Ghost, Backbone, confirm, JST, $, _ */
|
|
(function () {
|
|
"use strict";
|
|
|
|
var Widgets,
|
|
Widget,
|
|
WidgetContent,
|
|
$widgetContainer,
|
|
$itemElems,
|
|
widgetPositions;
|
|
|
|
widgetPositions = {
|
|
mobile: {},
|
|
tablet: {},
|
|
netbook: {},
|
|
desktop: {}
|
|
};
|
|
|
|
// Base view
|
|
// ----------
|
|
Ghost.Views.Dashboard = Ghost.View.extend({
|
|
initialize: function (options) {
|
|
this.addSubview(new Widgets({ el: '.js-widget-container', collection: this.collection })).render();
|
|
}
|
|
});
|
|
|
|
// Widgets
|
|
// ----------
|
|
Widgets = Ghost.View.extend({
|
|
initialize: function () {
|
|
$widgetContainer = this.$el;
|
|
},
|
|
|
|
packeryInit: function () {
|
|
var self = this;
|
|
$widgetContainer.packery({
|
|
itemSelector: '.js-widget',
|
|
gutter: 10,
|
|
columnWidth: 340,
|
|
rowHeight: 300
|
|
});
|
|
|
|
$itemElems = $($widgetContainer.packery('getItemElements'));
|
|
|
|
// make item elements draggable
|
|
$itemElems.draggable();
|
|
// bind Draggable events to Packery
|
|
$widgetContainer.packery('bindUIDraggableEvents', $itemElems);
|
|
|
|
$widgetContainer.packery('on', 'dragItemPositioned', function () {
|
|
var viewportSize = $(window).width();
|
|
if (viewportSize <= 400) { // Mobile
|
|
widgetPositions.mobile = self.getWidgetOrder($itemElems);
|
|
} else if (viewportSize > 400 && viewportSize <= 800) { // Tablet
|
|
widgetPositions.tablet = self.getWidgetOrder($itemElems);
|
|
} else if (viewportSize > 800 && viewportSize <= 1000) { // Netbook
|
|
widgetPositions.netbook = self.getWidgetOrder($itemElems);
|
|
} else if (viewportSize > 1000) {
|
|
widgetPositions.desktop = self.getWidgetOrder($itemElems);
|
|
}
|
|
localStorage.setItem('widgetPositions', JSON.stringify(widgetPositions));
|
|
|
|
// Retrieve the object from storage with `JSON.parse(localStorage.getItem('widgetPositions'));`
|
|
});
|
|
},
|
|
|
|
getWidgetOrder: function (itemElems) {
|
|
// items are in order within the layout
|
|
var order = {};
|
|
|
|
_.each(itemElems, function (widget, index) {
|
|
order[widget.getAttribute("data-widget-id")] = index;
|
|
});
|
|
return order;
|
|
},
|
|
|
|
render: function () {
|
|
this.collection.each(function (model) {
|
|
this.$el.append(this.addSubview(new Widget({model: model})).render().el);
|
|
}, this);
|
|
this.packeryInit();
|
|
}
|
|
|
|
});
|
|
|
|
// Widget
|
|
// ----------
|
|
Widget = Ghost.View.extend({
|
|
|
|
tagName: 'article',
|
|
attributes: function () {
|
|
var size = (this.model.get('size')) ? " widget-" + this.model.get('size') : "",
|
|
settings = (this.model.attributes.settings.enabled) ? " widget-settings" : "";
|
|
|
|
return {
|
|
'class': 'widget-' + this.model.get('name') + size + settings + ' js-widget',
|
|
'data-widget-id': this.model.get('applicationID')
|
|
};
|
|
},
|
|
|
|
events: {
|
|
'click .js-widget-resizer': 'resizeWidget',
|
|
'click .js-view-settings': 'showSettings',
|
|
'click .js-view-widget': 'showWidget'
|
|
},
|
|
|
|
resizeWidget: function (e) {
|
|
e.preventDefault();
|
|
var data = $(e.currentTarget).data('size');
|
|
|
|
this.$el.removeClass("widget-1x2 widget-2x1 widget-2x2");
|
|
|
|
if (data !== "1x1") {
|
|
this.$el.addClass('widget-' + data);
|
|
$widgetContainer.packery('fit', this.el);
|
|
} else {
|
|
$widgetContainer.packery();
|
|
}
|
|
|
|
$(e.currentTarget).siblings('.active').removeClass('active');
|
|
$(e.currentTarget).addClass('active');
|
|
},
|
|
|
|
showSettings: function (e) {
|
|
e.preventDefault();
|
|
this.model.attributes.settings.enabled = true;
|
|
this.$el.addClass("widget-settings");
|
|
this.render();
|
|
},
|
|
|
|
showWidget: function (e) {
|
|
e.preventDefault();
|
|
this.model.attributes.settings.enabled = false;
|
|
this.$el.removeClass("widget-settings");
|
|
this.render();
|
|
},
|
|
|
|
templateName: "widget",
|
|
|
|
template: function (data) {
|
|
return JST[this.templateName](data);
|
|
},
|
|
|
|
render: function () {
|
|
this.$el.html(this.template(this.model.toJSON()));
|
|
if (!this.model.attributes.settings.enabled) {
|
|
this.$(".widget-content").html(this.addSubview(new WidgetContent({model: this.model})).render().el);
|
|
} else {
|
|
var size = !this.model.get('size') ? "1x1" : this.model.get('size');
|
|
this.$el.find("[data-size='" + size + "']").addClass('active');
|
|
}
|
|
return this;
|
|
}
|
|
|
|
});
|
|
|
|
// Widget Content
|
|
// ----------
|
|
WidgetContent = Ghost.View.extend({
|
|
|
|
template: function (data) {
|
|
return JST['widgets/' + this.model.attributes.content.template](data);
|
|
},
|
|
|
|
render: function () {
|
|
this.$el.html(this.template(this.model.toJSON()));
|
|
return this;
|
|
}
|
|
|
|
});
|
|
|
|
}()); |