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

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) => Promise<{
36
37
  items: T[];
37
38
  total: number;
38
39
  }>;
@@ -2432,9 +2432,10 @@ class SdTable extends SdBaseSecureComponent {
2432
2432
  return await result;
2433
2433
  }
2434
2434
  else {
2435
- const filterInfo = this.#filterExportInfo(pageNumber, pageSize);
2435
+ const filterReq = this.#filterExportInfo(pageNumber, pageSize);
2436
2436
  if (this.tableOption.type === 'server') {
2437
- const result = this.tableOption.items(filterInfo);
2437
+ const pagingReq = this.#convertPagingReq(filterReq);
2438
+ const result = this.tableOption.items(filterReq, pagingReq);
2438
2439
  return await result;
2439
2440
  }
2440
2441
  else {
@@ -2451,7 +2452,7 @@ class SdTable extends SdBaseSecureComponent {
2451
2452
  else {
2452
2453
  exportedItems = this.tableOption.items;
2453
2454
  }
2454
- return this.#filterLocal(exportedItems, filterInfo);
2455
+ return this.#filterLocal(exportedItems, filterReq);
2455
2456
  }
2456
2457
  }
2457
2458
  };
@@ -3099,6 +3100,228 @@ class SdTable extends SdBaseSecureComponent {
3099
3100
  trackBy = (index, item) => {
3100
3101
  return item.meta.id;
3101
3102
  };
3103
+ #convertPagingReq = (filterReq) => {
3104
+ const { columns, filter } = this.tableOption;
3105
+ const externalFilters = filter?.externalFilters || [];
3106
+ const req = {
3107
+ filters: [],
3108
+ orders: [],
3109
+ pageNumber: filterReq.pageNumber,
3110
+ pageSize: filterReq.pageSize,
3111
+ };
3112
+ const { filters, orders } = req;
3113
+ const { rawColumnFilter, columnOperator, rawExternalFilter, orderBy, orderDirection } = filterReq;
3114
+ // Xử lý external filter
3115
+ for (const externalFilter of externalFilters || []) {
3116
+ const { field } = externalFilter;
3117
+ const value = rawExternalFilter?.[field];
3118
+ // Nếu có giá trị thì mới xử lý filter
3119
+ if (value !== undefined && value !== null && value !== '') {
3120
+ if (externalFilter.type === 'string') {
3121
+ // 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
3122
+ if (externalFilter.defaultOperator === 'EQUAL' && value?.includes(',')) {
3123
+ filters.push({
3124
+ field,
3125
+ operator: 'IN',
3126
+ data: value.split(',').map(val => val.trim()),
3127
+ });
3128
+ }
3129
+ else {
3130
+ filters.push({
3131
+ field,
3132
+ operator: externalFilter.defaultOperator || 'CONTAIN',
3133
+ data: value,
3134
+ });
3135
+ }
3136
+ }
3137
+ else if (externalFilter.type === 'boolean') {
3138
+ filters.push({
3139
+ field,
3140
+ operator: 'EQUAL',
3141
+ data: value === true || value === 1 || value === 'true' || value === '1',
3142
+ });
3143
+ }
3144
+ else if (externalFilter.type === 'daterange') {
3145
+ if (typeof value === 'object' && 'from' in value && 'to' in value) {
3146
+ if (value?.from) {
3147
+ filters.push({
3148
+ field,
3149
+ operator: 'GREATER_OR_EQUAL',
3150
+ data: DateUtilities.begin(value?.from).toISOString(),
3151
+ });
3152
+ }
3153
+ if (value?.to) {
3154
+ filters.push({
3155
+ field,
3156
+ operator: 'LESS_THAN',
3157
+ data: DateUtilities.begin(DateUtilities.addDays(value?.to, 1)).toISOString(),
3158
+ });
3159
+ }
3160
+ }
3161
+ }
3162
+ else if (externalFilter.type === 'date' || externalFilter.type === 'datetime') {
3163
+ if (DateUtilities.isDate(value)) {
3164
+ if (externalFilter.type === 'date') {
3165
+ if (externalFilter.defaultOperator === 'GREATER_OR_EQUAL') {
3166
+ filters.push({
3167
+ field,
3168
+ operator: 'GREATER_OR_EQUAL',
3169
+ data: DateUtilities.begin(value).toISOString(),
3170
+ });
3171
+ }
3172
+ if (externalFilter.defaultOperator === 'LESS_OR_EQUAL') {
3173
+ filters.push({
3174
+ field,
3175
+ operator: 'LESS_THAN',
3176
+ data: DateUtilities.begin(DateUtilities.addDays(value, 1)).toISOString(),
3177
+ });
3178
+ }
3179
+ }
3180
+ else {
3181
+ if (externalFilter.defaultOperator === 'GREATER_OR_EQUAL') {
3182
+ filters.push({
3183
+ field,
3184
+ operator: 'GREATER_OR_EQUAL',
3185
+ data: new Date(value).toISOString(),
3186
+ });
3187
+ }
3188
+ if (externalFilter.defaultOperator === 'LESS_OR_EQUAL') {
3189
+ filters.push({
3190
+ field,
3191
+ operator: 'LESS_OR_EQUAL',
3192
+ data: new Date(value).toISOString(),
3193
+ });
3194
+ }
3195
+ }
3196
+ }
3197
+ }
3198
+ else {
3199
+ if (Array.isArray(value)) {
3200
+ if (value.length) {
3201
+ filters.push({
3202
+ field,
3203
+ operator: 'IN',
3204
+ data: value,
3205
+ });
3206
+ }
3207
+ }
3208
+ else if (typeof value === 'object' && 'from' in value && 'to' in value) {
3209
+ if (value?.from) {
3210
+ filters.push({
3211
+ field,
3212
+ operator: 'GREATER_OR_EQUAL',
3213
+ data: DateUtilities.begin(value?.from).toISOString(),
3214
+ });
3215
+ }
3216
+ if (value?.to) {
3217
+ filters.push({
3218
+ field,
3219
+ operator: 'LESS_THAN',
3220
+ data: DateUtilities.begin(DateUtilities.addDays(value?.to, 1)).toISOString(),
3221
+ });
3222
+ }
3223
+ }
3224
+ else {
3225
+ filters.push({
3226
+ field,
3227
+ operator: externalFilter.defaultOperator || 'EQUAL',
3228
+ data: value,
3229
+ });
3230
+ }
3231
+ }
3232
+ }
3233
+ }
3234
+ // Xử lý column filter
3235
+ // Xử lý column filter
3236
+ for (const column of columns || []) {
3237
+ const { field } = column;
3238
+ const value = rawColumnFilter?.[field];
3239
+ const operator = columnOperator?.[field] || column.filter?.operator?.default;
3240
+ // Nếu có giá trị thì mới xử lý filter
3241
+ if (value !== undefined && value !== null && value !== '') {
3242
+ if (column.type === 'string') {
3243
+ filters.push({
3244
+ field,
3245
+ operator: operator || 'CONTAIN',
3246
+ data: value,
3247
+ });
3248
+ }
3249
+ else if (column.type === 'boolean') {
3250
+ filters.push({
3251
+ field,
3252
+ operator: 'EQUAL',
3253
+ data: value === true || value === 1 || value === 'true' || value === '1',
3254
+ });
3255
+ }
3256
+ else if (column.type === 'date' || column.type === 'datetime') {
3257
+ if (value && typeof value === 'object' && 'from' in value && 'to' in value) {
3258
+ if (value?.from && value?.to) {
3259
+ filters.push({
3260
+ field,
3261
+ operator: 'BETWEEN',
3262
+ data: {
3263
+ from: DateUtilities.begin(value?.from).toISOString(),
3264
+ to: DateUtilities.end(value?.to).toISOString(),
3265
+ },
3266
+ });
3267
+ }
3268
+ else if (value?.from) {
3269
+ filters.push({
3270
+ field,
3271
+ operator: 'GREATER_OR_EQUAL',
3272
+ data: DateUtilities.begin(value?.from).toISOString(),
3273
+ });
3274
+ }
3275
+ else if (value?.to) {
3276
+ filters.push({
3277
+ field,
3278
+ operator: 'LESS_THAN',
3279
+ data: DateUtilities.begin(DateUtilities.addDays(value?.to, 1)).toISOString(),
3280
+ });
3281
+ }
3282
+ }
3283
+ else {
3284
+ if (DateUtilities.isDate(value)) {
3285
+ filters.push({
3286
+ field,
3287
+ operator: 'BETWEEN',
3288
+ data: {
3289
+ from: DateUtilities.begin(value).toISOString(),
3290
+ to: DateUtilities.end(value).toISOString(),
3291
+ },
3292
+ });
3293
+ }
3294
+ }
3295
+ }
3296
+ else {
3297
+ if (Array.isArray(value)) {
3298
+ if (value.length) {
3299
+ filters.push({
3300
+ field,
3301
+ operator: 'IN',
3302
+ data: value,
3303
+ });
3304
+ }
3305
+ }
3306
+ else {
3307
+ filters.push({
3308
+ field,
3309
+ operator: operator || 'EQUAL',
3310
+ data: value,
3311
+ });
3312
+ }
3313
+ }
3314
+ }
3315
+ }
3316
+ // Xử lý orders
3317
+ if (orderBy && orderDirection) {
3318
+ orders.push({
3319
+ field: orderBy,
3320
+ direction: orderDirection,
3321
+ });
3322
+ }
3323
+ return req;
3324
+ };
3102
3325
  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
3326
  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
3327
  DatePipe,
@@ -3321,7 +3544,6 @@ const SdConvertToPagingReq = (filterRequest, args) => {
3321
3544
  });
3322
3545
  }
3323
3546
  else if (column.type === 'date' || column.type === 'datetime') {
3324
- console.log(value);
3325
3547
  if (typeof value === 'object' && 'from' in value && 'to' in value) {
3326
3548
  if (value?.from && value?.to) {
3327
3549
  filters.push({