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!
131 lines (114 loc) • 5.31 kB
JavaScript
(function(){
angular.module('angoose.ui.directives').directive("deformView", viewDirective).directive("deformEdit", editDirective);
angular.module('angoose.ui.directives').directive("angView", viewDirective).directive("angEdit", editDirective);
function viewDirective(){
var directive = {
restrict:'AE',
scope:true
};
directive.controller = function($scope, $element, $attrs, $routeParams, $injector ){
enterscope($scope,"DeformView");
prepareInstance($scope, $injector, $routeParams, $attrs);
$scope.readonly = true;
}
return directive;
}
function editDirective( $location, $routeParams, $injector, $ui, $alert , $compile){
var directive = {
restrict:'AE',
scope:true
};
directive.compile = function(){
return function link($scope, $element, $attrs ){
enterscope($scope,"AngEdit");
$scope.isNew = $location.path().indexOf("create")>0;
prepareInstance($scope, $injector, $routeParams, $attrs);
// render template if needed
var $form = $scope.defineForm();
$ui.resolveAndCompile($scope, $element, $attrs, $form, 'deform.edit.tpl');
// $ui.resolveTemplate($element, $attrs, $form, 'deform.edit.tpl').then(function(em){
// if(em){
// console.log("Resolved template, compiling(default: edit.tpl')")
// $element.html("<!-- CLEARED -->"); // first clear the inline template
// $element.append(em);
// $compile(em)($scope);
// }
// }, function(err){
// console.error("Error resolving template(edit.tpl)", err);
// });
$scope.saveForm = function(){
if(!$scope.instance) return;
// depopulate
$scope.$emit("save");
$scope.instance.save(function(err, result){
$scope.$emit("afterSave");
if(err) $alert.error(err+"");
else{
window.history.back();
$alert.success("Successfully saved data", 10);
// MessageBox.success("Successfully saved data.", function(){
// //$location.path("/deform/" + $scope..modelName+"/list");
// window.history.back();
// });
}
})
}
$scope.reset = function(){
$scope.instance = modelClass.$get({_id: modelId});
}
$scope.cancelEdit = function(){
$scope.$emit("cancel");
window.history.back();
}
}
};
return directive;
}
function prepareInstance($scope, $injector, $routeParams, $attrs){
//console.log("prepare scope", $scope.$id, " parent id", $scope.$parent.$id)
var $ui = $injector.get("$ui");
var modelName = $ui.resolveAttribute('modelName', $scope, $routeParams, $attrs)
var modelClass = $injector.get( $ui.camelcase( modelName));
var modelId = $ui.resolveAttribute('modelId', $scope, $routeParams, $attrs);
function processSchema(modelName, modelClass){
var formSpec = $scope.defineForm( {
modelName: modelName,
modelClass: modelClass,
modelSchema: modelClass.schema
});
var groups = {};
groups.sorted_groups = [""]; // work around angular's collectionKeys.sort
var refPaths = [];
var indx = 0;
Object.keys(modelClass.schema.paths).forEach(function(path){
var data = modelClass.schema.paths[path];
if($ui.filterPath(path,data, modelClass.schema)) return;
var group = "";
if(path.indexOf(".")>=0)
group = path.substring(0, path.indexOf("."));
group = group == 'meta' ? "": group; // meta is considered default group
if(groups.sorted_groups.indexOf(group)<0) groups.sorted_groups.push(group);
groups[group] = groups[group] || {}
groups[group][path] = data;
groups[group].sorted_paths = groups[group].sorted_paths||[];
groups[group].sorted_paths.push(path);
if(data.instance == 'ObjectID' && data.options.ref) refPaths.push(path);
});
$scope.groups = groups;
}
if(!$scope.isNew){
modelClass.findById(modelId).done(function(modelInstance){
$scope.instance = modelInstance;
modelClass = modelInstance.constructor || modelClass;
processSchema(modelClass.modelName, modelClass);
}, function(err){
console.error(err);
$injector.get('$alert').error(err+"");
});
}
else {
$scope.instance = new modelClass();
processSchema( modelName, modelClass);
}
}
})(); // scope wrapper