@ticatec/uniface-flexi-module 0.0.2

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.
Files changed (136) hide show
  1. package/FLEXICRITERIASET_GUIDE.md +1559 -0
  2. package/FLEXICRITERIASET_GUIDE_CN.md +1133 -0
  3. package/FLEXIDATATABLE_GUIDE.md +1650 -0
  4. package/FLEXIDATATABLE_GUIDE_CN.md +1650 -0
  5. package/FLEXIFORM_GUIDE.md +1068 -0
  6. package/FLEXIFORM_GUIDE_CN.md +1068 -0
  7. package/FLEXI_CONTEXT_GUIDE_CN.md +172 -0
  8. package/MODULE_LOADER_CN.md +228 -0
  9. package/README.md +307 -0
  10. package/README_CN.md +51 -0
  11. package/SANDBOX_CN.md +201 -0
  12. package/dist/FlexiContext.d.ts +28 -0
  13. package/dist/FlexiContext.js +45 -0
  14. package/dist/ModuleLoader.d.ts +41 -0
  15. package/dist/ModuleLoader.js +55 -0
  16. package/dist/Sandbox.d.ts +33 -0
  17. package/dist/Sandbox.js +101 -0
  18. package/dist/criteria-panel/CriteriaFieldsPanel.svelte +26 -0
  19. package/dist/criteria-panel/CriteriaFieldsPanel.svelte.d.ts +22 -0
  20. package/dist/criteria-panel/components/CascadeSelectSearchField.svelte +10 -0
  21. package/dist/criteria-panel/components/CascadeSelectSearchField.svelte.d.ts +25 -0
  22. package/dist/criteria-panel/components/DateRangeField.svelte +11 -0
  23. package/dist/criteria-panel/components/DateRangeField.svelte.d.ts +25 -0
  24. package/dist/criteria-panel/components/DateSearchField.svelte +10 -0
  25. package/dist/criteria-panel/components/DateSearchField.svelte.d.ts +24 -0
  26. package/dist/criteria-panel/components/DateTimeSearchField.svelte +10 -0
  27. package/dist/criteria-panel/components/DateTimeSearchField.svelte.d.ts +24 -0
  28. package/dist/criteria-panel/components/InputOptionSelectSearchField.svelte +9 -0
  29. package/dist/criteria-panel/components/InputOptionSelectSearchField.svelte.d.ts +24 -0
  30. package/dist/criteria-panel/components/NumberRangeField.svelte +11 -0
  31. package/dist/criteria-panel/components/NumberRangeField.svelte.d.ts +25 -0
  32. package/dist/criteria-panel/components/NumberSearchField.svelte +9 -0
  33. package/dist/criteria-panel/components/NumberSearchField.svelte.d.ts +24 -0
  34. package/dist/criteria-panel/components/OptionMultiSelectSearchField.svelte +9 -0
  35. package/dist/criteria-panel/components/OptionMultiSelectSearchField.svelte.d.ts +24 -0
  36. package/dist/criteria-panel/components/OptionSelectSearchField.svelte +9 -0
  37. package/dist/criteria-panel/components/OptionSelectSearchField.svelte.d.ts +24 -0
  38. package/dist/criteria-panel/components/SearchField.svelte +14 -0
  39. package/dist/criteria-panel/components/SearchField.svelte.d.ts +33 -0
  40. package/dist/criteria-panel/components/TextSearchField.svelte +9 -0
  41. package/dist/criteria-panel/components/TextSearchField.svelte.d.ts +24 -0
  42. package/dist/criteria-panel/components/UnknownCriteriaField.svelte +9 -0
  43. package/dist/criteria-panel/components/UnknownCriteriaField.svelte.d.ts +24 -0
  44. package/dist/criteria-panel/index.d.ts +6 -0
  45. package/dist/criteria-panel/index.js +6 -0
  46. package/dist/criteria-panel/lib/CriteriaComponentBuilder.d.ts +19 -0
  47. package/dist/criteria-panel/lib/CriteriaComponentBuilder.js +31 -0
  48. package/dist/criteria-panel/lib/CriteriaFieldBuilder.d.ts +1 -0
  49. package/dist/criteria-panel/lib/CriteriaFieldBuilder.js +127 -0
  50. package/dist/criteria-panel/lib/FlexiCriteriaField.d.ts +38 -0
  51. package/dist/criteria-panel/lib/FlexiCriteriaField.js +31 -0
  52. package/dist/criteria-panel/lib/FlexiCriteriaSet.d.ts +24 -0
  53. package/dist/criteria-panel/lib/FlexiCriteriaSet.js +48 -0
  54. package/dist/flexi-datatable/FlexiDataTable.d.ts +111 -0
  55. package/dist/flexi-datatable/FlexiDataTable.js +90 -0
  56. package/dist/flexi-datatable/index.d.ts +2 -0
  57. package/dist/flexi-datatable/index.js +2 -0
  58. package/dist/flexi-form/FlexiCompound.d.ts +34 -0
  59. package/dist/flexi-form/FlexiCompound.js +84 -0
  60. package/dist/flexi-form/FlexiFormDialog.svelte +24 -0
  61. package/dist/flexi-form/FlexiFormDialog.svelte.d.ts +21 -0
  62. package/dist/flexi-form/FlexiFormPage.svelte +26 -0
  63. package/dist/flexi-form/FlexiFormPage.svelte.d.ts +25 -0
  64. package/dist/flexi-form/Schema.d.ts +6 -0
  65. package/dist/flexi-form/Schema.js +1 -0
  66. package/dist/flexi-form/components/BreakLine.svelte +1 -0
  67. package/dist/flexi-form/components/BreakLine.svelte.d.ts +26 -0
  68. package/dist/flexi-form/components/CardTitleBar.svelte +18 -0
  69. package/dist/flexi-form/components/CardTitleBar.svelte.d.ts +22 -0
  70. package/dist/flexi-form/components/CascadeOptionSelectField.svelte +13 -0
  71. package/dist/flexi-form/components/CascadeOptionSelectField.svelte.d.ts +24 -0
  72. package/dist/flexi-form/components/CellFieldBuilder.d.ts +1 -0
  73. package/dist/flexi-form/components/CellFieldBuilder.js +178 -0
  74. package/dist/flexi-form/components/DateField.svelte +12 -0
  75. package/dist/flexi-form/components/DateField.svelte.d.ts +24 -0
  76. package/dist/flexi-form/components/DateTimeField.svelte +13 -0
  77. package/dist/flexi-form/components/DateTimeField.svelte.d.ts +24 -0
  78. package/dist/flexi-form/components/InputOptionSelectField.svelte +13 -0
  79. package/dist/flexi-form/components/InputOptionSelectField.svelte.d.ts +24 -0
  80. package/dist/flexi-form/components/MemoField.svelte +12 -0
  81. package/dist/flexi-form/components/MemoField.svelte.d.ts +24 -0
  82. package/dist/flexi-form/components/NumberField.svelte +12 -0
  83. package/dist/flexi-form/components/NumberField.svelte.d.ts +24 -0
  84. package/dist/flexi-form/components/OptionsMultiSelectField.svelte +13 -0
  85. package/dist/flexi-form/components/OptionsMultiSelectField.svelte.d.ts +24 -0
  86. package/dist/flexi-form/components/OptionsSelectField.svelte +13 -0
  87. package/dist/flexi-form/components/OptionsSelectField.svelte.d.ts +24 -0
  88. package/dist/flexi-form/components/TextField.svelte +12 -0
  89. package/dist/flexi-form/components/TextField.svelte.d.ts +24 -0
  90. package/dist/flexi-form/components/UnitNumberField.svelte +12 -0
  91. package/dist/flexi-form/components/UnitNumberField.svelte.d.ts +24 -0
  92. package/dist/flexi-form/components/UnknownTypeField.svelte +5 -0
  93. package/dist/flexi-form/components/UnknownTypeField.svelte.d.ts +18 -0
  94. package/dist/flexi-form/containers/FlexiPanel.svelte +13 -0
  95. package/dist/flexi-form/containers/FlexiPanel.svelte.d.ts +33 -0
  96. package/dist/flexi-form/flexi_card/FlexiCard.d.ts +64 -0
  97. package/dist/flexi-form/flexi_card/FlexiCard.js +66 -0
  98. package/dist/flexi-form/flexi_card/FlexiCardPanel.svelte +57 -0
  99. package/dist/flexi-form/flexi_card/FlexiCardPanel.svelte.d.ts +22 -0
  100. package/dist/flexi-form/flexi_composite/FlexiComposite.d.ts +50 -0
  101. package/dist/flexi-form/flexi_composite/FlexiComposite.js +26 -0
  102. package/dist/flexi-form/flexi_composite/FlexiCompositePanel.svelte +42 -0
  103. package/dist/flexi-form/flexi_composite/FlexiCompositePanel.svelte.d.ts +25 -0
  104. package/dist/flexi-form/flexi_composite/README.md +50 -0
  105. package/dist/flexi-form/flexi_datasheet/FlexiDataSheet.d.ts +4 -0
  106. package/dist/flexi-form/flexi_datasheet/FlexiDataSheet.js +2 -0
  107. package/dist/flexi-form/flexi_field/FlexiField.d.ts +76 -0
  108. package/dist/flexi-form/flexi_field/FlexiField.js +128 -0
  109. package/dist/flexi-form/flexi_field/FlexiFieldCell.svelte +35 -0
  110. package/dist/flexi-form/flexi_field/FlexiFieldCell.svelte.d.ts +25 -0
  111. package/dist/flexi-form/flexi_field/UnknownField.d.ts +3 -0
  112. package/dist/flexi-form/flexi_field/UnknownField.js +3 -0
  113. package/dist/flexi-form/flexi_form/FlexiForm.d.ts +127 -0
  114. package/dist/flexi-form/flexi_form/FlexiForm.js +160 -0
  115. package/dist/flexi-form/flexi_form/FlexiFormPanel.svelte +57 -0
  116. package/dist/flexi-form/flexi_form/FlexiFormPanel.svelte.d.ts +25 -0
  117. package/dist/flexi-form/index.d.ts +11 -0
  118. package/dist/flexi-form/index.js +11 -0
  119. package/dist/flexi-form/lib/ComponentBuilder.d.ts +15 -0
  120. package/dist/flexi-form/lib/ComponentBuilder.js +31 -0
  121. package/dist/flexi-form/lib/index.d.ts +5 -0
  122. package/dist/flexi-form/lib/index.js +2 -0
  123. package/dist/flexi-form/lib/types.d.ts +7 -0
  124. package/dist/flexi-form/lib/types.js +6 -0
  125. package/dist/flexi-form/lib/utils.d.ts +10 -0
  126. package/dist/flexi-form/lib/utils.js +48 -0
  127. package/dist/i18n-res/i18nRes.d.ts +2 -0
  128. package/dist/i18n-res/i18nRes.js +8 -0
  129. package/dist/i18n-res/index.d.ts +2 -0
  130. package/dist/i18n-res/index.js +2 -0
  131. package/dist/index.d.ts +5 -0
  132. package/dist/index.js +5 -0
  133. package/dist/uniface-flexi-module.css +46 -0
  134. package/dist/utils.d.ts +4 -0
  135. package/dist/utils.js +8 -0
  136. package/package.json +135 -0
