1
- import { templates , createFragment } from "deleight/apriori" ;
2
- import { apply , parentSelector } from "deleight/appliance" ;
3
- import { set , update } from "deleight/domitory" ;
4
- import {
5
- preventDefault ,
6
- stopPropagation ,
7
- eventListener ,
8
- matchListener ,
9
- } from "deleight/eventivity" ;
10
- import { one } from "deleight/onetomany" ;
11
- import { range , items } from "deleight/generational" ;
12
-
13
- function _random ( max ) {
14
- return Math . round ( Math . random ( ) * 1000 ) % max ;
15
- }
16
- const adjectives = [
17
- "pretty" ,
18
- "large" ,
19
- "big" ,
20
- "small" ,
21
- "tall" ,
22
- "short" ,
23
- "long" ,
24
- "handsome" ,
25
- "plain" ,
26
- "quaint" ,
27
- "clean" ,
28
- "elegant" ,
29
- "easy" ,
30
- "angry" ,
31
- "crazy" ,
32
- "helpful" ,
33
- "mushy" ,
34
- "odd" ,
35
- "unsightly" ,
36
- "adorable" ,
37
- "important" ,
38
- "inexpensive" ,
39
- "cheap" ,
40
- "expensive" ,
41
- "fancy" ,
42
- ] ;
43
- const colours = [
44
- "red" ,
45
- "yellow" ,
46
- "blue" ,
47
- "green" ,
48
- "pink" ,
49
- "brown" ,
50
- "purple" ,
51
- "brown" ,
52
- "white" ,
53
- "black" ,
54
- "orange" ,
55
- ] ;
56
- const nouns = [
57
- "table" ,
58
- "chair" ,
59
- "house" ,
60
- "bbq" ,
61
- "desk" ,
62
- "car" ,
63
- "pony" ,
64
- "cookie" ,
65
- "sandwich" ,
66
- "burger" ,
67
- "pizza" ,
68
- "mouse" ,
69
- "keyboard" ,
70
- ] ;
71
-
72
- const itemTemplate = templates (
73
- `
74
- <tr>
75
- <td class='col-md-1'>\${indices[item]}</td>
76
- <td class='col-md-4'><a class='lbl'>\${data[item]}</a></td>
77
- <td class='col-md-1'>
78
- <a class='remove'>
79
- <span class='remove glyphicon glyphicon-remove' aria-hidden='true'></span>
80
- </a>
81
- </td>
82
- <td class='col-md-6'></td>
83
- </tr>
84
- ` ,
85
- [ "indices" , "data" ] ,
86
- ) ;
87
1
88
- function data ( ) {
89
- return {
90
- index : 1 ,
91
- * createIndices ( n ) {
92
- const start = this . index ;
93
- const end = ( this . index += n ) ;
94
- for ( let i = start ; i < end ; i ++ ) yield i ;
95
- } ,
96
- * createLabels ( n ) {
97
- for ( let i = 0 ; i < n ; i ++ ) {
98
- yield adjectives [ _random ( adjectives . length ) ] +
99
- " " +
100
- colours [ _random ( colours . length ) ] +
101
- " " +
102
- nouns [ _random ( nouns . length ) ] ;
103
- }
104
- } ,
105
- build ( n , context ) {
106
- context . indices . push ( ...this . createIndices ( n ) ) ;
107
- context . data . push ( ...this . createLabels ( n ) ) ;
108
- } ,
109
- create ( n , context ) {
110
- this . clear ( context ) ;
111
- this . build ( n , context ) ;
112
- } ,
113
- append ( n , context ) {
114
- this . build ( n , context ) ;
115
- } ,
116
- update ( context ) {
117
- const length = context . data . length ;
118
- for ( let i = 0 ; i < length ; i += 10 ) context . data [ i ] += " !!!" ;
119
- } ,
120
- clear ( context ) {
121
- context . data = [ ] ;
122
- context . indices = [ ] ;
123
- } ,
124
- swap ( context ) {
125
- if ( context . data . length >= 999 ) {
126
- [ context . data [ 1 ] , context . data [ 998 ] ] = [
127
- context . data [ 998 ] ,
128
- context . data [ 1 ] ,
129
- ] ;
130
- [ context . indices [ 1 ] , context . indices [ 998 ] ] = [
131
- context . indices [ 998 ] ,
132
- context . indices [ 1 ] ,
133
- ] ;
134
- }
135
- } ,
136
- remove ( element , context ) {
137
- const index = Array . from ( element . parentNode . children ) . indexOf ( element ) ;
138
- context . indices . splice ( index , 1 ) ;
139
- context . data . splice ( index , 1 ) ;
140
- } ,
141
- } ;
142
- }
143
-
144
- function view ( table ) {
145
- return {
146
- create ( n , context ) {
147
- this . clear ( ) ;
148
- this . append ( n , context ) ;
149
- } ,
150
- append ( n , context ) {
151
- const length = context . data . length ;
152
- const renderedItems = [ ...itemTemplate (
153
- range ( length - n , length ) ,
154
- context . indices ,
155
- context . data ,
156
- ) ] ;
157
- table . append ( createFragment ( renderedItems . join ( '' ) ) ) ;
158
- } ,
159
- update ( context ) {
160
- apply (
161
- {
162
- "a.lbl" : ( ...labels ) => {
163
- const indices = [ ...range ( 0 , context . data . length , 10 ) ] ;
164
- set ( items ( labels , indices ) , {
165
- textContent : items ( context . data , indices ) ,
166
- } ) ;
167
- } ,
168
- } ,
169
- table ,
170
- ) ;
171
- } ,
172
- clear ( context ) {
173
- table . innerHTML = "" ;
174
- } ,
175
- swap ( context ) {
176
- if ( table . children . length >= 999 ) {
177
- update (
178
- [ ...items ( table . children , [ 1 , 998 ] ) ] ,
179
- [ ...items ( table . children , [ 998 , 1 ] ) ] ,
180
- ) ;
181
- }
182
- } ,
183
- remove ( element , context ) {
184
- table . removeChild ( element ) ;
185
- } ,
186
- } ;
187
- }
188
-
189
- apply ( {
190
- tbody : ( table ) => {
191
- const component = one ( [ data ( ) , view ( table ) ] , false , [ { } ] ) ;
2
+ import { ArrayActions , call , ChildrenActions } from 'deleight/apption' ;
3
+ import { apply , parentSelector } from "deleight/appliance" ;
192
4
193
- let selected ;
194
- function select ( node ) {
195
- if ( node === selected ) {
196
- selected . className = selected . className ? "" : "danger" ;
197
- } else {
198
- if ( selected ) selected . className = "" ;
199
- node . className = "danger" ;
200
- selected = node ;
201
- }
5
+ const _random = ( ( max ) => Math . round ( Math . random ( ) * 1000 ) % max ) , click = ( handler => element => element . onclick = handler ) ;
6
+ const adjectives = [ "pretty" , "large" , "big" , "small" , "tall" , "short" , "long" , "handsome" , "plain" , "quaint" , "clean" , "elegant" , "easy" , "angry" , "crazy" , "helpful" , "mushy" , "odd" , "unsightly" , "adorable" , "important" , "inexpensive" , "cheap" , "expensive" , "fancy" ] ;
7
+ const colours = [ "red" , "yellow" , "blue" , "green" , "pink" , "brown" , "purple" , "brown" , "white" , "black" , "orange" ] ;
8
+ const nouns = [ "table" , "chair" , "house" , "bbq" , "desk" , "car" , "pony" , "cookie" , "sandwich" , "burger" , "pizza" , "mouse" , "keyboard" ] ;
9
+
10
+ const array = [ ] , tbody = document . querySelector ( 'tbody' ) , row = document . querySelector ( 'template' ) . content . firstElementChild ;
11
+ const rowId = row . querySelector ( 'td' ) , rowlbl = row . querySelector ( 'a' ) ;
12
+ let id = 1 , selected = null ;
13
+
14
+ const AppChildrenActions = class extends ChildrenActions {
15
+ render ( item ) {
16
+ return ( rowId . firstChild . nodeValue = item . id ) && ( rowlbl . firstChild . nodeValue = item . lbl ) && row . cloneNode ( true ) ;
17
+ } update ( value = ' !!!' ) {
18
+ for ( let i = 0 ; i < array . length ; i += 10 )
19
+ this . element . children [ i ] . querySelector ( 'a' ) . firstChild . nodeValue = array [ i ] . lbl += value ;
202
20
}
21
+ } , actions = [ new ArrayActions ( array ) , new AppChildrenActions ( tbody ) ] ;
203
22
204
- const removeListener = ( e ) => {
205
- component . remove ( [ parentSelector ( e . target , "tr" ) ] ) ;
206
- } ;
207
-
208
- table . addEventListener (
209
- "click" ,
210
- matchListener ( {
211
- "a.lbl" : ( e ) => select ( e . target . parentNode . parentNode ) ,
212
- "span.remove" : eventListener (
213
- [ removeListener , preventDefault , stopPropagation ] ,
214
- { } ,
215
- ) ,
216
- } ) ,
217
- ) ;
218
-
219
- const btnListener = ( fn ) => ( btn ) => btn . addEventListener ( "click" , fn ) ;
220
-
221
- apply ( {
222
- "#run" : btnListener ( ( ) => component . create ( [ 1000 ] ) ) ,
223
- "#runlots" : btnListener ( ( ) => component . create ( [ 10000 ] ) ) ,
224
- "#add" : btnListener ( ( ) => component . append ( [ 1000 ] ) ) ,
225
- "#update" : btnListener ( ( ) => component . update ( ) ) ,
226
- "#clear" : btnListener ( ( ) => component . clear ( ) ) ,
227
- "#swaprows" : btnListener ( ( ) => component . swap ( ) ) ,
228
- } ) ;
229
- } ,
230
- } ) ;
23
+ function * createItems ( n ) {
24
+ for ( let i = 0 ; i < n ; i ++ , id ++ )
25
+ yield { id, lbl : `${ adjectives [ _random ( adjectives . length ) ] } ${ colours [ _random ( colours . length ) ] } ${ nouns [ _random ( nouns . length ) ] } ` }
26
+ }
27
+ function run ( n = 1000 ) { call ( { clear : actions , push : actions } , ...createItems ( n ) ) }
28
+ apply ( {
29
+ "#run" : click ( ( ) => run ( 1000 ) ) , "#runlots" : click ( ( ) => run ( 10000 ) ) ,
30
+ "#add" : click ( ( ) => call ( { push : actions } , ...createItems ( 1000 ) ) ) ,
31
+ "#update" : click ( ( ) => call ( { update : [ actions [ 1 ] ] } ) ) , "#clear" : click ( ( ) => call ( { clear : actions } ) ) ,
32
+ "#swaprows" : click ( ( ) => call ( { swap : actions } , 1 , 998 ) ) ,
33
+ tbody : click ( ( e ) => {
34
+ const row = parentSelector ( e . target , 'tr' ) ; if ( ! row ) return ;
35
+ const index = Array . prototype . indexOf . call ( tbody . children , row ) ;
36
+ if ( e . target . tagName === 'A' ) {
37
+ if ( selected ) selected . className = '' ;
38
+ selected = ( row === selected ) ? null : row ;
39
+ if ( selected ) selected . className = 'danger' ;
40
+ } else if ( e . target . tagName === 'SPAN' ) call ( { splice : actions } , index , 1 ) ;
41
+ } )
42
+ } , document . body , true , true ) ;
0 commit comments