1 angular.module('egFmRecordEditorMod',
2 ['egCoreMod', 'egUiMod', 'ui.bootstrap'])
4 .directive('egEditFmRecord', function() {
9 // IDL class hint (e.g. "aou")
12 // mode: 'create' for creating a new record,
13 // 'update' for editing an existing record
16 // record ID to update
19 // comma-separated list of fields that should not be
23 // comma-separated list of fields that should always
27 // comma-separated list of required fields; this
28 // supplements what the IDL considers required
31 // hash, keyed by field name, of functions to invoke
32 // to check whether a field is required. Each
33 // callback is passed the field name and the record
34 // and should return a boolean value. This supports
35 // cases where whether a field is required or not
36 // depends on the current value of another field.
37 isRequiredOverride : '@',
39 // reference to handler to run upon saving
40 // record. The handler will be passed the
41 // record ID and a parameter indicating whether
42 // the save did a create or an update. Note that
43 // even if the mode of the egEditFmRecord is
44 // 'create', the onSave handler may still get
45 // 'update' if the user is permitted to create a
46 // record, then update it
49 // reference to handler to run if the user
55 templateUrl : '/eg/staff/share/t_fm_record_editor',
59 function($scope , egCore) {
61 function list_to_hash(str) {
63 if (angular.isString(str)) {
64 str.split(/,/).map(function(s) {
65 hash[s.trim()] = true;
71 $scope.required = list_to_hash($scope.requiredFields);
72 $scope.readonly = list_to_hash($scope.readonlyFields);
73 $scope.hidden = list_to_hash($scope.hiddenFields);
75 $scope.record_label = egCore.idl.classes[$scope.idlClass].label;
77 $scope.rec_org_values = {};
79 if ($scope.mode == 'update') {
80 egCore.pcrud.retrieve($scope.idlClass, $scope.recordId).then(function(r) {
82 convert_datatypes_to_js($scope.rec);
83 $scope.fields = get_field_list();
86 $scope.rec = new egCore.idl[$scope.idlClass]();
87 $scope.fields = get_field_list();
90 function convert_datatypes_to_js(rec) {
91 var fields = egCore.idl.classes[$scope.idlClass].fields;
92 angular.forEach(fields, function(field) {
93 if (field.datatype == 'bool') {
94 if (rec[field.name]() == 't') {
95 rec[field.name](true);
96 } else if (rec[field.name]() == 'f') {
97 rec[field.name](false);
103 function convert_datatypes_to_idl(rec) {
104 var fields = egCore.idl.classes[$scope.idlClass].fields;
105 angular.forEach(fields, function(field) {
106 if (field.datatype == 'bool') {
107 if (rec[field.name]() == true) {
108 rec[field.name]('t');
109 } else if (rec[field.name]() == false) {
110 rec[field.name]('f');
116 function flatten_linked_values(cls, list) {
118 var fields = egCore.idl.classes[cls].fields;
121 angular.forEach(fields, function(fld) {
122 if (fld.datatype == 'id') {
124 selector = fld.selector ? fld.selector : id_field;
128 angular.forEach(list, function(item) {
129 var rec = egCore.idl.toHash(item);
138 function get_field_list() {
139 var fields = egCore.idl.classes[$scope.idlClass].fields;
141 angular.forEach(fields, function(field) {
142 field.readonly = (field.name in $scope.readonly);
143 if (angular.isObject($scope.isRequiredOverride) &&
144 field.name in $scope.isRequiredOverride) {
145 field.is_required = function() {
146 return $scope.isRequiredOverride[field.name](field.name, $scope.rec);
149 field.is_required = function() {
150 return field.required || (field.name in $scope.required);
153 if (field.datatype == 'link') {
154 egCore.pcrud.retrieveAll(
155 field.class, {}, {atomic : true}
156 ).then(function(list) {
157 field.linked_values = flatten_linked_values(field.class, list);
160 if (field.datatype == 'org_unit') {
161 $scope.rec_orgs[field.name] = function(org) {
162 if (arguments.length == 1) $scope.rec[field.name](org.id());
163 return egCore.org.get($scope.rec[field.name]());
165 if ($scope.rec[field.name]()) {
166 $scope.rec_org_values[field.name] = $scope.rec_orgs[field.name]();
170 return fields.filter(function(field) { return !(field.name in $scope.hidden) });
173 $scope.ok = function($event) {
174 var recToSave = egCore.idl.Clone($scope.rec)
175 convert_datatypes_to_idl(recToSave);
176 if ($scope.mode == 'update') {
177 egCore.pcrud.update(recToSave).then(function() {
178 $scope.onSave($event);
181 egCore.pcrud.create(recToSave).then(function() {
182 $scope.onSave($event);
186 $scope.cancel = function($event) {
187 $scope.onCancel($event);