@ibiz-template/runtime 0.7.41-alpha.100 → 0.7.41-alpha.101

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/dist/index.esm.js CHANGED
@@ -19572,21 +19572,48 @@ import {
19572
19572
  NoticeError,
19573
19573
  RuntimeError
19574
19574
  } from "@ibiz-template/core";
19575
- var DefaultErrorHandler = class {
19575
+ var _DefaultErrorHandler = class _DefaultErrorHandler {
19576
+ /**
19577
+ * 判断错误是否重复
19578
+ */
19579
+ static isDuplicate(message) {
19580
+ const { DEDUP_INTERVAL, errorCache } = _DefaultErrorHandler;
19581
+ const now = Date.now();
19582
+ for (const [key, time] of errorCache) {
19583
+ if (now - time >= DEDUP_INTERVAL) {
19584
+ errorCache.delete(key);
19585
+ }
19586
+ }
19587
+ const lastTime = errorCache.get(message);
19588
+ if (lastTime !== void 0) {
19589
+ return true;
19590
+ }
19591
+ errorCache.set(message, now);
19592
+ return false;
19593
+ }
19594
+ /**
19595
+ * 处理错误
19596
+ */
19576
19597
  handle(error) {
19577
19598
  var _a3, _b2;
19599
+ const { isDuplicate } = _DefaultErrorHandler;
19578
19600
  if (error instanceof RuntimeModelError || error instanceof ModelError) {
19579
- ibiz.message.error(error.message, 10, true);
19601
+ if (!isDuplicate(error.message)) {
19602
+ ibiz.message.error(error.message, 10, true);
19603
+ }
19580
19604
  } else if (error instanceof HttpError) {
19581
19605
  if (error.status === 401) {
19582
- ibiz.message.error(
19583
- ibiz.i18n.t("runtime.utils.errorHandler.noPermissionless")
19584
- );
19606
+ const msg = ibiz.i18n.t("runtime.utils.errorHandler.noPermissionless");
19607
+ if (!isDuplicate(msg)) {
19608
+ ibiz.message.error(msg);
19609
+ }
19585
19610
  } else if (error.status === 404) {
19586
19611
  ibiz.mc.error.send(error);
19587
19612
  } else if (error.status === 500 && ((_b2 = (_a3 = error.response) == null ? void 0 : _a3.data) == null ? void 0 : _b2.type) === "DataEntityRuntimeException") {
19588
- ibiz.message.error(error.message);
19589
- } else {
19613
+ if (!isDuplicate(error.message)) {
19614
+ ibiz.message.error(error.message);
19615
+ }
19616
+ } else if (!isDuplicate(error.message)) {
19590
19617
  ibiz.notification.error({
19591
19618
  title: "",
19592
19619
  desc: error.message,
@@ -19594,14 +19621,27 @@ var DefaultErrorHandler = class {
19594
19621
  });
19595
19622
  }
19596
19623
  } else if (error instanceof NoticeError) {
19597
- ibiz.message.error(error.message, error.duration, error.duration === 0);
19624
+ if (!isDuplicate(error.message)) {
19625
+ ibiz.message.error(error.message, error.duration, error.duration === 0);
19626
+ }
19598
19627
  } else if (error instanceof RuntimeError) {
19599
- ibiz.message.error(error.message, 10, true);
19628
+ if (!isDuplicate(error.message)) {
19629
+ ibiz.message.error(error.message, 10, true);
19630
+ }
19600
19631
  }
19601
19632
  ibiz.log.error(error);
19602
19633
  return true;
19603
19634
  }
19604
19635
  };
19636
+ /**
19637
+ * 错误去重时间间隔(300ms)
19638
+ */
19639
+ _DefaultErrorHandler.DEDUP_INTERVAL = 300;
19640
+ /**
19641
+ * 错误缓存
19642
+ */
19643
+ _DefaultErrorHandler.errorCache = /* @__PURE__ */ new Map();
19644
+ var DefaultErrorHandler = _DefaultErrorHandler;
19605
19645
 
19606
19646
  // src/utils/error-handler/error-handler-center.ts
19607
19647
  var ErrorHandlerCenter = class {
@@ -30880,8 +30920,9 @@ var AppMenuController = class extends ControlController {
30880
30920
  }
30881
30921
  async onCreated() {
30882
30922
  var _a3;
30883
- await super.onCreated();
30884
30923
  this.app = await ibiz.hub.getApp(this.context.srfappid);
30924
+ await calcDynamicMenu(this.model, this.context, this.params);
30925
+ await super.onCreated();
30885
30926
  await this.initAppMenuItemProviders();
30886
30927
  (_a3 = this.model.appMenuItems) == null ? void 0 : _a3.forEach((item) => {
30887
30928
  this.initMenuItemState(item);
@@ -31206,7 +31247,7 @@ var AppMenuController = class extends ControlController {
31206
31247
  }
31207
31248
  });
31208
31249
  };
31209
- flattenMenus(this.model.appMenuItems);
31250
+ flattenMenus(this.model.appMenuItems || []);
31210
31251
  this.allAppMenuItems = result;
31211
31252
  }
31212
31253
  /**
@@ -72874,14 +72915,19 @@ var FetchMethod = class extends Method {
72874
72915
  }
72875
72916
  const cond = DEDQCondUtil.getCond(this.method);
72876
72917
  const filter = new SearchFilter(context, searchParams);
72877
- const items = await this.searchLocal(cond, filter);
72878
- res = new HttpResponse6(items, 200);
72918
+ const { items, total, page, size, totalPages } = await this.searchLocalWithMeta(cond, filter);
72919
+ res = new HttpResponse6(items, 200, "", {
72920
+ "x-total": total,
72921
+ "x-page": page,
72922
+ "x-per-page": size,
72923
+ "x-total-pages": totalPages
72924
+ });
72879
72925
  } else {
72880
72926
  switch (this.method.dataSetType) {
72881
72927
  case "INDEXDE":
72882
72928
  case "CODELIST":
72883
72929
  case "MULTIFORM":
72884
- res = await this.fetchCodeListSet(context, searchParams);
72930
+ res = await this.fetchCodeListSetWithMeta(context, searchParams);
72885
72931
  break;
72886
72932
  case "REMOTE":
72887
72933
  {
@@ -72970,10 +73016,73 @@ var FetchMethod = class extends Method {
72970
73016
  }
72971
73017
  const { page, size } = filter;
72972
73018
  const start = page * size;
72973
- const end = (page + 1) * size - 1;
73019
+ const end = (page + 1) * size;
72974
73020
  const items = list.slice(start, end).map((item) => clone53(item));
72975
73021
  return items;
72976
73022
  }
73023
+ /**
73024
+ * 搜索本地数据(带元数据)
73025
+ * @param cond 查询实例
73026
+ * @param filter 过滤对象
73027
+ * @param queryParamKeys 当前实体支持快速搜索的属性
73028
+ * @returns 数据列表和分页信息
73029
+ */
73030
+ async searchLocalWithMeta(cond, filter, queryParamKeys = this.entity.quickSearchAppDEFieldIds) {
73031
+ let list = this.service.local.getList();
73032
+ if (cond) {
73033
+ if (list.length > 0) {
73034
+ list = list.filter((obj) => cond.test(obj, filter));
73035
+ }
73036
+ }
73037
+ if (list.length > 0) {
73038
+ if (filter.query && filter.query !== "") {
73039
+ if (queryParamKeys) {
73040
+ list = list.filter((obj) => {
73041
+ const reg2 = new RegExp(filter.query.toLowerCase());
73042
+ for (let i = 0; i < queryParamKeys.length; i += 1) {
73043
+ const key = queryParamKeys[i];
73044
+ const val = obj[key];
73045
+ if (reg2.test(val.toLowerCase())) {
73046
+ return true;
73047
+ }
73048
+ }
73049
+ return false;
73050
+ });
73051
+ }
73052
+ }
73053
+ }
73054
+ if (!isNil37(filter.sortField) && !isEmpty9(filter.sortField)) {
73055
+ if (filter.sortMode === "DESC") {
73056
+ list = descSort(list, filter.sortField);
73057
+ } else {
73058
+ list = ascSort2(list, filter.sortField);
73059
+ }
73060
+ }
73061
+ if (!isNil37(filter.srfDefaultCond) && !isEmpty9(filter.srfDefaultCond)) {
73062
+ const defaultConds = filter.srfDefaultCond;
73063
+ const defaultCondKeys = Object.keys(defaultConds);
73064
+ list = list.filter((obj) => {
73065
+ for (let i = 0; i < defaultCondKeys.length; i += 1) {
73066
+ const key = defaultCondKeys[i];
73067
+ if (obj[key] === defaultConds[key]) {
73068
+ return true;
73069
+ }
73070
+ }
73071
+ return false;
73072
+ });
73073
+ }
73074
+ const { page, size } = filter;
73075
+ const start = page * size;
73076
+ const end = (page + 1) * size;
73077
+ const items = list.slice(start, end).map((item) => clone53(item));
73078
+ return {
73079
+ items,
73080
+ total: list.length,
73081
+ page,
73082
+ size,
73083
+ totalPages: Math.ceil(list.length / size)
73084
+ };
73085
+ }
72977
73086
  /**
72978
73087
  * 获取代码表数据来源的集合
72979
73088
  * @author lxm
@@ -73002,6 +73111,38 @@ var FetchMethod = class extends Method {
73002
73111
  }));
73003
73112
  return new HttpResponse6(dataSet, 200);
73004
73113
  }
73114
+ /**
73115
+ * 获取代码表数据来源的集合(带元数据)
73116
+ *
73117
+ * @param {IContext} context
73118
+ * @param {IParams} params
73119
+ * @return {*} {Promise<HttpResponse<IData[]>>}
73120
+ */
73121
+ async fetchCodeListSetWithMeta(context, params) {
73122
+ const { appCodeListId } = this.method;
73123
+ if (!appCodeListId) {
73124
+ throw new RuntimeModelError71(
73125
+ this.method,
73126
+ ibiz.i18n.t("runtime.service.sourceCodeTable")
73127
+ );
73128
+ }
73129
+ const codeItems = await this.app.codeList.get(
73130
+ appCodeListId,
73131
+ context,
73132
+ params
73133
+ );
73134
+ const { keyAppDEFieldId, majorAppDEFieldId } = this.entity;
73135
+ const dataSet = codeItems.map((item) => ({
73136
+ [keyAppDEFieldId]: item.value,
73137
+ [majorAppDEFieldId]: item.text
73138
+ }));
73139
+ return new HttpResponse6(dataSet, 200, "", {
73140
+ "x-total": codeItems.length,
73141
+ "x-page": 0,
73142
+ "x-per-page": codeItems.length,
73143
+ "x-total-pages": 1
73144
+ });
73145
+ }
73005
73146
  };
73006
73147
 
73007
73148
  // src/service/service/entity/method/ac-fetch.ts
@@ -84682,6 +84823,82 @@ function stringifyObj(obj) {
84682
84823
  });
