flipper-ui 0.2.0.beta2 → 0.2.0.beta3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +12 -11
- data/README.md +5 -7
- data/examples/basic.ru +27 -26
- data/flipper-ui.gemspec +5 -3
- data/lib/flipper-ui.rb +1 -0
- data/lib/flipper/ui.rb +11 -2
- data/lib/flipper/ui/action.rb +45 -4
- data/lib/flipper/ui/actions/actors_gate.rb +48 -0
- data/lib/flipper/ui/actions/add_feature.rb +20 -0
- data/lib/flipper/ui/actions/boolean_gate.rb +26 -0
- data/lib/flipper/ui/actions/feature.rb +32 -0
- data/lib/flipper/ui/actions/features.rb +23 -3
- data/lib/flipper/ui/actions/file.rb +1 -1
- data/lib/flipper/ui/actions/gate.rb +11 -117
- data/lib/flipper/ui/actions/groups_gate.rb +43 -0
- data/lib/flipper/ui/actions/{index.rb → home.rb} +3 -3
- data/lib/flipper/ui/actions/percentage_of_actors_gate.rb +27 -0
- data/lib/flipper/ui/actions/percentage_of_time_gate.rb +27 -0
- data/lib/flipper/ui/actor.rb +13 -0
- data/lib/flipper/ui/assets/javascripts/application.coffee +0 -305
- data/lib/flipper/ui/assets/stylesheets/_bootstrap-compass.scss +9 -0
- data/lib/flipper/ui/assets/stylesheets/_bootstrap-mincer.scss +19 -0
- data/lib/flipper/ui/assets/stylesheets/_bootstrap-sprockets.scss +9 -0
- data/lib/flipper/ui/assets/stylesheets/_bootstrap.scss +50 -0
- data/lib/flipper/ui/assets/stylesheets/application.scss +33 -216
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_alerts.scss +73 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_badges.scss +68 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_breadcrumbs.scss +26 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_button-groups.scss +243 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_buttons.scss +160 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_carousel.scss +269 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_close.scss +36 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_code.scss +69 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_component-animations.scss +37 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_dropdowns.scss +214 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_forms.scss +578 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_glyphicons.scss +305 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_grid.scss +84 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_input-groups.scss +166 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_jumbotron.scss +50 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_labels.scss +66 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_list-group.scss +124 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_media.scss +61 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_mixins.scss +39 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_modals.scss +150 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_navbar.scss +662 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_navs.scss +242 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_normalize.scss +427 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_pager.scss +54 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_pagination.scss +88 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_panels.scss +265 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_popovers.scss +135 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_print.scss +107 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_progress-bars.scss +87 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_responsive-embed.scss +35 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_responsive-utilities.scss +177 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_scaffolding.scss +162 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_tables.scss +234 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_theme.scss +273 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_thumbnails.scss +38 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_tooltip.scss +102 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_type.scss +298 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_utilities.scss +55 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_variables.scss +866 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_wells.scss +29 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_alerts.scss +14 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_background-variant.scss +11 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_border-radius.scss +18 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_buttons.scss +52 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_center-block.scss +7 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_clearfix.scss +22 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_forms.scss +88 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_gradients.scss +58 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +81 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_grid.scss +122 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_hide-text.scss +21 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_image.scss +33 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_labels.scss +12 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_list-group.scss +31 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +10 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss +9 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_opacity.scss +8 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_pagination.scss +23 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_panels.scss +24 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_progress-bar.scss +10 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_reset-filter.scss +8 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_resize.scss +6 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss +21 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_size.scss +10 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_tab-focus.scss +9 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_table-row.scss +28 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +11 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-overflow.scss +8 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss +222 -0
- data/lib/flipper/ui/assets/stylesheets/primer/.scss-lint.yml +446 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_alerts.scss +106 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_avatars.scss +36 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_base.scss +40 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_blankslate.scss +96 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_buttons.scss +404 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_counter.scss +10 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_filter-list.scss +68 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_flex-table.scss +20 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_forms.scss +756 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_layout.scss +69 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_menu.scss +113 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_mixins.scss +53 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_normalize.scss +425 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_states.scss +32 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_tabnav.scss +65 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_tooltips.scss +255 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_truncate.scss +27 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_type.scss +92 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_utility.scss +73 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_variables.scss +34 -0
- data/lib/flipper/ui/assets/stylesheets/primer/primer.scss +39 -0
- data/lib/flipper/ui/decorators/feature.rb +37 -4
- data/lib/flipper/ui/middleware.rb +12 -3
- data/lib/flipper/ui/public/css/application.css +2563 -144
- data/lib/flipper/ui/public/css/primer.css +1 -0
- data/lib/flipper/ui/public/css/primer/primer.css +1933 -0
- data/lib/flipper/ui/public/css/scss/primer.css +1933 -0
- data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.eot +0 -0
- data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.svg +288 -0
- data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
- data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
- data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.woff2 +0 -0
- data/lib/flipper/ui/public/js/application.js +0 -539
- data/lib/flipper/ui/public/js/bootstrap-sprockets.js +12 -0
- data/lib/flipper/ui/public/js/bootstrap.js +2317 -0
- data/lib/flipper/ui/public/js/bootstrap.min.js +7 -0
- data/lib/flipper/ui/public/js/bootstrap/affix.js +162 -0
- data/lib/flipper/ui/public/js/bootstrap/alert.js +94 -0
- data/lib/flipper/ui/public/js/bootstrap/button.js +116 -0
- data/lib/flipper/ui/public/js/bootstrap/carousel.js +237 -0
- data/lib/flipper/ui/public/js/bootstrap/collapse.js +211 -0
- data/lib/flipper/ui/public/js/bootstrap/dropdown.js +161 -0
- data/lib/flipper/ui/public/js/bootstrap/modal.js +339 -0
- data/lib/flipper/ui/public/js/bootstrap/popover.js +108 -0
- data/lib/flipper/ui/public/js/bootstrap/scrollspy.js +172 -0
- data/lib/flipper/ui/public/js/bootstrap/tab.js +153 -0
- data/lib/flipper/ui/public/js/bootstrap/tooltip.js +476 -0
- data/lib/flipper/ui/public/js/bootstrap/transition.js +59 -0
- data/lib/flipper/ui/public/octicons/LICENSE.txt +9 -0
- data/lib/flipper/ui/public/octicons/README.md +1 -0
- data/lib/flipper/ui/public/octicons/octicons-local.ttf +0 -0
- data/lib/flipper/ui/public/octicons/octicons.css +236 -0
- data/lib/flipper/ui/public/octicons/octicons.eot +0 -0
- data/lib/flipper/ui/public/octicons/octicons.less +235 -0
- data/lib/flipper/ui/public/octicons/octicons.svg +200 -0
- data/lib/flipper/ui/public/octicons/octicons.ttf +0 -0
- data/lib/flipper/ui/public/octicons/octicons.woff +0 -0
- data/lib/flipper/ui/public/octicons/sprockets-octicons.scss +232 -0
- data/lib/flipper/ui/util.rb +4 -0
- data/lib/flipper/ui/version.rb +1 -1
- data/lib/flipper/ui/views/add_actor.erb +22 -0
- data/lib/flipper/ui/views/add_feature.erb +18 -0
- data/lib/flipper/ui/views/add_group.erb +31 -0
- data/lib/flipper/ui/views/feature.erb +209 -0
- data/lib/flipper/ui/views/features.erb +46 -0
- data/lib/flipper/ui/views/layout.erb +31 -149
- data/script/release +15 -0
- data/spec/flipper/ui/actions/actors_gate_spec.rb +68 -0
- data/spec/flipper/ui/actions/add_feature_spec.rb +17 -0
- data/spec/flipper/ui/actions/boolean_gate_spec.rb +41 -0
- data/spec/flipper/ui/actions/feature_spec.rb +59 -0
- data/spec/flipper/ui/actions/features_spec.rb +37 -0
- data/spec/flipper/ui/actions/file_spec.rb +43 -0
- data/spec/flipper/ui/actions/gate_spec.rb +24 -0
- data/spec/flipper/ui/actions/groups_gate_spec.rb +80 -0
- data/spec/flipper/ui/actions/home_spec.rb +16 -0
- data/spec/flipper/ui/actions/percentage_of_actors_gate_spec.rb +40 -0
- data/spec/flipper/ui/actions/percentage_of_time_gate_spec.rb +39 -0
- data/spec/flipper/ui/decorators/feature_spec.rb +38 -1
- data/spec/flipper/ui/decorators/gate_spec.rb +1 -1
- data/spec/flipper/ui_spec.rb +18 -441
- data/spec/helper.rb +22 -7
- metadata +199 -52
- data/examples/flipper.html +0 -14
- data/examples/flipper.png +0 -0
- data/lib/flipper/ui/assets/javascripts/spine/ajax.coffee +0 -223
- data/lib/flipper/ui/assets/javascripts/spine/list.coffee +0 -43
- data/lib/flipper/ui/assets/javascripts/spine/local.coffee +0 -16
- data/lib/flipper/ui/assets/javascripts/spine/manager.coffee +0 -83
- data/lib/flipper/ui/assets/javascripts/spine/relation.coffee +0 -148
- data/lib/flipper/ui/assets/javascripts/spine/route.coffee +0 -146
- data/lib/flipper/ui/assets/javascripts/spine/spine.coffee +0 -542
- data/lib/flipper/ui/assets/javascripts/spine/version +0 -1
- data/lib/flipper/ui/public/css/images/animated-overlay.gif +0 -0
- data/lib/flipper/ui/public/css/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-bg_flat_10_000000_40x100.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-icons_222222_256x240.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-icons_228ef1_256x240.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-icons_ef8c08_256x240.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-icons_ffd27a_256x240.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-icons_ffffff_256x240.png +0 -0
- data/lib/flipper/ui/public/css/jquery-ui-1.10.3.slider.min.css +0 -5
- data/lib/flipper/ui/public/js/handlebars.js +0 -1992
- data/lib/flipper/ui/public/js/jquery-ui-1.10.3.slider.min.js +0 -6
- data/lib/flipper/ui/public/js/jquery.js +0 -9555
- data/lib/flipper/ui/public/js/jquery.min.js +0 -4
- data/lib/flipper/ui/public/js/jquery.min.map +0 -1
- data/lib/flipper/ui/public/js/spine/ajax.js +0 -320
- data/lib/flipper/ui/public/js/spine/list.js +0 -72
- data/lib/flipper/ui/public/js/spine/local.js +0 -29
- data/lib/flipper/ui/public/js/spine/manager.js +0 -157
- data/lib/flipper/ui/public/js/spine/relation.js +0 -260
- data/lib/flipper/ui/public/js/spine/route.js +0 -223
- data/lib/flipper/ui/public/js/spine/spine.js +0 -927
- data/lib/flipper/ui/views/index.erb +0 -9
@@ -1,260 +0,0 @@
|
|
1
|
-
(function() {
|
2
|
-
var Collection, Instance, Singleton, Spine, isArray, require, singularize, underscore,
|
3
|
-
__hasProp = {}.hasOwnProperty,
|
4
|
-
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
|
5
|
-
|
6
|
-
Spine = this.Spine || require('spine');
|
7
|
-
|
8
|
-
isArray = Spine.isArray;
|
9
|
-
|
10
|
-
require = this.require || (function(value) {
|
11
|
-
return eval(value);
|
12
|
-
});
|
13
|
-
|
14
|
-
Collection = (function(_super) {
|
15
|
-
|
16
|
-
__extends(Collection, _super);
|
17
|
-
|
18
|
-
function Collection(options) {
|
19
|
-
var key, value;
|
20
|
-
if (options == null) {
|
21
|
-
options = {};
|
22
|
-
}
|
23
|
-
for (key in options) {
|
24
|
-
value = options[key];
|
25
|
-
this[key] = value;
|
26
|
-
}
|
27
|
-
}
|
28
|
-
|
29
|
-
Collection.prototype.all = function() {
|
30
|
-
var _this = this;
|
31
|
-
return this.model.select(function(rec) {
|
32
|
-
return _this.associated(rec);
|
33
|
-
});
|
34
|
-
};
|
35
|
-
|
36
|
-
Collection.prototype.first = function() {
|
37
|
-
return this.all()[0];
|
38
|
-
};
|
39
|
-
|
40
|
-
Collection.prototype.last = function() {
|
41
|
-
var values;
|
42
|
-
values = this.all();
|
43
|
-
return values[values.length - 1];
|
44
|
-
};
|
45
|
-
|
46
|
-
Collection.prototype.find = function(id) {
|
47
|
-
var records,
|
48
|
-
_this = this;
|
49
|
-
records = this.select(function(rec) {
|
50
|
-
return ("" + rec.id) === ("" + id);
|
51
|
-
});
|
52
|
-
if (!records[0]) {
|
53
|
-
throw new Error("\"" + this.model.className + "\" model could not find a record for the ID \"" + id + "\"");
|
54
|
-
}
|
55
|
-
return records[0];
|
56
|
-
};
|
57
|
-
|
58
|
-
Collection.prototype.findAllByAttribute = function(name, value) {
|
59
|
-
var _this = this;
|
60
|
-
return this.model.select(function(rec) {
|
61
|
-
return _this.associated(rec) && rec[name] === value;
|
62
|
-
});
|
63
|
-
};
|
64
|
-
|
65
|
-
Collection.prototype.findByAttribute = function(name, value) {
|
66
|
-
return this.findAllByAttribute(name, value)[0];
|
67
|
-
};
|
68
|
-
|
69
|
-
Collection.prototype.select = function(cb) {
|
70
|
-
var _this = this;
|
71
|
-
return this.model.select(function(rec) {
|
72
|
-
return _this.associated(rec) && cb(rec);
|
73
|
-
});
|
74
|
-
};
|
75
|
-
|
76
|
-
Collection.prototype.refresh = function(values) {
|
77
|
-
var record, records, _i, _j, _len, _len1, _ref;
|
78
|
-
_ref = this.all();
|
79
|
-
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
80
|
-
record = _ref[_i];
|
81
|
-
delete this.model.records[record.id];
|
82
|
-
}
|
83
|
-
records = this.model.fromJSON(values);
|
84
|
-
if (!isArray(records)) {
|
85
|
-
records = [records];
|
86
|
-
}
|
87
|
-
for (_j = 0, _len1 = records.length; _j < _len1; _j++) {
|
88
|
-
record = records[_j];
|
89
|
-
record.newRecord = false;
|
90
|
-
record[this.fkey] = this.record.id;
|
91
|
-
this.model.records[record.id] = record;
|
92
|
-
}
|
93
|
-
return this.model.trigger('refresh', this.model.cloneArray(records));
|
94
|
-
};
|
95
|
-
|
96
|
-
Collection.prototype.create = function(record) {
|
97
|
-
record[this.fkey] = this.record.id;
|
98
|
-
return this.model.create(record);
|
99
|
-
};
|
100
|
-
|
101
|
-
Collection.prototype.associated = function(record) {
|
102
|
-
return record[this.fkey] === this.record.id;
|
103
|
-
};
|
104
|
-
|
105
|
-
return Collection;
|
106
|
-
|
107
|
-
})(Spine.Module);
|
108
|
-
|
109
|
-
Instance = (function(_super) {
|
110
|
-
|
111
|
-
__extends(Instance, _super);
|
112
|
-
|
113
|
-
function Instance(options) {
|
114
|
-
var key, value;
|
115
|
-
if (options == null) {
|
116
|
-
options = {};
|
117
|
-
}
|
118
|
-
for (key in options) {
|
119
|
-
value = options[key];
|
120
|
-
this[key] = value;
|
121
|
-
}
|
122
|
-
}
|
123
|
-
|
124
|
-
Instance.prototype.exists = function() {
|
125
|
-
return this.record[this.fkey] && this.model.exists(this.record[this.fkey]);
|
126
|
-
};
|
127
|
-
|
128
|
-
Instance.prototype.update = function(value) {
|
129
|
-
if (!(value instanceof this.model)) {
|
130
|
-
value = new this.model(value);
|
131
|
-
}
|
132
|
-
if (value.isNew()) {
|
133
|
-
value.save();
|
134
|
-
}
|
135
|
-
return this.record[this.fkey] = value && value.id;
|
136
|
-
};
|
137
|
-
|
138
|
-
return Instance;
|
139
|
-
|
140
|
-
})(Spine.Module);
|
141
|
-
|
142
|
-
Singleton = (function(_super) {
|
143
|
-
|
144
|
-
__extends(Singleton, _super);
|
145
|
-
|
146
|
-
function Singleton(options) {
|
147
|
-
var key, value;
|
148
|
-
if (options == null) {
|
149
|
-
options = {};
|
150
|
-
}
|
151
|
-
for (key in options) {
|
152
|
-
value = options[key];
|
153
|
-
this[key] = value;
|
154
|
-
}
|
155
|
-
}
|
156
|
-
|
157
|
-
Singleton.prototype.find = function() {
|
158
|
-
return this.record.id && this.model.findByAttribute(this.fkey, this.record.id);
|
159
|
-
};
|
160
|
-
|
161
|
-
Singleton.prototype.update = function(value) {
|
162
|
-
if (!(value instanceof this.model)) {
|
163
|
-
value = this.model.fromJSON(value);
|
164
|
-
}
|
165
|
-
value[this.fkey] = this.record.id;
|
166
|
-
return value.save();
|
167
|
-
};
|
168
|
-
|
169
|
-
return Singleton;
|
170
|
-
|
171
|
-
})(Spine.Module);
|
172
|
-
|
173
|
-
singularize = function(str) {
|
174
|
-
return str.replace(/s$/, '');
|
175
|
-
};
|
176
|
-
|
177
|
-
underscore = function(str) {
|
178
|
-
return str.replace(/::/g, '/').replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2').replace(/([a-z\d])([A-Z])/g, '$1_$2').replace(/-/g, '_').toLowerCase();
|
179
|
-
};
|
180
|
-
|
181
|
-
Spine.Model.extend({
|
182
|
-
hasMany: function(name, model, fkey) {
|
183
|
-
var association;
|
184
|
-
if (fkey == null) {
|
185
|
-
fkey = "" + (underscore(this.className)) + "_id";
|
186
|
-
}
|
187
|
-
association = function(record) {
|
188
|
-
if (typeof model === 'string') {
|
189
|
-
model = require(model);
|
190
|
-
}
|
191
|
-
return new Collection({
|
192
|
-
name: name,
|
193
|
-
model: model,
|
194
|
-
record: record,
|
195
|
-
fkey: fkey
|
196
|
-
});
|
197
|
-
};
|
198
|
-
return this.prototype[name] = function(value) {
|
199
|
-
if (value != null) {
|
200
|
-
association(this).refresh(value);
|
201
|
-
}
|
202
|
-
return association(this);
|
203
|
-
};
|
204
|
-
},
|
205
|
-
belongsTo: function(name, model, fkey) {
|
206
|
-
var association;
|
207
|
-
if (fkey == null) {
|
208
|
-
fkey = "" + (singularize(name)) + "_id";
|
209
|
-
}
|
210
|
-
association = function(record) {
|
211
|
-
if (typeof model === 'string') {
|
212
|
-
model = require(model);
|
213
|
-
}
|
214
|
-
return new Instance({
|
215
|
-
name: name,
|
216
|
-
model: model,
|
217
|
-
record: record,
|
218
|
-
fkey: fkey
|
219
|
-
});
|
220
|
-
};
|
221
|
-
this.prototype[name] = function(value) {
|
222
|
-
if (value != null) {
|
223
|
-
association(this).update(value);
|
224
|
-
}
|
225
|
-
return association(this).exists();
|
226
|
-
};
|
227
|
-
return this.attributes.push(fkey);
|
228
|
-
},
|
229
|
-
hasOne: function(name, model, fkey) {
|
230
|
-
var association;
|
231
|
-
if (fkey == null) {
|
232
|
-
fkey = "" + (underscore(this.className)) + "_id";
|
233
|
-
}
|
234
|
-
association = function(record) {
|
235
|
-
if (typeof model === 'string') {
|
236
|
-
model = require(model);
|
237
|
-
}
|
238
|
-
return new Singleton({
|
239
|
-
name: name,
|
240
|
-
model: model,
|
241
|
-
record: record,
|
242
|
-
fkey: fkey
|
243
|
-
});
|
244
|
-
};
|
245
|
-
return this.prototype[name] = function(value) {
|
246
|
-
if (value != null) {
|
247
|
-
association(this).update(value);
|
248
|
-
}
|
249
|
-
return association(this).find();
|
250
|
-
};
|
251
|
-
}
|
252
|
-
});
|
253
|
-
|
254
|
-
Spine.Collection = Collection;
|
255
|
-
|
256
|
-
Spine.Singleton = Singleton;
|
257
|
-
|
258
|
-
Spine.Instance = Instance;
|
259
|
-
|
260
|
-
}).call(this);
|
@@ -1,223 +0,0 @@
|
|
1
|
-
(function() {
|
2
|
-
var $, Spine, escapeRegExp, hashStrip, namedParam, splatParam,
|
3
|
-
__hasProp = {}.hasOwnProperty,
|
4
|
-
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
|
5
|
-
__slice = [].slice;
|
6
|
-
|
7
|
-
Spine = this.Spine || require('spine');
|
8
|
-
|
9
|
-
$ = Spine.$;
|
10
|
-
|
11
|
-
hashStrip = /^#*/;
|
12
|
-
|
13
|
-
namedParam = /:([\w\d]+)/g;
|
14
|
-
|
15
|
-
splatParam = /\*([\w\d]+)/g;
|
16
|
-
|
17
|
-
escapeRegExp = /[-[\]{}()+?.,\\^$|#\s]/g;
|
18
|
-
|
19
|
-
Spine.Route = (function(_super) {
|
20
|
-
var _ref;
|
21
|
-
|
22
|
-
__extends(Route, _super);
|
23
|
-
|
24
|
-
Route.extend(Spine.Events);
|
25
|
-
|
26
|
-
Route.historySupport = ((_ref = window.history) != null ? _ref.pushState : void 0) != null;
|
27
|
-
|
28
|
-
Route.routes = [];
|
29
|
-
|
30
|
-
Route.options = {
|
31
|
-
trigger: true,
|
32
|
-
history: false,
|
33
|
-
shim: false
|
34
|
-
};
|
35
|
-
|
36
|
-
Route.add = function(path, callback) {
|
37
|
-
var key, value, _results;
|
38
|
-
if (typeof path === 'object' && !(path instanceof RegExp)) {
|
39
|
-
_results = [];
|
40
|
-
for (key in path) {
|
41
|
-
value = path[key];
|
42
|
-
_results.push(this.add(key, value));
|
43
|
-
}
|
44
|
-
return _results;
|
45
|
-
} else {
|
46
|
-
return this.routes.push(new this(path, callback));
|
47
|
-
}
|
48
|
-
};
|
49
|
-
|
50
|
-
Route.setup = function(options) {
|
51
|
-
if (options == null) {
|
52
|
-
options = {};
|
53
|
-
}
|
54
|
-
this.options = $.extend({}, this.options, options);
|
55
|
-
if (this.options.history) {
|
56
|
-
this.history = this.historySupport && this.options.history;
|
57
|
-
}
|
58
|
-
if (this.options.shim) {
|
59
|
-
return;
|
60
|
-
}
|
61
|
-
if (this.history) {
|
62
|
-
$(window).bind('popstate', this.change);
|
63
|
-
} else {
|
64
|
-
$(window).bind('hashchange', this.change);
|
65
|
-
}
|
66
|
-
return this.change();
|
67
|
-
};
|
68
|
-
|
69
|
-
Route.unbind = function() {
|
70
|
-
if (this.options.shim) {
|
71
|
-
return;
|
72
|
-
}
|
73
|
-
if (this.history) {
|
74
|
-
return $(window).unbind('popstate', this.change);
|
75
|
-
} else {
|
76
|
-
return $(window).unbind('hashchange', this.change);
|
77
|
-
}
|
78
|
-
};
|
79
|
-
|
80
|
-
Route.navigate = function() {
|
81
|
-
var args, lastArg, options, path;
|
82
|
-
args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
|
83
|
-
options = {};
|
84
|
-
lastArg = args[args.length - 1];
|
85
|
-
if (typeof lastArg === 'object') {
|
86
|
-
options = args.pop();
|
87
|
-
} else if (typeof lastArg === 'boolean') {
|
88
|
-
options.trigger = args.pop();
|
89
|
-
}
|
90
|
-
options = $.extend({}, this.options, options);
|
91
|
-
path = args.join('/');
|
92
|
-
if (this.path === path) {
|
93
|
-
return;
|
94
|
-
}
|
95
|
-
this.path = path;
|
96
|
-
this.trigger('navigate', this.path);
|
97
|
-
if (options.trigger) {
|
98
|
-
this.matchRoute(this.path, options);
|
99
|
-
}
|
100
|
-
if (options.shim) {
|
101
|
-
return;
|
102
|
-
}
|
103
|
-
if (this.history) {
|
104
|
-
return history.pushState({}, document.title, this.path);
|
105
|
-
} else {
|
106
|
-
return window.location.hash = this.path;
|
107
|
-
}
|
108
|
-
};
|
109
|
-
|
110
|
-
Route.getPath = function() {
|
111
|
-
var path;
|
112
|
-
path = window.location.pathname;
|
113
|
-
if (path.substr(0, 1) !== '/') {
|
114
|
-
path = '/' + path;
|
115
|
-
}
|
116
|
-
return path;
|
117
|
-
};
|
118
|
-
|
119
|
-
Route.getHash = function() {
|
120
|
-
return window.location.hash;
|
121
|
-
};
|
122
|
-
|
123
|
-
Route.getFragment = function() {
|
124
|
-
return this.getHash().replace(hashStrip, '');
|
125
|
-
};
|
126
|
-
|
127
|
-
Route.getHost = function() {
|
128
|
-
return (document.location + '').replace(this.getPath() + this.getHash(), '');
|
129
|
-
};
|
130
|
-
|
131
|
-
Route.change = function() {
|
132
|
-
var path;
|
133
|
-
path = this.history ? this.getPath() : this.getFragment();
|
134
|
-
if (path === this.path) {
|
135
|
-
return;
|
136
|
-
}
|
137
|
-
this.path = path;
|
138
|
-
return this.matchRoute(this.path);
|
139
|
-
};
|
140
|
-
|
141
|
-
Route.matchRoute = function(path, options) {
|
142
|
-
var route, _i, _len, _ref1;
|
143
|
-
_ref1 = this.routes;
|
144
|
-
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
145
|
-
route = _ref1[_i];
|
146
|
-
if (!(route.match(path, options))) {
|
147
|
-
continue;
|
148
|
-
}
|
149
|
-
this.trigger('change', route, path);
|
150
|
-
return route;
|
151
|
-
}
|
152
|
-
};
|
153
|
-
|
154
|
-
function Route(path, callback) {
|
155
|
-
var match;
|
156
|
-
this.path = path;
|
157
|
-
this.callback = callback;
|
158
|
-
this.names = [];
|
159
|
-
if (typeof path === 'string') {
|
160
|
-
namedParam.lastIndex = 0;
|
161
|
-
while ((match = namedParam.exec(path)) !== null) {
|
162
|
-
this.names.push(match[1]);
|
163
|
-
}
|
164
|
-
splatParam.lastIndex = 0;
|
165
|
-
while ((match = splatParam.exec(path)) !== null) {
|
166
|
-
this.names.push(match[1]);
|
167
|
-
}
|
168
|
-
path = path.replace(escapeRegExp, '\\$&').replace(namedParam, '([^\/]*)').replace(splatParam, '(.*?)');
|
169
|
-
this.route = new RegExp("^" + path + "$");
|
170
|
-
} else {
|
171
|
-
this.route = path;
|
172
|
-
}
|
173
|
-
}
|
174
|
-
|
175
|
-
Route.prototype.match = function(path, options) {
|
176
|
-
var i, match, param, params, _i, _len;
|
177
|
-
if (options == null) {
|
178
|
-
options = {};
|
179
|
-
}
|
180
|
-
match = this.route.exec(path);
|
181
|
-
if (!match) {
|
182
|
-
return false;
|
183
|
-
}
|
184
|
-
options.match = match;
|
185
|
-
params = match.slice(1);
|
186
|
-
if (this.names.length) {
|
187
|
-
for (i = _i = 0, _len = params.length; _i < _len; i = ++_i) {
|
188
|
-
param = params[i];
|
189
|
-
options[this.names[i]] = param;
|
190
|
-
}
|
191
|
-
}
|
192
|
-
return this.callback.call(null, options) !== false;
|
193
|
-
};
|
194
|
-
|
195
|
-
return Route;
|
196
|
-
|
197
|
-
})(Spine.Module);
|
198
|
-
|
199
|
-
Spine.Route.change = Spine.Route.proxy(Spine.Route.change);
|
200
|
-
|
201
|
-
Spine.Controller.include({
|
202
|
-
route: function(path, callback) {
|
203
|
-
return Spine.Route.add(path, this.proxy(callback));
|
204
|
-
},
|
205
|
-
routes: function(routes) {
|
206
|
-
var key, value, _results;
|
207
|
-
_results = [];
|
208
|
-
for (key in routes) {
|
209
|
-
value = routes[key];
|
210
|
-
_results.push(this.route(key, value));
|
211
|
-
}
|
212
|
-
return _results;
|
213
|
-
},
|
214
|
-
navigate: function() {
|
215
|
-
return Spine.Route.navigate.apply(Spine.Route, arguments);
|
216
|
-
}
|
217
|
-
});
|
218
|
-
|
219
|
-
if (typeof module !== "undefined" && module !== null) {
|
220
|
-
module.exports = Spine.Route;
|
221
|
-
}
|
222
|
-
|
223
|
-
}).call(this);
|