@@ -0,0 +1,66 @@
1
+ import {} from "../lib";
2
+ import FlexField from "../flexi_field/FlexiField";
3
+ import FlexiField from "../flexi_field/FlexiField";
4
+ import FlexiComposite from "../flexi_composite/FlexiComposite";
5
+ import FlexiForm from "../flexi_form/FlexiForm";
6
+ import FlexiCompound from "../FlexiCompound";
7
+ export default class FlexiCard extends FlexiCompound {
8
+ block;
9
+ form;
10
+ arrangement = "vertical";
11
+ composite = {};
12
+ #schema;
13
+ foldable;
14
+ constructor(form, schema, data) {
15
+ const mode = schema.mode ?? form.mode;
16
+ const readonly = schema.readonly == true;
17
+ const disabled = schema.disabled == true;
18
+ const label$style = schema.label$style ?? form.label$style;
19
+ const variant = schema.variant ?? form.variant;
20
+ super(data ?? form.data, readonly, disabled, variant, mode, schema.props, schema.attrs, schema.title, label$style);
21
+ this.block = schema.block;
22
+ this.form = form;
23
+ this.arrangement = schema.arrangement ?? form.arrangement;
24
+ this.#schema = schema;
25
+ this.foldable = schema.foldable == true;
26
+ this.createFromSchema();
27
+ }
28
+ /**
29
+ * 从schema构建卡片
30
+ * @protected
31
+ */
32
+ createFromSchema() {
33
+ for (const field of this.#schema.fields) {
34
+ if (field.type == 'composite') {
35
+ const schema = field;
36
+ let composite = this.createComposite(schema);
37
+ this._fields.push(composite);
38
+ this.composite[schema.name] = composite;
39
+ }
40
+ else {
41
+ const cellField = this.createFlexiField(field);
42
+ this._fields.push(cellField);
43
+ this.field[field.name] = cellField;
44
+ }
45
+ }
46
+ for (let action of (this.#schema.actions ?? [])) {
47
+ const handler = this[action.handler];
48
+ if (handler) {
49
+ this.actions.push({ icon: action.icon, handler });
50
+ }
51
+ else {
52
+ console.warn(`Method ${action.handler} not found!`);
53
+ }
54
+ }
55
+ console.log('当前的字段', this._fields);
56
+ }
57
+ createComposite(schema) {
58
+ throw new Error('Implement is in subclass');
59
+ }
60
+ createFlexiField(fieldSchema) {
61
+ return new FlexiField(this, this.data, this.mode, fieldSchema);
62
+ }
63
+ getCompositeSchema(name) {
64
+ return this.form.getCompositeSchema(name);
65
+ }
66
+ }
@@ -0,0 +1,57 @@
1
+ <script lang="ts">import FlexiCard from "./FlexiCard";
2
+ import FlexiPanel from "../containers/FlexiPanel.svelte";
3
+ import FlexiField from "../flexi_field/FlexiField";
4
+ import FlexiFieldCell from "../flexi_field/FlexiFieldCell.svelte";
5
+ import FlexiBlockPanel from "../flexi_composite/FlexiCompositePanel.svelte";
6
+ import FlexiComposite from "../flexi_composite/FlexiComposite";
7
+ import { onMount } from "svelte";
8
+ import Icon from "@ticatec/uniface-element/Icon";
9
+ export let card;
10
+ export let readonly;
11
+ onMount(() => {
12
+ card.setInvalidateHandler(() => {
13
+ fields = [...card.fields];
14
+ arrangement = card.arrangement;
15
+ });
16
+ return () => {
17
+ card.setInvalidateHandler();
18
+ };
19
+ });
20
+ $: fields = [...card.fields];
21
+ $: arrangement = card.arrangement;
22
+ </script>
23
+
24
+ <div class="uniface-flexi-card">
25
+
26
+ {#if card.title}
27
+ <div class="uniface-flexi-card-title-bar">
28
+ <div class="title-text">
29
+ <span>{card.title}</span>
30
+ </div>
31
+ <div class="action-bar">
32
+ {#each card.actions as action}
33
+ <Icon onclick={action.handler} name={action.icon}/>
34
+ {/each}
35
+ </div>
36
+ </div>
37
+ {/if}
38
+
39
+ <FlexiPanel style="padding: 0" mode={card.mode} {...card.props} {arrangement}>
40
+ {#each fields as field}
41
+ {#if field instanceof FlexiField}
42
+ <FlexiFieldCell {field} readonly={readonly || field.isReadonly} disabled={card.disabled} variant={card.variant}/>
43
+ {:else if Array.isArray(field) && field.length>0 && field[0] instanceof FlexiComposite}
44
+ {#each field as composite}
45
+ {#if composite.visible}
46
+ <FlexiBlockPanel readonly={readonly || card.readonly} {arrangement} disabled={card.disabled} {composite}/>
47
+ {/if}
48
+ {/each}
49
+ {:else if field instanceof FlexiComposite }
50
+ {#if field.visible}
51
+ <FlexiBlockPanel readonly={readonly || card.readonly} {arrangement} disabled={card.disabled} composite={field}/>
52
+ {/if}
53
+ {/if}
54
+ {/each}
55
+ </FlexiPanel>
56
+
57
+ </div>
@@ -0,0 +1,22 @@
1
+ import FlexiCard from "./FlexiCard";
2
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
+ $$bindings?: Bindings;
5
+ } & Exports;
6
+ (internal: unknown, props: Props & {
7
+ $$events?: Events;
8
+ $$slots?: Slots;
9
+ }): Exports & {
10
+ $set?: any;
11
+ $on?: any;
12
+ };
13
+ z_$$bindings?: Bindings;
14
+ }
15
+ declare const FlexiCardPanel: $$__sveltets_2_IsomorphicComponent<{
16
+ card: FlexiCard;
17
+ readonly: boolean;
18
+ }, {
19
+ [evt: string]: CustomEvent<any>;
20
+ }, {}, {}, string>;
21
+ type FlexiCardPanel = InstanceType<typeof FlexiCardPanel>;
22
+ export default FlexiCardPanel;
@@ -0,0 +1,50 @@
1
+ import FlexiField, { type FlexiFieldSchema } from "../flexi_field/FlexiField";
2
+ import FlexiCard from "../flexi_card/FlexiCard";
3
+ import { type LayoutMode } from "../lib";
4
+ import type { Arrangement } from "../lib/types";
5
+ import FlexiCompound from "../FlexiCompound";
6
+ /**
7
+ * 一个结构块的Schema,可以包括一组字段,独立布局,样式
8
+ */
9
+ export interface FlexiCompositeSchema {
10
+ /** 类型 - block */
11
+ type?: 'block';
12
+ /** 字段组合块的标题 */
13
+ title?: string;
14
+ /** 中间包括的字段 */
15
+ fields: Array<FlexiFieldSchema>;
16
+ /** 是否只读 */
17
+ readonly?: boolean;
18
+ /** 是否禁用 */
19
+ disabled?: boolean;
20
+ /** 买个字段中label的格式 */
21
+ label$style?: string;
22
+ /** 字段的样式,(填充/边框线) */
23
+ variant?: string;
24
+ /** 布局模式,Flex布局还是Grid布局 */
25
+ mode?: LayoutMode;
26
+ /** 布局的属性,对于grid,需要确定列的数量 */
27
+ props?: any;
28
+ /** label和字段内容的布局方式,上下布局还是左右布局*/
29
+ arrangement?: Arrangement;
30
+ }
31
+ /**
32
+ * 用于卡片中嵌入的结构块的定义
33
+ */
34
+ export interface FlexiCompositeFieldSchema {
35
+ type: "composite";
36
+ /** 嵌套对象的key */
37
+ keyField?: string;
38
+ /** 卡片中block的名称*/
39
+ name: string;
40
+ /** block的名称*/
41
+ composite: string;
42
+ /** 字段单元格的属性,比如span等*/
43
+ cell?: any;
44
+ }
45
+ export default class FlexiComposite extends FlexiCompound<FlexiField> {
46
+ visible: boolean;
47
+ readonly card: FlexiCard;
48
+ constructor(card: FlexiCard, data: any, schema: FlexiCompositeSchema, cell: any);
49
+ protected buildFlexiFields(card: FlexiCard, fields: Array<FlexiFieldSchema>): FlexiField[];
50
+ }
@@ -0,0 +1,26 @@
1
+ import FlexiField, {} from "../flexi_field/FlexiField";
2
+ import FlexiCard from "../flexi_card/FlexiCard";
3
+ import {} from "../lib";
4
+ import FlexiCompound from "../FlexiCompound";
5
+ export default class FlexiComposite extends FlexiCompound {
6
+ visible = true;
7
+ card;
8
+ constructor(card, data, schema, cell) {
9
+ const readonly = schema.readonly == true;
10
+ const disabled = schema.disabled == true;
11
+ const label$style = schema.label$style ?? card.label$style;
12
+ const variant = schema.variant ?? card.variant;
13
+ const mode = schema.mode ?? card.mode;
14
+ const props = schema.props ?? {};
15
+ super(data, readonly, disabled, variant, mode, props, cell, schema.title, label$style);
16
+ this._fields = this.buildFlexiFields(card, schema.fields);
17
+ this.card = card;
18
+ }
19
+ buildFlexiFields(card, fields) {
20
+ let list = [];
21
+ for (let field of fields) {
22
+ list.push(new FlexiField(card, this._data, this.mode, field));
23
+ }
24
+ return list;
25
+ }
26
+ }
@@ -0,0 +1,42 @@
1
+ <script lang="ts">import FlexiPanel from "../containers/FlexiPanel.svelte";
2
+ import FlexiFieldCell from "../flexi_field/FlexiFieldCell.svelte";
3
+ /** 组合框的单元所在的表单的布局模式 */
4
+ export let composite;
5
+ export let readonly;
6
+ export let disabled;
7
+ export let arrangement;
8
+ $: mode = composite.card.mode;
9
+ $: title = composite.title;
10
+ $: fields = composite.fields;
11
+ $: if (composite) {
12
+ composite.setInvalidateHandler(() => {
13
+ fields = [...composite.fields];
14
+ });
15
+ }
16
+ const getGridCellStyle = () => {
17
+ let cell = composite.cell;
18
+ return `rowSpan: ${cell.rowSpan ?? 1}; colSpan: ${cell.colSpan ?? 1}; row: ${cell.row}; col: ${cell.col}, height: ${cell.height ?? "auto"}`;
19
+ };
20
+ const getFlexCellStyle = () => {
21
+ let cell = composite.cell;
22
+ return `flex: 0 0 auto; width: ${(cell.span ?? 1) * 100 / 12}%`;
23
+ };
24
+ $: cellStyle = mode === "grid" ? getGridCellStyle() : getFlexCellStyle();
25
+ </script>
26
+
27
+ <div class="uniface-flexi-composite-panel" style="{cellStyle}">
28
+ {#if title}
29
+ <div class="flexi-composite-title-bar">
30
+ <div class="title-text">
31
+ <span>{title}</span>
32
+ </div>
33
+ </div>
34
+ {/if}
35
+ <FlexiPanel style="padding: 0" mode={composite.mode} props={composite.props} {arrangement}>
36
+ {#each fields as field}
37
+ <FlexiFieldCell {field} readonly={readonly || composite.readonly} disabled={disabled || composite.disabled} variant={composite.variant}
38
+ label$style={composite.label$style}/>
39
+ {/each}
40
+
41
+ </FlexiPanel>
42
+ </div>
@@ -0,0 +1,25 @@
1
+ import type FlexiComposite from "./FlexiComposite";
2
+ import type { Arrangement } from "../lib";
3
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
4
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
5
+ $$bindings?: Bindings;
6
+ } & Exports;
7
+ (internal: unknown, props: Props & {
8
+ $$events?: Events;
9
+ $$slots?: Slots;
10
+ }): Exports & {
11
+ $set?: any;
12
+ $on?: any;
13
+ };
14
+ z_$$bindings?: Bindings;
15
+ }
16
+ declare const FlexiCompositePanel: $$__sveltets_2_IsomorphicComponent<{
17
+ /** 组合框的单元所在的表单的布局模式 */ composite: FlexiComposite;
18
+ readonly: boolean;
19
+ disabled: boolean;
20
+ arrangement: Arrangement;
21
+ }, {
22
+ [evt: string]: CustomEvent<any>;
23
+ }, {}, {}, string>;
24
+ type FlexiCompositePanel = InstanceType<typeof FlexiCompositePanel>;
25
+ export default FlexiCompositePanel;
@@ -0,0 +1,50 @@
1
+ ## FlexiBlock
2
+
3
+ `FlexiBlock`是一个字段组,可以包括一个到多个字段,拥有独立的布局模式和全局的`readonly`,`disabled`和`visible`的属性。
4
+
5
+ ### 属性
6
+
7
+ - `isReadonly` 为**true**时,区块内的所有字段只读,如果为**false**时,每个字段可以自主控制,可以是布尔值或者表达式
8
+ - `disabled` 为**true**时,区块内的所有字段禁用,如果为**false**时,每个字段可以自主控制,可以是布尔值或者表达式
9
+ - `visible` 整个区块的显示或者隐藏
10
+ - `title` 可以是一段**文字**,**函数名**或者**null**,函数名为`@{}`包裹
11
+ - `mode` 布局模式,可以是**flex**布局或者**grid**布局
12
+ - `props` 布局属性,根据布局的不同,属性也不同
13
+ - `key` 关键
14
+ - `fields`
15
+ #### 示例
16
+
17
+ * 简单模式
18
+ 基于flex布局的表单块
19
+ ```json
20
+ {
21
+ "keyField": "contact",
22
+ "readonly": false,
23
+ "disabled": false,
24
+ "title": "联系人",
25
+ "mode": "flex",
26
+ "fields": [
27
+ {
28
+ "type": "TextEditor",
29
+ "field": "name",
30
+ "readonly": false,
31
+ "disabled": false,
32
+ "props": {
33
+ "input$maxLength": 30
34
+ },
35
+ "span": 4
36
+ },
37
+ {
38
+ "type": "TextEditor",
39
+ "field": "phoneNumber",
40
+ "array": true,
41
+ "isReadonly": false,
42
+ "disabled": false,
43
+ "props": {
44
+ "input$maxLength": 30
45
+ },
46
+ "span": 4
47
+ }
48
+ ]
49
+ }
50
+ ```
@@ -0,0 +1,4 @@
1
+ export interface FlexiDataSheetSchema {
2
+ }
3
+ export default class FlexiDataSheet {
4
+ }
@@ -0,0 +1,2 @@
1
+ export default class FlexiDataSheet {
2
+ }
@@ -0,0 +1,76 @@
1
+ import FlexiCard from "../flexi_card/FlexiCard";
2
+ import type { SvelteComponent } from "svelte";
3
+ import { type LayoutMode, Visibility } from "../lib";
4
+ import type FlexiComposite from "../flexi_composite/FlexiComposite";
5
+ export interface ValidationSchema {
6
+ /** 字符串格式 */
7
+ format?: {
8
+ regex: string;
9
+ message: string;
10
+ };
11
+ /** 数字类型的最小值 */
12
+ minValue?: number;
13
+ /** 数字类型的最大值 */
14
+ maxValue?: number;
15
+ /** 字符类型的最小长度 */
16
+ minLength?: number;
17
+ /** 自定义的检查方法 */
18
+ check?: string;
19
+ }
20
+ export interface FlexiFieldSchema {
21
+ /** 字段的类型 */
22
+ type: string;
23
+ /** 字段的名称 */
24
+ keyField: string;
25
+ /** 字段的名称 */
26
+ name: string;
27
+ /** 关联的数据字典项目 */
28
+ dictName?: string;
29
+ /** 字段的标签 */
30
+ label: string;
31
+ /** 输入框的样式 */
32
+ variant?: "" | "outlined" | "filled";
33
+ /** 是否只读 */
34
+ readonly?: boolean;
35
+ /** 是否禁用 */
36
+ disabled?: boolean;
37
+ /** 是否必须 */
38
+ required?: boolean;
39
+ /** 事件 */
40
+ events?: Record<string, string>;
41
+ /** 在卡片/Block中所在单元格的属性,flex布局和grid布局对应的属性也不一样*/
42
+ cell?: any;
43
+ /** 字段的属性 */
44
+ props?: any;
45
+ /** 检测规则 */
46
+ validation?: ValidationSchema;
47
+ }
48
+ export default class FlexiField {
49
+ #private;
50
+ readonly data: any;
51
+ readonly keyField: string;
52
+ readonly component: typeof SvelteComponent;
53
+ readonly variant?: "" | "outlined" | "filled";
54
+ visibility: Visibility;
55
+ readonly mode: LayoutMode;
56
+ label: string;
57
+ isReadonly: boolean;
58
+ disabled: boolean;
59
+ required: boolean;
60
+ constructor(parent: FlexiCard | FlexiComposite, data: any, mode: LayoutMode, schema: FlexiFieldSchema);
61
+ validate(): boolean;
62
+ get error(): string | null;
63
+ /**
64
+ *
65
+ */
66
+ get events(): any;
67
+ /**
68
+ * 字段的属性
69
+ */
70
+ get props(): any;
71
+ /**
72
+ * 单元格属性,通常包括span等
73
+ */
74
+ get cell(): any;
75
+ private parseValidationRule;
76
+ }
@@ -0,0 +1,128 @@
1
+ import FlexiCard from "../flexi_card/FlexiCard";
2
+ import { Visibility } from "../lib";
3
+ import ComponentBuilder from "../lib/ComponentBuilder";
4
+ import utils from "../lib/utils";
5
+ export default class FlexiField {
6
+ #parent;
7
+ data;
8
+ keyField;
9
+ component;
10
+ variant;
11
+ visibility = Visibility.View;
12
+ #error = null;
13
+ #props = {};
14
+ #events = {};
15
+ #cell = {};
16
+ mode;
17
+ label;
18
+ isReadonly;
19
+ disabled;
20
+ required;
21
+ #validation;
22
+ constructor(parent, data, mode, schema) {
23
+ this.#parent = parent;
24
+ this.mode = mode;
25
+ this.label = schema.label;
26
+ this.variant = schema.variant;
27
+ this.isReadonly = schema.readonly == true;
28
+ this.disabled = schema.disabled == true;
29
+ this.required = schema.required = true;
30
+ this.#cell = schema.cell;
31
+ const card = parent instanceof FlexiCard ? parent : parent.card;
32
+ if (schema.events) {
33
+ for (let key in schema.events) {
34
+ let eventHandler = schema.events[key];
35
+ this.#events[key] = (...args) => card[eventHandler]?.(...args);
36
+ }
37
+ }
38
+ this.#validation = this.parseValidationRule(schema.validation);
39
+ const cellField = ComponentBuilder.getInstance().buildField(schema, (name) => card.form.getDictionary(name));
40
+ this.component = cellField.component;
41
+ this.#props = cellField.props;
42
+ const result = utils.getParentAndKey(data, schema.keyField);
43
+ this.keyField = result?.key;
44
+ this.data = result?.parent;
45
+ }
46
+ validate() {
47
+ let valid = true;
48
+ this.#error = null;
49
+ if (!this.isReadonly && !this.disabled && this.visibility == Visibility.View) {
50
+ let value = this.data[this.keyField];
51
+ let valueType = typeof value;
52
+ if (value == null || (valueType == "string" && value.trim().length == 0)) {
53
+ if (this.required) {
54
+ this.#error = '请输入数值';
55
+ valid = false;
56
+ }
57
+ }
58
+ else {
59
+ if (valueType == "string") { //检查字符串类型
60
+ if (this.#validation?.minLength && this.data.length < this.#validation?.minLength) {
61
+ this.#error = '低于最小长度';
62
+ valid = false;
63
+ }
64
+ if (valid && this.#validation?.format) { //如果有正则表达式,检查正则表达式
65
+ if (!this.#validation.format.regex.test(this.data)) {
66
+ this.#error = this.#validation.format.message;
67
+ }
68
+ }
69
+ }
70
+ else if (valueType == "number") { //如果是数字,检查最大/最小值
71
+ if (this.#validation?.minValue && this.data < this.#validation.minValue) {
72
+ this.#error = '低于最小值';
73
+ valid = false;
74
+ }
75
+ else if (this.#validation?.maxValue && this.data > this.#validation.maxValue) {
76
+ this.#error = '超过最大值';
77
+ valid = false;
78
+ }
79
+ }
80
+ }
81
+ if (valid && this.#validation?.check) { //如果有自定义检查,通过自定义方法检查
82
+ const result = this.#validation.check(this.data, this.#parent.data);
83
+ if (!result.valid) {
84
+ valid = false;
85
+ this.#error = result.message;
86
+ }
87
+ }
88
+ }
89
+ return valid;
90
+ }
91
+ get error() {
92
+ return this.#error;
93
+ }
94
+ /**
95
+ *
96
+ */
97
+ get events() {
98
+ return { ...this.#events };
99
+ }
100
+ /**
101
+ * 字段的属性
102
+ */
103
+ get props() {
104
+ return { ...this.#props };
105
+ }
106
+ /**
107
+ * 单元格属性,通常包括span等
108
+ */
109
+ get cell() {
110
+ return { ...this.#cell };
111
+ }
112
+ parseValidationRule(validation) {
113
+ if (validation) {
114
+ const rule = { minValue: validation.minValue, maxValue: validation.maxValue, minLength: validation.minLength };
115
+ if (validation.format) {
116
+ rule.format = { regex: new RegExp(validation.format.regex), message: validation.format.message };
117
+ }
118
+ if (validation.check) {
119
+ let checkFun = this.#parent[validation.check];
120
+ if (checkFun) {
121
+ rule.check = checkFun;
122
+ }
123
+ }
124
+ return rule;
125
+ }
126
+ return undefined;
127
+ }
128
+ }
@@ -0,0 +1,35 @@
1
+ <script lang="ts">import { CellField } from "@ticatec/uniface-element/FlexForm";
2
+ import { GridField } from "@ticatec/uniface-element/GridForm";
3
+ import { Visibility } from "../lib/types";
4
+ export let field;
5
+ export let readonly = false;
6
+ export let disabled = false;
7
+ export let variant;
8
+ export let label$style = '';
9
+ let component = field.component;
10
+ $: label = field.label;
11
+ $: required = field.required;
12
+ $: mode = field.mode;
13
+ $: error = field.error;
14
+ $: cell = field.cell;
15
+ $: displayStyle = field.visibility == Visibility.View ? 'display: block; visibility: visible' : field.visibility == Visibility.Hidden ? 'display: none; visibility: visible' : 'display: block; visibility: hidden';
16
+ $: FormCell = mode === "grid" ? GridField : CellField;
17
+ $: props = mode === "grid" ?
18
+ {
19
+ rowSpan: cell.rowSpan ?? 1,
20
+ colSpan: cell.colSpan ?? 1,
21
+ row: cell.row,
22
+ col: cell.col,
23
+ height: cell.height,
24
+ labelSuffix: cell.labelSuffix,
25
+ style: displayStyle
26
+ } : {
27
+ span: cell.span,
28
+ labelSuffix: cell.labelSuffix,
29
+ style: `${displayStyle}; ${cell.style ?? ''}`
30
+ };
31
+ </script>
32
+
33
+ <svelte:component this={FormCell} {label} {...props} {error} {required} {label$style}>
34
+ <svelte:component this={component} {field} {readonly} {disabled} {variant}/>
35
+ </svelte:component>
@@ -0,0 +1,25 @@
1
+ import type FlexiField from "./FlexiField";
2
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
+ $$bindings?: Bindings;
5
+ } & Exports;
6
+ (internal: unknown, props: Props & {
7
+ $$events?: Events;
8
+ $$slots?: Slots;
9
+ }): Exports & {
10
+ $set?: any;
11
+ $on?: any;
12
+ };
13
+ z_$$bindings?: Bindings;
14
+ }
15
+ declare const FlexiFieldCell: $$__sveltets_2_IsomorphicComponent<{
16
+ field: FlexiField;
17
+ readonly?: boolean;
18
+ disabled?: boolean;
19
+ variant: any;
20
+ label$style?: string;
21
+ }, {
22
+ [evt: string]: CustomEvent<any>;
23
+ }, {}, {}, string>;
24
+ type FlexiFieldCell = InstanceType<typeof FlexiFieldCell>;
25
+ export default FlexiFieldCell;
@@ -0,0 +1,3 @@
1
+ import FlexiField from "./FlexiField";
2
+ export default class UnknownField extends FlexiField {
3
+ }
@@ -0,0 +1,3 @@
1
+ import FlexiField from "./FlexiField";
2
+ export default class UnknownField extends FlexiField {
3
+ }