84683
84824
  }
84684
84825
 
84826
+ // src/utils/model/index.ts
84827
+ import { isBase64, isBase64Image as isBase64Image2, isSvg } from "@ibiz-template/core";
84828
+ async function calcDynamicMenu(menu, context, params) {
84829
+ const {
84830
+ appId: appId2,
84831
+ dynamicMode,
84832
+ clsAppDEFieldId,
84833
+ textAppDEFieldId,
84834
+ tipsAppDEFieldId,
84835
+ itemAppDEDataSetId,
84836
+ iconClsAppDEFieldId,
84837
+ itemAppDataEntityId,
84838
+ appFuncTagAppDEFieldId,
84839
+ enableScriptAppDEFieldId,
84840
+ visibleScriptAppDEFieldId
84841
+ } = menu;
84842
+ if (dynamicMode !== 1 || !itemAppDataEntityId || !itemAppDEDataSetId)
84843
+ return;
84844
+ try {
84845
+ const app = ibiz.hub.getApp(appId2);
84846
+ const res = await app.deService.exec(
84847
+ itemAppDataEntityId,
84848
+ itemAppDEDataSetId,
84849
+ context,
84850
+ params
84851
+ );
84852
+ if (res.ok && res.data && Array.isArray(res.data)) {
84853
+ if (!menu.appMenuItems)
84854
+ menu.appMenuItems = [];
84855
+ res.data.forEach((item) => {
84856
+ const menuItem = {
84857
+ appId: appId2,
84858
+ id: item.srfkey,
84859
+ name: item.srfkey,
84860
+ itemType: "MENUITEM",
84861
+ appFuncId: appFuncTagAppDEFieldId ? item[appFuncTagAppDEFieldId] : void 0,
84862
+ caption: textAppDEFieldId ? item[textAppDEFieldId] : item.srfmajortext,
84863
+ tooltip: tipsAppDEFieldId ? item[tipsAppDEFieldId] : item.srfmajortext
84864
+ };
84865
+ if (clsAppDEFieldId && item[clsAppDEFieldId])
84866
+ menuItem.sysCss = { appId: appId2, cssName: item[clsAppDEFieldId] };
84867
+ if (iconClsAppDEFieldId && item[iconClsAppDEFieldId]) {
84868
+ const icon = item[iconClsAppDEFieldId];
84869
+ const imagePath = isBase64Image2(icon) || isBase64(icon) || isSvg(icon) || icon.endsWith("svg") || icon.startsWith("http");
84870
+ menuItem.sysImage = {
84871
+ appId: appId2,
84872
+ [imagePath ? "imagePath" : "cssClass"]: icon
84873
+ };
84874
+ }
84875
+ let visible = true;
84876
+ if (visibleScriptAppDEFieldId && item[visibleScriptAppDEFieldId]) {
84877
+ visible = ScriptFactory.execScriptFn(
84878
+ { context, params },
84879
+ item[visibleScriptAppDEFieldId],
84880
+ { singleRowReturn: true }
84881
+ );
84882
+ }
84883
+ menuItem.hidden = !visible;
84884
+ let enable = true;
84885
+ if (enableScriptAppDEFieldId && item[enableScriptAppDEFieldId]) {
84886
+ enable = ScriptFactory.execScriptFn(
84887
+ { context, params },
84888
+ item[enableScriptAppDEFieldId],
84889
+ { singleRowReturn: true }
84890
+ );
84891
+ }
84892
+ menuItem.valid = enable;
84893
+ if (visible)
84894
+ menu.appMenuItems.push(menuItem);
84895
+ });
84896
+ }
84897
+ } catch (error) {
84898
+ ibiz.log.error(error);
84899
+ }
84900
+ }
84901
+
84685
84902
  // src/command/app/open-app-view/open-app-view.ts
84686
84903
  import { ModelError as ModelError30, RuntimeError as RuntimeError70 } from "@ibiz-template/core";
84687
84904
  import { clone as clone59 } from "ramda";
@@ -91656,6 +91873,7 @@ export {
91656
91873
  calcDyUiactionGroup,
91657
91874
  calcDynaClass,
91658
91875
  calcDynaSysParams,
91876
+ calcDynamicMenu,
91659
91877
  calcFilterModelBySchema,
91660
91878
  calcGridLayoutPos,
91661
91879
  calcImportSchemaData,