json-object-editor 0.10.654 → 0.10.660

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.
@@ -168,6 +168,27 @@ function JsonObjectEditor(specs){
168
168
  }});
169
169
  }
170
170
 
171
+ };
172
+ this.uploaderSetFileRole = function(uploader_id, filename, role){
173
+ try{
174
+ var joe_uploader = self.uploaders && self.uploaders[uploader_id];
175
+ if (!joe_uploader || !Array.isArray(joe_uploader.files)) { return; }
176
+ var file = joe_uploader.files.where({filename:filename})[0];
177
+ if (!file) { return; }
178
+ if (role) {
179
+ file.file_role = role;
180
+ } else {
181
+ delete file.file_role;
182
+ }
183
+ if (joe_uploader.preview) {
184
+ $(joe_uploader.preview).html(_renderUploaderFilePreviews(joe_uploader.files, joe_uploader.cuid));
185
+ }
186
+ if (typeof self.updateObject === 'function') {
187
+ self.updateObject(null, null, true);
188
+ }
189
+ }catch(e){
190
+ console.warn('uploaderSetFileRole error', e && e.message || e);
191
+ }
171
192
  };
172
193
  window._joes.push(this);
173
194
 
@@ -5329,6 +5350,19 @@ this.renderHTMLContent = function(specs){
5329
5350
  if(files && !$c.isArray(files)){
5330
5351
  files = [files];
5331
5352
  }
5353
+
5354
+ // Register uploader object (including optional file_roles) BEFORE we render
5355
+ // previews so that _renderUploaderFilePreviews can access role metadata.
5356
+ var uploader_obj = {
5357
+ cuid: uploader_id,
5358
+ prop: prop.name,
5359
+ files: files,
5360
+ max: prop.max || 0,
5361
+ // Optional file role configuration from schema (e.g. [{value,label,default}])
5362
+ roles: prop.file_roles || []
5363
+ };
5364
+ self.uploaders[uploader_id] = uploader_obj;
5365
+
5332
5366
  if(prop.field && self.current.object[prop.field]){
5333
5367
  var kfield = self.getField(prop.field);
5334
5368
  var preview = self.current.object[prop.field]
@@ -5356,13 +5390,6 @@ this.renderHTMLContent = function(specs){
5356
5390
  ;
5357
5391
  //var idprop = prop.idprop || '_id';
5358
5392
  //html+= __clearDiv__;
5359
- var uploader_obj = {
5360
- cuid:uploader_id,
5361
- prop:prop.name,
5362
- files:files,
5363
- max:prop.max || 0
5364
- }
5365
- self.uploaders[uploader_id] = uploader_obj;
5366
5393
  return html;
5367
5394
  };
5368
5395
  function _removeUploaderFile(id,filename){
@@ -5379,8 +5406,9 @@ this.renderHTMLContent = function(specs){
5379
5406
  var alink ="<a href='${url}${base64}' class='file-link' target='_blank'></a>";
5380
5407
  var delete_btn = '<joe-uploader-file-delete-btn class="svg-shadow" onclick="_joe.Fields.uploader.remove(\''+cuid+'\',\'${filename}\');">'+self.SVG.icon.close+'</joe-uploader-delete-btn>';
5381
5408
  var label = '';
5382
-
5383
-
5409
+ var uploader = self.uploaders && self.uploaders[cuid];
5410
+ var roles = uploader && uploader.roles;
5411
+
5384
5412
  files.map(function(file){
5385
5413
  var filesize = '<joe-uploader-file-label>${filename}</joe-uploader-file-label>';
5386
5414
  if(file.size){
@@ -5409,16 +5437,32 @@ this.renderHTMLContent = function(specs){
5409
5437
  label += '<joe-uploader-file-oaid >'+file.openai_file_id+'</joe-uploader-file-oaid>';
5410
5438
  }
5411
5439
 
5440
+ // Optional file role selector when roles are configured on this uploader
5441
+ var roleSelect = '';
5442
+ if (roles && roles.length) {
5443
+ var currentRole = file.file_role || '';
5444
+ var safeFilename = String(file.filename || '').replace(/'/g, "\\'");
5445
+ var optsHtml = '<option value=""></option>';
5446
+ roles.forEach(function(r){
5447
+ if (!r || !r.value) { return; }
5448
+ var lbl = r.label || r.value;
5449
+ var sel = (currentRole === r.value) ? ' selected' : '';
5450
+ optsHtml += '<option value="'+r.value.replace(/\"/g,'&quot;')+'"'+sel+'>'+lbl.replace(/</g,'&lt;').replace(/>/g,'&gt;')+'</option>';
5451
+ });
5452
+ var onchange = "_joe.uploaderSetFileRole('"+cuid+"','"+safeFilename+"', this.value)";
5453
+ roleSelect = '<div class=\"joe-uploader-file-role\"><select onchange=\"'+onchange+'\">'+optsHtml+'</select></div>';
5454
+ }
5455
+
5412
5456
  if((file.type && file.type.contains('image')) || (!file.type && (file.url||file.base64).split('.').contains(['jpg','jpeg','png','gif','svg']))){
5413
- jup_template = '<joe-uploader-file class="'+(file.uploaded && 'uploaded'||'')+'" style="background-image:url(${url}${base64})">'+alink+label+filesize+delete_btn+'</joe-uploader-file>';
5457
+ jup_template = '<joe-uploader-file class="'+(file.uploaded && 'uploaded'||'')+'" style="background-image:url(${url}${base64})">'+alink+label+roleSelect+filesize+delete_btn+'</joe-uploader-file>';
5414
5458
  }else if (docTypes.includes((file.url || file.base64).split('.').pop())) {
5415
5459
  jup_template = '<joe-uploader-file class="'+(file.uploaded && 'uploaded'||'')+'">'+
5416
5460
  '<joe-uploader-file-extension >.'+(file.type.split('/')[1] || 'docx')+'</joe-uploader-file-extension>'+
5417
- alink+label+filesize+delete_btn+'</joe-uploader-file>';
5461
+ alink+label+roleSelect+filesize+delete_btn+'</joe-uploader-file>';
5418
5462
  }else{
5419
5463
  jup_template = '<joe-uploader-file class="'+(file.uploaded && 'uploaded'||'')+'">'+
5420
5464
  '<joe-uploader-file-extension >.'+(file.type.split('/')[1] || '???')+'</joe-uploader-file-extension>'+
5421
- alink+label+filesize+delete_btn+'</joe-uploader-file>';
5465
+ alink+label+roleSelect+filesize+delete_btn+'</joe-uploader-file>';
5422
5466
  }
5423
5467
  // Build optional OpenAI retry/upload button
5424
5468
  var openaiBtn = '';