@steedos-widgets/sortable 1.3.4-beta.9 → 1.3.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.
@@ -20381,7 +20381,7 @@
20381
20381
  if(optionColor){
20382
20382
  const background = optionColor.charAt(0) === '#' ? optionColor : '#'+optionColor;
20383
20383
  const color = getContrastColor(background);
20384
- const optionColorStyle = 'background:'+background+';color:'+color;
20384
+ const optionColorStyle = 'background:'+background+';color:'+color+';line-height:1.5rem';
20385
20385
  map[optionValue] = `<span class="rounded-xl px-2 py-1" style='${optionColorStyle}'>${option.label}</span>`;
20386
20386
  }else {
20387
20387
  map[optionValue] = option.label;
@@ -20642,17 +20642,17 @@
20642
20642
  }
20643
20643
 
20644
20644
  const countQuery = options.count === false ? "" : `,count:${object.name}__count(filters:{__filters})`;
20645
- const moreQuerie = options.moreQueries?.length ? ("," + options.moreQueries.map(function(item){
20646
- // 把最外层的{}去除
20647
- return item.replace(/^{/,"").replace(/}$/,"");
20648
- }).join(",")) : "";
20645
+ // const moreQuerie = options.moreQueries?.length ? ("," + options.moreQueries.map(function(item){
20646
+ // // 把最外层的{}去除
20647
+ // return item.replace(/^{/,"").replace(/}$/,"");
20648
+ // }).join(",")) : "";
20649
20649
 
20650
20650
  return {
20651
20651
  orderBy: "${orderBy}",
20652
20652
  orderDir: "${orderDir}",
20653
20653
  pageNo: "${page}",
20654
20654
  pageSize: "${perPage}",
20655
- query: `{${alias}:${object.name}${queryOptions}{${await getFieldsTemplate(fields, options.expand)}${treeFields}${cfsFields}}${countQuery}${moreQuerie}}`
20655
+ query: `{${alias}:${object.name}${queryOptions}{${await getFieldsTemplate(fields, options.expand)}${treeFields}${cfsFields}}${countQuery}}`
20656
20656
  }
20657
20657
  }
20658
20658
 
@@ -21454,7 +21454,7 @@
21454
21454
  showFieldsFilter = true;
21455
21455
  }
21456
21456
  filterService.setData({showFieldsFilter});
21457
- resizeWindow();
21457
+ // resizeWindow();//已迁移到搜索栏表单提交事件中执行,因为表单项change后也会触发表单提交了
21458
21458
  // 使用filterForm.getValues()的话,并不能拿到本地存储中的过滤条件,所以需要从event.data中取。
21459
21459
  let filterFormValues = event.data;
21460
21460
  let isFieldsFilterEmpty = SteedosUI.isFilterFormValuesEmpty(filterFormValues);
@@ -21518,7 +21518,8 @@
21518
21518
  if(isLookup){
21519
21519
  searchableFieldsStoreKey += "/lookup/" + objectName;
21520
21520
  }
21521
- let defaultSearchableFields = sessionStorage.getItem(searchableFieldsStoreKey);
21521
+ searchableFieldsStoreKey = searchableFieldsStoreKey + "/" + (data.context && data.context.userId);
21522
+ let defaultSearchableFields = localStorage.getItem(searchableFieldsStoreKey);
21522
21523
  if(defaultSearchableFields){
21523
21524
  defaultSearchableFields = defaultSearchableFields.split(",");
21524
21525
  }
@@ -21587,7 +21588,8 @@
21587
21588
  if(isLookup){
21588
21589
  searchableFieldsStoreKey += "/lookup/" + objectName;
21589
21590
  }
21590
- sessionStorage.setItem(searchableFieldsStoreKey, value);
21591
+ searchableFieldsStoreKey = searchableFieldsStoreKey + "/" + (data.context && data.context.userId);
21592
+ localStorage.setItem(searchableFieldsStoreKey, value);
21591
21593
 
21592
21594
  // ===START===:当变更可搜索字段时,如果被移除的可搜索字段在本地存储中已经存入过滤条件中则应该清除本地存储中相关字段的过滤条件。
21593
21595
  const searchableFields = data.fields;
@@ -22093,7 +22095,8 @@
22093
22095
  "&": "${list_view}",
22094
22096
  "name":"",
22095
22097
  "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
22098
+ "shared":false,
22099
+ "object_name": "${targetObjectName}",
22097
22100
  },
22098
22101
  "fieldsExtend": fieldsExtend$3(),
22099
22102
  "fields": fields(),
@@ -22881,7 +22884,7 @@ let resizeWindow = function(){
22881
22884
  //触发amis crud 高度重算
22882
22885
  setTimeout(()=>{
22883
22886
  window.dispatchEvent(new Event("resize"))
22884
- }, 500);
22887
+ }, 1000);
22885
22888
  }
22886
22889
  resizeWindow();
22887
22890
  // 手机端在显示搜索栏时隐藏crud上的刷新按钮,因为点击后crud高度显示有问题
@@ -22943,7 +22946,8 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
22943
22946
  "placeholder": "搜索此列表",
22944
22947
  "value": crudKeywords,
22945
22948
  "clearable": true,
22946
- "clearAndSubmit": true
22949
+ "clearAndSubmit": true,
22950
+ "searchImediately": true
22947
22951
  }
22948
22952
  ]
22949
22953
  }
@@ -23118,6 +23122,7 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
23118
23122
  }
23119
23123
 
23120
23124
  function getObjectFooterToolbar(mainObject, formFactor, options) {
23125
+ // crud card模式与table模式两种情况下showPageInput默认值不一样,所以需要显式设置为false
23121
23126
  if (formFactor === 'SMALL') {
23122
23127
  // return [
23123
23128
  // "load-more",
@@ -23127,14 +23132,17 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
23127
23132
  "switch-per-page",
23128
23133
  {
23129
23134
  "type": "pagination",
23130
- "maxButtons": 5
23135
+ "maxButtons": 5,
23136
+ "showPageInput": false
23131
23137
  }
23132
23138
  ]
23133
23139
  }else {
23134
23140
  return [
23141
+ // "statistics",
23135
23142
  {
23136
23143
  "type": "pagination",
23137
- "maxButtons": 5
23144
+ "maxButtons": 5,
23145
+ "showPageInput": false
23138
23146
  }
23139
23147
  ]
23140
23148
  }
@@ -23143,32 +23151,81 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
23143
23151
  if(options && options.isRelated){
23144
23152
  return [
23145
23153
  "statistics",
23146
- "pagination"
23154
+ {
23155
+ "type": "pagination",
23156
+ "maxButtons": 10,
23157
+ "showPageInput": false
23158
+ }
23147
23159
  ]
23148
23160
 
23149
23161
  }
