e78ca44c411f039f2c1b1cca24bdbdb893bef9a0
[archive/20170607/tools/tic.git] / public / src / js / page / image.js
1 define([
2     'jquery',
3     'lodash',
4     'js/util',
5     'js/logger'
6 ], function (
7     $,
8     _,
9     Util,
10     Logger
11 ) {
12     'use strict';
13
14     var logger = Logger('image.js');
15
16     var AppConfig = null;
17
18     // connected socket object
19     var client;
20
21     // the list of checked pakages
22     var checkedPackagesList;
23
24     // template for the URL
25     var URL_EXPORTS = '<%= url %>/exports';
26
27     // template
28     var IMAGE_LOG = '<p><%= log %></p>';
29     var IMAGE_ITEM = '<li class="list-group-item image-item">' +
30                         '<p class="image-list-name" title="<%= fileName %>"><%= fileName %></p>' +
31                         '<p class="image-list-detail">Size: <%= fileSize %></p>' +
32                         '<p class="image-list-detail">Updated: <%= fileTime %></p>' +
33                         '<a class="image-list-btndownload" href="<%= hrefPath %>" date-name="<%= fileName %>" download="download">Download</a>' +
34                      '</li>';
35
36     function _initSocket(socket) {
37         client = socket;
38
39         client.emit('ws/mic/available/from');
40         client.on('ws/mic/available/to', function (data) {
41             $('#tic-image-create').prop('disabled', !data);
42         });
43
44         client.on('ws/fs/image/list/to', function (data) {
45             var $imageList = $('#tic-image-list').empty();
46             _.forEach(data.list, function (file) {
47                  var imageItem = _.template(IMAGE_ITEM)({
48                     fileName: file.name,
49                     fileSize: Util.bytesToSize(file.size),
50                     fileTime: new Date(file.birthtime).toLocaleString(),
51                     hrefPath: '/api/fs/download/' + file.name
52                 });
53                 $imageList.append(imageItem);
54             });
55         });
56
57         client.on('ws/fs/image/add/to', function (data) {
58             var logItem = _.template(IMAGE_LOG)({
59                 log: data
60             });
61             var $imageNewLog = $('#tic-image-new-log').append(logItem);
62             $imageNewLog.animate({ scrollTop : $imageNewLog.height() }, 'slow');
63         });
64
65         /**
66          * TODO
67          *
68          * manage the logs for file.
69          */
70         // when finish
71         client.on('ws/fs/image/add/finish', function (data) {
72             var logItem = _.template(IMAGE_LOG)({
73                 log: data
74             });
75             var $imageNewLog = $('#tic-image-new-log').append(logItem);
76             $imageNewLog.animate({ scrollTop : $imageNewLog.height() }, 'slow');
77
78             // button enabled
79             $('#tic-image-create').prop('disabled', false);
80             $('#tic-image-cancel').toggleClass('hidden', true);
81
82             // upate the list of images
83             updateList();
84         });
85     }
86
87     function updateList() {
88         var msgData = {
89             path: AppConfig.MIC.OUT_DIR
90         };
91         client.emit('ws/fs/image/list/from', msgData);
92     }
93
94     function updateSummary() {
95         var pacakgeImageSize = $('#tic-image-image-size').empty();
96         var packageImageInstalledSize = $('#tic-image-image-installed-size').empty();
97         var packageListBadge = $('#tic-image-package-list-badge').empty();
98         var packageList = $('#tic-image-package-list').empty();
99
100         checkedPackagesList = require('js/page/package').getCheckedPackages();
101         var count = _.size(checkedPackagesList);
102         var imageSize = _.sumBy(checkedPackagesList, function getImageSize(item) {
103             return _.toNumber(item.size);
104         });
105         var imageInstalledSize = _.sumBy(checkedPackagesList, function getImageInstalled(item) {
106             return _.toNumber(item.installed);
107         });
108
109         if (_.isNumber(imageSize)) {
110             pacakgeImageSize.html(Util.bytesToSize(imageSize));
111         }
112         if (_.isNumber(imageInstalledSize)) {
113             packageImageInstalledSize.html(Util.bytesToSize(imageInstalledSize));
114         }
115         if (_.isNumber(count)) {
116             packageListBadge.html(count);
117         }
118         if (!_.isEmpty(checkedPackagesList)) {
119             packageList.html(_.orderBy(_.map(checkedPackagesList, 'text')).join('<br>'));
120         }
121
122         $('#tic-image-create').prop('disabled', count === 0);
123         client.emit('ws/mic/available/from');
124     }
125
126     function confirmCreateImage() {
127         $('#tic-image-create').prop('disabled', true);
128
129         // when packages are checked nothing
130         if (_.isEmpty(checkedPackagesList)) {
131             return;
132         }
133
134         function createImage(pathKsFile) {
135             $('#tic-image-new-log').empty();
136
137             /**
138              * TODO - checks the msgData
139              */
140             var msgData = {
141                 pathKsFile: pathKsFile,
142                 pathOutput: AppConfig.MIC.OUT_DIR
143             };
144             client.emit('ws/fs/image/add/from', msgData);
145         }
146
147         function getExportsUrl() {
148             return _.template(URL_EXPORTS)({
149                 url: location.origin
150             });
151         }
152
153         function getKickstartRecipeFile() {
154              var msgData = {
155                 recipe: {
156                     name: 'default'
157                 },
158                 packages: _.map(checkedPackagesList, 'name'),
159                 output: AppConfig.TIC_CORE.KS_OUT_DIR
160             };
161             return Util.POST(getExportsUrl(), msgData)
162             .then(function (result) {
163                 return result.data
164             });
165         }
166
167         // confirm
168         Util.showConfirmDialog('Are you sure want to create the image?')
169         .then(function () {
170             $('#tic-image-cancel').toggleClass('hidden', false);
171             getKickstartRecipeFile()
172             .then(createImage)
173             .catch(function (err) {
174                 logger.error(err);
175                 Util.showAlertDialog('Failed to create a image.<br>Please check the ks file.');
176                 $('#tic-image-create').prop('disabled', false);
177                 $('#tic-image-cancel').toggleClass('hidden', true);
178             });
179         })
180         .catch(function () {
181             logger.info('Image creation was canceled.');
182             $('#tic-image-create').prop('disabled', false);
183             $('#tic-image-cancel').toggleClass('hidden', true);
184         });
185     }
186
187     /**
188      * Initiation for the all widgets
189      */
190     function _initWidgets() {
191         // button
192         $('#tic-image-create').prop('disabled', true).on('click', confirmCreateImage);
193
194         function _imageCreateCancel() {
195             client.emit('ws/fs/image/add/kill');
196             $(this).toggleClass('hidden', true);
197         }
198         $('#tic-image-cancel').on('click', _imageCreateCancel);
199     }
200
201     function init() {
202         logger.info('init');
203
204         _initWidgets();
205         _initSocket(Util.getWebSocket());
206
207         Util.getAppConfig()
208         .then(function (data) {
209             AppConfig = data;
210             updateList();
211         });
212     }
213
214     init();
215
216     return {
217         /**
218          * Update summary in image page
219          * @method updateSummary
220          */
221         updateSummary: updateSummary,
222
223         /**
224          * Update list in image page
225          * @method updateList
226          */
227         updateList: updateList
228     }
229
230 });