backend-plus 2.0.0-rc.16 → 2.0.0-rc.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -183,20 +183,15 @@ myOwn.i18n.messages.es=changing(myOwn.i18n.messages.es, {
183
183
  /** @param {string} text */
184
184
  function regex4search(text){
185
185
  return new RegExp(
186
- text.trim().replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
186
+ text.toString().trim().replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
187
187
  // .replace(/"/g,"\\b")
188
188
  .replace(/[ñÑ]/g,'(?:gn|nn?i?|[ñÑ])')
189
- .replace(/[cCçÇ]/g,'[cçÇ]')
190
- .replace(/[áÁàÀäÄãÃ]/gi,'[AáÁàÀäÄãÃ]')
191
- .replace(/[éÉèÈëË]/gi,'[EéÉèÈëË]')
192
- .replace(/[íÍìÌïÏ]/gi,'[IíÍìÌïÏ]')
193
- .replace(/[óÓòÒöÖõÕ]/gi,'[OóÓòÒöÖõÕ]')
194
- .replace(/[úÚùÙüÜ]/gi,'[UúÚùÙüÜ]')
195
- .replace(/a/gi,'[AáÁàÀäÄãÃ]')
196
- .replace(/e/gi,'[EéÉèÈëË]')
197
- .replace(/i/gi,'[IíÍìÌïÏ]')
198
- .replace(/o/gi,'[OóÓòÒöÖõÕ]')
199
- .replace(/u/gi,'[UúÚùÙüÜ]')
189
+ .replace(/[cCçÇ]/g,'[cCçÇ]')
190
+ .replace(/[AáÁàÀäÄãÃ]/gi,'[AáÁàÀäÄãÃ]')
191
+ .replace(/[EéÉèÈëË]/gi,'[EéÉèÈëË]')
192
+ .replace(/[IíÍìÌïÏ]/gi,'[IíÍìÌïÏ]')
193
+ .replace(/[OóÓòÒöÖõÕ]/gi,'[OóÓòÒöÖõÕ]')
194
+ .replace(/[UúÚùÙüÜ]/gi,'[UúÚùÙüÜ]')
200
195
  // .replace(/\s+/g,'.*\\s+.*') mas estricto, exige el espacio
201
196
  .replace(/\s+/g,'.*')
202
197
  , 'i');
@@ -212,9 +207,9 @@ myOwn.comparatorParameterNull={
212
207
  '!=\u2205':true,
213
208
  }
214
209
  myOwn.comparator={
215
- '=':function(valueToCheck,condition){return valueToCheck == condition;},
216
- '~':function(valueToCheck,condition){return condition==null || regex4search(condition.toString()).test(valueToCheck);},
217
- '!~':function(valueToCheck,condition){return condition==null || !regex4search(condition.toString()).test(valueToCheck);},
210
+ '=':function(valueToCheck,condition){return sameValue(valueToCheck,condition);},
211
+ '~': function(valueToCheck,condition){return condition==null || condition instanceof Date ? Math.abs(condition-valueToCheck) <= 1000*60*60*24 : regex4search(condition).test(valueToCheck);},
212
+ '!~':function(valueToCheck,condition){return condition==null || condition instanceof Date ? Math.abs(condition-valueToCheck) > 1000*60*60*24 :!regex4search(condition).test(valueToCheck);},
218
213
  '/R/i':function(valueToCheck,condition){return condition==null || RegExp(condition,'i').test(valueToCheck);},
219
214
  '\u2205':function(valueToCheck,condition){return valueToCheck == null;},//\u2205 = conjunto vacío
220
215
  '!=\u2205':function(valueToCheck,condition){return valueToCheck != null;},//\u2205 = conjunto vacío
@@ -1005,7 +1000,7 @@ myOwn.DataColumnGrid.prototype.thFilter = function thFilter(depot, iColumn){
1005
1000
  var grid = this.grid;
1006
1001
  var fieldDef = this.fieldDef;
1007
1002
  var fieldName=fieldDef.name;
1008
- depot.rowSymbols[fieldDef.name]=depot.rowSymbols[fieldDef.name]||'~';
1003
+ depot.rowSymbols[fieldDef.name]=depot.rowSymbols[fieldDef.name]||(fieldDef.typeName == 'text' ? '~' : '=');
1009
1004
  var filterImage=my.path.img+my.comparator.traductor[depot.rowSymbols[fieldDef.name]]+'.png';
1010
1005
  var th=html.td(this.cellAttributes({class:"autoFilter", "typed-controls-direct-input":true},{skipMandatory:true})).create();
1011
1006
  var symbolFilter=th;
@@ -184,7 +184,7 @@ export type FieldDefinition = EditableDbDefinition & {
184
184
  serverSide?:boolean /* default:!clientSide if the value is retrived from the database */
185
185
  inTable?:boolean /* default:!clientSide && !sql.fields[...].expr. Is a real fisical field in the table */
186
186
  /* sizeByte?:number deprecated size in bytes for numbers */
187
- allowEmtpyText?:boolean /* if a text field accepts '' as a valid value */
187
+ allowEmptyText?:boolean /* if a text field accepts '' as a valid value */
188
188
  mobileInputType?:string
189
189
  extraRow?:number
190
190
  inexactNumber?:number /* default:depends on typeName if = means abs(x-v)<espilon
@@ -2978,22 +2978,32 @@ AppBackend.prototype.dumpDbSchemaPartial = async function dumpDbSchemaPartial(pa
2978
2978
  lines[0][0]=lines[0][0].replace('\ufeff','')
2979
2979
  }
2980
2980
  rows=lines.slice(1);
2981
+ var filteredFieldDef = lines[0].filter(filterField);
2981
2982
  if(tablesWithStrictSequence[tableName]){
2982
2983
  var dataString="COPY "+db.quoteIdent(tableName)+" ("+
2983
- lines[0].filter(filterField).map(db.quoteIdent).join(', ')+
2984
+ filteredFieldDef.map(db.quoteIdent).join(', ')+
2984
2985
  ') FROM stdin;\n'+
2985
2986
  rows.map(function(line){
2986
- return line.filter(function(_,i){ return filterField(lines[0][i]);}).map(function(value){
2987
- return value===''?'\\N':value.replace(/\\/g,'\\\\').replace(/\t/g,'\\t').replace(/\n/g,'\\n').replace(/\r/g,'\\r');
2987
+ return line.filter(function(_,i){ return filterField(lines[0][i]);}).map(function(value,i){
2988
+ var def = tableDef.field[filteredFieldDef[i]];
2989
+ return value==='' ? (
2990
+ def.allowEmptyText && ('nullable' in def) && !def.nullable ? '' : '\\N'
2991
+ ): value.replace(/\\/g,'\\\\').replace(/\t/g,'\\t').replace(/\n/g,'\\n').replace(/\r/g,'\\r');
2988
2992
  }).join('\t')+'\n';
2989
2993
  }).join('')+'\\.\n';
2990
2994
  }else{
2991
2995
  var dataString="insert into "+db.quoteIdent(tableName)+" ("+
2992
- lines[0].filter(filterField).map(db.quoteIdent).join(', ')+
2996
+ filteredFieldDef.map(db.quoteIdent).join(', ')+
2993
2997
  ') values\n'+
2994
2998
  rows.map(function(line){
2995
- return "("+line.filter(function(_,i){ return filterField(lines[0][i]);}).map(function(value){
2996
- return value===''?'null':db.quoteNullable(value);
2999
+ return "("+line.filter(function(_,i){ return filterField(lines[0][i]);}).map(function(value,i){
3000
+ var def = tableDef.field[filteredFieldDef[i]];
3001
+ if(def == null) {
3002
+ throw Error("no se encuentra la columna "+filteredFieldDef[i]+" en "+tableName);
3003
+ }
3004
+ return value==='' ? (
3005
+ def.allowEmptyText && ('nullable' in def) && !def.nullable ? "''" : 'null'
3006
+ ) : db.quoteNullable(value);
2997
3007
  }).join(', ')+")";
2998
3008
  }).join(',\n')+';\n';
2999
3009
  }
@@ -823,6 +823,9 @@ ProcedureTables = [
823
823
  if(value != null && parameters.skipUnknownFieldsAtImport){
824
824
  value = value.replace(/(\s|\u00A0)+/g,' ').trim()
825
825
  }
826
+ if (value == null && field.allowEmptyText && ('nullable' in field) && !field.nullable ) {
827
+ value = ''
828
+ }
826
829
  newRow[field.name]=value;
827
830
  }
828
831
  });
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "backend-plus",
3
3
  "description": "Backend for the anti Pareto rule",
4
- "version": "2.0.0-rc.16",
4
+ "version": "2.0.0-rc.18",
5
5
  "author": "Codenautas <codenautas@googlegroups.com>",
6
6
  "license": "MIT",
7
7
  "repository": "codenautas/backend-plus",
@@ -82,7 +82,7 @@
82
82
  "@types/js-yaml": "^4.0.9",
83
83
  "@types/mocha": "^10.0.6",
84
84
  "@types/multiparty": "~0.0.36",
85
- "@types/node": "^20.13.0",
85
+ "@types/node": "^20.14.0",
86
86
  "@types/nodemailer": "^6.4.15",
87
87
  "@types/numeral": "~2.0.5",
88
88
  "@types/session-file-store": "^1.2.5",