jsharmony 1.40.14 → 1.41.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AppSrv.File.js +22 -3
- package/AppSrv.ModelForm.js +7 -2
- package/clientjs/XAPI.Grid.js +2 -0
- package/jsHarmony.LoadModels.js +1 -1
- package/jsHarmony.css +1 -0
- package/jsHarmonyConfig.js +2 -2
- package/package.json +3 -1
- package/public/js/jsHarmony.js +1 -1
- package/test/images.js +11 -7
- package/test/models/src/images/base/tree.webp +0 -0
- package/views/jsh_client_controls.ejs +1 -1
package/AppSrv.File.js
CHANGED
|
@@ -334,6 +334,12 @@ exports.ProcessFileParams = function (req, res, model, P, fieldlist, sql_extfiel
|
|
|
334
334
|
if (field.controlparams._data_file_has_extension) tdest += '%%%EXT%%%';
|
|
335
335
|
fileops.push({ op: 'move', src: '', dest: tdest });
|
|
336
336
|
}
|
|
337
|
+
//Delete cached files in main operation
|
|
338
|
+
if (field.controlparams.cache) for (var cname in field.controlparams.cache) {
|
|
339
|
+
var cdest = jsh.Config.datadir + field.controlparams.data_folder + '/' + (field.controlparams.data_file_prefix||field.name) + '_' + cname + '_%%%KEY%%%';
|
|
340
|
+
if (field.controlparams._data_file_has_extension) cdest += '%%%EXT%%%';
|
|
341
|
+
fileops.push({ op: 'move', src: '', dest: cdest });
|
|
342
|
+
}
|
|
337
343
|
filecallback(null);
|
|
338
344
|
}
|
|
339
345
|
else {
|
|
@@ -378,6 +384,12 @@ exports.ProcessFileParams = function (req, res, model, P, fieldlist, sql_extfiel
|
|
|
378
384
|
fileops.push({ op: 'move', src: '', dest: tdest });
|
|
379
385
|
}
|
|
380
386
|
}
|
|
387
|
+
//Clear cached files
|
|
388
|
+
if (field.controlparams.cache) for (var cname in field.controlparams.cache) {
|
|
389
|
+
var cdest = jsh.Config.datadir + field.controlparams.data_folder + '/' + (field.controlparams.data_file_prefix||field.name) + '_' + cname + '_%%%KEY%%%';
|
|
390
|
+
if (field.controlparams._data_file_has_extension) cdest += '.' + (field.controlparams.cache[cname].format || '');
|
|
391
|
+
fileops.push({ op: 'move', src: '', dest: cdest });
|
|
392
|
+
}
|
|
381
393
|
//Resize Image, if applicable
|
|
382
394
|
if (field.controlparams.image && _.includes(jsh.Config.supported_images, file_ext)) {
|
|
383
395
|
filedest = Helper.ReplaceAll(filedest, '%%%EXT%%%', '.' + field.controlparams.image.format);
|
|
@@ -413,7 +425,7 @@ exports.ProcessFileOperations = function (keyval, fileops, rslt, stats, callback
|
|
|
413
425
|
function(filehandlercb){
|
|
414
426
|
//Get src file extension
|
|
415
427
|
HelperFS.getExtFileName(filesrc, function(err, filename){
|
|
416
|
-
if(err) return
|
|
428
|
+
if(err) return opcallback(Helper.NewError('File not found', -33));
|
|
417
429
|
filesrc = filename;
|
|
418
430
|
return filehandlercb();
|
|
419
431
|
});
|
|
@@ -421,7 +433,10 @@ exports.ProcessFileOperations = function (keyval, fileops, rslt, stats, callback
|
|
|
421
433
|
function(filehandlercb){
|
|
422
434
|
//Get dest file extension
|
|
423
435
|
HelperFS.getExtFileName(filedest, function(err, filename){
|
|
424
|
-
if(err)
|
|
436
|
+
if(err){
|
|
437
|
+
if((fileop.op == 'move') && !filesrc) return opcallback(null);
|
|
438
|
+
return opcallback(Helper.NewError('File not found', -33));
|
|
439
|
+
}
|
|
425
440
|
filedest = filename;
|
|
426
441
|
return filehandlercb();
|
|
427
442
|
});
|
|
@@ -445,6 +460,7 @@ exports.ProcessFileOperations = function (keyval, fileops, rslt, stats, callback
|
|
|
445
460
|
else return opcallback(null);
|
|
446
461
|
});
|
|
447
462
|
}, function (fileerr) {
|
|
463
|
+
if(fileerr && (fileerr.number == -33)) return callback(fileerr);
|
|
448
464
|
if ((fileerr != null) && ('code' in fileerr) && (fileerr.code == 'ENOENT')) { /* Ignore this error */ }
|
|
449
465
|
else if (fileerr != null) {
|
|
450
466
|
jsh.Log.error(fileerr);
|
|
@@ -458,7 +474,10 @@ exports.ProcessFileOperationsDone = function (fileops, callback) {
|
|
|
458
474
|
async.eachSeries(fileops, function (fileop, opcallback) {
|
|
459
475
|
if ((fileop.op == 'move') || (fileop.op == 'delete_on_complete')) {
|
|
460
476
|
if (fileop.src == '') return opcallback(null);
|
|
461
|
-
HelperFS.
|
|
477
|
+
HelperFS.getExtFileName(fileop.src, function(err, filename){
|
|
478
|
+
if(err) return opcallback(null);
|
|
479
|
+
HelperFS.unlink(filename, function (err) { opcallback(null); });
|
|
480
|
+
});
|
|
462
481
|
}
|
|
463
482
|
else return opcallback(null);
|
|
464
483
|
}, function (err) { callback(null, null); });
|
package/AppSrv.ModelForm.js
CHANGED
|
@@ -649,12 +649,17 @@ exports.deleteModelForm = function (req, res, fullmodelid, Q, P, onComplete) {
|
|
|
649
649
|
_.each(filelist, function (file) {
|
|
650
650
|
var filefield = _this.getFieldByName(model.fields, file);
|
|
651
651
|
//Delete file in post-processing
|
|
652
|
-
fileops.push({ op: 'move', src: _this.jsh.Config.datadir + filefield.controlparams.data_folder + '/' + (filefield.controlparams.data_file_prefix||file) + '_' + keyval + ((filefield.controlparams._data_file_has_extension)?'%%%EXT%%%':''),
|
|
652
|
+
fileops.push({ op: 'move', src: _this.jsh.Config.datadir + filefield.controlparams.data_folder + '/' + (filefield.controlparams.data_file_prefix||file) + '_' + keyval + ((filefield.controlparams._data_file_has_extension)?'%%%EXT%%%':''), dest: '' });
|
|
653
653
|
//Delete thumbnails in post-processing
|
|
654
654
|
if (filefield.controlparams.thumbnails) for (var tname in filefield.controlparams.thumbnails) {
|
|
655
|
-
fileops.push({ op: 'move', src: _this.jsh.Config.datadir + filefield.controlparams.data_folder + '/' + (filefield.controlparams.data_file_prefix||filefield.name) + '_' + tname + '_' + keyval + ((filefield.controlparams._data_file_has_extension)?'%%%EXT%%%':''),
|
|
655
|
+
fileops.push({ op: 'move', src: _this.jsh.Config.datadir + filefield.controlparams.data_folder + '/' + (filefield.controlparams.data_file_prefix||filefield.name) + '_' + tname + '_' + keyval + ((filefield.controlparams._data_file_has_extension)?'%%%EXT%%%':''), dest: '' });
|
|
656
|
+
}
|
|
657
|
+
//Delete cache in post-processing
|
|
658
|
+
if (filefield.controlparams.cache) for (var cname in filefield.controlparams.cache) {
|
|
659
|
+
fileops.push({ op: 'move', src: _this.jsh.Config.datadir + filefield.controlparams.data_folder + '/' + (filefield.controlparams.data_file_prefix||filefield.name) + '_' + cname + '_' + keyval + ((filefield.controlparams._data_file_has_extension)?'%%%EXT%%%':''), dest: '' });
|
|
656
660
|
}
|
|
657
661
|
});
|
|
662
|
+
|
|
658
663
|
dbtasks['_POSTPROCESS'] = function (callback) {
|
|
659
664
|
_this.ProcessFileOperationsDone(fileops, callback);
|
|
660
665
|
};
|
package/clientjs/XAPI.Grid.js
CHANGED
|
@@ -227,6 +227,8 @@ exports = module.exports = function(jsh){
|
|
|
227
227
|
|
|
228
228
|
if(_.isString(col1)) col1 = col1.toUpperCase();
|
|
229
229
|
if(_.isString(col2)) col2 = col2.toUpperCase();
|
|
230
|
+
if(_.isNil(col1)) col1 = '';
|
|
231
|
+
if(_.isNil(col2)) col2 = '';
|
|
230
232
|
|
|
231
233
|
if(sortexp.dir=='^'){
|
|
232
234
|
if(col1 < col2) return -1;
|
package/jsHarmony.LoadModels.js
CHANGED
|
@@ -1961,7 +1961,7 @@ exports.ParseEntities = function () {
|
|
|
1961
1961
|
var _v_controlparams = [
|
|
1962
1962
|
'value_true', 'value_false', 'value_hidden', 'code_val', 'popupstyle', 'popupiconstyle', 'popup_copy_results', 'onpopup', 'base_readonly', 'dateformat', 'panelstyle',
|
|
1963
1963
|
'download_button', 'preview_button', 'upload_button', 'delete_button', 'data_folder', 'data_file_prefix', 'sqlparams', '_data_file_has_extension', 'show_thumbnail', 'preview_on_click', 'icon',
|
|
1964
|
-
'image', 'thumbnails', 'expand_all', 'expand_to_selected', 'onmove', 'ondrop', 'ongetnodecontent', 'drag_anchor_settings', 'item_context_menu', 'item_dropdown', 'insert_link', 'grid_save_before_update', 'update_when_blank', 'htmlarea_config', 'placeholder'
|
|
1964
|
+
'image', 'thumbnails', 'cache', 'expand_all', 'expand_to_selected', 'onmove', 'ondrop', 'ongetnodecontent', 'drag_anchor_settings', 'item_context_menu', 'item_dropdown', 'insert_link', 'grid_save_before_update', 'update_when_blank', 'htmlarea_config', 'placeholder'
|
|
1965
1965
|
];
|
|
1966
1966
|
var _v_popuplov = ['target', 'code_val', 'popupstyle', 'popupiconstyle', 'popup_copy_results', 'onpopup', 'popup_copy_results', 'onpopup', 'base_readonly'];
|
|
1967
1967
|
var _v_lov = ['sql', 'sql2', 'sqlmp', 'code', 'code2', 'code_sys', 'code2_sys', 'code_app', 'code2_app', 'schema', 'blank', 'parent', 'parents', 'datalock', 'sql_params', 'sqlselect', 'sqlselect_params', 'sqltruncate', 'always_get_full_lov', 'nodatalock', 'showcode', 'db', 'database', 'values', 'post_process'];
|
package/jsHarmony.css
CHANGED
|
@@ -229,6 +229,7 @@ BODY
|
|
|
229
229
|
<%-rootcss%> .xform_file_download .xform_file_download_button { padding-right:25px; }
|
|
230
230
|
<%-rootcss%> .xform_file_download.nodocument .xform_file_download_button { display:none; }
|
|
231
231
|
<%-rootcss%> .xform_image, .xform_image_preview { display:inline-block; }
|
|
232
|
+
<%-rootcss%> .xtbl td .xform_image_preview { vertical-align: text-top; }
|
|
232
233
|
<%-rootcss%> .xform .xform_label,
|
|
233
234
|
<%-rootcss%> .xform input,
|
|
234
235
|
<%-rootcss%> .xform select,
|
package/jsHarmonyConfig.js
CHANGED
|
@@ -155,9 +155,9 @@ function jsHarmonyConfig(config){
|
|
|
155
155
|
"validation_level": "standard"
|
|
156
156
|
};
|
|
157
157
|
//Valid file upload extensions
|
|
158
|
-
this.valid_extensions = [".jpg", ".jpeg", ".pdf", ".png", ".svg", ".tif", ".tiff", ".gif", ".mp4", ".ogv", ".webm", ".mp3", ".wav", ".avi", ".txt", ".xlsm", ".xls", ".xlsx", ".bak", ".zip", ".csv"];
|
|
158
|
+
this.valid_extensions = [".jpg", ".jpeg", ".webp", ".pdf", ".png", ".svg", ".tif", ".tiff", ".gif", ".mp4", ".ogv", ".webm", ".mp3", ".wav", ".avi", ".txt", ".xlsm", ".xls", ".xlsx", ".bak", ".zip", ".csv"];
|
|
159
159
|
//Valid image extensions
|
|
160
|
-
this.supported_images = ['.jpg','.jpeg','.gif','.png','.svg'];
|
|
160
|
+
this.supported_images = ['.jpg','.jpeg','.webp','.gif','.png','.svg'];
|
|
161
161
|
//File viewers
|
|
162
162
|
this.file_viewers = { /* '.ext': function(jsh, req, res, options, fpath, fname){ ... } */ };
|
|
163
163
|
//Time before log entries are flushed to disk
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jsharmony",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.41.0",
|
|
4
4
|
"description": "Rapid Application Development (RAD) Platform for Node.js Database Application Development",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -44,6 +44,8 @@
|
|
|
44
44
|
"express": "^4.17.1",
|
|
45
45
|
"form-data": "^2.5.0",
|
|
46
46
|
"jsharmony-db": "^1.2.0",
|
|
47
|
+
"jsharmony-image-magick": "^1.1.0",
|
|
48
|
+
"jsharmony-image-sharp": "^1.1.0",
|
|
47
49
|
"jsharmony-validate": "^1.1.5",
|
|
48
50
|
"lodash": "^4.17.19",
|
|
49
51
|
"mime": "^1.3.4",
|