@steedos-widgets/sortable 1.3.4-beta.17 → 1.3.4-beta.19

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.
@@ -22093,7 +22093,8 @@
22093
22093
  "&": "${list_view}",
22094
22094
  "name":"",
22095
22095
  "label": instance.t('frontend_listview_control_clone_defaultData_label_start') + " ${list_view.label} " + instance.t('frontend_listview_control_clone_defaultData_label_end'),
22096
- "shared":false
22096
+ "shared":false,
22097
+ "object_name": "${targetObjectName}",
22097
22098
  },
22098
22099
  "fieldsExtend": fieldsExtend$3(),
22099
22100
  "fields": fields(),
@@ -23801,7 +23802,9 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
23801
23802
  pickerSchema.headerToolbar = getObjectHeaderToolbar(refObjectConfig, fieldsArr, ctx.formFactor, { headerToolbarItems, isLookup: true, keywordsSearchBoxName });
23802
23803
  const isAllowCreate = refObjectConfig.permissions.allowCreate;
23803
23804
  const isCreate = lodash.exports.isBoolean(field.create) ? field.create : true;
23804
- if (isAllowCreate && isCreate) {
23805
+ // lookup字段配置过滤条件就强制不显示新建按钮
23806
+ let isHasFilters = (field.filters || field._filtersFunction) ? true : false;
23807
+ if (isAllowCreate && isCreate && !isHasFilters) {
23805
23808
  const new_button = await getSchema$5(refObjectConfig, { appId: ctx.appId, objectName: refObjectConfig.name, formFactor: ctx.formFactor });
23806
23809
  new_button.align = "right";
23807
23810
  // 保持快速搜索放在最左侧,新建按钮往里插,而不是push到最后
@@ -24175,10 +24178,10 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
24175
24178
 
24176
24179
  const refObject = await getUISchema(referenceTo.objectName);
24177
24180
 
24178
- // 此处不参考 steedos 的 enable_enhanced_lookup 规则. 如果默认是开启弹出选择,用户选择过程操作太繁琐, 所以默认是关闭弹出选择.
24179
- // 由于amis picker 目前不支持联动, 配置了depend_on时, 使用使用select ,以支持联动
24180
- // TODO: 确认 amis picker 支持联动时, 清理field.depend_on判断
24181
- if(refObject.enable_enhanced_lookup == true && lodash.exports.isEmpty(field.depend_on)){
24181
+ // 优先取字段中配置的enable_enhanced_lookup,字段上没配置时,才从对象上取enable_enhanced_lookup属性
24182
+ let enableEnhancedLookup = lodash.exports.isBoolean(field.enable_enhanced_lookup) ? field.enable_enhanced_lookup : refObject.enable_enhanced_lookup;
24183
+ // 默认使用下拉框模式显示lookup选项,只能配置了enable_enhanced_lookup才使用弹出增强模式
24184
+ if(enableEnhancedLookup == true){
24182
24185
  return await lookupToAmisPicker(field, readonly, ctx);
24183
24186
  }else if(refObject.enable_tree) {
24184
24187
  return await lookupToAmisTreeSelect(field, readonly, Object.assign({}, ctx, {
@@ -24491,8 +24494,8 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
24491
24494
  /*
24492
24495
  * @Author: baozhoutao@steedos.com
24493
24496
  * @Date: 2022-10-28 14:15:09
24494
- * @LastEditors: baozhoutao@steedos.com
24495
- * @LastEditTime: 2022-11-02 18:06:16
24497
+ * @LastEditors: liaodaxue
24498
+ * @LastEditTime: 2023-10-30 17:51:54
24496
24499
  * @Description:
24497
24500
  */
24498
24501
 
@@ -24543,11 +24546,26 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
24543
24546
  useChunk: false, // 关闭分块上传
24544
24547
  receiver: {
24545
24548
  method: "post",
24549
+ dataType: "form-data",
24546
24550
  url: `\${context.rootUrl}/s3/${tableName}`,
24547
- data: {
24548
- $: "$$",
24549
- context: `\${context}`,
24550
- },
24551
+ requestAdaptor: `
24552
+ const { _master, global,context } = api.body;
24553
+ // const { recordId, objectName } = _master;
24554
+ const { spaceId, userId, user } = global;
24555
+ /*
24556
+ record_id: recordId,
24557
+ parent: recordId,
24558
+ object_name: objectName,
24559
+ owner_name: user.name,
24560
+ space: spaceId,
24561
+ owner: userId
24562
+ */
24563
+ // 参考platform 2.2版本,附件字段保存时cfs.files.filerecord、cfs.images.filerecord表中的metadata下只保存space、owner两个属性值。
24564
+ api.data.append('space', spaceId);
24565
+ api.data.append('owner', userId);
24566
+
24567
+ return api;
24568
+ `,
24551
24569
  adaptor: `
24552
24570
  const { context } = api.body;
24553
24571
  var rootUrl = context.rootUrl + "/api/files/${tableName}/";
@@ -25289,8 +25307,44 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
25289
25307
  };
25290
25308
 
25291
25309
  async function getQuickEditSchema(field, options){
25310
+ //判断在amis3.2以上环境下,放开批量编辑
25311
+ const isAmisVersionforBatchEdit = amisRequire('amis').version[0] >= 3 && amisRequire('amis').version[2] >= 2;
25292
25312
  const quickEditId = options.objectName + "_" + field.name + "QuickEdit";//定义快速编辑的表单id,用于setvalue传值
25293
25313
  var quickEditSchema = { body: [], id: quickEditId };
25314
+ //select,avatar,image,file等组件无法行记录字段赋值,暂不支持批量编辑;
25315
+ if(field.type != 'avatar' && field.type != 'image' && field.type != 'file' && isAmisVersionforBatchEdit){
25316
+ const submitEvent = {
25317
+ submit: {
25318
+ actions: [
25319
+ {
25320
+ actionType: "custom",
25321
+ script: `
25322
+ const items = event.data.items;
25323
+ const selectedItems = event.data.selectedItems;
25324
+ if(event.data.isBatchEdit){
25325
+ selectedItems.forEach(function(selectedItem){
25326
+ items[selectedItem._index-1]._display.${field.name} = event.data._display.${field.name};
25327
+ })
25328
+ doAction({actionType: 'setValue', "args": {"value": {items}},componentId: "${options.crudId}","dataMergeMode": "override"});
25329
+ selectedItems.forEach(function(selectedItem){
25330
+ doAction({actionType: 'setValue', "args": {"value": event.data.${field.name}},componentId: "${options.objectName + "_" + field.name + "_"}" + selectedItem._index});
25331
+ })
25332
+ }else{
25333
+ items[event.data._index-1]._display.${field.name} = event.data._display.${field.name};
25334
+ doAction({actionType: 'setValue', "args": {"value": {items}},componentId: "${options.crudId}","dataMergeMode": "override"});
25335
+ doAction({actionType: 'setValue', "args": {"value": event.data.${field.name}},componentId: "${options.objectName + "_" + field.name + "_"}" + event.data._index});
25336
+ }
25337
+ `
25338
+ },
25339
+ {
25340
+ "actionType": "closeDialog"
25341
+ }
25342
+ ]
25343
+ }
25344
+ };
25345
+ quickEditSchema.onEvent = submitEvent;
25346
+ }
25347
+
25294
25348
  if (field.disabled) {
25295
25349
  quickEditSchema = false;
25296
25350
  } else {
@@ -25524,6 +25578,14 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
25524
25578
  }
25525
25579
 
25526
25580
  });
25581
+ if(field.type != 'avatar' && field.type != 'image' && field.type != 'file' && isAmisVersionforBatchEdit){
25582
+ quickEditSchema.body.push({
25583
+ "name": "isBatchEdit",
25584
+ "type": "checkbox",
25585
+ "option": "更新${COUNT(selectedItems)}个选定记录",
25586
+ "visibleOn": "${ARRAYSOME(selectedItems, item => item._id === _id) && COUNT(selectedItems)>1}"
25587
+ });
25588
+ }
25527
25589
  } else {
25528
25590
  quickEditSchema = false;
25529
25591
  }
@@ -25589,7 +25651,7 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
25589
25651
  {
25590
25652
  "args": {
25591
25653
  "api": {
25592
- "url": "${context.rootUrl}/api/files/files/${versions[0]}?download=true",
25654
+ "url": "${(versions[0] && versions[0].url) ? versions[0].url+'?download=true' : context.rootUrl+'/api/files/files/'+versions[0]+'?download=true'}",
25593
25655
  "method": "get",
25594
25656
  "headers": {
25595
25657
  "Authorization": "Bearer ${context.tenantId},${context.authToken}"
@@ -25636,7 +25698,7 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
25636
25698
  else if(field.type === 'select'){
25637
25699
  const map = getSelectMap(field.options);
25638
25700
  columnItem = Object.assign({}, {
25639
- type: "mapping",
25701
+ type: "static-mapping",
25640
25702
  name: field.name,
25641
25703
  label: field.label,
25642
25704
  map: map,
@@ -25651,7 +25713,7 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
25651
25713
  const tpl = await getFieldTpl(field, options);
25652
25714
  let type = 'text';
25653
25715
  if(tpl){
25654
- type = 'tpl';
25716
+ type = 'static';
25655
25717
  }else if(field.type === 'html'){
25656
25718
  type = 'markdown';
25657
25719
  }else if(field.type === 'url'){
@@ -25692,6 +25754,7 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
25692
25754
  columnItem.quickEdit = quickEditSchema;
25693
25755
  columnItem.quickEditEnabledOn = "${is_system !== true}";
25694
25756
  }
25757
+ columnItem.id = `${options.objectName}_${field.name}_\${_index}`;
25695
25758
  columns.push(columnItem);
25696
25759
  }
25697
25760
  }
@@ -26069,6 +26132,7 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
26069
26132
  }
26070
26133
  return {
26071
26134
  mode: "cards",
26135
+ perPageAvailable: [5, 10, 20, 50, 100, 500],
26072
26136
  name: "thelist",
26073
26137
  headerToolbarClassName: "py-2 px-2 border-gray-300 border-solid border-b",
26074
26138
  className: "",
@@ -26091,6 +26155,7 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
26091
26155
 
26092
26156
  return {
26093
26157
  mode: "table",
26158
+ perPageAvailable: [5, 10, 20, 50, 100, 500],
26094
26159
  name: "thelist",
26095
26160
  headerToolbarClassName: "py-2 px-2 border-gray-300 border-solid border-b",
26096
26161
  className: "",
@@ -31629,6 +31694,10 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
31629
31694
  };
31630
31695
  }), 2), items = _w[0], setItems = _w[1];
31631
31696
  var _x = __read(React.useState(Object.keys(items)), 2), containers = _x[0], setContainers = _x[1];
31697
+ React.useEffect(function () {
31698
+ setItems(value);
31699
+ setContainers(Object.keys(value));
31700
+ }, [value]);
31632
31701
  var handleChange = function (newItems) { return __awaiter(_this, void 0, void 0, function () {
31633
31702
  var value, rendererEvent;
31634
31703
  return __generator(this, function (_a) {
@@ -31645,7 +31714,7 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
31645
31714
  if (rendererEvent === null || rendererEvent === void 0 ? void 0 : rendererEvent.prevented) {
31646
31715
  return [2 /*return*/];
31647
31716
  }
31648
- setTimeout(function () { return amisOnChange(value); }, 1000);
31717
+ setTimeout(function () { return amisOnChange(value); }, 500);
31649
31718
  return [2 /*return*/];
31650
31719
  }
31651
31720
  });
@@ -31748,6 +31817,7 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
31748
31817
  var active = _a.active, over = _a.over;
31749
31818
  var overId = over === null || over === void 0 ? void 0 : over.id;
31750
31819
  if (overId == null || overId === TRASH_ID || active.id in items) {
31820
+ // 拖动的是分组则跳过后面的逻辑
31751
31821
  return;
31752
31822
  }
31753
31823
  var overContainer = findContainer(overId);
@@ -31825,14 +31895,37 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
31825
31895
  var overContainer = findContainer(overId);
31826
31896
  var newItems = items;
31827
31897
  if (overContainer) {
31828
- var activeIndex_1 = items[activeContainer].indexOf(active.id);
31829
- var overIndex_1 = items[overContainer].indexOf(overId);
31830
- if (activeIndex_1 !== overIndex_1) {
31831
- setItems(function (items) {
31832
- var _a;
31833
- newItems = __assign$1(__assign$1({}, items), (_a = {}, _a[overContainer] = arrayMove(items[overContainer], activeIndex_1, overIndex_1), _a));
31834
- return newItems;
31835
- });
31898
+ if (activeContainer !== overContainer) {
31899
+ // 拖动变更分组之间的顺序时,activeContainer overContainer 值不相等
31900
+ setTimeout(function () {
31901
+ var sortedGroups = over.data.current.sortable.items; //不加setTimeout的话,这里拿到的会是变更前的数据
31902
+ newItems = {};
31903
+ sortedGroups.forEach(function (groupKey) {
31904
+ newItems[groupKey] = items[groupKey];
31905
+ });
31906
+ delete newItems[TRASH_ID];
31907
+ delete newItems[PLACEHOLDER_ID];
31908
+ if (lodash.exports.keys(items).join(",") !== lodash.exports.keys(newItems).join(",")) {
31909
+ // 只有顺序发生变化时才触发change事件
31910
+ setItems(newItems);
31911
+ // console.log('拖动结束2,更新form value')
31912
+ handleChange(newItems);
31913
+ }
31914
+ setActiveId(null);
31915
+ }, 500);
31916
+ return;
31917
+ }
31918
+ else {
31919
+ // 同一个分组中字段顺序变更以及把一个字段从某个分组拖动到另一个分组内时,activeContainer 与 overContainer 值相等
31920
+ var activeIndex_1 = items[activeContainer].indexOf(active.id);
31921
+ var overIndex_1 = items[overContainer].indexOf(overId);
31922
+ if (activeIndex_1 !== overIndex_1) {
31923
+ setItems(function (items) {
31924
+ var _a;
31925
+ newItems = __assign$1(__assign$1({}, items), (_a = {}, _a[overContainer] = arrayMove(items[overContainer], activeIndex_1, overIndex_1), _a));
31926
+ return newItems;
31927
+ });
31928
+ }
31836
31929
  }
31837
31930
  }
31838
31931
  setActiveId(null);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@steedos-widgets/sortable",
3
- "version": "1.3.4-beta.17",
3
+ "version": "1.3.4-beta.19",
4
4
  "main": "dist/sortable.cjs.js",
5
5
  "module": "dist/sortable.esm.js",
6
6
  "unpkg": "dist/sortable.umd.js",
@@ -45,7 +45,7 @@
45
45
  "dependencies": {
46
46
  "@dnd-kit/core": "^6.0.5",
47
47
  "@dnd-kit/sortable": "^7.0.1",
48
- "@steedos-widgets/amis-lib": "1.3.4-beta.17"
48
+ "@steedos-widgets/amis-lib": "1.3.4-beta.19"
49
49
  },
50
- "gitHead": "184247f4260015e19c82a49fa4d6562839e73d2c"
50
+ "gitHead": "e0636927f13d497d2f2838d60ead4abaa331a615"
51
51
  }
@@ -1,6 +1,6 @@
1
1
  import React, { useCallback, useEffect, useRef, useState } from 'react';
2
2
  import { createPortal, unstable_batchedUpdates } from 'react-dom';
3
- import { map, keyBy, cloneDeep } from 'lodash';
3
+ import { map, keyBy, cloneDeep, keys } from 'lodash';
4
4
 
5
5
  import { createObject } from '@steedos-widgets/amis-lib'
6
6
 
@@ -227,6 +227,11 @@ export function MultipleContainers(props) {
227
227
  Object.keys(items) as UniqueIdentifier[]
228
228
  );
229
229
 
230
+ useEffect(() => {
231
+ setItems(value as Items);
232
+ setContainers(Object.keys(value) as UniqueIdentifier[]);
233
+ }, [value]);
234
+
230
235
  const handleChange = async (newItems? : any) => {
231
236
  if (!amisDispatchEvent || !amisOnChange)
232
237
  return
@@ -243,7 +248,7 @@ export function MultipleContainers(props) {
243
248
  return;
244
249
  }
245
250
 
246
- setTimeout(()=> amisOnChange(value), 1000);
251
+ setTimeout(()=> amisOnChange(value), 500);
247
252
  }
248
253
 
249
254
  const [activeId, setActiveId] = useState<UniqueIdentifier | null>(null);
@@ -384,6 +389,7 @@ export function MultipleContainers(props) {
384
389
  const overId = over?.id;
385
390
 
386
391
  if (overId == null || overId === TRASH_ID || active.id in items) {
392
+ // 拖动的是分组则跳过后面的逻辑
387
393
  return;
388
394
  }
389
395
 
@@ -496,21 +502,45 @@ export function MultipleContainers(props) {
496
502
  let newItems = items;
497
503
 
498
504
  if (overContainer) {
499
- const activeIndex = items[activeContainer].indexOf(active.id);
500
- const overIndex = items[overContainer].indexOf(overId);
501
-
502
- if (activeIndex !== overIndex) {
503
- setItems((items) => {
504
- newItems = {
505
- ...items,
506
- [overContainer]: arrayMove(
507
- items[overContainer],
508
- activeIndex,
509
- overIndex
510
- ),
505
+ if(activeContainer !== overContainer){
506
+ // 拖动变更分组之间的顺序时,activeContainer overContainer 值不相等
507
+ setTimeout(function(){
508
+ const sortedGroups = over.data.current.sortable.items; //不加setTimeout的话,这里拿到的会是变更前的数据
509
+ newItems = {};
510
+ sortedGroups.forEach((groupKey: string) => {
511
+ newItems[groupKey] = items[groupKey];
512
+ });
513
+ delete newItems[TRASH_ID];
514
+ delete newItems[PLACEHOLDER_ID];
515
+ if(keys(items).join(",") !== keys(newItems).join(",")){
516
+ // 只有顺序发生变化时才触发change事件
517
+ setItems(newItems);
518
+ // console.log('拖动结束2,更新form value')
519
+ handleChange(newItems)
511
520
  }
512
- return newItems;
513
- });
521
+
522
+ setActiveId(null);
523
+ },500);
524
+ return;
525
+ }
526
+ else {
527
+ // 同一个分组中字段顺序变更以及把一个字段从某个分组拖动到另一个分组内时,activeContainer 与 overContainer 值相等
528
+ const activeIndex = items[activeContainer].indexOf(active.id);
529
+ const overIndex = items[overContainer].indexOf(overId);
530
+
531
+ if (activeIndex !== overIndex) {
532
+ setItems((items) => {
533
+ newItems = {
534
+ ...items,
535
+ [overContainer]: arrayMove(
536
+ items[overContainer],
537
+ activeIndex,
538
+ overIndex
539
+ ),
540
+ }
541
+ return newItems;
542
+ });
543
+ }
514
544
  }
515
545
  }
516
546