23150
23162
  else {
23151
- return [
23152
- "switch-per-page",
23163
+ const no_pagination = mainObject.paging && (mainObject.paging.enabled === false);
23164
+ const is_lookup = options.isLookup;
23165
+ const commonConfig = [
23153
23166
  "statistics",
23154
- "pagination"
23155
- ]
23167
+ {
23168
+ "type": "pagination",
23169
+ "maxButtons": 10,
23170
+ "showPageInput": false
23171
+ }
23172
+ ];
23173
+
23174
+ if (no_pagination && is_lookup) {
23175
+ return commonConfig;
23176
+ } else {
23177
+ return ["switch-per-page", ...commonConfig];
23178
+ }
23156
23179
  }
23157
23180
  }
23158
23181
  }
23159
23182
 
23160
23183
  async function getObjectFilter(objectSchema, fields, options) {
23161
23184
  const fieldsFilterBarSchema = await getObjectListHeaderFieldsFilterBar(objectSchema, null, options);
23185
+ let onSubmitSuccScript = `
23186
+ let isLookup = event.data.isLookup;
23187
+ if(isLookup){
23188
+ return;
23189
+ }
23190
+ // 列表搜索栏字段值变更后立刻触发提交表单执行crud搜索,所以这里需要额外重算crud高度及筛选按钮红色星号图标显示隐藏
23191
+ let resizeWindow = function(){
23192
+ //触发amis crud 高度重算
23193
+ setTimeout(()=>{
23194
+ window.dispatchEvent(new Event("resize"))
23195
+ }, 1000);
23196
+ }
23197
+ resizeWindow();
23198
+ const scope = event.context.scoped;
23199
+ // let filterFormValues = event.data;
23200
+ let filterForm = SteedosUI.getClosestAmisComponentByType(scope, "form");
23201
+ let filterFormService = SteedosUI.getClosestAmisComponentByType(filterForm.context, "service");
23202
+ // 使用event.data的话,并不能拿到本地存储中的过滤条件,所以需要从filterFormService中取。
23203
+ let filterFormValues = filterFormService.getData()
23204
+ let isFieldsFilterEmpty = SteedosUI.isFilterFormValuesEmpty(filterFormValues);
23205
+ let crud = SteedosUI.getClosestAmisComponentByType(scope, "crud");
23206
+ let crudService = crud && SteedosUI.getClosestAmisComponentByType(crud.context, "service");
23207
+ crudService && crudService.setData({isFieldsFilterEmpty});
23208
+ `;
23162
23209
  return {
23163
23210
  "title": "",
23164
23211
  "submitText": "",
23165
23212
  "className": "",
23166
- // "debug": true,
23213
+ "debug": true,
23167
23214
  "mode": "normal",
23168
23215
  "wrapWithPanel": false,
23169
23216
  "body": [
23170
23217
  fieldsFilterBarSchema
23171
- ]
23218
+ ],
23219
+ "onEvent": {
23220
+ "submitSucc": {
23221
+ "actions": [
23222
+ {
23223
+ "actionType": "custom",
23224
+ "script": onSubmitSuccScript
23225
+ }
23226
+ ]
23227
+ }
23228
+ }
23172
23229
  }
23173
23230
  }
23174
23231
 
@@ -23789,13 +23846,15 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
23789
23846
  pickerSchema.headerToolbar = getObjectHeaderToolbar(refObjectConfig, fieldsArr, ctx.formFactor, { headerToolbarItems, isLookup: true, keywordsSearchBoxName });
23790
23847
  const isAllowCreate = refObjectConfig.permissions.allowCreate;
23791
23848
  const isCreate = lodash.exports.isBoolean(field.create) ? field.create : true;
