UNPKG

angoose

Version:

Angoose is a Remote Method Invocation module that comes with built-in mongoose/angular support. Now you can call server side module in browser just like you're in the server side!

139 lines (122 loc) 5.95 kB
/** * Deform field directives * * * Usage: * * */ (function(){ angular.module('angoose.ui.controllers').controller("dfc-selector", function($scope, $injector, $schema, $ui, inputElement, templateElement, $timeout){ enterscope($scope, "selector ctrl: "+ $scope.path); window.s2em = inputElement; window.selscope = $scope; var scope = $scope; var pathSchema = $schema; //console.log("selector pat schema is ", $schema) if(!pathSchema) return; var refModelName = $ui.camelcase( $ui.getReference(pathSchema) ); var isRefArray = Array.isArray(pathSchema.options.type); //var isRef = console.log("Is ref:", refModelName, isRefArray ); if(!refModelName && ! isRefArray) return ; var refModel = $injector.get(refModelName); function format(objId){ var object = optionCandidates[objId] || objId; //console.log("formating result", object) if(object && object.getDisplayName) return object.getDisplayName(); if($ui.getter(object, 'meta.name.first')) return object.meta.name.first +" "+ object.meta.name.last; if($ui.getter(object, 'meta.name')) return object.meta.name; if($ui.getter(object, 'name.first')) return object.name.first +" "+ object.name.last; if(object && object.name) return object.name; //if(object && object.type) return object.type + object._id return objId; } ///scope.select2name = scope.path.replace(/\./g, '_') +"Select2Options" // we keep the select2 query result in this variable for formatting lookup. We can't use object directly as value for the model. ' var optionCandidates = {}; //@ todo: cache invalidation scope.select2options = { placeholder: 'Please Select '+ refModelName, id: function(obj){ return (obj && obj._id) ? obj._id: obj; }, formatResult: format, formatSelection:format, multiple: isRefArray, query: function(query){ var filter = {} ;// query.term?{'meta.name': { $regex:query.term, $options:'i'} }:{}; if(query.term){ filter["$or"]= [{'meta.name': { $regex:query.term, $options:'i'} }, {'meta.name.sortable': { $regex:query.term, $options:'i'} } ]; } refModel.find(filter, {'meta.name':1, name:1,type:1}, function(err, results){ //@todo: generic name fields var data = _.map(results, function(off){ optionCandidates[off._id] = off; return off }); //console.log("Query result", data.length) query.callback({results:data, more:false}); }); }, initSelection: initSelection } function initSelection(em, callback){ var values = em.val? em.val() : em //console.log("#### initSelection", values) if(!values || (Array.isArray(values ) && values.length == 0)) return; var values = Array.isArray(values) ? values: [values]; var selectedObjects = []; var lookupIDs = []; values.forEach(function(obj){ var objId = typeof(obj) == 'string'? obj: obj._id; if(!optionCandidates[objId]) lookupIDs.push(objId); else selectedObjects.push(optionCandidates[objId]); }) if(lookupIDs.length>0){ //console.log("lookup ids", lookupIDs) refModel.find({_id: {'$in': lookupIDs} }, {'meta.name':1, name:1, type:1}, function(err, results){ //@todo: generic name fields results && results.forEach(function(res){ optionCandidates[res._id] = res; selectedObjects.push(res); }); callback(selectedObjects); }); } else{ callback(selectedObjects); } } // the ngModel is not initialized at this point, so we need to wait a bit after ngModel is rendered scope.$watch(inputElement.attr('ng-model'), function(curr, old){ if(!curr || ( !Array.isArray(curr) && ! curr._id) ) return; var ids = []; curr = Array.isArray(curr)? curr: [curr]; for(var i=0;i<curr.length;i++){ var it = curr[i] if(!it._id) return; ids.push(it._id) it = optionCandidates[it._id] || it; if(it.meta || it.name ) // already populated return; } initSelection(ids, function(selectedObjects){ var obj = Array.isArray(selectedObjects) && selectedObjects.length == 1? selectedObjects[0] : selectedObjects; inputElement.controller("ngModel").$setViewValue( obj ); }); /** console.log("Ref model value", curr) if(curr && curr._id && ! optionCandidates[curr._id]){ //@todo generic field refModel.findById(curr._id, {'meta.name':1, name:1}, function(err, obj){ if(err){ console.error("Error loading ref field value", err); return; } console.log("inital obj", obj); inputElement.controller("ngModel").$setViewValue(obj); optionCandidates[obj._id] = obj; }) }*/ }) }); })(); // end enclosure