Skip to content

Commit 91a75ef

Browse files
committed
add emitter fns and test
1 parent 07f4a49 commit 91a75ef

File tree

6 files changed

+222
-69
lines changed

6 files changed

+222
-69
lines changed

examples/index.html

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -102,20 +102,13 @@
102102
<div class="grid-canvas">
103103
</div>
104104
</div>
105-
<div class="pagination">
106-
</div>
107105
</div>
108106
</div>
109107

110108
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.js"></script>
111109
<script src="/js/index.js"></script>
112110
<script type="text/javascript">
113111
$(function() {
114-
115-
var e = new Flow.Emitter();
116-
e.on('foo', () => console.log('foo fired'));
117-
e.trigger('foo');
118-
119112
var dataProvider = new Flow.AjaxDataProvider({
120113
url: 'http://192.168.60.167:3002/api.php',
121114
pagination: {

gulpfile.js

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,10 @@ gulp.task('js', () => {
1414
.pipe(plumber())
1515
.pipe(rollup({
1616
plugins: [
17-
resolve({
18-
jsnext: true,
19-
main: true
20-
}),
21-
commonjs({
22-
include: './src/js',
23-
extensions: ['.js']
24-
}),
17+
resolve({ jsnext: true, main: true }),
18+
commonjs({ include: './src/js', extensions: ['.js'] }),
2519
babel({
26-
presets: [["es2015", { modules: false }]],
20+
presets: [['es2015', { modules: false }]],
2721
exclude: 'node_modules/**',
2822
plugins: ['external-helpers'],
2923
externalHelpers: true

spec/emitter-spec.js

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,58 @@
11
import Emitter from '../src/js/emitter';
22

33
describe('Emitter', () => {
4-
it(".on('foo')", () => {
5-
expect(true).toEqual(true);
4+
let emitter;
5+
let result;
6+
7+
beforeEach(() => {
8+
emitter = new Emitter();
9+
result = [];
10+
});
11+
12+
it(".on(eventName, fn)", () => {
13+
registerEvents();
14+
emitEvents();
15+
16+
expect(result).toEqual([1, 2, 1, 2]);
17+
});
18+
19+
it(".once(eventName, fn)", () => {
20+
emitter.once('foo', (n) => {
21+
result.push(n);
22+
});
23+
24+
emitter.once('bar', (n) => {
25+
result.push(n);
26+
});
27+
28+
emitEvents();
29+
30+
expect(result).toEqual([1, 1]);
31+
});
32+
33+
it(".off(eventName, fn)", () => {
34+
registerEvents();
35+
emitter.off('foo');
36+
emitEvents();
37+
38+
expect(result).toEqual([1, 2]);
639
});
40+
41+
let registerEvents = () => {
42+
emitter.on('foo', (n) => {
43+
result.push(n);
44+
});
45+
46+
emitter.on('bar', (n) => {
47+
result.push(n);
48+
});
49+
};
50+
51+
let emitEvents = () => {
52+
emitter.emit('foo', 1);
53+
emitter.emit('foo', 2);
54+
emitter.emit('bar', 1);
55+
emitter.emit('bar', 2);
56+
};
757
});
58+

src/js/emitter.js

Lines changed: 108 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,120 @@
1-
/*
2-
var emitter = new Emitter();
1+
/**
2+
* A minimal event emitter implemention in ES6, api is fairly to similar to
3+
* node api check node emitter documention for information.
4+
*
5+
* @example
6+
* ```
7+
* var emitter = new Emitter();
8+
* emitter.on('foo', () => {
9+
* console.log('foo triggered');
10+
* });
11+
* emitter.emit('foo');
12+
* ```
13+
*/
314

4-
emitter.on('foo', function() {
5-
console.log('foo triggered');
6-
});
7-
8-
emitter.off('foo');
9-
*/
1015
class Emitter {
1116
constructor() {
12-
this.callbacks = {};
17+
this.events = {};
1318
}
1419

15-
on(name, fn) {
16-
this.callbacks[name] = fn;
20+
/**
21+
* Register an `event`.
22+
*
23+
* @param {String} eventName
24+
* @param {Function} fn
25+
* @return {Emitter}
26+
*/
27+
28+
on(eventName, fn) {
29+
if (typeof this.events[eventName] === 'undefined') {
30+
this.events[eventName] = [];
31+
}
32+
33+
this.events[eventName].push(fn);
34+
return this;
1735
}
1836

19-
emit() {
20-
// eslint-disable-next-line no-console
21-
console.log(this.callbacks);
37+
/**
38+
* Remove an `event`.
39+
*
40+
* @param {String} eventName
41+
* @param {Function} fn
42+
* @return {Emitter}
43+
*/
44+
45+
off(eventName, fn) {
46+
if (typeof eventName === 'undefined') {
47+
this.events = {};
48+
}
49+
50+
if (typeof fn === 'undefined') {
51+
this.events[eventName] = [];
52+
}
53+
54+
if (typeof fn === 'function') {
55+
let i;
56+
let events = this.events[eventName];
57+
58+
for (i = 0; i < events.length; i += 1) {
59+
if (events[i] === fn) {
60+
events.splice(i, 1);
61+
}
62+
}
63+
}
64+
65+
return this;
2266
}
2367

24-
trigger() {
25-
// eslint-disable-next-line no-console
26-
console.log(this.callbacks);
68+
/**
69+
* Register an `event` which is fired only once and removed.
70+
*
71+
* @param {Strint} eventName
72+
* @param {Function} fn
73+
* @return {Emitter}
74+
*/
75+
76+
once(eventName, fn) {
77+
let self = this;
78+
let cb = (data) => {
79+
self.off(eventName, cb);
80+
fn.call(this, data);
81+
};
82+
83+
this.on(eventName, cb);
84+
return this;
85+
}
86+
87+
/**
88+
* Emit `event` with given arguments.
89+
*
90+
* @param {String} eventName
91+
* @param {Mixed} args
92+
* @return {Emitter}
93+
*/
94+
95+
emit(eventName, data) {
96+
var i;
97+
var events = this.events[eventName];
98+
99+
if (typeof events === 'undefined') {
100+
return this;
101+
}
102+
103+
for (i = 0; i < events.length; i += 1) {
104+
events[i].call(this, data);
105+
}
106+
107+
return this;
108+
}
109+
110+
/**
111+
* An alias to `emit`.
112+
*
113+
* @see `emit`
114+
*/
115+
116+
trigger(eventName, data) {
117+
return this.emit(eventName, data);
27118
}
28119
}
29120

src/js/grid.js

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* global $ */
12
import Emitter from './emitter';
23

34
class Grid extends Emitter {
@@ -10,12 +11,36 @@ class Grid extends Emitter {
1011
}
1112

1213
this.columns = options.columns;
13-
this.dataProvider = options.dataProvider;
14+
this.provider = options.dataProvider;
15+
16+
this.render();
1417
}
1518

1619
render() {
17-
// eslint-disable-next-line no-console
18-
console.log(this.el);
20+
const { el, columns, provider } = this;
21+
const data = provider.getData();
22+
const thead = $('<thead/>');
23+
const dataLength = data.length;
24+
25+
for (let i = 0; i < columns.length; i += 1) {
26+
27+
let column = columns[i];
28+
const tr = $('<tr/>');
29+
30+
for (let j = 0; j < dataLength; j += 1) {
31+
let cell = data[j];
32+
let div = $('<td class="grid-cell"/>').text(cell);
33+
34+
35+
// eslint-disable-next-line no-console
36+
console.log(cell);
37+
tr.append(div);
38+
}
39+
40+
thead.append(tr);
41+
}
42+
43+
el.append(thead);
1944
}
2045
}
2146

src/js/pager.js

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,19 @@ import Emitter from './emitter';
33

44
class Pager extends Emitter {
55
contructor(options) {
6-
var $container = options.el;
7-
var dataProvider = options.dataProvider;
8-
var $el = $('<div class="grid-pager"/>');
9-
var $status;
6+
this.container = options.el;
7+
this.provider = options.dataProvider;
8+
this.el = $('<div class="grid-pager"/>');
9+
this.status = null;
1010

1111
this.render();
12-
registerEvents();
13-
updatePager(dataProvider.getPagination());
12+
this.registerEvents();
13+
this.pagination = this.provider.pagination;
14+
this.updatePager(this.pagination);
1415
}
1516

1617
registerEvents() {
17-
dataProvider.onPaginationUpdated.subscribe(function(e, pager) {
18-
updatePager(pager);
19-
});
18+
this.pagination.on('update', this.updatePager);
2019
}
2120

2221
getState() {
@@ -34,11 +33,9 @@ class Pager extends Emitter {
3433
}
3534

3635
setPageSize(n) {
37-
dataProvider.setRefreshHints({
38-
isFilterUnchanged: true
39-
});
36+
this.provider.setRefreshHints({ updateFilter: false });
4037
var page = parseInt(n, 10);
41-
dataProvider.setPageSize(n);
38+
this.pagination.setPageSize(n);
4239
}
4340

4441
gotoFirst() {
@@ -69,17 +66,18 @@ class Pager extends Emitter {
6966
}
7067

7168
render() {
72-
var $nav = $('<ul class="pagination"/>').appendTo($el);
73-
var $settings = $('<div class="grid-pagesize pagesize"/>').appendTo($el);
74-
$status = $('<div class="grid-summary"/>').appendTo($el);
69+
const { el } = this;
70+
const nav = $('<ul class="pagination"/>').appendTo(el);
71+
const settings = $('<div class="grid-pagesize pagesize"/>').appendTo(el);
72+
this.status = $('<div class="grid-summary"/>').appendTo(el);
7573

76-
$settings
74+
settings
7775
.append('<p class="pagesize-links expanded" style="display:none"><span>Show:</span><a href="#" data-pagesize="0">All</a><a href="#" data-pagesize="25">25</a><a href="#" data-pagesize="50">50</a><a href="#" data-pagesize="100">100</a></p>');
7876

79-
$settings.find("a[data-pagesize]").click((e) => {
80-
var pageSize = $(e.target).attr("data-pagesize");
81-
if (pageSize !== undefined) {
82-
setPageSize(pageSize);
77+
settings.find("a[data-pagesize]").click((e) => {
78+
var pageSize = $(e.target).data("pagesize");
79+
if (typeof pageSize !== 'undefined') {
80+
this.setPageSize(pageSize);
8381
}
8482
});
8583

@@ -112,27 +110,28 @@ class Pager extends Emitter {
112110
}
113111

114112

115-
updatePager(pager) {
116-
var state = getState();
113+
updatePager(pagination) {
114+
var state = this.getState();
115+
const { el, status } = this;
117116

118-
$el.find(".pager-pagination .page-link").removeClass("disabled");
117+
el.find(".pager-pagination .page-link").removeClass("disabled");
119118
if (!state.canGotoFirst) {
120-
$el.find(".page-icon-first").addClass("disabled");
119+
el.find(".page-icon-first").addClass("disabled");
121120
}
122121
if (!state.canGotoLast) {
123-
$el.find(".page-icon-last").addClass("disabled");
122+
el.find(".page-icon-last").addClass("disabled");
124123
}
125124
if (!state.canGotoNext) {
126-
$el.find(".page-icon-next").addClass("disabled");
125+
el.find(".page-icon-next").addClass("disabled");
127126
}
128127
if (!state.canGotoPrev) {
129-
$el.find(".page-icon-prev").addClass("disabled");
128+
el.find(".page-icon-prev").addClass("disabled");
130129
}
131130

132-
if (pager.pageSize === 0) {
133-
$status.text("Showing all " + pager.totalCount + " rows");
131+
if (pagination.pageSize === 0) {
132+
status.text("Showing all " + pagination.totalCount + " rows");
134133
} else {
135-
$status.text("Showing page " + (pager.page + 1) + " of " + pager.totalPages);
134+
status.text("Showing page " + (pagination.page + 1) + " of " + pagination.totalPages);
136135
}
137136
}
138137
}

0 commit comments

Comments
 (0)