[TIC-Web] source clean up
[archive/20170607/tools/tic.git] / public / src / js / page / job.js
1 define([
2     'jquery',
3     'lodash',
4     'js/util',
5     'js/logger',
6     '../model/JobModel',
7     '../model/JobPagingModel',
8     '../widget/JobPaging',
9     '../widget/JobTableItem',
10     '../widget/JobTableEmptyItem',
11     '../widget/JobLog'
12 ], function (
13     $,
14     _,
15     Util,
16     Logger,
17     JobModel,
18     JobPagingModel,
19     JobPaging,
20     JobTableItem,
21     JobTableEmptyItem,
22     JobLog
23 ) {
24     'use strict';
25
26     var logger = Logger('job.js');
27
28     // connected socket object
29     var client;
30
31     // config
32     var AppConfig;
33
34     // the list for the job
35     var ModelJobList = [];
36
37     // the paging model for the table of job
38     var ModelJobPaging;
39
40     // const
41     var JOB_STATUS_DONE = 'DONE';
42     var JOB_STATUS_FAILED = 'FAILED';
43
44     function gotoPageNum(pageNum) {
45         logger.info('gotoPageNum : ' + pageNum);
46         _update(pageNum);
47     }
48
49     function _update(pageNum) {
50         ModelJobList = [];
51         ModelJobPaging;
52
53         function _updateView(arrJobs) {
54             return new Promise(function (resolve, reject) {
55                 logger.info('_updateView');
56                 var targetTableBody = $('#tic-job-table > tbody');
57                 targetTableBody.empty();
58
59                 if (arrJobs.length <= 0) {
60                     targetTableBody.append(new JobTableEmptyItem().getRow());
61                 } else {
62                     // when not empty
63                     _.forEach(arrJobs, function (value, index) {
64                         targetTableBody.append(new JobTableItem(value, index).getRow());
65                     });
66                 }
67             });
68         }
69
70         function _updateDataModel(result) {
71             return new Promise(function (resolve, reject) {
72                 logger.info('_updateDataModel');
73
74                 // model
75                 _.forEach(result, function (jobItem) {
76                     var item = new JobModel(jobItem);
77                     ModelJobList.push(item);
78                 });
79
80                 resolve(ModelJobList);
81             });
82         }
83
84         function _getAllListItem() {
85             var msgData = {
86                 pageNum: pageNum
87             };
88             logger.info('_getAllListItem');
89             return Util.POST(AppConfig.EVENT.JOB.JOB_GET_ALL_LISTITEM, msgData);
90         }
91
92         function _updatePagingView(dataObj) {
93             return new Promise(function (resolve, reject) {
94                 logger.info('_updatePagingView');
95
96                 var targetPaging = $('#tic-job-list-pagination');
97                 targetPaging.empty();
98
99                 // create the element
100                 targetPaging.append(new JobPaging(dataObj).getTemplate());
101
102                 // bind a events
103                 $('#tic-job-section .pagination > li > a').on('click', function(e) {
104                     var pagenum;
105
106                     e.preventDefault();
107
108                     pagenum = $(this).data('pagenum');
109
110                     if (pagenum !== 0) {
111                         gotoPageNum(pagenum);
112                     }
113                     return false;
114                 });
115
116                 resolve();
117             });
118         }
119
120         function _updatePagingModel (result) {
121             return new Promise(function (resolve, reject) {
122                 logger.info('_updatePagingModel');
123
124                 var totalCount, pagingCount;
125
126                 // initialize
127                 totalCount = 0;
128                 $('#tic-job-list-pagination').empty();
129
130                 // set totalCount
131                 totalCount = Number(result[0].total_count);
132
133                 if (_.isEmpty(ModelJobPaging)) {
134                     ModelJobPaging = new JobPagingModel({
135                         totalCount: totalCount,
136                         currentPageNum: pageNum 
137                     })
138                 }
139
140                 resolve(ModelJobPaging);
141             });
142         }
143
144         function _getTotalCount() {
145             logger.info('_getTotalCount');
146             return Util.POST(AppConfig.EVENT.JOB.JOB_GET_ALL_COUNT);
147         }
148
149         return _getTotalCount()
150         .then(_updatePagingModel)
151         .then(_updatePagingView)
152         .then(_getAllListItem)
153         .then(_updateDataModel)
154         .then(_updateView);
155     }
156
157     function updateList(selectedPageNum) {
158         logger.info('updateList');
159         // when first,
160         // the default value of pageNum is 1.
161         var pageNum = selectedPageNum || 1;
162         gotoPageNum(pageNum);
163     }
164
165     /**
166      * @name doCreateAnImage
167      * @param paramObj {
168      *      jobId: '1',
169      *      pathKsFile: '/var/tmp/tic-web/1/default.ks',
170      *      pathOutput: '/var/tmp/tic-web/1/'
171      * }
172      */
173     function doCreateAnImage(paramObj) {
174         var msgData;
175
176         logger.info('doCreateAnImage');
177
178         msgData = {
179             jobId: paramObj.jobId,
180             pathKsFile: paramObj.pathKsFile,
181             pathOutput: paramObj.pathOutput
182         };
183
184         client.emit(AppConfig.EVENT.SOCKET.FS_IMAGE_ADD_FROM, msgData);
185
186         updateList(ModelJobPaging.getCurrentPoint());
187     }
188
189     function _initSocket(socket) {
190         // assign
191         client = socket;
192
193         /**
194          * whether can using mic or not
195          *
196          * AppConfig.EVENT.SOCKET.MIC_AVAILABLE_FROM = 'ws/mic/available/from'
197          * AppConfig.EVENT.SOCKET.MIC_AVAILABLE_TO = 'ws/mic/available/to'
198          */
199         client.emit(AppConfig.EVENT.SOCKET.MIC_AVAILABLE_FROM);
200         client.on(AppConfig.EVENT.SOCKET.MIC_AVAILABLE_TO, function (data) {
201             $('#tic-package-create').prop('disabled', !data);
202         });
203
204         /**
205          * when running on mic
206          *
207          * AppConfig.EVENT.SOCKET.FS_IMAGE_ADD_TO = 'ws/fs/image/add/to'
208          */
209         client.on(AppConfig.EVENT.SOCKET.FS_IMAGE_ADD_TO, function (dataObj) {
210             return new JobLog(dataObj);
211         });
212
213         /**
214          * when finish
215          *
216          * AppConfig.EVENT.SOCKET.FS_IMAGE_ADD_FINISH = 'ws/fs/image/add/finish'
217          */
218         client.on(AppConfig.EVENT.SOCKET.FS_IMAGE_ADD_FINISH, function (dataObj) {
219             var jobId, logItem, msgObj;
220
221             // jobId
222             jobId = dataObj.jobId;
223
224             // log
225             logItem = new JobLog(dataObj);
226
227             // log
228             logItem = new JobLog({
229                 msg: 'Image created successfully.',
230                 jobId: jobId
231             });
232
233             logger.info(AppConfig.EVENT.SOCKET.FS_IMAGE_ADD_FINISH);
234
235             // button enabled
236             $('#tic-package-create').prop('disabled', false);
237
238             function onError(err) {
239                 if (err) {
240                     logger.error(err);
241                     throw err;
242                 }
243             }
244
245             function updateJobListView() {
246                 // upate the list of jobs
247                 updateList(ModelJobPaging.getCurrentPoint());
248
249                 // notification popup
250                 Util.showInfoDialog('Image created successfully. The #ID is ' + jobId + '.');
251             }
252
253             function updateJobInfo(data) {
254                 console.log(data);
255                 // update the status and image_id
256                 var msgObj = {
257                     job_status: JOB_STATUS_DONE,
258                     image_id: data.image_id
259                 };
260                 return Util.POST(AppConfig.EVENT.JOB.JOB_EDIT_ONE + jobId, msgObj)
261             }
262
263             function addAnImage() {
264                 /**
265                  * FIXME
266                  */
267                 var msgObj = {
268                     image_name: 'image.tar.gz',
269                     image_type: 'external',
270                     image_size: '92164532'
271                 };
272                 return Util.POST(AppConfig.EVENT.IMAGE.IMAGE_ADD_ONE, msgObj)
273             }
274
275             function getAnImageInfo() {
276                 return new Promise(function (resolve, reject) {
277                     /**
278                      * TODO
279                      *
280                      * Using NGINX
281                      */
282                     resolve();
283                 });
284             }
285
286             return getAnImageInfo()
287             .then(addAnImage)
288             .then(updateJobInfo)
289             .then(updateJobListView)
290             .catch(onError);
291         });
292
293         /**
294          * when failed
295          *
296          * AppConfig.EVENT.SOCKET.FS_IMAGE_ADD_FAIL = 'ws/fs/image/add/fail'
297          */
298         client.on(AppConfig.EVENT.SOCKET.FS_IMAGE_ADD_FAIL, function (dataObj) {
299             var jobId, logItem, msgObj;
300
301             // jobId
302             jobId = dataObj.jobId;
303
304             // log
305             logItem = new JobLog(dataObj);
306
307             // log
308             logItem = new JobLog({
309                 msg: 'Failed to create image.',
310                 jobId: jobId
311             });
312
313             // notification popup
314             Util.showAlertDialog('Failed to create image. The #ID is ' + jobId + '.');
315
316             // button enabled
317             $('#tic-package-create').prop('disabled', false);
318
319             // update the status
320             msgObj = {
321                 job_status: JOB_STATUS_FAILED
322             };
323             Util.POST(AppConfig.EVENT.JOB.JOB_EDIT_ONE + jobId, msgObj)
324             .then(function () {
325                 // upate the list of jobs
326                 updateList(ModelJobPaging.getCurrentPoint());
327             });
328         });
329     }
330
331     function init() {
332         logger.info('init');
333
334         // set the config information for the app
335         Util.getAppConfig().then(function (data) {
336             AppConfig = data;
337             _initSocket(Util.getWebSocket());
338             updateList();
339         });
340     }
341
342     init();
343
344     return {
345         /**
346          * Update list in job page
347          * @method updateList
348          */
349         updateList: updateList,
350
351         /**
352          * Create an Image
353          * @method doCreateAnImage
354          */
355         doCreateAnImage: doCreateAnImage
356     }
357
358 });