@@ -6,6 +6,7 @@ import { AccessType } from '@girder/core/constants';
66import { confirm } from '@girder/core/dialog' ;
77import events from '@girder/core/events' ;
88import { localeSort } from '@girder/core/misc' ;
9+ import View from '@girder/core/views/View' ;
910
1011import JsonMetadatumEditWidgetTemplate from '@girder/core/templates/widgets/jsonMetadatumEditWidget.pug' ;
1112import JsonMetadatumViewTemplate from '@girder/core/templates/widgets/jsonMetadatumView.pug' ;
@@ -20,7 +21,21 @@ import 'bootstrap/js/dropdown';
2021import metadataWidgetTemplate from '../templates/panels/metadataWidget.pug' ;
2122import '../stylesheets/panels/metadataWidget.styl' ;
2223
23- var MetadatumWidget = Panel . extend ( {
24+ function getMetadataRecord ( item , fieldName ) {
25+ if ( item [ fieldName ] ) {
26+ return item [ fieldName ] ;
27+ }
28+ let meta = item . attributes ;
29+ fieldName . split ( '.' ) . forEach ( ( part ) => {
30+ if ( ! meta [ part ] ) {
31+ meta [ part ] = { } ;
32+ }
33+ meta = meta [ part ] ;
34+ } ) ;
35+ return meta ;
36+ }
37+
38+ var MetadatumWidget = View . extend ( {
2439 className : 'g-widget-metadata-row' ,
2540
2641 events : {
@@ -38,6 +53,7 @@ var MetadatumWidget = Panel.extend({
3853 this . parentView = settings . parentView ;
3954 this . fieldName = settings . fieldName ;
4055 this . apiPath = settings . apiPath ;
56+ this . noSave = settings . noSave ;
4157 this . onMetadataEdited = settings . onMetadataEdited ;
4258 this . onMetadataAdded = settings . onMetadataAdded ;
4359 } ,
@@ -46,8 +62,8 @@ var MetadatumWidget = Panel.extend({
4662 var newMode = this . parentView . modes [ to ] ;
4763
4864 if ( _ . has ( newMode , 'validation' ) &&
49- _ . has ( newMode . validation , 'from' ) &&
50- _ . has ( newMode . validation . from , from ) ) {
65+ _ . has ( newMode . validation , 'from' ) &&
66+ _ . has ( newMode . validation . from , from ) ) {
5167 var validate = newMode . validation . from [ from ] [ 0 ] ;
5268 var msg = newMode . validation . from [ from ] [ 1 ] ;
5369
@@ -85,6 +101,7 @@ var MetadatumWidget = Panel.extend({
85101 parentView : this ,
86102 fieldName : this . fieldName ,
87103 apiPath : this . apiPath ,
104+ noSave : this . noSave ,
88105 onMetadataEdited : this . onMetadataEdited ,
89106 onMetadataAdded : this . onMetadataAdded
90107 } , overrides || { } ) ;
@@ -105,6 +122,7 @@ var MetadatumWidget = Panel.extend({
105122 parentView : this ,
106123 fieldName : this . fieldName ,
107124 apiPath : this . apiPath ,
125+ noSave : this . noSave ,
108126 onMetadataEdited : this . onMetadataEdited ,
109127 onMetadataAdded : this . onMetadataAdded
110128 } ;
@@ -142,7 +160,7 @@ var MetadatumWidget = Panel.extend({
142160 }
143161} ) ;
144162
145- var MetadatumEditWidget = Panel . extend ( {
163+ var MetadatumEditWidget = View . extend ( {
146164 events : {
147165 'click .g-widget-metadata-cancel-button' : 'cancelEdit' ,
148166 'click .g-widget-metadata-save-button' : 'save' ,
@@ -161,6 +179,7 @@ var MetadatumEditWidget = Panel.extend({
161179 key : this . $el . find ( '.g-widget-metadata-key-input' ) . val ( ) ,
162180 value : this . getCurrentValue ( )
163181 } ) ;
182+ return false ;
164183 }
165184 } ,
166185
@@ -173,6 +192,7 @@ var MetadatumEditWidget = Panel.extend({
173192 this . newDatum = settings . newDatum ;
174193 this . fieldName = settings . fieldName ;
175194 this . apiPath = settings . apiPath ;
195+ this . noSave = settings . noSave ;
176196 this . onMetadataEdited = settings . onMetadataEdited ;
177197 this . onMetadataAdded = settings . onMetadataAdded ;
178198 } ,
@@ -187,6 +207,11 @@ var MetadatumEditWidget = Panel.extend({
187207 event . stopImmediatePropagation ( ) ;
188208 const target = $ ( event . currentTarget ) ;
189209 var metadataList = target . parent ( ) . parent ( ) ;
210+ if ( this . noSave ) {
211+ delete getMetadataRecord ( this . item , this . fieldName ) [ this . key ] ;
212+ metadataList . remove ( ) ;
213+ return ;
214+ }
190215 var params = {
191216 text : 'Are you sure you want to delete the metadatum <b>' +
192217 _ . escape ( this . key ) + '</b>?' ,
@@ -222,14 +247,14 @@ var MetadatumEditWidget = Panel.extend({
222247 event . stopImmediatePropagation ( ) ;
223248 const target = $ ( event . currentTarget ) ;
224249 var curRow = target . parent ( ) ,
225- tempKey = curRow . find ( '.g-widget-metadata-key-input' ) . val ( ) ,
250+ tempKey = curRow . find ( '.g-widget-metadata-key-input' ) . val ( ) . trim ( ) ,
226251 tempValue = ( value !== undefined ) ? value : curRow . find ( '.g-widget-metadata-value-input' ) . val ( ) ;
227252 if ( this . newDatum && tempKey === '' ) {
228253 events . trigger ( 'g:alert' , {
229254 text : 'A key is required for all metadata.' ,
230255 type : 'warning'
231256 } ) ;
232- return ;
257+ return false ;
233258 }
234259 var saveCallback = ( ) => {
235260 this . key = tempKey ;
@@ -260,6 +285,18 @@ var MetadatumEditWidget = Panel.extend({
260285 if ( this . onMetadataAdded ) {
261286 this . onMetadataAdded ( tempKey , tempValue , saveCallback , errorCallback ) ;
262287 } else {
288+ if ( this . noSave ) {
289+ if ( getMetadataRecord ( this . item , this . fieldName ) [ tempKey ] !== undefined ) {
290+ events . trigger ( 'g:alert' , {
291+ text : tempKey + ' is already a metadata key' ,
292+ type : 'warning'
293+ } ) ;
294+ return false ;
295+ }
296+ getMetadataRecord ( this . item , this . fieldName ) [ tempKey ] = tempValue ;
297+ this . parentView . parentView . render ( ) ;
298+ return ;
299+ }
263300 this . item . addMetadata ( tempKey , tempValue , saveCallback , errorCallback , {
264301 field : this . fieldName ,
265302 path : this . apiPath
@@ -269,6 +306,20 @@ var MetadatumEditWidget = Panel.extend({
269306 if ( this . onMetadataEdited ) {
270307 this . onMetadataEdited ( tempKey , this . key , tempValue , saveCallback , errorCallback ) ;
271308 } else {
309+ if ( this . noSave ) {
310+ tempKey = tempKey === '' ? this . key : tempKey ;
311+ if ( tempKey !== this . key && getMetadataRecord ( this . item , this . fieldName ) [ tempKey ] !== undefined ) {
312+ events . trigger ( 'g:alert' , {
313+ text : tempKey + ' is already a metadata key' ,
314+ type : 'warning'
315+ } ) ;
316+ return false ;
317+ }
318+ delete getMetadataRecord ( this . item , this . fieldName ) [ this . key ] ;
319+ getMetadataRecord ( this . item , this . fieldName ) [ tempKey ] = tempValue ;
320+ this . parentView . parentView . render ( ) ;
321+ return ;
322+ }
272323 this . item . editMetadata ( tempKey , this . key , tempValue , saveCallback , errorCallback , {
273324 field : this . fieldName ,
274325 path : this . apiPath
@@ -307,6 +358,7 @@ var JsonMetadatumEditWidget = MetadatumEditWidget.extend({
307358 text : 'The field contains invalid JSON and can not be saved.' ,
308359 type : 'warning'
309360 } ) ;
361+ return false ;
310362 }
311363 } ,
312364
@@ -345,7 +397,7 @@ var MetadataWidget = Panel.extend({
345397 this . addMetadata ( event , 'simple' ) ;
346398 } ,
347399 'click .h-panel-maximize' : function ( event ) {
348- this . expand ( ) ;
400+ this . expand ( event ) ;
349401 this . $ ( '.s-panel-content' ) . addClass ( 'in' ) ;
350402 let panelElem = this . $el . closest ( '.s-panel' ) ;
351403 let maximize = ! panelElem . hasClass ( 'h-panel-maximized' ) ;
@@ -382,6 +434,8 @@ var MetadataWidget = Panel.extend({
382434 this . apiPath = settings . apiPath ;
383435 this . accessLevel = settings . accessLevel ;
384436 this . onMetadataEdited = settings . onMetadataEdited ;
437+ this . panel = settings . panel === undefined ? true : settings . panel ;
438+ this . noSave = settings . noSave ;
385439 // the event is created
386440 this . on ( 'h-metadata-panel-update' , ( event ) => {
387441 this . renderMetadataWidgetHeader ( event ) ;
@@ -456,6 +510,7 @@ var MetadataWidget = Panel.extend({
456510 apiPath : this . apiPath ,
457511 accessLevel : this . accessLevel ,
458512 parentView : this ,
513+ noSave : this . noSave ,
459514 onMetadataEdited : this . onMetadataEdited ,
460515 onMetadataAdded : this . onMetadataAdded
461516 } ) ;
@@ -468,6 +523,7 @@ var MetadataWidget = Panel.extend({
468523 fieldName : this . fieldName ,
469524 apiPath : this . apiPath ,
470525 accessLevel : this . accessLevel ,
526+ noSave : this . noSave ,
471527 newDatum : true ,
472528 parentView : widget ,
473529 onMetadataEdited : this . onMetadataEdited ,
@@ -478,20 +534,32 @@ var MetadataWidget = Panel.extend({
478534 } ,
479535
480536 renderMetadataWidgetHeader : function ( ) {
481- // pervent automatically collapse the widget after rendering again
537+ // prevent automatically collapsing the widget after rendering again
482538 this . render ( ) ;
483539 } ,
484540
485541 render : function ( ) {
486542 if ( this . item && this . item . id ) {
487- const imageId = this . item . id ;
488- const apiPath = `/item/${ imageId } /metadata` ;
489- this . item . getAccessLevel ( ( accessLevel ) => {
490- var metaDict = this . item . get ( this . fieldName ) || { } ;
543+ let func = this . item . getAccessLevel ;
544+ if ( this . item . get ( '_modelType' ) === 'annotation' ) {
545+ func = ( callback ) => {
546+ const accessLevel = this . item . getAccessLevel ( ) ;
547+ callback ( accessLevel ) ;
548+ } ;
549+ }
550+ func . call ( this . item , ( accessLevel ) => {
551+ const fieldParts = this . fieldName . split ( '.' ) ;
552+ let metaDict = this . item . get ( fieldParts [ 0 ] ) || { } ;
553+ fieldParts . slice ( 1 ) . forEach ( ( part ) => {
554+ metaDict = metaDict [ part ] || { } ;
555+ } ) ;
556+ if ( this . item [ this . fieldName ] ) {
557+ metaDict = this . item [ this . fieldName ] ;
558+ }
491559 var metaKeys = Object . keys ( metaDict ) ;
492560 metaKeys . sort ( localeSort ) ;
493- var firstKey = ( metaKeys ) [ 0 ] ;
494- var firstValue = metaDict [ firstKey ] ;
561+ const firstKey = ( metaKeys ) [ 0 ] ;
562+ let firstValue = metaDict [ firstKey ] ;
495563 if ( _ . isObject ( firstValue ) ) {
496564 // if the value is a json object, JSON.stringify to make it more readable
497565 firstValue = JSON . stringify ( firstValue ) ;
@@ -503,8 +571,9 @@ var MetadataWidget = Panel.extend({
503571 firstValue : firstValue ,
504572 accessLevel : this . item . attributes . _accessLevel ,
505573 AccessType : AccessType ,
574+ panel : this . panel ,
506575 // if never rendered, the jquery selector will be empty and won't be visible
507- collapsed : ! this . $ ( '.s-panel-content' ) . hasClass ( 'in' ) && ! this . $el . closest ( '.s-panel' ) . hasClass ( 'h-panel-maximized' )
576+ collapsed : this . panel && ! this . $ ( '.s-panel-content' ) . hasClass ( 'in' ) && ! this . $el . closest ( '.s-panel' ) . hasClass ( 'h-panel-maximized' )
508577 } ) ) ;
509578 // Append each metadatum
510579 _ . each ( metaKeys , function ( metaKey ) {
@@ -515,7 +584,8 @@ var MetadataWidget = Panel.extend({
515584 accessLevel : this . item . attributes . _accessLevel ,
516585 parentView : this ,
517586 fieldName : this . fieldName ,
518- apiPath : apiPath ,
587+ apiPath : this . apiPath ,
588+ noSave : this . noSave ,
519589 onMetadataEdited : this . onMetadataEdited ,
520590 onMetadataAdded : this . onMetadataAdded
521591 } ) . render ( ) . $el ) ;
0 commit comments