@ai-table/state 0.0.11 → 0.0.12
Sign up to get free protection for your applications and to get access to all the features.
- package/esm2022/types/view.mjs +1 -1
- package/esm2022/utils/build.mjs +6 -11
- package/esm2022/utils/field/date.mjs +19 -1
- package/esm2022/utils/field/field.mjs +32 -1
- package/esm2022/utils/field/number.mjs +19 -1
- package/esm2022/utils/field/rate.mjs +19 -1
- package/esm2022/utils/field/select.mjs +23 -1
- package/esm2022/utils/field/text.mjs +7 -1
- package/esm2022/utils/sort-records.mjs +34 -0
- package/esm2022/utils/view.mjs +8 -1
- package/fesm2022/ai-table-state.mjs +153 -9
- package/fesm2022/ai-table-state.mjs.map +1 -1
- package/package.json +1 -1
- package/types/view.d.ts +7 -3
- package/types/view.d.ts.map +1 -1
- package/utils/build.d.ts +2 -2
- package/utils/build.d.ts.map +1 -1
- package/utils/field/date.d.ts +3 -0
- package/utils/field/date.d.ts.map +1 -1
- package/utils/field/field.d.ts +5 -1
- package/utils/field/field.d.ts.map +1 -1
- package/utils/field/number.d.ts +3 -0
- package/utils/field/number.d.ts.map +1 -1
- package/utils/field/rate.d.ts +3 -0
- package/utils/field/rate.d.ts.map +1 -1
- package/utils/field/select.d.ts +6 -1
- package/utils/field/select.d.ts.map +1 -1
- package/utils/field/text.d.ts +2 -0
- package/utils/field/text.d.ts.map +1 -1
- package/utils/sort-records.d.ts +5 -0
- package/utils/sort-records.d.ts.map +1 -0
- package/utils/view.d.ts +2 -1
- package/utils/view.d.ts.map +1 -1
@@ -2,6 +2,7 @@ import * as Y from 'yjs';
|
|
2
2
|
import { ActionName, AITableQueries, getDefaultFieldValue, idCreator, Actions, FLUSHING, AITableFieldType } from '@ai-table/grid';
|
3
3
|
import { isArray, isEmpty as isEmpty$1, isObject, isUndefinedOrNull, TinyDate } from 'ngx-tethys/util';
|
4
4
|
import { createDraft, finishDraft } from 'immer';
|
5
|
+
import { isEqual } from 'lodash';
|
5
6
|
import { fromUnixTime, subDays } from 'date-fns';
|
6
7
|
|
7
8
|
class Positions {
|
@@ -663,6 +664,13 @@ function removeView$1(aiTable, records, fields, activeViewId) {
|
|
663
664
|
});
|
664
665
|
ViewActions.removeView(aiTable, [activeViewId]);
|
665
666
|
}
|
667
|
+
function sortByViewPosition(data, activeView) {
|
668
|
+
const hasPositions = data.every((item) => item.positions && item.positions);
|
669
|
+
if (hasPositions) {
|
670
|
+
return [...data].sort((a, b) => a.positions[activeView._id] - b.positions[activeView._id]);
|
671
|
+
}
|
672
|
+
return data;
|
673
|
+
}
|
666
674
|
|
667
675
|
const GeneralViewActions = {
|
668
676
|
transform(aiTable, action) {
|
@@ -907,6 +915,7 @@ function isEmpty(value) {
|
|
907
915
|
return isUndefinedOrNull(value) || value == '';
|
908
916
|
}
|
909
917
|
|
918
|
+
const zhIntlCollator = typeof Intl !== 'undefined' ? new Intl.Collator('zh-CN') : undefined;
|
910
919
|
class Field {
|
911
920
|
stringInclude(str, searchStr) {
|
912
921
|
return str.toLowerCase().includes(searchStr.trim().toLowerCase());
|
@@ -935,6 +944,35 @@ class Field {
|
|
935
944
|
}
|
936
945
|
}
|
937
946
|
}
|
947
|
+
eq(cv1, cv2) {
|
948
|
+
return isEqual(cv1, cv2);
|
949
|
+
}
|
950
|
+
compare(cellValue1, cellValue2, field) {
|
951
|
+
if (this.eq(cellValue1, cellValue2)) {
|
952
|
+
return 0;
|
953
|
+
}
|
954
|
+
if (cellValue1 == null) {
|
955
|
+
return -1;
|
956
|
+
}
|
957
|
+
if (cellValue2 == null) {
|
958
|
+
return 1;
|
959
|
+
}
|
960
|
+
let str1 = this.cellValueToString(cellValue1, field);
|
961
|
+
let str2 = this.cellValueToString(cellValue2, field);
|
962
|
+
if (str1 === str2) {
|
963
|
+
return 0;
|
964
|
+
}
|
965
|
+
if (str1 == null) {
|
966
|
+
return -1;
|
967
|
+
}
|
968
|
+
if (str2 == null) {
|
969
|
+
return 1;
|
970
|
+
}
|
971
|
+
str1 = str1.trim();
|
972
|
+
str2 = str2.trim();
|
973
|
+
// test pinyin sort
|
974
|
+
return str1 === str2 ? 0 : zhIntlCollator ? zhIntlCollator.compare(str1, str2) : str1.localeCompare(str2, 'zh-CN') > 0 ? 1 : -1;
|
975
|
+
}
|
938
976
|
}
|
939
977
|
|
940
978
|
class TextField extends Field {
|
@@ -953,6 +991,12 @@ class TextField extends Field {
|
|
953
991
|
static stringInclude(str, searchStr) {
|
954
992
|
return str.toLowerCase().includes(searchStr.trim().toLowerCase());
|
955
993
|
}
|
994
|
+
eq(cv1, cv2) {
|
995
|
+
return this.cellValueToString(cv1) === this.cellValueToString(cv2);
|
996
|
+
}
|
997
|
+
cellValueToString(cellValue) {
|
998
|
+
return cellValue;
|
999
|
+
}
|
956
1000
|
}
|
957
1001
|
|
958
1002
|
class SelectField extends Field {
|
@@ -970,6 +1014,28 @@ class SelectField extends Field {
|
|
970
1014
|
return super.isMeetFilter(condition, cellValue);
|
971
1015
|
}
|
972
1016
|
}
|
1017
|
+
cellValueToString(cellValue, field) {
|
1018
|
+
return this.arrayValueToString(this.cellValueToArray(cellValue, field));
|
1019
|
+
}
|
1020
|
+
cellValueToArray(cellValue, field) {
|
1021
|
+
if (!cellValue) {
|
1022
|
+
return null;
|
1023
|
+
}
|
1024
|
+
const result = [];
|
1025
|
+
for (let i = 0, l = cellValue.length; i < l; i++) {
|
1026
|
+
const option = this.findOptionById(field, cellValue[i]);
|
1027
|
+
if (option) {
|
1028
|
+
result.push(option.text);
|
1029
|
+
}
|
1030
|
+
}
|
1031
|
+
return result;
|
1032
|
+
}
|
1033
|
+
findOptionById(field, id) {
|
1034
|
+
return field.settings.options.find(option => option._id === id) || null;
|
1035
|
+
}
|
1036
|
+
arrayValueToString(cellValues) {
|
1037
|
+
return cellValues && cellValues.length ? cellValues.join(', ') : null;
|
1038
|
+
}
|
973
1039
|
}
|
974
1040
|
function hasIntersect(array1, array2) {
|
975
1041
|
if (!Array.isArray(array1) || !Array.isArray(array2)) {
|
@@ -1034,6 +1100,24 @@ class DateField extends Field {
|
|
1034
1100
|
];
|
1035
1101
|
}
|
1036
1102
|
}
|
1103
|
+
cellValueToString(_cellValue) {
|
1104
|
+
return null;
|
1105
|
+
}
|
1106
|
+
static _compare(cellValue1, cellValue2) {
|
1107
|
+
if (isEmpty(cellValue1?.timestamp) && isEmpty(cellValue2?.timestamp)) {
|
1108
|
+
return 0;
|
1109
|
+
}
|
1110
|
+
if (isEmpty(cellValue1?.timestamp)) {
|
1111
|
+
return -1;
|
1112
|
+
}
|
1113
|
+
if (isEmpty(cellValue2?.timestamp)) {
|
1114
|
+
return 1;
|
1115
|
+
}
|
1116
|
+
return cellValue1.timestamp === cellValue2.timestamp ? 0 : cellValue1.timestamp > cellValue2.timestamp ? 1 : -1;
|
1117
|
+
}
|
1118
|
+
compare(cellValue1, cellValue2) {
|
1119
|
+
return DateField._compare(cellValue1, cellValue2);
|
1120
|
+
}
|
1037
1121
|
}
|
1038
1122
|
|
1039
1123
|
class NumberField extends Field {
|
@@ -1059,6 +1143,24 @@ class NumberField extends Field {
|
|
1059
1143
|
return super.isMeetFilter(condition, cellValue);
|
1060
1144
|
}
|
1061
1145
|
}
|
1146
|
+
cellValueToString(_cellValue) {
|
1147
|
+
return null;
|
1148
|
+
}
|
1149
|
+
static _compare(cellValue1, cellValue2) {
|
1150
|
+
if (isEmpty(cellValue1) && isEmpty(cellValue2)) {
|
1151
|
+
return 0;
|
1152
|
+
}
|
1153
|
+
if (isEmpty(cellValue1)) {
|
1154
|
+
return -1;
|
1155
|
+
}
|
1156
|
+
if (isEmpty(cellValue2)) {
|
1157
|
+
return 1;
|
1158
|
+
}
|
1159
|
+
return cellValue1 === cellValue2 ? 0 : cellValue1 > cellValue2 ? 1 : -1;
|
1160
|
+
}
|
1161
|
+
compare(cellValue1, cellValue2) {
|
1162
|
+
return NumberField._compare(cellValue1, cellValue2);
|
1163
|
+
}
|
1062
1164
|
}
|
1063
1165
|
|
1064
1166
|
class RateField extends Field {
|
@@ -1076,6 +1178,24 @@ class RateField extends Field {
|
|
1076
1178
|
return super.isMeetFilter(condition, cellValue);
|
1077
1179
|
}
|
1078
1180
|
}
|
1181
|
+
cellValueToString(_cellValue) {
|
1182
|
+
return null;
|
1183
|
+
}
|
1184
|
+
static _compare(cellValue1, cellValue2) {
|
1185
|
+
if (isEmpty(cellValue1) && isEmpty(cellValue2)) {
|
1186
|
+
return 0;
|
1187
|
+
}
|
1188
|
+
if (isEmpty(cellValue1)) {
|
1189
|
+
return -1;
|
1190
|
+
}
|
1191
|
+
if (isEmpty(cellValue2)) {
|
1192
|
+
return 1;
|
1193
|
+
}
|
1194
|
+
return cellValue1 === cellValue2 ? 0 : cellValue1 > cellValue2 ? 1 : -1;
|
1195
|
+
}
|
1196
|
+
compare(cellValue1, cellValue2) {
|
1197
|
+
return RateField._compare(cellValue1, cellValue2);
|
1198
|
+
}
|
1079
1199
|
}
|
1080
1200
|
|
1081
1201
|
const ViewOperationMap = {
|
@@ -1143,24 +1263,48 @@ function doFilter(condition, field, cellValue) {
|
|
1143
1263
|
return ViewOperationMap[field.type].isMeetFilter(condition, cellValue);
|
1144
1264
|
}
|
1145
1265
|
|
1146
|
-
function
|
1147
|
-
|
1148
|
-
|
1149
|
-
return [...data].sort((a, b) => a.positions[activeViewId] - b.positions[activeViewId]);
|
1266
|
+
function getSortRecords(aiTable, records, activeView) {
|
1267
|
+
if (!activeView?.settings || !activeView.settings.sorts?.length) {
|
1268
|
+
return records;
|
1150
1269
|
}
|
1151
|
-
|
1270
|
+
const { is_keep_sort, sorts } = activeView.settings;
|
1271
|
+
if (is_keep_sort && sorts?.length) {
|
1272
|
+
return sortRecordsBySortInfo(aiTable, records, activeView);
|
1273
|
+
}
|
1274
|
+
return sortByViewPosition(records, activeView);
|
1275
|
+
}
|
1276
|
+
function sortRecordsBySortInfo(aiTable, records, activeView) {
|
1277
|
+
const shallowRows = [...records];
|
1278
|
+
if (activeView.settings?.sorts?.length) {
|
1279
|
+
shallowRows.sort((prev, current) => {
|
1280
|
+
return activeView.settings.sorts.reduce((acc, rule) => {
|
1281
|
+
const field = aiTable.fieldsMap()[rule.sort_by];
|
1282
|
+
if (!field || acc !== 0) {
|
1283
|
+
return acc;
|
1284
|
+
}
|
1285
|
+
const fieldMethod = ViewOperationMap[field.type];
|
1286
|
+
const cellValue1 = AITableQueries.getFieldValue(aiTable, [prev._id, field._id]);
|
1287
|
+
const cellValue2 = AITableQueries.getFieldValue(aiTable, [current._id, field._id]);
|
1288
|
+
const res = fieldMethod.compare(cellValue1, cellValue2, field);
|
1289
|
+
return res * rule.direction;
|
1290
|
+
}, 0);
|
1291
|
+
});
|
1292
|
+
return shallowRows;
|
1293
|
+
}
|
1294
|
+
return shallowRows;
|
1152
1295
|
}
|
1153
|
-
|
1296
|
+
|
1297
|
+
function buildRecordsByView(aiTable, records, fields, activeView) {
|
1154
1298
|
const filteredRecords = getFilteredRecords(records, fields, activeView);
|
1155
|
-
return
|
1299
|
+
return getSortRecords(aiTable, filteredRecords, activeView);
|
1156
1300
|
}
|
1157
1301
|
function buildFieldsByView(fields, activeView) {
|
1158
|
-
return
|
1302
|
+
return sortByViewPosition(fields, activeView);
|
1159
1303
|
}
|
1160
1304
|
|
1161
1305
|
/**
|
1162
1306
|
* Generated bundle index. Do not edit.
|
1163
1307
|
*/
|
1164
1308
|
|
1165
|
-
export { AITableFilterLogical, AITableFilterOperation, Direction, GeneralActions, GeneralPositionActions, GeneralViewActions, POSITION_ACTIONS, PositionActionName, PositionActions, Positions, VIEW_ACTIONS, ViewActionName, ViewActions, ViewOperationMap, YjsAITable, actionMappers, addRecordPosition, addView$1 as addView, apply, applyActionOps, applyEvents, applyPosition, applyView, applyYjsEvents, buildFieldsByView, buildRecordsByView, createDefaultPositions, createSharedType, doFilter, getFilteredRecords, getPosition, getShareTypeNumberPath, getSharedMapValueId, getSharedMapValueIndex, getSharedRecordId, getSharedRecordIndex, initSharedType, initTable, isEmpty, removeRecordPosition, removeView$1 as removeView,
|
1309
|
+
export { AITableFilterLogical, AITableFilterOperation, Direction, GeneralActions, GeneralPositionActions, GeneralViewActions, POSITION_ACTIONS, PositionActionName, PositionActions, Positions, VIEW_ACTIONS, ViewActionName, ViewActions, ViewOperationMap, YjsAITable, actionMappers, addRecordPosition, addView$1 as addView, apply, applyActionOps, applyEvents, applyPosition, applyView, applyYjsEvents, buildFieldsByView, buildRecordsByView, createDefaultPositions, createSharedType, doFilter, getFilteredRecords, getPosition, getShareTypeNumberPath, getSharedMapValueId, getSharedMapValueIndex, getSharedRecordId, getSharedRecordIndex, initSharedType, initTable, isEmpty, removeRecordPosition, removeView$1 as removeView, sortByViewPosition, toRecordSyncElement, toSharedType, toSyncElement, translatePositionToPath, translateToRecordValues, translateToRecords, translateYjsEvent, withView };
|
1166
1310
|
//# sourceMappingURL=ai-table-state.mjs.map
|