@sd-angular/core 19.0.0-beta.5 → 19.0.0-beta.7

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.
@@ -10,6 +10,7 @@ import { SdTableOptionGroup } from './table-option-group.model';
10
10
  import { SdTableOptionSort } from './table-option-sort.model';
11
11
  import { SdTableOptionPaginate } from './table-option-paginate.model';
12
12
  import { TableOptionConfig } from './table-option-config.model';
13
+ import { SdPagingReq } from '@sd-angular/core/utilities';
13
14
  export type SdTableOption<T = any> = SdTableLocalOption<T> | SdTableServerOption<T>;
14
15
  interface SdTableBaseOption<T = any> {
15
16
  key?: string;
@@ -32,7 +33,7 @@ interface SdTableLocalOption<T = any> extends SdTableBaseOption<T> {
32
33
  }
33
34
  interface SdTableServerOption<T = any> extends SdTableBaseOption<T> {
34
35
  type: 'server';
35
- items: (filterRequest: SdTableFilterRequest<T>) => Promise<{
36
+ items: (filterRequest: SdTableFilterRequest<T>, pagingReq: SdPagingReq<T>) => Promise<{
36
37
  items: T[];
37
38
  total: number;
38
39
  }>;
@@ -2359,7 +2359,8 @@ class SdTable extends SdBaseSecureComponent {
2359
2359
  total: 0,
2360
2360
  };
2361
2361
  }
2362
- const data = await items(filterReq).catch(err => {
2362
+ const pagingReq = this.#convertPagingReq(filterReq);
2363
+ const data = await items(filterReq, pagingReq).catch(err => {
2363
2364
  console.error(err);
2364
2365
  return {
2365
2366
  items: [],
@@ -2432,9 +2433,10 @@ class SdTable extends SdBaseSecureComponent {
2432
2433
  return await result;
2433
2434
  }
2434
2435
  else {
2435
- const filterInfo = this.#filterExportInfo(pageNumber, pageSize);
2436
+ const filterReq = this.#filterExportInfo(pageNumber, pageSize);
2436
2437
  if (this.tableOption.type === 'server') {
2437
- const result = this.tableOption.items(filterInfo);
2438
+ const pagingReq = this.#convertPagingReq(filterReq);
2439
+ const result = this.tableOption.items(filterReq, pagingReq);
2438
2440
  return await result;
2439
2441
  }
2440
2442
  else {
@@ -2451,7 +2453,7 @@ class SdTable extends SdBaseSecureComponent {
2451
2453
  else {
2452
2454
  exportedItems = this.tableOption.items;
2453
2455
  }
2454
- return this.#filterLocal(exportedItems, filterInfo);
2456
+ return this.#filterLocal(exportedItems, filterReq);
2455
2457
  }
2456
2458
  }
2457
2459
  };
@@ -3099,6 +3101,228 @@ class SdTable extends SdBaseSecureComponent {
3099
3101
  trackBy = (index, item) => {
3100
3102
  return item.meta.id;
3101
3103
  };
3104
+ #convertPagingReq = (filterReq) => {
3105
+ const { columns, filter } = this.tableOption;
3106
+ const externalFilters = filter?.externalFilters || [];
3107
+ const req = {
3108
+ filters: [],
3109
+ orders: [],
3110
+ pageNumber: filterReq.pageNumber,
3111
+ pageSize: filterReq.pageSize,
3112
+ };
3113
+ const { filters, orders } = req;
3114
+ const { rawColumnFilter, columnOperator, rawExternalFilter, orderBy, orderDirection } = filterReq;
3115
+ // Xử lý external filter
3116
+ for (const externalFilter of externalFilters || []) {
3117
+ const { field } = externalFilter;
3118
+ const value = rawExternalFilter?.[field];
3119
+ // Nếu có giá trị thì mới xử lý filter
3120
+ if (value !== undefined && value !== null && value !== '') {
3121
+ if (externalFilter.type === 'string') {
3122
+ // Nếu filter là equal và có dấu , ngăn cách thì hiểu là tìm nhiều ngăn cách bởi dấu phẩy
3123
+ if (externalFilter.defaultOperator === 'EQUAL' && value?.includes(',')) {
3124
+ filters.push({
3125
+ field,
3126
+ operator: 'IN',
3127
+ data: value.split(',').map(val => val.trim()),
3128
+ });
3129
+ }
3130
+ else {
3131
+ filters.push({
3132
+ field,
3133
+ operator: externalFilter.defaultOperator || 'CONTAIN',
3134
+ data: value,
3135
+ });
3136
+ }
3137
+ }
3138
+ else if (externalFilter.type === 'boolean') {
3139
+ filters.push({
3140
+ field,
3141
+ operator: 'EQUAL',
3142
+ data: value === true || value === 1 || value === 'true' || value === '1',
3143
+ });
3144
+ }
3145
+ else if (externalFilter.type === 'daterange') {
3146
+ if (typeof value === 'object' && 'from' in value && 'to' in value) {
3147
+ if (value?.from) {
3148
+ filters.push({
3149
+ field,
3150
+ operator: 'GREATER_OR_EQUAL',
3151
+ data: DateUtilities.begin(value?.from).toISOString(),
3152
+ });
3153
+ }
3154
+ if (value?.to) {
3155
+ filters.push({
3156
+ field,
3157
+ operator: 'LESS_THAN',
3158
+ data: DateUtilities.begin(DateUtilities.addDays(value?.to, 1)).toISOString(),
3159
+ });
3160
+ }
3161
+ }
3162
+ }
3163
+ else if (externalFilter.type === 'date' || externalFilter.type === 'datetime') {
3164
+ if (DateUtilities.isDate(value)) {
3165
+ if (externalFilter.type === 'date') {
3166
+ if (externalFilter.defaultOperator === 'GREATER_OR_EQUAL') {
3167
+ filters.push({
3168
+ field,
3169
+ operator: 'GREATER_OR_EQUAL',
3170
+ data: DateUtilities.begin(value).toISOString(),
3171
+ });
3172
+ }
3173
+ if (externalFilter.defaultOperator === 'LESS_OR_EQUAL') {
3174
+ filters.push({
3175
+ field,
3176
+ operator: 'LESS_THAN',
3177
+ data: DateUtilities.begin(DateUtilities.addDays(value, 1)).toISOString(),
3178
+ });
3179
+ }
3180
+ }
3181
+ else {
3182
+ if (externalFilter.defaultOperator === 'GREATER_OR_EQUAL') {
3183
+ filters.push({
3184
+ field,
3185
+ operator: 'GREATER_OR_EQUAL',
3186
+ data: new Date(value).toISOString(),
3187
+ });
3188
+ }
3189
+ if (externalFilter.defaultOperator === 'LESS_OR_EQUAL') {
3190
+ filters.push({
3191
+ field,
3192
+ operator: 'LESS_OR_EQUAL',
3193
+ data: new Date(value).toISOString(),
3194
+ });
3195
+ }
3196
+ }
3197
+ }
3198
+ }
3199
+ else {
3200
+ if (Array.isArray(value)) {
3201
+ if (value.length) {
3202
+ filters.push({
3203
+ field,
3204
+ operator: 'IN',
3205
+ data: value,
3206
+ });
3207
+ }
3208
+ }
3209
+ else if (typeof value === 'object' && 'from' in value && 'to' in value) {
3210
+ if (value?.from) {
3211
+ filters.push({
3212
+ field,
3213
+ operator: 'GREATER_OR_EQUAL',
3214
+ data: DateUtilities.begin(value?.from).toISOString(),
3215
+ });
3216
+ }
3217
+ if (value?.to) {
3218
+ filters.push({
3219
+ field,
3220
+ operator: 'LESS_THAN',
3221
+ data: DateUtilities.begin(DateUtilities.addDays(value?.to, 1)).toISOString(),
3222
+ });
3223
+ }
3224
+ }
3225
+ else {
3226
+ filters.push({
3227
+ field,
3228
+ operator: externalFilter.defaultOperator || 'EQUAL',
3229
+ data: value,
3230
+ });
3231
+ }
3232
+ }
3233
+ }
3234
+ }
3235
+ // Xử lý column filter
3236
+ // Xử lý column filter
3237
+ for (const column of columns || []) {
3238
+ const { field } = column;
3239
+ const value = rawColumnFilter?.[field];
3240
+ const operator = columnOperator?.[field] || column.filter?.operator?.default;
3241
+ // Nếu có giá trị thì mới xử lý filter
3242
+ if (value !== undefined && value !== null && value !== '') {
3243
+ if (column.type === 'string') {
3244
+ filters.push({
3245
+ field,
3246
+ operator: operator || 'CONTAIN',
3247
+ data: value,
3248
+ });
3249
+ }
3250
+ else if (column.type === 'boolean') {
3251
+ filters.push({
3252
+ field,
3253
+ operator: 'EQUAL',
3254
+ data: value === true || value === 1 || value === 'true' || value === '1',
3255
+ });
3256
+ }
3257
+ else if (column.type === 'date' || column.type === 'datetime') {
3258
+ if (value && typeof value === 'object' && 'from' in value && 'to' in value) {
3259
+ if (value?.from && value?.to) {
3260
+ filters.push({
3261
+ field,
3262
+ operator: 'BETWEEN',
3263
+ data: {
3264
+ from: DateUtilities.begin(value?.from).toISOString(),
3265
+ to: DateUtilities.end(value?.to).toISOString(),
3266
+ },
3267
+ });
3268
+ }
3269
+ else if (value?.from) {
3270
+ filters.push({
3271
+ field,
3272
+ operator: 'GREATER_OR_EQUAL',
3273
+ data: DateUtilities.begin(value?.from).toISOString(),
3274
+ });
3275
+ }
3276
+ else if (value?.to) {
3277
+ filters.push({
3278
+ field,
3279
+ operator: 'LESS_THAN',
3280
+ data: DateUtilities.begin(DateUtilities.addDays(value?.to, 1)).toISOString(),
3281
+ });
3282
+ }
3283
+ }
3284
+ else {
3285
+ if (DateUtilities.isDate(value)) {
3286
+ filters.push({
3287
+ field,
3288
+ operator: 'BETWEEN',
3289
+ data: {
3290
+ from: DateUtilities.begin(value).toISOString(),
3291
+ to: DateUtilities.end(value).toISOString(),
3292
+ },
3293
+ });
3294
+ }
3295
+ }
3296
+ }
3297
+ else {
3298
+ if (Array.isArray(value)) {
3299
+ if (value.length) {
3300
+ filters.push({
3301
+ field,
3302
+ operator: 'IN',
3303
+ data: value,
3304
+ });
3305
+ }
3306
+ }
3307
+ else {
3308
+ filters.push({
3309
+ field,
3310
+ operator: operator || 'EQUAL',
3311
+ data: value,
3312
+ });
3313
+ }
3314
+ }
3315
+ }
3316
+ }
3317
+ // Xử lý orders
3318
+ if (orderBy && orderDirection) {
3319
+ orders.push({
3320
+ field: orderBy,
3321
+ direction: orderDirection,
3322
+ });
3323
+ }
3324
+ return req;
3325
+ };
3102
3326
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdTable, deps: [{ token: i0.ChangeDetectorRef }, { token: i1$4.SdFormatNumberPipe }, { token: SD_TABLE_CONFIGURATION, optional: true }, { token: ConfigService }, { token: i1$1.SdExcelService }, { token: i1$1.SdNotifyService }, { token: SdTableFilterService }], target: i0.ɵɵFactoryTarget.Component });
3103
3327
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: SdTable, isStandalone: true, selector: "sd-table", inputs: { _autoId: ["autoId", "_autoId"], option: "option" }, providers: [
3104
3328
  DatePipe,
@@ -3321,7 +3545,6 @@ const SdConvertToPagingReq = (filterRequest, args) => {
3321
3545
  });
3322
3546
  }
3323
3547
  else if (column.type === 'date' || column.type === 'datetime') {
3324
- console.log(value);
3325
3548
  if (typeof value === 'object' && 'from' in value && 'to' in value) {
3326
3549
  if (value?.from && value?.to) {
3327
3550
  filters.push({