[CORD-2292] Removing all the fields not defined in xProto before saving a model

Change-Id: I3fac1a0e8715094d309a1a473502cdf1d56e3ba7
diff --git a/src/app/core/services/helpers/config.helpers.ts b/src/app/core/services/helpers/config.helpers.ts
index 4750ac1..80855e5 100644
--- a/src/app/core/services/helpers/config.helpers.ts
+++ b/src/app/core/services/helpers/config.helpers.ts
@@ -316,25 +316,17 @@
 
         return;
       }
+      // remove fields added by the GUI
+      item = this.removeExtraFields(item, model);
 
-      const itemCopy = angular.copy(item);
-
-      // TODO remove ManyToMany relations and save them separately (how??)
-      delete item.networks;
-
-      // remove field added by xosTable
       _.forEach(Object.keys(item), prop => {
-        // FIXME what _ptr fields comes from??
-        if (prop.indexOf('-formatted') > -1 || prop.indexOf('_ptr') > -1) {
-          delete item[prop];
-        }
-
         // convert dates back to UnixTime
         if (this.XosFormHelpers._getFieldFormat(item[prop]) === 'date') {
           item[prop] = new Date(item[prop]).getTime() / 1000;
         }
       });
 
+      const itemCopy = angular.copy(item);
       const itemName = (angular.isUndefined(itemCopy.name)) ? model.name : itemCopy.name;
 
       item.$save()
@@ -365,6 +357,16 @@
     return formCfg;
   }
 
+  private removeExtraFields(item: any, modelDef: IXosModeldef) {
+    _.forEach(Object.keys(item), prop => {
+      const hasField = _.findIndex(modelDef.fields, {name: prop}) > -1;
+      if (!hasField) {
+        delete item[prop];
+      }
+    });
+    return item;
+  }
+
   private formatDefaultValues(val: any): any {
 
     if (angular.isString(val)) {