@ai-table/state 0.0.10 → 0.0.12
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.
- 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
|