23792
- if (isAllowCreate && isCreate) {
23849
+ // lookup字段配置过滤条件就强制不显示新建按钮
23850
+ let isHasFilters = (field.filters || field._filtersFunction) ? true : false;
23851
+ if (isAllowCreate && isCreate && !isHasFilters) {
23793
23852
  const new_button = await getSchema$5(refObjectConfig, { appId: ctx.appId, objectName: refObjectConfig.name, formFactor: ctx.formFactor });
23794
23853
  new_button.align = "right";
23795
23854
  // 保持快速搜索放在最左侧,新建按钮往里插,而不是push到最后
23796
23855
  pickerSchema.headerToolbar.splice(pickerSchema.headerToolbar.length - 1, 0, new_button);
23797
23856
  }
23798
- pickerSchema.footerToolbar = refObjectConfig.enable_tree ? [] : getObjectFooterToolbar();
23857
+ pickerSchema.footerToolbar = refObjectConfig.enable_tree ? [] : getObjectFooterToolbar(refObjectConfig,ctx.formFactor,{isLookup: true});
23799
23858
  if (ctx.filterVisible !== false) {
23800
23859
  pickerSchema.filter = await getObjectFilter(refObjectConfig, fields, {
23801
23860
  ...ctx,
@@ -23923,10 +23982,10 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
23923
23982
  // const labelFieldKey = referenceTo && referenceTo.labelField?.name || 'name';
23924
23983
 
23925
23984
  let apiInfo;
23926
-
23985
+ let defaultValueOptionsQueryData;
23927
23986
  if(referenceTo){
23928
23987
  // 字段值单独走一个请求合并到source的同一个GraphQL接口中
23929
- const defaultValueOptionsQueryData = await getFindQuery({ name: referenceTo.objectName }, null, [
23988
+ defaultValueOptionsQueryData = await getFindQuery({ name: referenceTo.objectName }, null, [
23930
23989
  Object.assign({}, referenceTo.labelField, {alias: 'label'}),
23931
23990
  Object.assign({}, referenceTo.valueField, {alias: 'value'})
23932
23991
  ], {
@@ -23939,7 +23998,7 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
23939
23998
  }, null, [
23940
23999
  Object.assign({}, referenceTo.labelField, {alias: 'label'}),
23941
24000
  Object.assign({}, referenceTo.valueField, {alias: 'value'})
23942
- ], {expand: false, alias: 'options', queryOptions: `filters: {__filters}, top: {__top}, sort: "{__sort}"`, moreQueries: [defaultValueOptionsQueryData.query]});
24001
+ ], {expand: false, alias: 'options', queryOptions: `filters: {__filters}, top: {__top}, sort: "{__sort}"`});
23943
24002
 
23944
24003
  apiInfo.adaptor = `
23945
24004
  const data = payload.data;
@@ -24033,11 +24092,16 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
24033
24092
  var optionsFiltersOp = "${field.multiple ? "in" : "="}";
24034
24093
  var optionsFilters = [["${valueFieldKey}", optionsFiltersOp, []]];
24035
24094
  if (defaultValue && !api.data.$term) {
24095
+ const defaultValueOptionsQueryData = ${JSON.stringify(defaultValueOptionsQueryData)};
24096
+ const defaultValueOptionsQuery = defaultValueOptionsQueryData?.query?.replace(/^{/,"").replace(/}$/,"");
24036
24097
  // 字段值单独请求,没值的时候在请求中返回空
24037
24098
  optionsFilters = [["${valueFieldKey}", optionsFiltersOp, defaultValue]];
24038
24099
  if(filters.length > 0){
24039
24100
  optionsFilters = [filters, optionsFilters];
24040
24101
  }
24102
+ if(defaultValueOptionsQuery){
24103
+ api.data.query = "{"+api.data.query.replace(/^{/,"").replace(/}$/,"")+","+defaultValueOptionsQuery+"}";
24104
+ }
24041
24105
  }
24042
24106
  api.data.query = api.data.query.replace(/{__options_filters}/g, JSON.stringify(optionsFilters));
24043
24107
  return api;
@@ -24079,7 +24143,7 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
24079
24143
  disabledOn: `${readonly} || ( (this._master && (this._master.relatedKey ==='${field.name}')) || ((this.relatedKey ==='${field.name}') && (${field.multiple} != true)) )`,
24080
24144
  // labelField: labelField,
24081
24145
  // valueField: valueField,
24082
- source: apiInfo,
24146
+ // source: apiInfo,
24083
24147
  autoComplete: apiInfo,
24084
24148
  searchable: true,
24085
24149
  };
@@ -24158,10 +24222,10 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
24158
24222
 
24159
24223
  const refObject = await getUISchema(referenceTo.objectName);
24160
24224
 
24161
- // 此处不参考 steedos 的 enable_enhanced_lookup 规则. 如果默认是开启弹出选择,用户选择过程操作太繁琐, 所以默认是关闭弹出选择.
24162
- // 由于amis picker 目前不支持联动, 配置了depend_on时, 使用使用select ,以支持联动
24163
- // TODO: 确认 amis picker 支持联动时, 清理field.depend_on判断
24164
- if(refObject.enable_enhanced_lookup == true && lodash.exports.isEmpty(field.depend_on)){
24225
+ // 优先取字段中配置的enable_enhanced_lookup,字段上没配置时,才从对象上取enable_enhanced_lookup属性
24226
+ let enableEnhancedLookup = lodash.exports.isBoolean(field.enable_enhanced_lookup) ? field.enable_enhanced_lookup : refObject.enable_enhanced_lookup;
24227
+ // 默认使用下拉框模式显示lookup选项,只能配置了enable_enhanced_lookup才使用弹出增强模式
24228
+ if(enableEnhancedLookup == true){
24165
24229
  return await lookupToAmisPicker(field, readonly, ctx);
24166
24230
  }else if(refObject.enable_tree) {
24167
24231
  return await lookupToAmisTreeSelect(field, readonly, Object.assign({}, ctx, {
@@ -24474,8 +24538,8 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
24474
24538
  /*
24475
24539
  * @Author: baozhoutao@steedos.com
24476
24540
  * @Date: 2022-10-28 14:15:09
24477
- * @LastEditors: baozhoutao@steedos.com
24478
- * @LastEditTime: 2022-11-02 18:06:16
24541
+ * @LastEditors: liaodaxue
24542
+ * @LastEditTime: 2023-10-30 17:51:54
24479
24543
  * @Description:
24480
24544
  */
24481
24545
 
@@ -24526,11 +24590,26 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
24526
24590
  useChunk: false, // 关闭分块上传
24527
24591
  receiver: {
24528
24592
  method: "post",
24593
+ dataType: "form-data",
24529
24594
  url: `\${context.rootUrl}/s3/${tableName}`,
24530
- data: {
24531
- $: "$$",
24532
- context: `\${context}`,
24533
- },
24595
+ requestAdaptor: `
24596
+ const { _master, global,context } = api.body;
24597
+ // const { recordId, objectName } = _master;
24598
+ const { spaceId, userId, user } = global;
24599
+ /*
24600
+ record_id: recordId,
24601
+ parent: recordId,
24602
+ object_name: objectName,
24603
+ owner_name: user.name,
24604
+ space: spaceId,
24605
+ owner: userId
24606
+ */
24607
+ // 参考platform 2.2版本,附件字段保存时cfs.files.filerecord、cfs.images.filerecord表中的metadata下只保存space、owner两个属性值。
24608
+ api.data.append('space', spaceId);
24609
+ api.data.append('owner', userId);
24610
+
24611
+ return api;
24612
+ `,
24534
24613
  adaptor: `
24535
24614
  const { context } = api.body;
24536
24615
  var rootUrl = context.rootUrl + "/api/files/${tableName}/";
@@ -24611,8 +24690,6 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
24611
24690
  }
24612
24691
 
24613
24692
  async function convertSFieldToAmisField(field, readonly, ctx) {
24614
- // console.log('convertSFieldToAmisField====>', field, readonly, ctx)
24615
- const isMobile = window.innerWidth <= 768;
24616
24693
  // 创建人和修改人、创建时间和修改时间不显示
24617
24694
  if(lodash.exports.includes(OMIT_FIELDS, field.name) && ctx.showSystemFields != true){
24618
24695
  return;
@@ -24701,26 +24778,33 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
24701
24778
  };
24702
24779
  break;
24703
24780
  case 'date':
24704
- convertData = isMobile && !readonly ? {
24705
- type: "native-date",
24706
- pipeIn: (value, data) => {
24707
- if (value) {
24708
- value = moment(value).utc().format('YYYY-MM-DD');
24709
- return value;
24710
- } else {
24711
- return "";
24712
- }
24713
-
24714
- },
24715
- pipeOut: (value, oldValue, data) => {
24716
- if (value) {
24717
- value = moment(value).format('YYYY-MM-DDT00:00:00.000[Z]');
24718
- return value;
24719
- } else {
24720
- return "";
24721
- }
24722
- }
24723
- } : {
24781
+ // convertData = isMobile && !readonly ? {
24782
+ // type: "native-date",
24783
+ // pipeIn: (value, data) => {
24784
+ // if (value) {
24785
+ // value = moment(value).utc().format('YYYY-MM-DD');
24786
+ // return value;
24787
+ // } else {
24788
+ // return "";
24789
+ // }
24790
+
24791
+ // },
24792
+ // pipeOut: (value, oldValue, data) => {
24793
+ // if (value) {
24794
+ // value = moment(value).format('YYYY-MM-DDT00:00:00.000[Z]');
24795
+ // return value;
24796
+ // } else {
24797
+ // return "";
24798
+ // }
24799
+ // }
24800
+ // } : {
24801
+ // type: getAmisStaticFieldType('date', readonly),
24802
+ // inputFormat: "YYYY-MM-DD",
24803
+ // format:'YYYY-MM-DDT00:00:00.000[Z]',
24804
+ // tpl: readonly ? Tpl.getDateTpl(field) : null,
24805
+ // // utc: true
24806
+ // }
24807
+ convertData = {
24724
24808
  type: getAmisStaticFieldType('date', readonly),
24725
24809
  inputFormat: "YYYY-MM-DD",
24726
24810
  format:'YYYY-MM-DDT00:00:00.000[Z]',
@@ -24739,43 +24823,51 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
24739
24823
  };
24740
24824
  break;
24741
24825
  case 'datetime':
24742
- convertData = isMobile && !readonly ? {
24743
- type: "combo",
24744
- pipeIn: (value, data) => {
24745
- let revalue = {};
24746
- if (value && value != "Invalid date") {
24747
- value = moment(value).format('YYYY-MM-DD HH:mm:ss');
24748
- revalue[field.name + "-native-date"] = value.split(' ')[0];
24749
- revalue[field.name + "-native-time"] = value.split(' ')[1];
24750
- } else {
24751
- revalue[field.name + "-native-date"] = "";
24752
- revalue[field.name + "-native-time"] = "";
24753
- }
24754
- return revalue;
24755
- },
24756
- pipeOut: (value, oldValue, data) => {
24757
- let revalue = "";
24758
- if (value[field.name + "-native-date"] && value[field.name + "-native-time"]) {
24759
- revalue = value[field.name + "-native-date"] + " " + value[field.name + "-native-time"];
24760
- revalue = moment(revalue).utc().format('YYYY-MM-DDTHH:mm:ss.SSS[Z]');
24761
- }
24762
- return revalue;
24763
- },
24764
- items: [
24765
- {
24766
- type: "native-date",
24767
- name: field.name + "-native-date",
24768
- className: "steedos-native-date",
24769
- value: ""
24770
- },
24771
- {
24772
- type: "native-time",
24773
- name: field.name + "-native-time",
24774
- className: "steedos-native-time",
24775
- value: ""
24776
- }
24777
- ]
24778
- } : {
24826
+ // convertData = isMobile && !readonly ? {
24827
+ // type: "combo",
24828
+ // pipeIn: (value, data) => {
24829
+ // let revalue = {};
24830
+ // if (value && value != "Invalid date") {
24831
+ // value = moment(value).format('YYYY-MM-DD HH:mm:ss');
24832
+ // revalue[field.name + "-native-date"] = value.split(' ')[0];
24833
+ // revalue[field.name + "-native-time"] = value.split(' ')[1];
24834
+ // } else {
24835
+ // revalue[field.name + "-native-date"] = "";
24836
+ // revalue[field.name + "-native-time"] = "";
24837
+ // }
24838
+ // return revalue;
24839
+ // },
24840
+ // pipeOut: (value, oldValue, data) => {
24841
+ // let revalue = "";
24842
+ // if (value[field.name + "-native-date"] && value[field.name + "-native-time"]) {
24843
+ // revalue = value[field.name + "-native-date"] + " " + value[field.name + "-native-time"];
24844
+ // revalue = moment(revalue).utc().format('YYYY-MM-DDTHH:mm:ss.SSS[Z]');
24845
+ // }
24846
+ // return revalue;
24847
+ // },
24848
+ // items: [
24849
+ // {
24850
+ // type: "native-date",
24851
+ // name: field.name + "-native-date",
24852
+ // className: "steedos-native-date",
24853
+ // value: ""
24854
+ // },
24855
+ // {
24856
+ // type: "native-time",
24857
+ // name: field.name + "-native-time",
24858
+ // className: "steedos-native-time",
24859
+ // value: ""
24860
+ // }
24861
+ // ]
24862
+ // } : {
24863
+ // type: getAmisStaticFieldType('datetime', readonly),
24864
+ // inputFormat: 'YYYY-MM-DD HH:mm',
24865
+ // format: 'YYYY-MM-DDTHH:mm:ss.SSSZ',
24866
+ // tpl: readonly ? Tpl.getDateTimeTpl(field) : null,
24867
+ // utc: true,
24868
+ // }
24869
+
24870
+ convertData = {
24779
24871
  type: getAmisStaticFieldType('datetime', readonly),
24780
24872
  inputFormat: 'YYYY-MM-DD HH:mm',
24781
24873
  format: 'YYYY-MM-DDTHH:mm:ss.SSSZ',
@@ -24795,26 +24887,34 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
24795
24887
  };
24796
24888
  break;
24797
24889
  case 'time':
24798
- convertData = isMobile && !readonly ? {
24799
- type: "native-time",
24800
- pipeIn: (value, data) => {
24801
- if (value) {
24802
- value = moment(value).utc().format('HH:mm');
24803
- return value;
24804
- } else {
24805
- return "";
24806
- }
24807
-
24808
- },
24809
- pipeOut: (value, oldValue, data) => {
24810
- if (value) {
24811
- value = moment('1970-01-01 ' + value).format('1970-01-01THH:mm:00.000[Z]');
24812
- return value;
24813
- } else {
24814
- return "";
24815
- }
24816
- }
24817
- } : {
24890
+ // convertData = isMobile && !readonly ? {
24891
+ // type: "native-time",
24892
+ // pipeIn: (value, data) => {
24893
+ // if (value) {
24894
+ // value = moment(value).utc().format('HH:mm');
24895
+ // return value;
24896
+ // } else {
24897
+ // return "";
24898
+ // }
24899
+
24900
+ // },
24901
+ // pipeOut: (value, oldValue, data) => {
24902
+ // if (value) {
24903
+ // value = moment('1970-01-01 ' + value).format('1970-01-01THH:mm:00.000[Z]');
24904
+ // return value;
24905
+ // } else {
24906
+ // return "";
24907
+ // }
24908
+ // }
24909
+ // } : {
24910
+ // type: getAmisStaticFieldType('time', readonly),
24911
+ // inputFormat: 'HH:mm',
24912
+ // timeFormat:'HH:mm',
24913
+ // format:'1970-01-01THH:mm:00.000[Z]',
24914
+ // tpl: readonly ? Tpl.getDateTimeTpl(field) : null,
24915
+ // // utc: true
24916
+ // }
24917
+ convertData = {
24818
24918
  type: getAmisStaticFieldType('time', readonly),
24819
24919
  inputFormat: 'HH:mm',
24820
24920
  timeFormat:'HH:mm',
@@ -24864,7 +24964,20 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
24864
24964
  type: getAmisStaticFieldType('number', readonly),
24865
24965
  min: field.min,
24866
24966
  max: field.max,
24867
- precision: field.scale
24967
+ precision: field.scale,
24968
+ suffix: "%",
24969
+ pipeIn: (value, data) => {
24970
+ if(value){
24971
+ return value*100;
24972
+ }
24973
+ return value;
24974
+ },
24975
+ pipeOut: (value, oldValue, data) => {
24976
+ if(value){
24977
+ return value/100;
24978
+ }
24979
+ return value;
24980
+ },
24868
24981
  };
24869
24982
  }
24870
24983
  break;
@@ -25198,7 +25311,9 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
25198
25311
 
25199
25312
  const amisField = await convertSFieldToAmisField(_field, false, Object.assign({}, ctx, {fieldNamePrefix: fieldNamePrefix, required: false, showSystemFields: true, inFilterForm: true}));
25200
25313
  if(amisField){
25201
- return amisField;
25314
+ return Object.assign({}, amisField,{
25315
+ submitOnChange: true
25316
+ });
25202
25317
  }
25203
25318
  }
25204
25319
  }
@@ -25259,8 +25374,46 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
25259
25374
  };
25260
25375
 
25261
25376
  async function getQuickEditSchema(field, options){
25262
- const quickEditId = options.objectName + "_" + field.name + "QuickEdit";//定义快速编辑的表单id,用于setvalue传值
25377
+ //判断在amis3.2以上环境下,放开批量编辑
25378
+ let isAmisVersionforBatchEdit = false;
25379
+ if(window.amisRequire && window.amisRequire('amis')){
25380
+ isAmisVersionforBatchEdit = window.amisRequire('amis').version[0] >= 3 && window.amisRequire('amis').version[2] >= 2;
25381
+ }else if(window.Amis){
25382
+ isAmisVersionforBatchEdit = window.Amis.version[0] >= 3 && window.Amis.version[2] >= 2;
25383
+ }
25384
+ const quickEditId = options.objectName + "_" + field.name + "_quickEdit";//定义快速编辑的表单id,用于setvalue传值
25263
25385
  var quickEditSchema = { body: [], id: quickEditId };
25386
+ //select,avatar,image,file等组件无法行记录字段赋值,暂不支持批量编辑;
25387
+ if(field.type != 'avatar' && field.type != 'image' && field.type != 'file' && isAmisVersionforBatchEdit){
25388
+ const submitEvent = {
25389
+ submit: {
25390
+ actions: [
25391
+ {
25392
+ actionType: "custom",
25393
+ script: `
25394
+ let items = _.cloneDeep(event.data.items);
25395
+ let selectedItems = _.cloneDeep(event.data.selectedItems);
25396
+ if(event.data.isBatchEdit){
25397
+ selectedItems.forEach(function(selectedItem){
25398
+ selectedItem._display.${field.name} = event.data._display.${field.name};
25399
+ doAction({actionType: 'setValue', "args": {"value": selectedItem._display},componentId: "_display_" + selectedItem._index});
25400
+ doAction({actionType: 'setValue', "args": {"value": event.data.${field.name}},componentId: "${options.objectName + "_" + field.name + "_"}" + selectedItem._index});
25401
+ })
25402
+ }else{
25403
+ doAction({actionType: 'setValue', "args": {"value": event.data._display},componentId: "_display_" + event.data._index});
25404
+ doAction({actionType: 'setValue', "args": {"value": event.data.${field.name}},componentId: "${options.objectName + "_" + field.name + "_"}" + event.data._index});
25405
+ }
25406
+ `
25407
+ },
25408
+ {
25409
+ "actionType": "closeDialog"
25410
+ }
25411
+ ]
25412
+ }
25413
+ };
25414
+ quickEditSchema.onEvent = submitEvent;
25415
+ }
25416
+
25264
25417
  if (field.disabled) {
25265
25418
  quickEditSchema = false;
25266
25419
  } else {
@@ -25277,7 +25430,7 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
25277
25430
  {
25278
25431
  "actionType": "custom",
25279
25432
  "script": `
25280
- var _display = event.data._display;
25433
+ var _display = _.cloneDeep(event.data._display);
25281
25434
  ${displayField}
25282
25435
  doAction({actionType: 'setValue', "args": {"value": {_display}},componentId: "${quickEditId}"});
25283
25436
  `
@@ -25299,7 +25452,7 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
25299
25452
  第二种是增加选项时,按照value的值,找到对应选项,并按照_display的规则为其赋值
25300
25453
  */
25301
25454
  TempDisplayField = `
25302
- const preData = event.data.__super.${field.name};
25455
+ const preData = _.cloneDeep(event.data.__super.${field.name});
25303
25456
  if(preData && event.data.${field.name}.length < preData.length){
25304
25457
  let deletedIndex;
25305
25458
  preData.forEach(function(item,index){
@@ -25343,7 +25496,7 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
25343
25496
  break;
25344
25497
  case "percent":
25345
25498
  TempDisplayField = `
25346
- _display["${field.name}"] = (event.data.value * 100).toFixed(${field.scale}) + '%';
25499
+ _display["${field.name}"] = event.data.value.toFixed(${field.scale}) + '%';
25347
25500
  `;
25348
25501
  quickEditSchema.body[0].onEvent["change"] = quickEditOnEvent(TempDisplayField);
25349
25502
  break;
@@ -25494,6 +25647,131 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
25494
25647
  }
25495
25648
 
25496
25649
  });
25650
+ if(field.type != 'avatar' && field.type != 'image' && field.type != 'file' && isAmisVersionforBatchEdit){
25651
+ quickEditSchema.body.push({
25652
+ "name": "isBatchEdit",
25653
+ "type": "checkbox",
25654
+ "option": [
25655
+ {
25656
+ "type": "tpl",
25657
+ "tpl": "更新${COUNT(selectedItems)}个选定记录"
25658
+ },
25659
+ {
25660
+ "type": "spinner",
25661
+ "showOn": "${batchPermissionLoading}",
25662
+ "size": "sm",
25663
+ "className": "mr-4"
25664
+ }
25665
+ ],
25666
+ "visibleOn": "${ARRAYSOME(selectedItems, item => item._id === _id) && COUNT(selectedItems)>1 && quickedit_record_permissions.allowEdit && quickedit_record_permissions_loading == false}",
25667
+ "disabledOn": "${batchPermissionLoading}",
25668
+ "onEvent":{
25669
+ "change":{
25670
+ "actions":[
25671
+ {
25672
+ "actionType": "setValue",
25673
+ "componentId": quickEditId,
25674
+ "args": {
25675
+ "value":{
25676
+ "batchPermissionLoading": true
25677
+ }
25678
+ },
25679
+ "expression":"${event.data.value}"
25680
+ },
25681
+ {
25682
+ "actionType": "ajax",
25683
+ "args": {
25684
+ "api": {
25685
+ "url": "${context.rootUrl}/graphql",
25686
+ "method": "post",
25687
+ "headers": {
25688
+ "Authorization": "Bearer ${context.tenantId},${context.authToken}"
25689
+ },
25690
+ "data": {
25691
+ "query": "{rows:${objectName}(filters:[\"_id\",\"in\",${selectedItems | pick:_id | split | json}]){_id,_permissions{allowEdit}}}"
25692
+ },
25693
+ "adaptor": `
25694
+ const noPermission = [];
25695
+ payload.data.rows.forEach(function (row) {
25696
+ if(!row._permissions.allowEdit){
25697
+ noPermission.push(row._id);
25698
+ }
25699
+ })
25700
+ payload.data.noPermission = noPermission;
25701
+ return payload;
25702
+ `
25703
+ }
25704
+ },
25705
+ "expression":"${event.data.value}"
25706
+ },
25707
+ {
25708
+ "actionType": "setValue",
25709
+ "componentId": quickEditId,
25710
+ "args": {
25711
+ "value":{
25712
+ "batchPermissionLoading": false
25713
+ }
25714
+ },
25715
+ "expression":"${event.data.value}"
25716
+ },
25717
+ {
25718
+ "actionType": "dialog",
25719
+ "dialog":{
25720
+ "title": "记录权限",
25721
+ "showCloseButton": false,
25722
+ "body":[
25723
+ {
25724
+ "type": "tpl",
25725
+ "tpl": "当前选中记录中,有${COUNT(noPermission)}条记录无编辑权限,是否需要批量编辑其他记录?"
25726
+ }
25727
+ ],
25728
+ "onEvent":{
25729
+ "confirm":{
25730
+ "actions":[
25731
+ {
25732
+ "actionType": "custom",
25733
+ "script": `
25734
+ const noPermission = event.data.noPermission;
25735
+ const crudComponent = event.context.scoped.getComponentById("${options.crudId}");
25736
+ const selectedItems = crudComponent && crudComponent.props.store.selectedItems.concat();
25737
+ noPermission.forEach(function (item) {
25738
+ crudComponent && crudComponent.unSelectItem(_.find(selectedItems,{_id:item}));
25739
+ })
25740
+ `
25741
+ },
25742
+ {
25743
+ "actionType": "setValue",
25744
+ "componentId": quickEditId,
25745
+ "args": {
25746
+ "value":{
25747
+ "isBatchEdit": true
25748
+ }
25749
+ },
25750
+ }
25751
+ ]
25752
+ },
25753
+ "cancel":{
25754
+ "actions":[
25755
+ {
25756
+ "actionType": "setValue",
25757
+ "componentId": quickEditId,
25758
+ "args": {
25759
+ "value":{
25760
+ "isBatchEdit": false
25761
+ }
25762
+ },
25763
+ }
25764
+ ]
25765
+ }
25766
+ }
25767
+ },
25768
+ "expression":"${COUNT(event.data.noPermission)>0}"
25769
+ }
25770
+ ]
25771
+ }
25772
+ }
25773
+ });
25774
+ }
25497
25775
  } else {
25498
25776
  quickEditSchema = false;
25499
25777
  }
@@ -25528,6 +25806,8 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
25528
25806
  const columns = [];
25529
25807
  if(!options.isLookup){
25530
25808
  columns.push({name: '_index',type: 'text', width: 32, placeholder: ""});
25809
+ //将_display放入crud的columns中,可以通过setvalue修改行内数据域的_display,而不影响上层items的_display,用于批量编辑
25810
+ columns.push({name: '_display',type: 'static', width: 32, placeholder: "",id: "_display_${_index}", className: "hidden"});
25531
25811
  }
25532
25812
  const allowEdit = options.permissions?.allowEdit && !options.isLookup && options.enable_inline_edit != false;
25533
25813
 
@@ -25559,7 +25839,7 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
25559
25839
  {
25560
25840
  "args": {
25561
25841
  "api": {
25562
- "url": "${context.rootUrl}/api/files/files/${versions[0]}?download=true",
25842
+ "url": "${(versions[0] && versions[0].url) ? versions[0].url+'?download=true' : context.rootUrl+'/api/files/files/'+versions[0]+'?download=true'}",
25563
25843
  "method": "get",
25564
25844
  "headers": {
25565
25845
  "Authorization": "Bearer ${context.tenantId},${context.authToken}"
@@ -25606,7 +25886,7 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
25606
25886
  else if(field.type === 'select'){
25607
25887
  const map = getSelectMap(field.options);
25608
25888
  columnItem = Object.assign({}, {
25609
- type: "mapping",
25889
+ type: "static-mapping",
25610
25890
  name: field.name,
25611
25891
  label: field.label,
25612
25892
  map: map,
@@ -25621,7 +25901,7 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
25621
25901
  const tpl = await getFieldTpl(field, options);
25622
25902
  let type = 'text';
25623
25903
  if(tpl){
25624
- type = 'tpl';
25904
+ type = 'static';
25625
25905
  }else if(field.type === 'html'){
25626
25906
  type = 'markdown';
25627
25907
  }else if(field.type === 'url'){
@@ -25662,6 +25942,7 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
25662
25942
  columnItem.quickEdit = quickEditSchema;
25663
25943
  columnItem.quickEditEnabledOn = "${is_system !== true}";
25664
25944
  }
25945
+ columnItem.id = `${options.objectName}_${field.name}_\${_index}`;
25665
25946
  columns.push(columnItem);
25666
25947
  }
25667
25948
  }
@@ -25940,7 +26221,7 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
25940
26221
  }
25941
26222
  return {
25942
26223
  type: 'operation',
25943
- label: instance.t('frontend_operation'),
26224
+ label: "",
25944
26225
  fixed: 'right',
25945
26226
  labelClassName: 'text-center',
25946
26227
  className: 'text-center steedos-listview-operation w-10',
@@ -25974,23 +26255,87 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
25974
26255
  }
25975
26256
  }
25976
26257
 
26258
+ async function getDefaultCrudCard(columns, options) {
26259
+ let labelFieldName = options?.labelFieldName || "name";
26260
+ let titleColumn, bodyColumns = [];
26261
+ columns.forEach(function (item) {
26262
+ delete item.quickEdit;
26263
+ delete item.width;
26264
+ if (item.name === labelFieldName) {
26265
+ titleColumn = item;
26266
+ }
26267
+ else {
26268
+ if (item.name !== "_index") {
26269
+ bodyColumns.push(item);
26270
+ }
26271
+ }
26272
+ });
26273
+ let card = {
26274
+ "header": {
26275
+ "title": titleColumn.tpl
26276
+ },
26277
+ body: bodyColumns,
26278
+ // useCardLabel: false,
26279
+ toolbar: []
26280
+ };
26281
+ let hideToolbarOperation = options.formFactor === 'SMALL' || ["split"].indexOf(options.displayAs) > -1;
26282
+ if(!hideToolbarOperation){
26283
+ let toolbarOperation = await getTableOperation(options);
26284
+ if (toolbarOperation) {
26285
+ toolbarOperation.className += " inline-block w-auto";
26286
+ }
26287
+ card.toolbar.push(toolbarOperation);
26288
+ }
26289
+ return card;
26290
+ }
26291
+
25977
26292
  async function getTableSchema$1(fields, options){
25978
26293
  if(!options){
25979
26294
  options = {};
25980
26295
  }
25981
26296
  let { isLookup, hiddenColumnOperation } = options;
26297
+ const defaults = options.defaults;
26298
+ const listSchema = (defaults && defaults.listSchema) || {};
26299
+
25982
26300
  let columns = [];
25983
26301
  let useMobileColumns = options.formFactor === 'SMALL' || ["split"].indexOf(options.displayAs) > -1;
25984
26302
  if(isLookup){
25985
26303
  // 在lookup手机端列表模式调式好之前不使用getMobileTableColumns
25986
26304
  useMobileColumns = false;
25987
26305
  }
26306
+ if(listSchema.mode && listSchema.mode !== "table"){
26307
+ // 如果指定的mode,则不走我们内置的手机端列表效果,使用steedos组件内部开发的默认card/list效果,或者由用户自己实现card/list模式的crud列表
26308
+ useMobileColumns = false;
26309
+ }
25988
26310
  if(useMobileColumns){
25989
26311
  columns = await getMobileTableColumns(fields, options);
25990
26312
  }
25991
26313
  else {
25992
26314
  columns = await getTableColumns(fields, options);
25993
26315
 
26316
+ if(listSchema.mode === "cards"){
26317
+ let card = listSchema.card;
26318
+ if(!card){
26319
+ card = await getDefaultCrudCard(columns, options);
26320
+ }
26321
+ return {
26322
+ mode: "cards",
26323
+ perPageAvailable: [5, 10, 20, 50, 100, 500],
26324
+ name: "thelist",
26325
+ headerToolbarClassName: "py-2 px-2 border-gray-300 border-solid border-b",
26326
+ className: "",
26327
+ draggable: false,
26328
+ defaultParams: getDefaultParams(options),
26329
+ card: card,
26330
+ syncLocation: false,
26331
+ keepItemSelectionOnPageChange: true,
26332
+ checkOnItemClick: isLookup ? true : false,
26333
+ labelTpl: `\${${options.labelFieldName}}`,
26334
+ autoFillHeight: false, // 自动高度效果不理想,先关闭
26335
+ columnsTogglable: false
26336
+ }
26337
+ }
26338
+
25994
26339
  if(!isLookup && !hiddenColumnOperation){
25995
26340
  columns.push(await getTableOperation(options));
25996
26341
  }
@@ -25998,6 +26343,7 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
25998
26343
 
25999
26344
  return {
26000
26345
  mode: "table",
26346
+ perPageAvailable: [5, 10, 20, 50, 100, 500],
26001
26347
  name: "thelist",
26002
26348
  headerToolbarClassName: "py-2 px-2 border-gray-300 border-solid border-b",
26003
26349
  className: "",
@@ -26085,8 +26431,8 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
26085
26431
  /*
26086
26432
  * @Author: baozhoutao@steedos.com
26087
26433
  * @Date: 2022-07-05 15:55:39
26088
- * @LastEditors: 殷亮辉 yinlianghui@hotoa.com
26089
- * @LastEditTime: 2023-09-21 17:35:06
26434
+ * @LastEditors: liaodaxue
26435
+ * @LastEditTime: 2023-10-20 11:38:25
26090
26436
  * @Description:
26091
26437
  */
26092
26438
 
@@ -26383,8 +26729,8 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
26383
26729
  "filtersFunction": listview_filters,
26384
26730
  "sort": sort,
26385
26731
  "ctx": ctx,
26386
- "requestAdaptor": listView.requestAdaptor,
26387
- "adaptor": listView.adaptor,
26732
+ "requestAdaptor": listView.requestAdaptor || ctx.requestAdaptor,
26733
+ "adaptor": listView.adaptor || ctx.adaptor,
26388
26734
  "headerToolbarItems": ctx.headerToolbarItems,
26389
26735
  "filterVisible": ctx.filterVisible,
26390
26736
  "rowClassNameExpr": ctx.rowClassNameExpr,
@@ -31518,7 +31864,13 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
31518
31864
  var empty = [];
31519
31865
  function MultipleContainers(props) {
31520
31866
  var _this = this;
31521
- var _a = props.adjustScale, adjustScale = _a === void 0 ? false : _a; props.itemCount; var cancelDrop = props.cancelDrop, _c = props.columns, columns = _c === void 0 ? 1 : _c, _d = props.handle, handle = _d === void 0 ? true : _d, containerStyle = props.containerStyle, _e = props.coordinateGetter, coordinateGetter$1 = _e === void 0 ? coordinateGetter : _e, _f = props.getItemStyles, getItemStyles = _f === void 0 ? function () { return ({}); } : _f, _g = props.wrapperStyle, wrapperStyle = _g === void 0 ? function () { return ({}); } : _g, _h = props.minimal, minimal = _h === void 0 ? false : _h, modifiers = props.modifiers, renderItem = props.renderItem, _j = props.strategy, strategy = _j === void 0 ? verticalListSortingStrategy : _j, _k = props.addable, addable = _k === void 0 ? false : _k, _l = props.trashable, trashable = _l === void 0 ? false : _l, _m = props.vertical, vertical = _m === void 0 ? false : _m, scrollable = props.scrollable, _o = props.boardSource, boardSource = _o === void 0 ? [] : _o, _p = props.cardSource, cardSource = _p === void 0 ? [] : _p, defaultValue = props.defaultValue, amisOnChange = props.onChange, amisData = props.data, amisDispatchEvent = props.dispatchEvent, amisRender = props.render, _q = props.cardSchema, cardSchema = _q === void 0 ? [{
31867
+ var _a = props.adjustScale, adjustScale = _a === void 0 ? false : _a; props.itemCount; var cancelDrop = props.cancelDrop, _c = props.columns, columns = _c === void 0 ? 1 : _c, _d = props.handle, handle = _d === void 0 ? true : _d, containerStyle = props.containerStyle, _e = props.coordinateGetter, coordinateGetter$1 = _e === void 0 ? coordinateGetter : _e, _f = props.getItemStyles, getItemStyles = _f === void 0 ? function () { return ({}); } : _f, _g = props.wrapperStyle, wrapperStyle = _g === void 0 ? function () { return ({}); } : _g, _h = props.minimal, minimal = _h === void 0 ? false : _h, modifiers = props.modifiers, renderItem = props.renderItem,
31868
+ // strategy = verticalListSortingStrategy,
31869
+ _j = props.strategy,
31870
+ // strategy = verticalListSortingStrategy,
31871
+ strategy = _j === void 0 ? rectSortingStrategy : _j, //这里默认值不用rectSortingStrategy的话,会出现字段在左右两边拖动变更顺序时拖动过程中dragOverlay丢失问题
31872
+ _k = props.addable, //这里默认值不用rectSortingStrategy的话,会出现字段在左右两边拖动变更顺序时拖动过程中dragOverlay丢失问题
31873
+ addable = _k === void 0 ? false : _k, _l = props.trashable, trashable = _l === void 0 ? false : _l, _m = props.vertical, vertical = _m === void 0 ? false : _m, scrollable = props.scrollable, _o = props.boardSource, boardSource = _o === void 0 ? [] : _o, _p = props.cardSource, cardSource = _p === void 0 ? [] : _p, value = props.value, amisOnChange = props.onChange, amisData = props.data, amisDispatchEvent = props.dispatchEvent, amisRender = props.render, _q = props.cardSchema, cardSchema = _q === void 0 ? [{
31522
31874
  "type": "tpl",
31523
31875
  "tpl": "${label}",
31524
31876
  "inline": false,
@@ -31526,24 +31878,28 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
31526
31878
  "type": "tpl",
31527
31879
  "tpl": "${label}",
31528
31880
  }] : _r, _s = props.boardFooter, boardFooter = _s === void 0 ? [] : _s, _t = props.wrapperClassName, wrapperClassName = _t === void 0 ? "gap-2" : _t, _u = props.boardClassName, boardClassName = _u === void 0 ? "border rounded" : _u, _v = props.cardClassName, cardClassName = _v === void 0 ? "" : _v;
31529
- defaultValue && delete (defaultValue.$$id);
31881
+ value && delete (value.$$id);
31530
31882
  var _w = __read(React.useState(function () {
31531
31883
  var _a;
31532
- return (_a = defaultValue) !== null && _a !== void 0 ? _a : {
31884
+ return (_a = value) !== null && _a !== void 0 ? _a : {
31533
31885
  A: ['A1', 'A2'],
31534
31886
  B: ['B1', 'B2'],
31535
31887
  C: ['C1', 'C2'],
31536
31888
  };
31537
31889
  }), 2), items = _w[0], setItems = _w[1];
31538
31890
  var _x = __read(React.useState(Object.keys(items)), 2), containers = _x[0], setContainers = _x[1];
31539
- var handleChange = function () { return __awaiter(_this, void 0, void 0, function () {
31891
+ React.useEffect(function () {
31892
+ setItems(value);
31893
+ setContainers(Object.keys(value));
31894
+ }, [value]);
31895
+ var handleChange = function (newItems) { return __awaiter(_this, void 0, void 0, function () {
31540
31896
  var value, rendererEvent;
31541
31897
  return __generator(this, function (_a) {
31542
31898
  switch (_a.label) {
31543
31899
  case 0:
31544
31900
  if (!amisDispatchEvent || !amisOnChange)
31545
31901
  return [2 /*return*/];
31546
- value = items;
31902
+ value = newItems || items;
31547
31903
  return [4 /*yield*/, amisDispatchEvent('change', createObject(amisData, {
31548
31904
  value: value
31549
31905
  }))];
@@ -31552,7 +31908,7 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
31552
31908
  if (rendererEvent === null || rendererEvent === void 0 ? void 0 : rendererEvent.prevented) {
31553
31909
  return [2 /*return*/];
31554
31910
  }
31555
- setTimeout(function () { return amisOnChange(value); }, 1000);
31911
+ setTimeout(function () { return amisOnChange(value); }, 500);
31556
31912
  return [2 /*return*/];
31557
31913
  }
31558
31914
  });
@@ -31655,6 +32011,7 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
31655
32011
  var active = _a.active, over = _a.over;
31656
32012
  var overId = over === null || over === void 0 ? void 0 : over.id;
31657
32013
  if (overId == null || overId === TRASH_ID || active.id in items) {
32014
+ // 拖动的是分组则跳过后面的逻辑
31658
32015
  return;
31659
32016
  }
31660
32017
  var overContainer = findContainer(overId);
@@ -31730,19 +32087,44 @@ crudService && crudService.setData({showFieldsFilter: toShowFieldsFilter});
31730
32087
  return;
31731
32088
  }
31732
32089
  var overContainer = findContainer(overId);
32090
+ var newItems = items;
31733
32091
  if (overContainer) {
31734
- var activeIndex_1 = items[activeContainer].indexOf(active.id);
31735
- var overIndex_1 = items[overContainer].indexOf(overId);
31736
- if (activeIndex_1 !== overIndex_1) {
31737
- setItems(function (items) {
31738
- var _a;
31739
- return (__assign$1(__assign$1({}, items), (_a = {}, _a[overContainer] = arrayMove(items[overContainer], activeIndex_1, overIndex_1), _a)));
31740
- });
32092
+ if (activeContainer !== overContainer) {
32093
+ // 拖动变更分组之间的顺序时,activeContainer overContainer 值不相等
32094
+ setTimeout(function () {
32095
+ var sortedGroups = over.data.current.sortable.items; //不加setTimeout的话,这里拿到的会是变更前的数据
32096
+ newItems = {};
32097
+ sortedGroups.forEach(function (groupKey) {
32098
+ newItems[groupKey] = items[groupKey];
32099
+ });
32100
+ delete newItems[TRASH_ID];
32101
+ delete newItems[PLACEHOLDER_ID];
32102
+ if (lodash.exports.keys(items).join(",") !== lodash.exports.keys(newItems).join(",")) {
32103
+ // 只有顺序发生变化时才触发change事件
32104
+ setItems(newItems);
32105
+ // console.log('拖动结束2,更新form value')
32106
+ handleChange(newItems);
32107
+ }
32108
+ setActiveId(null);
32109
+ }, 500);
32110
+ return;
32111
+ }
32112
+ else {
32113
+ // 同一个分组中字段顺序变更以及把一个字段从某个分组拖动到另一个分组内时,activeContainer 与 overContainer 值相等
32114
+ var activeIndex_1 = items[activeContainer].indexOf(active.id);
32115
+ var overIndex_1 = items[overContainer].indexOf(overId);
32116
+ if (activeIndex_1 !== overIndex_1) {
32117
+ setItems(function (items) {
32118
+ var _a;
32119
+ newItems = __assign$1(__assign$1({}, items), (_a = {}, _a[overContainer] = arrayMove(items[overContainer], activeIndex_1, overIndex_1), _a));
32120
+ return newItems;
32121
+ });
32122
+ }
31741
32123
  }
31742
32124
  }
31743
32125
  setActiveId(null);
31744
32126
  // console.log('拖动结束2,更新form value')
31745
- handleChange();
32127
+ handleChange(newItems);
31746
32128
  }, cancelDrop: cancelDrop, onDragCancel: onDragCancel, modifiers: modifiers },
31747
32129
  React__default["default"].createElement("div", { style: {
31748
32130
  display: 'inline-grid',